From 89f1b0b55b9daed25a89c9474b678814cc5c5331 Mon Sep 17 00:00:00 2001 From: yutt Date: Wed, 19 Jun 2024 14:34:03 +0800 Subject: [PATCH 001/135] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\345\237\272\346\234\254\350\246\201\346\261\202.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "sig/sig-test-0419/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202201-2022-5).md" => "sig/sig-test-0419/content/\347\224\250\346\210\267\346\214\207\345\215\227/\345\237\272\346\234\254\350\246\201\346\261\202.md" (100%) diff --git "a/sig/sig-test-0419/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202201-2022-5).md" "b/sig/sig-test-0419/content/\347\224\250\346\210\267\346\214\207\345\215\227/\345\237\272\346\234\254\350\246\201\346\261\202.md" similarity index 100% rename from "sig/sig-test-0419/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202201-2022-5).md" rename to "sig/sig-test-0419/content/\347\224\250\346\210\267\346\214\207\345\215\227/\345\237\272\346\234\254\350\246\201\346\261\202.md" -- Gitee From d575516a6f36fc070b7bb631ea4475cec3a8dbf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E7=AB=8B?= <404325854@qq.com> Date: Mon, 24 Jun 2024 10:10:36 +0000 Subject: [PATCH 002/135] =?UTF-8?q?update=20sig/T-One/content/=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E6=89=8B=E5=86=8C/test.md.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 苏立 <404325854@qq.com> --- .../\345\274\200\345\217\221\346\211\213\345\206\214/test.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/sig/T-One/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" "b/sig/T-One/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" index 954bbfe2..4aa93e68 100644 --- "a/sig/T-One/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" +++ "b/sig/T-One/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" @@ -1,4 +1,5 @@ HCT密码计算套件的目录结构如下: +阿斯顿法师打发斯蒂芬 hygon-devkit/ -- Gitee From 5a0d5d4ba35e42fa43e33a071c38096d5a85a6df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E7=AB=8B?= <404325854@qq.com> Date: Fri, 28 Jun 2024 08:14:11 +0000 Subject: [PATCH 003/135] =?UTF-8?q?update=20sig/T-One/content/=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E6=89=8B=E5=86=8C/test.md.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 苏立 <404325854@qq.com> --- .../\345\274\200\345\217\221\346\211\213\345\206\214/test.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/sig/T-One/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" "b/sig/T-One/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" index 4aa93e68..693ed709 100644 --- "a/sig/T-One/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" +++ "b/sig/T-One/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" @@ -1,6 +1,6 @@ HCT密码计算套件的目录结构如下: 阿斯顿法师打发斯蒂芬 - +44444444444444444444444444444444444444444444444444444 hygon-devkit/ ├─ hct -- Gitee From 2412f1405ba0a6e20779c6f78a990c2454f9e73c Mon Sep 17 00:00:00 2001 From: yutt Date: Fri, 28 Jun 2024 08:50:28 +0000 Subject: [PATCH 004/135] =?UTF-8?q?update=20sig/AI/content/=E6=9C=88?= =?UTF-8?q?=E6=8A=A5/202301.md.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yutt --- "sig/AI/content/\346\234\210\346\212\245/202301.md" | 7 +++++++ 1 file changed, 7 insertions(+) diff --git "a/sig/AI/content/\346\234\210\346\212\245/202301.md" "b/sig/AI/content/\346\234\210\346\212\245/202301.md" index 85bbb428..154fa40a 100644 --- "a/sig/AI/content/\346\234\210\346\212\245/202301.md" +++ "b/sig/AI/content/\346\234\210\346\212\245/202301.md" @@ -1,5 +1,12 @@ # 整体进展 + + +修改文件20202202-102-1201-1210201-1- + + + + - 发布 ANCK 5.10-013 版本。 - 确定KABI机制整体方案。 - 浪潮信息龙蜥联合实验室的工作事项更新。 -- Gitee From bcfa9a21992910bd338048df40f3865b4abe5811 Mon Sep 17 00:00:00 2001 From: yutt Date: Thu, 11 Jul 2024 08:39:56 +0000 Subject: [PATCH 005/135] 20240711 Signed-off-by: yutt --- ...\272\223\351\205\215\347\275\256\350\247\204\350\214\203.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/sig/\345\237\272\347\241\200\350\256\276\346\226\275SIG/content/CI\345\217\212\344\273\243\347\240\201\351\227\250\347\246\201/CI-META\344\273\223\345\272\223\351\205\215\347\275\256\350\247\204\350\214\203.md" "b/sig/\345\237\272\347\241\200\350\256\276\346\226\275SIG/content/CI\345\217\212\344\273\243\347\240\201\351\227\250\347\246\201/CI-META\344\273\223\345\272\223\351\205\215\347\275\256\350\247\204\350\214\203.md" index f110f613..b8c3d40b 100644 --- "a/sig/\345\237\272\347\241\200\350\256\276\346\226\275SIG/content/CI\345\217\212\344\273\243\347\240\201\351\227\250\347\246\201/CI-META\344\273\223\345\272\223\351\205\215\347\275\256\350\247\204\350\214\203.md" +++ "b/sig/\345\237\272\347\241\200\350\256\276\346\226\275SIG/content/CI\345\217\212\344\273\243\347\240\201\351\227\250\347\246\201/CI-META\344\273\223\345\272\223\351\205\215\347\275\256\350\247\204\350\214\203.md" @@ -1,3 +1,5 @@ +修改内容 20240711 + # 简介 [CI-META仓库](https://gitee.com/anolis/ci-meta)做为OpenAnolis社区PackageCI测试流程的配置中心,提供了全局配置和自定义配置,全局配置默认对Gitee上的OpenAnolis企业账户下的所有仓库生效,自定义配置允许开发者通过自定义形式接入社区测试流程,本文主要介绍CI-META仓库配置规范。 -- Gitee From 3a28a4e5bf48d23e3c5a8e8c58fdf9b105c14286 Mon Sep 17 00:00:00 2001 From: suli02 <14689694+suli02@user.noreply.gitee.com> Date: Mon, 29 Jul 2024 07:48:08 +0000 Subject: [PATCH 006/135] =?UTF-8?q?update=20sig/T-One/content/=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=8C=87=E5=8D=97/test1.md.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: suli02 <14689694+suli02@user.noreply.gitee.com> --- .../test1.md" | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git "a/sig/T-One/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" "b/sig/T-One/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" index 6d1884c0..f9c99ee0 100644 --- "a/sig/T-One/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" +++ "b/sig/T-One/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" @@ -67,4 +67,7 @@ print '缩进 4 个空格' > 区块引用 > Markdown教程 -> 学的不仅是技术更是梦想 \ No newline at end of file +> 学的不仅是技术更是梦想 + + +SDFGSDFGSDFGSDFG \ No newline at end of file -- Gitee From d6e71776ec2f5048f1b95a7f2ad792ed1d8a7a71 Mon Sep 17 00:00:00 2001 From: suli02 <14689694+suli02@user.noreply.gitee.com> Date: Mon, 29 Jul 2024 08:12:55 +0000 Subject: [PATCH 007/135] =?UTF-8?q?update=20sig/AI/content/=E6=9C=88?= =?UTF-8?q?=E6=8A=A5/2022121.md.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: suli02 <14689694+suli02@user.noreply.gitee.com> --- "sig/AI/content/\346\234\210\346\212\245/2022121.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/sig/AI/content/\346\234\210\346\212\245/2022121.md" "b/sig/AI/content/\346\234\210\346\212\245/2022121.md" index 9ad98f22..9718d343 100644 --- "a/sig/AI/content/\346\234\210\346\212\245/2022121.md" +++ "b/sig/AI/content/\346\234\210\346\212\245/2022121.md" @@ -1 +1 @@ -xcvxcvxcvxcbcvvb \ No newline at end of file +xcvxcvxcvxcbcvvbasdfsda \ No newline at end of file -- Gitee From e7a48343e8605ca5f7611ecec54c29fd74d38f11 Mon Sep 17 00:00:00 2001 From: suli02 <14689694+suli02@user.noreply.gitee.com> Date: Mon, 29 Jul 2024 09:22:24 +0000 Subject: [PATCH 008/135] test Signed-off-by: suli02 <14689694+suli02@user.noreply.gitee.com> --- ...Bugzilla\347\224\250\346\210\267\346\226\207\346\241\243.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/sig/AI/content/Bugzilla\347\263\273\347\273\237/Bugzilla\347\224\250\346\210\267\346\226\207\346\241\243.md" "b/sig/AI/content/Bugzilla\347\263\273\347\273\237/Bugzilla\347\224\250\346\210\267\346\226\207\346\241\243.md" index 6076d9eb..05335297 100644 --- "a/sig/AI/content/Bugzilla\347\263\273\347\273\237/Bugzilla\347\224\250\346\210\267\346\226\207\346\241\243.md" +++ "b/sig/AI/content/Bugzilla\347\263\273\347\273\237/Bugzilla\347\224\250\346\210\267\346\226\207\346\241\243.md" @@ -6,7 +6,7 @@ Bugzilla是一个缺陷管理系统,可以用来管理Bug,也可以用来管 ![image.png](https://oss.openanolis.cn/blog/vnyrodeytjdirmwvclsl) ## 二. Bug生命周期 -- **2.1 新建Bug** +- **2.1 新建Bug** - **2.1.1 路径** 首页->New/File a Bug->Select a classification->Select a product->Bug创建页面。具体如下:首先,在首页点击New或File a Bug按钮,进行创建Bug。 -- Gitee From f07d2254ae7e4785b0f5d7ca9c595ef0548221bd Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Mon, 5 Aug 2024 15:20:11 +0800 Subject: [PATCH 009/135] =?UTF-8?q?v2.5.2:sig=E4=B8=BB=E9=A1=B5=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=BC=9A=E8=AE=AE=E7=BA=AA=E8=A6=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "sig/Anolis\350\277\201\347\247\273SIG/sig-info.yaml" | 1 + 1 file changed, 1 insertion(+) diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/sig-info.yaml" "b/sig/Anolis\350\277\201\347\247\273SIG/sig-info.yaml" index ad653972..3d7048b1 100644 --- "a/sig/Anolis\350\277\201\347\247\273SIG/sig-info.yaml" +++ "b/sig/Anolis\350\277\201\347\247\273SIG/sig-info.yaml" @@ -5,6 +5,7 @@ description: OpenAnolis作为一个新的OS开源社区,为了用户能够更 en_description: As a new OS open source community, Anolis OS needs to provide migration guidance and migration tools for migrating from other OS to Anolis OS i mailing_list: os@lists.openanolis.cn meeting_url: https://openanolis.cn +meeting_minutes_url: https://www.openeuler.org/zh/sig/sig-detail/?name=Kernel maintainers: - openanolis_id: ceshi002 gitee_id: -- Gitee From 81368ce370d8192113d99ad5b064e528837d0932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E7=AB=8B?= <404325854@qq.com> Date: Tue, 13 Aug 2024 10:11:23 +0000 Subject: [PATCH 010/135] update sig/T-One/sig-info.yaml. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 苏立 <404325854@qq.com> --- sig/T-One/sig-info.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sig/T-One/sig-info.yaml b/sig/T-One/sig-info.yaml index 09451c60..cd92b3e5 100644 --- a/sig/T-One/sig-info.yaml +++ b/sig/T-One/sig-info.yaml @@ -5,7 +5,7 @@ description: T-One兴趣组主要目标是建立OpenAnolis社区的质量保障 en_description: The main goal of the T-One interest group is to establish the quality assurance infrastructure of the OpenAnolis community (including but not limited to the one-stop automated test platform T-One/Testfarm, Bisect defect location tool and other test platforms), to support various test platforms in the OpenAnolis community Class testing activities. mailing_list: t-one@lists.openanolis.cn -meeting_url: https://etherpad.openanolis.cn/p/t-one +meeting_minutes_url: https://etherpad.openanolis.cn/p/t-one maintainers: - openanolis_id: yongchao gitee_id: yongchao -- Gitee From 61a2e74157ff5db9811882d99a33236cf8703741 Mon Sep 17 00:00:00 2001 From: yk <11703230+just-sososo@user.noreply.gitee.com> Date: Mon, 26 Aug 2024 01:56:59 +0000 Subject: [PATCH 011/135] =?UTF-8?q?=E5=86=85=E5=AE=B9=E7=BC=BA=E5=A4=B1:?= =?UTF-8?q?=E5=86=85=E5=AE=B9/=E4=BB=A3=E7=A0=81=E6=9C=89=E7=BC=BA?= =?UTF-8?q?=E5=A4=B1=EF=BC=8C=E5=AF=BC=E8=87=B4=E6=93=8D=E4=BD=9C=E4=B8=AD?= =?UTF-8?q?=E6=96=AD=EF=BC=8C=E6=97=A0=E6=B3=95=E7=BB=A7=E7=BB=AD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yk <11703230+just-sososo@user.noreply.gitee.com> --- ...noise_\344\273\243\347\240\201\345\210\206\346\236\220.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace_osnoise_\344\273\243\347\240\201\345\210\206\346\236\220.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace_osnoise_\344\273\243\347\240\201\345\210\206\346\236\220.md" index d8d8d5f7..b66bf0b7 100644 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace_osnoise_\344\273\243\347\240\201\345\210\206\346\236\220.md" +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace_osnoise_\344\273\243\347\240\201\345\210\206\346\236\220.md" @@ -1,7 +1,7 @@ ![](assets/Ftrace:_osnoise_代码分析/img_0.png) -前面一篇文章中,我们简要的介绍了一下osnoise的相关信息,本篇文章主要针对其源代码进行分析阐述。 +前面一篇文章中,我们简要的osnoise的相关信息,本篇文章主要针对其源代码进行分析阐述。 @@ -84,7 +84,7 @@ osnoise用来记录结果的主要数据结构为`struct osnoise_variables`其 ## 2.1 注册trace\_point -如第一篇文章所述,osnoise引入了一组trace\_point。通过这些trace\_point,开发人员可以获取噪声的详细信息。注册trace\_point的代码如下(以irq\_noise为例): +如第一篇,osnoise引入了一组trace\_point。通过这些trace\_point,开发人员可以获取噪声的详细信息。注册trace\_point的代码如下(以irq\_noise为例): -- Gitee From 95407d3b3c44d47cbbeab71d6e32d14c10f1958d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8E=E5=A9=B7?= Date: Sat, 12 Oct 2024 05:28:24 +0000 Subject: [PATCH 012/135] =?UTF-8?q?=E4=BF=AE=E6=94=B9sig=20info?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 于婷 --- sig/Cloud Kernel/sig-info.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sig/Cloud Kernel/sig-info.yaml b/sig/Cloud Kernel/sig-info.yaml index cb917ea7..f271c5c2 100644 --- a/sig/Cloud Kernel/sig-info.yaml +++ b/sig/Cloud Kernel/sig-info.yaml @@ -11,9 +11,9 @@ maintainers: name: organization: email: -- openanolis_id: - gitee_id: - name: +- openanolis_id: ceshi001 + gitee_id: ceshi001 + name: ceshi001 - openanolis_id: gitee_id: name: -- Gitee From e04a48a1870e3862fdfe44b8d618535ab0df1733 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E7=AB=8B?= <404325854@qq.com> Date: Tue, 15 Oct 2024 05:38:59 +0000 Subject: [PATCH 013/135] update sig/T-One/sig-info.yaml. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 苏立 <404325854@qq.com> --- sig/T-One/sig-info.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sig/T-One/sig-info.yaml b/sig/T-One/sig-info.yaml index cd92b3e5..316584cd 100644 --- a/sig/T-One/sig-info.yaml +++ b/sig/T-One/sig-info.yaml @@ -16,6 +16,8 @@ maintainers: gitee_id: suqingming - openanolis_id: jacob2021 gitee_id: jacob2021 +- openanolis_id: eeeeeeee + gitee_id: suli01 contributors: - openanolis_id: fuyong gitee_id: fuyong -- Gitee From 7e3749a5597caf65246578679a07369371479340 Mon Sep 17 00:00:00 2001 From: WB01533938 Date: Fri, 25 Oct 2024 13:31:29 +0800 Subject: [PATCH 014/135] =?UTF-8?q?docs(T-One):=20=E6=9B=B4=E6=96=B0=20Ton?= =?UTF-8?q?e=E9=83=A8=E7=BD=B2=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 强调仅支持 Anolis OS 系统,暂不支持 Debian、Ubuntu等 - 明确其他架构类型机器需要更换第三方开源组件镜像源 - 优化安装目录说明,推荐使用 ~/tone目录 - 补充前端代码解压前需要安装 unzip命令的说明 - 在配置文件中添加 oss_url 配置项 --- .../tone\351\203\250\347\275\262.md" | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git "a/sig/T-One/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" "b/sig/T-One/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" index 34e5806f..c7cdfb90 100644 --- "a/sig/T-One/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" +++ "b/sig/T-One/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" @@ -13,12 +13,12 @@ **机器要求**: * 硬件要求:推荐使用 8c16g 以上规格机器。 -* OS 要求:推荐使用 Anolis OS 系统进行部署。 +* OS 要求:推荐使用 Anolis OS 系统进行部署( 暂不支持debian、ubuntu等)。 **部署说明**: - 主要分为安装环境、项目构建、项目启动、数据初始化等几个步骤。 -- 该文档以x86_64机器为例,如果您的部署机器为其他arch类型的机器,则需要将更改指定的第三方开源组件镜像 -- 可以自己指定安装目录,该文档以 ~/tone目录为例 +- 该文档以x86_64机器为例, 如果您的部署机器为其他arch类型的机器,则需要将docker-compose.yaml中指定的第三方开源组件镜像更换成对应的镜像源。 +- 可以自己指定安装目录,该文档以 ~/tone目录为例(推荐)。 # 部署步骤 > 后续步骤以 Anolis OS 8.6 环境为示例进行行详细说明。 @@ -36,7 +36,6 @@ systemctl start docker systemctl status docker ``` -> [更多docker安装配置](https://yeasy.gitbook.io/docker_practice/install) ### b. 配置docker源 ``` vim /etc/docker/daemon.json @@ -56,6 +55,7 @@ pip3 install docker-compose docker-compose --version ``` + ## 2. 项目构建 ### a. 下载项目源码 @@ -68,14 +68,21 @@ git clone --single-branch --branch master https://gitee.com/anolis/tone-agent-pr git clone --single-branch --branch master https://gitee.com/anolis/tone-storage.git ~/tone/code/tone-storage ``` 下载后的目录结构: -![tone目录层级](../../assets/Dingtalk_20240614165831.jpg "tone目录层级") +``` +~/tone/code/ + ├── tone-web + ├── tone-runner + ├── tone-agent-proxy + └── tone-storage +``` ### b. 集成前端代码 ```shell # 下载前端代码包: wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/tone-front-latest.zip wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/toneagent-front-latest.zip - +# 安装unzip命令 +yum install -y unzip # 解压到指定目录 unzip -j -o tone-front-latest.zip -d ~/tone/code/tone-web/static/front/ unzip -j -o toneagent-front-latest.zip -d ~/tone/code/tone-agent-proxy/static/front/ @@ -594,10 +601,11 @@ git clone --single-branch --branch master https://gitee.com/anolis/testlib.git ~ # redis redis_url: redis://:${redis_password}@redis:6379/10 # app - tone_host: http://${server_ip}:8080 + tone_host: http://${server_ip}:8080/ tone_token: tone_token tone_user_name: tone_user_name main_domain: http://${server_ip}:8005 + oss_url: http://${server_ip}:8005 ``` #### e.重启服务 ```shell -- Gitee From 96fd0f87a5eb7685a201c752372207fc704ef7b5 Mon Sep 17 00:00:00 2001 From: yutt Date: Fri, 6 Dec 2024 08:49:12 +0000 Subject: [PATCH 015/135] siginfo Signed-off-by: yutt --- sig/beautiful-sig/sig-info.yaml | 84 ++++++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/sig/beautiful-sig/sig-info.yaml b/sig/beautiful-sig/sig-info.yaml index 0f6d830d..177e06d6 100644 --- a/sig/beautiful-sig/sig-info.yaml +++ b/sig/beautiful-sig/sig-info.yaml @@ -1,7 +1,89 @@ name: 漂亮 en_name: beautiful home_page: https://openanolis.cn/sig/beautiful -description: 看月亮爬上来,你也... +description: # 安装说明 +1)下载anolis GA镜像并使用最小化安装 + +2)配置anolis dde仓库源 + +命令行执行如下命令: + +sudo yum install yum-utils + +sudo yum-config-manager --enable DDE + +sudo yum-config-manager --enable Plus + +sudo yum install epel-release + +sudo yum clean all && yum makecache + +3)dde相关软件包安装 + +命令行执行sudo yum groupinstall dde + +4)命令行执行reboot 重启计算机 + +重启完成后即可进入dde桌面环境 + +注:如果您已经安装了图形化界面,需要在软件包安装完成后执行以下命令: + +· 1sudo systemctl disable gdm + +· 2sudo systemctl enable lightdm + +· 然后重启计算机 + +# 简介 +DDE桌面环境是一款美观易用、安全可靠的图形化操作界面。桌面环境主要由桌面、任务栏、启动器、控制中心等组成,是您使用该操作系统的基础。 + +# 第一章 桌面模块 +## 1.1. 桌面 +桌面是您登录后看到的主屏幕区域。在桌面上,您可以新建文件/文件夹、排列文件、打开终端、设置壁纸和屏保等,还可以通过启动器向桌面添加应用的快捷方式。 + +## 1.2. 任务栏 +任务栏是指位于桌面底部的长条,主要由启动器、应用程序图标、托盘区、系统插件等组成。在任务栏,您可以打开启动器、显示桌面,对其上的应用程序进行打开、新建、关闭、强制退出等操作,还可以设置输入法,调节音量,连接网络,查看日历,进入关机界面等。 + +## 1.3. 启动器 +启动器有全屏和小窗口两种模式。单击启动器界面右上角的图标来切换模式。两种模式均支持搜索应用、设置快捷方式等操作。 + +小窗口模式还支持快速打开文件管理器,控制中心和进入关机界面等功能。 + +## 1.4. 控制中心 +DDE桌面操作系统通过控制中心来管理系统的基本设置,包括帐户管理、网络设置、日期和时间、个性化设置、显示设置、系统信息查看等。 + +# 第二章 应用模块 +## 2.1. 设备管理器 +设备管理器是一款可以查看和管理系统硬件设备的软件。 + +## 2.2. 文件管理器 +文件管理器是一款功能强大的文件管理工具,包括搜索、复制、回收站、压缩/解压缩,文件属性等管理功能。 + +## 2.3. 日历 +日历是一款查看日期、管理日程的工具。 + +## 2.4. 截图 +截图是一款精巧截图应用,它具有智能窗口识别、快捷键支持、图片编辑、延迟截图、社交分享、智能保存、调节图像分辨率等功能。 + +## 2.5. 系统监视器 +系统监视器是一款直观易用的系统监视器应用,它可以实时监控处理器状态、内存占用率、网络上传下载速度;还可以管理您的系统进程和应用进程,支持搜索进程和强制结束进程。 + +## 2.6. 看图 +看图是一款图片查看器,外观时尚、性能流畅,支持多种图片格式。 + +## 2.7. 文档查看器 +文档查看器是一个支持多种格式的文件浏览器,可以用来阅读如PDF、Postscript、djvu、tiff、dvi等格式的文件。 + +## 2.8. 终端 +终端是一款终端模拟器。它拥有简单的界面,丰富而强大的功能。 + +## 2.9. 字体管理器 +字体管理器是一款字体安装和卸载工具,简化字体安装和卸载的操作,支持批量安装、字体信息识别等功能。 + +## 2.10. 文本编辑器 +文本编辑器是一款简单易用、可灵活定制部分功能的轻量级文本编辑器。 + + en_description: Watching the moon climb up into the sky, you too... mailing_list: t-one@lists.openanolis.cn meeting_url: https://etherpad.openanolis.cn/p/beautiful -- Gitee From da7cf9988289bb2a20f7d1adb2f4e6d4040ce159 Mon Sep 17 00:00:00 2001 From: yutt Date: Thu, 12 Dec 2024 05:57:33 +0000 Subject: [PATCH 016/135] TC_Project.yml --- TC_Project.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 TC_Project.yml diff --git a/TC_Project.yml b/TC_Project.yml new file mode 100644 index 00000000..a4672d12 --- /dev/null +++ b/TC_Project.yml @@ -0,0 +1,15 @@ +projects: + - project_id: TC2024080201 + repos: + - repo_name: anolis/community + dir_or_files: + - sig/AI + - sig/AI/sig-info.yaml + - sig/AI/README.md + - project_id: TC2024080202 + repos: + - repo_name: anolis/community2 + dir_or_files: + - sig/AI + - sig/AI/sig-info.yaml + - sig/AI/README.md \ No newline at end of file -- Gitee From 9f6dcc6ad165d0d533395a6471e83b2059da804c Mon Sep 17 00:00:00 2001 From: yutt Date: Fri, 13 Dec 2024 05:43:07 +0000 Subject: [PATCH 017/135] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yutt --- ...250\213\346\216\245\345\205\245\346\214\207\345\257\274.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/sig/AI/content/\351\276\231\350\234\245\345\256\236\351\252\214\345\256\244/\351\276\231\350\234\245\345\256\236\351\252\214\345\256\244\350\257\276\347\250\213\346\216\245\345\205\245\346\214\207\345\257\274.md" "b/sig/AI/content/\351\276\231\350\234\245\345\256\236\351\252\214\345\256\244/\351\276\231\350\234\245\345\256\236\351\252\214\345\256\244\350\257\276\347\250\213\346\216\245\345\205\245\346\214\207\345\257\274.md" index 757eaada..d13161ad 100644 --- "a/sig/AI/content/\351\276\231\350\234\245\345\256\236\351\252\214\345\256\244/\351\276\231\350\234\245\345\256\236\351\252\214\345\256\244\350\257\276\347\250\213\346\216\245\345\205\245\346\214\207\345\257\274.md" +++ "b/sig/AI/content/\351\276\231\350\234\245\345\256\236\351\252\214\345\256\244/\351\276\231\350\234\245\345\256\236\351\252\214\345\256\244\350\257\276\347\250\213\346\216\245\345\205\245\346\214\207\345\257\274.md" @@ -33,3 +33,6 @@ 六、提交审核之后等待管理员审核,管理员审核通过之后在实验室课程中心就能看到了 ![image.png](https://oss.openanolis.cn/blog/anamxvcefkymizldwtel) 以上就是龙蜥实验室创作中心创作课程的完整过程,如使用过程中有问题,欢迎联系[基础设施 SIG 组](https://openanolis.cn/sig/SIG-Infra)。 + + +加点内容 -- Gitee From f8d5f9beeaa82a672f74f8dc52ace2c7fb398f68 Mon Sep 17 00:00:00 2001 From: yutt Date: Fri, 13 Dec 2024 08:31:16 +0000 Subject: [PATCH 018/135] =?UTF-8?q?project=5Fid=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yutt --- TC_Project.yml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/TC_Project.yml b/TC_Project.yml index a4672d12..8b60e006 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -1,15 +1,29 @@ projects: - project_id: TC2024080201 repos: - - repo_name: anolis/community + - repo_name: openanolis-copy/community dir_or_files: - sig/AI - sig/AI/sig-info.yaml - sig/AI/README.md - project_id: TC2024080202 repos: - - repo_name: anolis/community2 + - repo_name: openanolis-copy/community2 dir_or_files: - sig/AI - sig/AI/sig-info.yaml + - sig/AI/README.md +- project_id: TC2024080403 + repos: + - repo_name: openanolis-copy/community + dir_or_files: + - sig/AI/content + - sig/AI/sig-info.yaml + - sig/AI/README.md +- project_id: TC2024080503 + repos: + - repo_name: openanolis-copy/community + dir_or_files: + - sig/AI/content + - sig/AI/sig-info.yaml - sig/AI/README.md \ No newline at end of file -- Gitee From a63f96df85a58f86ff99f7ae21e8be6c20e94a73 Mon Sep 17 00:00:00 2001 From: yutt Date: Fri, 13 Dec 2024 08:57:25 +0000 Subject: [PATCH 019/135] =?UTF-8?q?=E4=BF=AE=E6=94=B9projects?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yutt --- TC_Project.yml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/TC_Project.yml b/TC_Project.yml index 8b60e006..dd25c9a9 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -13,17 +13,17 @@ projects: - sig/AI - sig/AI/sig-info.yaml - sig/AI/README.md -- project_id: TC2024080403 - repos: - - repo_name: openanolis-copy/community - dir_or_files: - - sig/AI/content - - sig/AI/sig-info.yaml - - sig/AI/README.md -- project_id: TC2024080503 - repos: - - repo_name: openanolis-copy/community - dir_or_files: - - sig/AI/content - - sig/AI/sig-info.yaml - - sig/AI/README.md \ No newline at end of file + - project_id: TC2024080403 + repos: + - repo_name: openanolis-copy/community + dir_or_files: + - sig/AI/content + - sig/AI/sig-info.yaml + - sig/AI/README.md + - project_id: TC2024080503 + repos: + - repo_name: openanolis-copy/community + dir_or_files: + - sig/AI/content + - sig/AI/sig-info.yaml + - sig/AI/README.md \ No newline at end of file -- Gitee From 209acb59a6c96941d95d34ebfdd57d08908f9e31 Mon Sep 17 00:00:00 2001 From: yutt Date: Fri, 13 Dec 2024 09:16:44 +0000 Subject: [PATCH 020/135] repo_name Signed-off-by: yutt --- TC_Project.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/TC_Project.yml b/TC_Project.yml index dd25c9a9..acccaea7 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -14,16 +14,16 @@ projects: - sig/AI/sig-info.yaml - sig/AI/README.md - project_id: TC2024080403 - repos: - - repo_name: openanolis-copy/community - dir_or_files: - - sig/AI/content - - sig/AI/sig-info.yaml - - sig/AI/README.md + repos: + - repo_name: openanolis-copy/community + dir_or_files: + - sig/AI/content + - sig/AI/sig-info.yaml + - sig/AI/README.md - project_id: TC2024080503 - repos: - - repo_name: openanolis-copy/community - dir_or_files: - - sig/AI/content - - sig/AI/sig-info.yaml - - sig/AI/README.md \ No newline at end of file + repos: + - repo_name: openanolis-copy/community + dir_or_files: + - sig/AI/content + - sig/AI/sig-info.yaml + - sig/AI/README.md \ No newline at end of file -- Gitee From 8af2c3151b7f81edddd2f234d2ae719c2da40f8e Mon Sep 17 00:00:00 2001 From: yutt Date: Fri, 13 Dec 2024 10:19:50 +0000 Subject: [PATCH 021/135] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=BC=96=E7=A0=81?= =?UTF-8?q?=EF=BC=9ATC2024080201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yutt --- .../\346\234\210\346\212\245\350\257\264\346\230\216.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/sig/AI/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" "b/sig/AI/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" index 30020428..419869f5 100644 --- "a/sig/AI/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" +++ "b/sig/AI/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" @@ -5,3 +5,6 @@ + 具体进展:SIG 该月项目的详细进展,分别展开细节。 + 重要议题: SIG 该月讨论的重要议题。 + 运营活动: SIG 该月发生的运营活动。 + + +66666666666666666666666666666666666666666666666 -- Gitee From 5cb0ff6739687ad4f16cf3d497cfd86e30dbad4a Mon Sep 17 00:00:00 2001 From: yutt Date: Mon, 16 Dec 2024 03:16:57 +0000 Subject: [PATCH 022/135] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=BC=96=E7=A0=81?= =?UTF-8?q?=EF=BC=9ATC2024080201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yutt --- .../\346\234\210\346\212\245\350\257\264\346\230\216.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/sig/AI/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" "b/sig/AI/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" index 419869f5..8f8aad72 100644 --- "a/sig/AI/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" +++ "b/sig/AI/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" @@ -8,3 +8,6 @@ 66666666666666666666666666666666666666666666666 + + +04444433333333333333333333333333333333-- -- Gitee From e161e20a41b8432f042306897d875f461bbed4c6 Mon Sep 17 00:00:00 2001 From: yutt Date: Thu, 19 Dec 2024 07:25:55 +0000 Subject: [PATCH 023/135] =?UTF-8?q?TC2024080201=20=E9=9A=8F=E4=BE=BF?= =?UTF-8?q?=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yutt --- .../\346\234\210\346\212\245\350\257\264\346\230\216.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/sig/AI/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" "b/sig/AI/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" index 8f8aad72..178c5b3e 100644 --- "a/sig/AI/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" +++ "b/sig/AI/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" @@ -11,3 +11,6 @@ 04444433333333333333333333333333333333-- + + + 不写项目编码 \ No newline at end of file -- Gitee From 723415f9b827ec0733b7e5e28814f6e0390ee3ad Mon Sep 17 00:00:00 2001 From: yutt Date: Thu, 19 Dec 2024 07:58:01 +0000 Subject: [PATCH 024/135] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yutt --- .../\346\234\210\346\212\245\350\257\264\346\230\216.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/sig/AI/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" "b/sig/AI/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" index 178c5b3e..4882c4cd 100644 --- "a/sig/AI/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" +++ "b/sig/AI/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" @@ -13,4 +13,5 @@ 04444433333333333333333333333333333333-- - 不写项目编码 \ No newline at end of file + 不写项目编码 + ------------------------ \ No newline at end of file -- Gitee From e8eb2723567d229b766dd02b55559612e17e4027 Mon Sep 17 00:00:00 2001 From: yutt Date: Fri, 20 Dec 2024 14:03:28 +0800 Subject: [PATCH 025/135] =?UTF-8?q?=E6=8F=90=E4=BA=A4TC2024080201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/sig/AI/content/\345\206\205\346\240\270\350\260\203\346\265\213/...Pstore\345\211\215\347\253\257DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" "b/sig/AI/content/\345\206\205\346\240\270\350\260\203\346\265\213/...Pstore\345\211\215\347\253\257DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" index d00e1b42..2117df16 100644 --- "a/sig/AI/content/\345\206\205\346\240\270\350\260\203\346\265\213/...Pstore\345\211\215\347\253\257DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" +++ "b/sig/AI/content/\345\206\205\346\240\270\350\260\203\346\265\213/...Pstore\345\211\215\347\253\257DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" @@ -203,7 +203,7 @@ pstore dmesg主要工作流程如下: (5)调用后端的写函数,将record写入相应的后端设备 - +加点内容 -- Gitee From ace0a6159c802a03fdbda67aa263dac52dc824ca Mon Sep 17 00:00:00 2001 From: yutt Date: Fri, 20 Dec 2024 14:12:48 +0800 Subject: [PATCH 026/135] =?UTF-8?q?=E6=8F=90=E4=BA=A4TC2024080202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...257DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/sig/AI/content/\345\206\205\346\240\270\350\260\203\346\265\213/...Pstore\345\211\215\347\253\257DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" "b/sig/AI/content/\345\206\205\346\240\270\350\260\203\346\265\213/...Pstore\345\211\215\347\253\257DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" index 2117df16..8682851d 100644 --- "a/sig/AI/content/\345\206\205\346\240\270\350\260\203\346\265\213/...Pstore\345\211\215\347\253\257DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" +++ "b/sig/AI/content/\345\206\205\346\240\270\350\260\203\346\265\213/...Pstore\345\211\215\347\253\257DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" @@ -204,6 +204,7 @@ pstore dmesg主要工作流程如下: 加点内容 +算22332 -- Gitee From b39119553ee6a2b840deb673037e9d4cd1b44a9a Mon Sep 17 00:00:00 2001 From: yutt Date: Fri, 20 Dec 2024 14:13:21 +0800 Subject: [PATCH 027/135] =?UTF-8?q?=E6=8F=90=E4=BA=A4TC2024080203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...32DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/sig/AI/content/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257\357\274\232DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" "b/sig/AI/content/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257\357\274\232DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" index d00e1b42..d5f3a1ba 100644 --- "a/sig/AI/content/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257\357\274\232DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" +++ "b/sig/AI/content/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257\357\274\232DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" @@ -202,6 +202,8 @@ pstore dmesg主要工作流程如下: (5)调用后端的写函数,将record写入相应的后端设备 +wwqwq + -- Gitee From ea434847379fa0665df742238bf8391f259fac23 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Tue, 24 Dec 2024 11:25:34 +0800 Subject: [PATCH 028/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/test\347\256\200\344\273\213.md" | 4 + ...72\345\210\266\347\256\200\344\273\213.md" | 340 ++++++++++++++++++ 2 files changed, 344 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/test\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/test\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/test\347\256\200\344\273\213.md" new file mode 100644 index 00000000..7fe512a0 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/test\347\256\200\344\273\213.md" @@ -0,0 +1,4 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" new file mode 100644 index 00000000..c3c53de1 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" @@ -0,0 +1,340 @@ +# 1. RAS机制简介 + + +为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: + + +**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。  + + +**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 + + +**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 + + +RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 + + +# 2. RAS机制错误处理流程 + + +RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 + + +RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_0.png) + + +# 3. RAS机制评测流程 + + +RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 + + +APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 + + +从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 + + +如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 + + + + +| | +| --- | +| 0 Processor Correctable +1 Processor Uncorrectable non-fatal +2 Processor Uncorrectable fatal | +| 3 Memory Correctable +4 Memory Uncorrectable non-fatal +5 Memory Uncorrectable fatal | +| 6 PCI Express Correctable +7 PCI Express Uncorrectable non-fatal +8 PCI Express Uncorrectable fatal | +| 9 Platform Correctable +10 Platform Uncorrectable non-fatal +11 Platform Uncorrectable fatal | + + +Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_1.png) + + +上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 + + +错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: + + +1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 + + +2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 + + +3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 + + +# 4. CPU及内存错误注入演示 + + +CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 + + +##  4.1 环境准备 + + +### 1. 安装EINJ模块 + + +使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html + + +此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 + + +### 2. 安装RAS测试工具 + + +直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git + + +### 3. 安装rasdaemon + + +先安装依赖包yum install sqlite perl-DBD-SQLite + + +使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git + + + +``` +autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make +make install +``` + +在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 + + + +``` + -d, --disable 禁用RAS事件并退出 + -e, --enable 使能RAS事件并退出 + -f, --foreground 前台运行 + -r, --record 通过sqlite3记录事件 +``` + +rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 + + +查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 + + +本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 + + +## 4.2 CPU错误注入 + + +本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 + + +使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 + + + +``` +./einj_mem_uc core_non_fatal +0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 +injecting ... +triggering ... +Manually take page offline +Test passed +``` + +使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 + + + + +| | | | | +| --- | --- | --- | --- | +| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined.  | + + +可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=17(core), cnt=0xd +INFO: RAS reg: +INFO: fr = 10a9a2 +INFO: status = 44800007 +INFO: addr = 8007e0e95fffb7ff +INFO: misc0 = 4 +INFO: misc1 = 0 +RTC: 2000-01-06 09:32:09 + core[8] mm(17) return: 0 +--handler(17) end +[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error +[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 +[40858.436229] {42}[Hardware Error]: event severity: recoverable +[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 +[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable +[40858.454204] {42}[Hardware Error]: section_type: ARM processor error +[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 +[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 +[40858.475041] {42}[Hardware Error]: running state: 0x1 +[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 +[40858.487456] {42}[Hardware Error]: Error info structure 0: +[40858.493013] {42}[Hardware Error]: num errors: 1 +[40858.497702] {42}[Hardware Error]: error_type: 0, cache error +[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 +[40858.509857] {42}[Hardware Error]: transaction type: Instruction +[40858.516109] {42}[Hardware Error]: cache level: 2 +[40858.521058] {42}[Hardware Error]: the error has not been corrected +[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered +``` + +## 4.3 内存错误注入 + + +使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 + + + +``` +./einj_mem_uc single +0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 +injecting ... +triggering ... +SIGBUS: addr = 0xffffabcb3400 +page not present +Test passed +``` + +BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=0(exception), cnt=0xa +MM Mem RAS handle,Intr:0 +Ch = 25810000 + |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 + |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 + |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 + |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 + |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 + |-ECCUSYN0~2:1FF,0,76 + |-SBRCTL:1C01591B,SBRSTS:0 +RasData->ExceptionEl: 0, UeCnt:0x1 +RTC: 2000-01-06 09:27:58 +Get SystemAddrss through mAddrTransProtocol start +Get SystemAddrss through mAddrTransProtocol end +s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 +Locate error dimm, Socket:0, Channel:2 Dimm:0 + core[8] mm(0) return: 0 +--handler(0) end +[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) +[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 +[40606.668367] {41}[Hardware Error]: event severity: recoverable +[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 +[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable +[40606.686342] {41}[Hardware Error]: section_type: memory error +[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) +[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 +[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 +[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC +[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered +``` + +## 4.4 rasdaemon日志读取 + + +rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 + + + +``` +[root@localhost ras-tools]# ras-mc-ctl --errors +Memory controller events: +1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +``` + +# 5. Q&A + + +Q:RAS机制是否需要BIOS支持? + + +A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 + + +  + + +Q: x86和ARM64的APEI是否一致? + + +A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 + + +  + + +Q: RAS注入的错误是真实的错误吗? + + +A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 + + +  + + +Q: rasdaemon日志查看是否有更易用的方法? + + +A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; + + + 最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 + + +  + + +Q: 可否使用mcelog? + + +A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 + + +  + + +Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? + + +A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 + + +  + + +Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? + + +A:需要检查是否是rasdaemon某些选项未开启。 + -- Gitee From 29c723318039d78d6dce9f8a08911aa1417c46c7 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Tue, 24 Dec 2024 13:39:30 +0800 Subject: [PATCH 029/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/test\347\256\200\344\273\213.md" | 4 - ...72\345\210\266\347\256\200\344\273\213.md" | 340 ------------------ 2 files changed, 344 deletions(-) delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/test\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/test\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/test\347\256\200\344\273\213.md" deleted file mode 100644 index 7fe512a0..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/test\347\256\200\344\273\213.md" +++ /dev/null @@ -1,4 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" deleted file mode 100644 index c3c53de1..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" +++ /dev/null @@ -1,340 +0,0 @@ -# 1. RAS机制简介 - - -为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: - - -**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。  - - -**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 - - -**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 - - -RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 - - -# 2. RAS机制错误处理流程 - - -RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 - - -RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_0.png) - - -# 3. RAS机制评测流程 - - -RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 - - -APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 - - -从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 - - -如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 - - - - -| | -| --- | -| 0 Processor Correctable -1 Processor Uncorrectable non-fatal -2 Processor Uncorrectable fatal | -| 3 Memory Correctable -4 Memory Uncorrectable non-fatal -5 Memory Uncorrectable fatal | -| 6 PCI Express Correctable -7 PCI Express Uncorrectable non-fatal -8 PCI Express Uncorrectable fatal | -| 9 Platform Correctable -10 Platform Uncorrectable non-fatal -11 Platform Uncorrectable fatal | - - -Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_1.png) - - -上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 - - -错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: - - -1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 - - -2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 - - -3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 - - -# 4. CPU及内存错误注入演示 - - -CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 - - -##  4.1 环境准备 - - -### 1. 安装EINJ模块 - - -使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html - - -此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 - - -### 2. 安装RAS测试工具 - - -直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git - - -### 3. 安装rasdaemon - - -先安装依赖包yum install sqlite perl-DBD-SQLite - - -使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git - - - -``` -autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make -make install -``` - -在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 - - - -``` - -d, --disable 禁用RAS事件并退出 - -e, --enable 使能RAS事件并退出 - -f, --foreground 前台运行 - -r, --record 通过sqlite3记录事件 -``` - -rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 - - -查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 - - -本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 - - -## 4.2 CPU错误注入 - - -本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 - - -使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 - - - -``` -./einj_mem_uc core_non_fatal -0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 -injecting ... -triggering ... -Manually take page offline -Test passed -``` - -使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 - - - - -| | | | | -| --- | --- | --- | --- | -| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined.  | - - -可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=17(core), cnt=0xd -INFO: RAS reg: -INFO: fr = 10a9a2 -INFO: status = 44800007 -INFO: addr = 8007e0e95fffb7ff -INFO: misc0 = 4 -INFO: misc1 = 0 -RTC: 2000-01-06 09:32:09 - core[8] mm(17) return: 0 ---handler(17) end -[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error -[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 -[40858.436229] {42}[Hardware Error]: event severity: recoverable -[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 -[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable -[40858.454204] {42}[Hardware Error]: section_type: ARM processor error -[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 -[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 -[40858.475041] {42}[Hardware Error]: running state: 0x1 -[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 -[40858.487456] {42}[Hardware Error]: Error info structure 0: -[40858.493013] {42}[Hardware Error]: num errors: 1 -[40858.497702] {42}[Hardware Error]: error_type: 0, cache error -[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 -[40858.509857] {42}[Hardware Error]: transaction type: Instruction -[40858.516109] {42}[Hardware Error]: cache level: 2 -[40858.521058] {42}[Hardware Error]: the error has not been corrected -[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered -``` - -## 4.3 内存错误注入 - - -使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 - - - -``` -./einj_mem_uc single -0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 -injecting ... -triggering ... -SIGBUS: addr = 0xffffabcb3400 -page not present -Test passed -``` - -BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=0(exception), cnt=0xa -MM Mem RAS handle,Intr:0 -Ch = 25810000 - |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 - |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 - |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 - |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 - |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 - |-ECCUSYN0~2:1FF,0,76 - |-SBRCTL:1C01591B,SBRSTS:0 -RasData->ExceptionEl: 0, UeCnt:0x1 -RTC: 2000-01-06 09:27:58 -Get SystemAddrss through mAddrTransProtocol start -Get SystemAddrss through mAddrTransProtocol end -s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 -Locate error dimm, Socket:0, Channel:2 Dimm:0 - core[8] mm(0) return: 0 ---handler(0) end -[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) -[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 -[40606.668367] {41}[Hardware Error]: event severity: recoverable -[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 -[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable -[40606.686342] {41}[Hardware Error]: section_type: memory error -[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) -[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 -[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 -[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC -[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered -``` - -## 4.4 rasdaemon日志读取 - - -rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 - - - -``` -[root@localhost ras-tools]# ras-mc-ctl --errors -Memory controller events: -1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -``` - -# 5. Q&A - - -Q:RAS机制是否需要BIOS支持? - - -A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 - - -  - - -Q: x86和ARM64的APEI是否一致? - - -A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 - - -  - - -Q: RAS注入的错误是真实的错误吗? - - -A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 - - -  - - -Q: rasdaemon日志查看是否有更易用的方法? - - -A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; - - - 最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 - - -  - - -Q: 可否使用mcelog? - - -A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 - - -  - - -Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? - - -A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 - - -  - - -Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? - - -A:需要检查是否是rasdaemon某些选项未开启。 - -- Gitee From d27e9231d9f7b6755dba0da3f2976c8affe4c5cd Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Tue, 24 Dec 2024 14:11:32 +0800 Subject: [PATCH 030/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=952?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/test\347\256\200\344\273\213.md" | 3 + ...72\345\210\266\347\256\200\344\273\213.md" | 339 ++++++++++++++++++ 2 files changed, 342 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test/test\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test/test\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test/test\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test/test\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" new file mode 100644 index 00000000..2a362235 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" @@ -0,0 +1,339 @@ +# 1. RAS机制简介 + + +为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: + + +**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 + + +**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 + + +**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 + + +RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 + + +# 2. RAS机制错误处理流程 + + +RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 + + +RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_0.png) + + +# 3. RAS机制评测流程 + + +RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 + + +APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 + + +从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 + + +如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 + + + + +| | +| --- | +| 0 Processor Correctable +1 Processor Uncorrectable non-fatal +2 Processor Uncorrectable fatal | +| 3 Memory Correctable +4 Memory Uncorrectable non-fatal +5 Memory Uncorrectable fatal | +| 6 PCI Express Correctable +7 PCI Express Uncorrectable non-fatal +8 PCI Express Uncorrectable fatal | +| 9 Platform Correctable +10 Platform Uncorrectable non-fatal +11 Platform Uncorrectable fatal | + + +Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_1.png) + + +上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 + + +错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: + + +1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 + + +2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 + + +3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 + + +# 4. CPU及内存错误注入演示 + + +CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 + + +## 4.1 环境准备 + + +### 1. 安装EINJ模块 + + +使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html + + +此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 + + +### 2. 安装RAS测试工具 + + +直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git + + +### 3. 安装rasdaemon + + +先安装依赖包yum install sqlite perl-DBD-SQLite + + +使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git + + + +``` +autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make +make install +``` + +在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 + + + +``` + -d, --disable 禁用RAS事件并退出 + -e, --enable 使能RAS事件并退出 + -f, --foreground 前台运行 + -r, --record 通过sqlite3记录事件 +``` + +rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 + + +查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 + + +本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 + + +## 4.2 CPU错误注入 + + +本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 + + +使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 + + + +``` +./einj_mem_uc core_non_fatal +0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 +injecting ... +triggering ... +Manually take page offline +Test passed +``` + +使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 + + + + +| | | | | +| --- | --- | --- | --- | +| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | + + +可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=17(core), cnt=0xd +INFO: RAS reg: +INFO: fr = 10a9a2 +INFO: status = 44800007 +INFO: addr = 8007e0e95fffb7ff +INFO: misc0 = 4 +INFO: misc1 = 0 +RTC: 2000-01-06 09:32:09 + core[8] mm(17) return: 0 +--handler(17) end +[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error +[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 +[40858.436229] {42}[Hardware Error]: event severity: recoverable +[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 +[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable +[40858.454204] {42}[Hardware Error]: section_type: ARM processor error +[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 +[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 +[40858.475041] {42}[Hardware Error]: running state: 0x1 +[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 +[40858.487456] {42}[Hardware Error]: Error info structure 0: +[40858.493013] {42}[Hardware Error]: num errors: 1 +[40858.497702] {42}[Hardware Error]: error_type: 0, cache error +[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 +[40858.509857] {42}[Hardware Error]: transaction type: Instruction +[40858.516109] {42}[Hardware Error]: cache level: 2 +[40858.521058] {42}[Hardware Error]: the error has not been corrected +[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered +``` + +## 4.3 内存错误注入 + + +使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 + + + +``` +./einj_mem_uc single +0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 +injecting ... +triggering ... +SIGBUS: addr = 0xffffabcb3400 +page not present +Test passed +``` + +BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=0(exception), cnt=0xa +MM Mem RAS handle,Intr:0 +Ch = 25810000 + |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 + |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 + |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 + |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 + |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 + |-ECCUSYN0~2:1FF,0,76 + |-SBRCTL:1C01591B,SBRSTS:0 +RasData->ExceptionEl: 0, UeCnt:0x1 +RTC: 2000-01-06 09:27:58 +Get SystemAddrss through mAddrTransProtocol start +Get SystemAddrss through mAddrTransProtocol end +s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 +Locate error dimm, Socket:0, Channel:2 Dimm:0 + core[8] mm(0) return: 0 +--handler(0) end +[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) +[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 +[40606.668367] {41}[Hardware Error]: event severity: recoverable +[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 +[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable +[40606.686342] {41}[Hardware Error]: section_type: memory error +[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) +[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 +[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 +[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC +[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered +``` + +## 4.4 rasdaemon日志读取 + + +rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 + + + +``` +[root@localhost ras-tools]# ras-mc-ctl --errors +Memory controller events: +1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +``` + +# 5. Q&A + + +Q:RAS机制是否需要BIOS支持? + + +A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 + + + + + +Q: x86和ARM64的APEI是否一致? + + +A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 + + + + + +Q: RAS注入的错误是真实的错误吗? + + +A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 + + + + + +Q: rasdaemon日志查看是否有更易用的方法? + + +A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; + + +最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 + + + + + +Q: 可否使用mcelog? + + +A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 + + + + + +Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? + + +A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 + + + + + +Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? + + +A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file -- Gitee From ad9173cb46b9676f1b885e01428e5d8ad103be74 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Tue, 24 Dec 2024 14:55:45 +0800 Subject: [PATCH 031/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=953?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/test\347\256\200\344\273\213.md" | 0 ...50\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename "sig/Anolis\350\277\201\347\247\273SIG/content/test/test\347\256\200\344\273\213.md" => "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/test\347\256\200\344\273\213.md" (100%) rename "sig/Anolis\350\277\201\347\247\273SIG/content/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" => "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" (100%) diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test/test\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/test\347\256\200\344\273\213.md" similarity index 100% rename from "sig/Anolis\350\277\201\347\247\273SIG/content/test/test\347\256\200\344\273\213.md" rename to "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/test\347\256\200\344\273\213.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" similarity index 100% rename from "sig/Anolis\350\277\201\347\247\273SIG/content/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" rename to "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" -- Gitee From 6f195c2964c08591b6a89a071fc3d2d527f9dff5 Mon Sep 17 00:00:00 2001 From: yutt Date: Tue, 24 Dec 2024 09:17:28 +0000 Subject: [PATCH 032/135] =?UTF-8?q?=E4=BF=AE=E6=94=B9TC=5FProject.yml?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yutt --- TC_Project.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/TC_Project.yml b/TC_Project.yml index acccaea7..5d2905b6 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -26,4 +26,12 @@ projects: dir_or_files: - sig/AI/content - sig/AI/sig-info.yaml - - sig/AI/README.md \ No newline at end of file + - sig/AI/README.md + - project_id: TC2024080413 + repos: + - repo_name: openanolis-copy/community3 + dir_or_files: + - sig/AI/content + - sig/AI/sig-info.yaml + - sig/AI/README.md + \ No newline at end of file -- Gitee From e228adc208bc2e95efb7bf5e60d6a6dd8fe1a96a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E6=9D=B0?= <136683138@qq.com> Date: Wed, 25 Dec 2024 02:35:42 +0000 Subject: [PATCH 033/135] 11 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 钟杰 <136683138@qq.com> --- "sig/\351\222\237\346\235\26023/sig-info.yaml" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/sig/\351\222\237\346\235\26023/sig-info.yaml" "b/sig/\351\222\237\346\235\26023/sig-info.yaml" index 96fdc31b..b89ed8ac 100644 --- "a/sig/\351\222\237\346\235\26023/sig-info.yaml" +++ "b/sig/\351\222\237\346\235\26023/sig-info.yaml" @@ -6,7 +6,8 @@ en_description: hello! mailing_list: meeting_url: maintainers: - +- openanolis_id: hgj_admin + gitee_id: logic_jie contributors: -- Gitee From 2d3b78f49c219876cfa93fc3d630d78458844c26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E6=9D=B0?= <136683138@qq.com> Date: Wed, 25 Dec 2024 02:50:16 +0000 Subject: [PATCH 034/135] 111 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 钟杰 <136683138@qq.com> --- "sig/\351\222\237\346\235\26023/README.md" | 3 ++- "sig/\351\222\237\346\235\26023/sig-info.yaml" | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git "a/sig/\351\222\237\346\235\26023/README.md" "b/sig/\351\222\237\346\235\26023/README.md" index f73dd741..ee6063bd 100644 --- "a/sig/\351\222\237\346\235\26023/README.md" +++ "b/sig/\351\222\237\346\235\26023/README.md" @@ -1 +1,2 @@ -1212 \ No newline at end of file +1212 +232323 diff --git "a/sig/\351\222\237\346\235\26023/sig-info.yaml" "b/sig/\351\222\237\346\235\26023/sig-info.yaml" index b89ed8ac..589f4d54 100644 --- "a/sig/\351\222\237\346\235\26023/sig-info.yaml" +++ "b/sig/\351\222\237\346\235\26023/sig-info.yaml" @@ -9,6 +9,8 @@ maintainers: - openanolis_id: hgj_admin gitee_id: logic_jie +- openanolis_id: + gitee_id: contributors: -- Gitee From 2239c0e3955fb287ca42dc749b0102cd9f83fc1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E6=9D=B0?= <136683138@qq.com> Date: Wed, 25 Dec 2024 03:03:05 +0000 Subject: [PATCH 035/135] 2323 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 钟杰 <136683138@qq.com> --- "sig/\351\222\237\346\235\26023/content/13/222.md" | 1 + "sig/\351\222\237\346\235\26023/content/13/aaaa.md" | 0 "sig/\351\222\237\346\235\26023/content/13/bbbb.md" | 0 "sig/\351\222\237\346\235\26023/content/13/zzzzz.md" | 0 4 files changed, 1 insertion(+) create mode 100644 "sig/\351\222\237\346\235\26023/content/13/222.md" create mode 100644 "sig/\351\222\237\346\235\26023/content/13/aaaa.md" create mode 100644 "sig/\351\222\237\346\235\26023/content/13/bbbb.md" create mode 100644 "sig/\351\222\237\346\235\26023/content/13/zzzzz.md" diff --git "a/sig/\351\222\237\346\235\26023/content/13/222.md" "b/sig/\351\222\237\346\235\26023/content/13/222.md" new file mode 100644 index 00000000..85972fc6 --- /dev/null +++ "b/sig/\351\222\237\346\235\26023/content/13/222.md" @@ -0,0 +1 @@ +2323 \ No newline at end of file diff --git "a/sig/\351\222\237\346\235\26023/content/13/aaaa.md" "b/sig/\351\222\237\346\235\26023/content/13/aaaa.md" new file mode 100644 index 00000000..e69de29b diff --git "a/sig/\351\222\237\346\235\26023/content/13/bbbb.md" "b/sig/\351\222\237\346\235\26023/content/13/bbbb.md" new file mode 100644 index 00000000..e69de29b diff --git "a/sig/\351\222\237\346\235\26023/content/13/zzzzz.md" "b/sig/\351\222\237\346\235\26023/content/13/zzzzz.md" new file mode 100644 index 00000000..e69de29b -- Gitee From e0bad85d02d240e31ac39d02a401ca490608d39b Mon Sep 17 00:00:00 2001 From: yutt Date: Wed, 25 Dec 2024 08:25:49 +0000 Subject: [PATCH 036/135] =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yutt --- TC_Project.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/TC_Project.yml b/TC_Project.yml index 5d2905b6..4b286bbd 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -27,11 +27,11 @@ projects: - sig/AI/content - sig/AI/sig-info.yaml - sig/AI/README.md - - project_id: TC2024080413 - repos: - - repo_name: openanolis-copy/community3 - dir_or_files: - - sig/AI/content - - sig/AI/sig-info.yaml - - sig/AI/README.md + - project_id: TC2024080413 + repos: + - repo_name: openanolis-copy/community3 + dir_or_files: + - sig/AI/content + - sig/AI/sig-info.yaml + - sig/AI/README.md \ No newline at end of file -- Gitee From 52775eeb4a08b2100ece6dd35522ce8faaf68626 Mon Sep 17 00:00:00 2001 From: yutt Date: Thu, 26 Dec 2024 05:40:57 +0000 Subject: [PATCH 037/135] =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E7=9A=84TC=5FProject?= =?UTF-8?q?.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yutt --- TC_Project.yml | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/TC_Project.yml b/TC_Project.yml index 4b286bbd..2b200c49 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -26,12 +26,8 @@ projects: dir_or_files: - sig/AI/content - sig/AI/sig-info.yaml - - sig/AI/README.md - - project_id: TC2024080413 - repos: - - repo_name: openanolis-copy/community3 - dir_or_files: - - sig/AI/content - - sig/AI/sig-info.yaml - - sig/AI/README.md - \ No newline at end of file + - sig/AI/README.md + - project_id: TC2024080812 + repos: + - repo_name: anolis/anolis7.9els + dir_or_files: \ No newline at end of file -- Gitee From ea7799356df43972df76eced2d8382613ad23847 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E6=9D=B0?= <136683138@qq.com> Date: Thu, 26 Dec 2024 08:44:23 +0000 Subject: [PATCH 038/135] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 钟杰 <136683138@qq.com> --- TC_Project.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/TC_Project.yml b/TC_Project.yml index 2b200c49..a1ccc366 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -1,4 +1,8 @@ projects: + - project_id: TC2024121001 + repos: + - repo_name: love-sky/docs + dir_or_files: - project_id: TC2024080201 repos: - repo_name: openanolis-copy/community -- Gitee From c7049855017fa696d4ac32c150e643cc25a0350f Mon Sep 17 00:00:00 2001 From: yutt Date: Thu, 26 Dec 2024 08:50:57 +0000 Subject: [PATCH 039/135] TC2024080403 Signed-off-by: yutt --- "sig/AI/content/\346\234\210\346\212\245/202212.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/sig/AI/content/\346\234\210\346\212\245/202212.md" "b/sig/AI/content/\346\234\210\346\212\245/202212.md" index 88250c90..5ace9b5c 100644 --- "a/sig/AI/content/\346\234\210\346\212\245/202212.md" +++ "b/sig/AI/content/\346\234\210\346\212\245/202212.md" @@ -80,3 +80,6 @@ # 运营活动 - [浪潮信息正式发布基于龙蜥 Anolis OS 的服务器操作系统 Inspur KOS](https://openanolis.cn/news/726244284765327879)。 - 于2022.12.24 举办了“[龙蜥走进系列活动之走进浪潮信息 MeetUp](https://mp.weixin.qq.com/s?__biz=Mzg4MTMyMTUwMQ==&mid=2247510368&idx=1&sn=95a1d511b32670f8388745682483046a&chksm=cf655a12f812d30494be938d7bf8a46b7244711c8fb75f44e8379ab261b1fd4aeb1c8bb0805e&scene=21#wechat_redirect)",并成立了浪潮信息龙蜥联合实验室,致力于共建龙蜥社区的软硬件兼容性生态、标准建设和技术创新等。 + + +TC2024080403 \ No newline at end of file -- Gitee From 4dd8bf5cbcba4f00bd717ff479927de7bab74bd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E6=9D=B0?= <136683138@qq.com> Date: Thu, 26 Dec 2024 08:59:03 +0000 Subject: [PATCH 040/135] 11 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 钟杰 <136683138@qq.com> --- TC_Project.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TC_Project.yml b/TC_Project.yml index a1ccc366..90fdd77d 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -1,7 +1,7 @@ projects: - project_id: TC2024121001 repos: - - repo_name: love-sky/docs + - repo_name: openanolis-copy/docs dir_or_files: - project_id: TC2024080201 repos: -- Gitee From 642b86c68dbadd131a049fccb06e425d3e8e25f3 Mon Sep 17 00:00:00 2001 From: yutt Date: Fri, 27 Dec 2024 06:50:21 +0000 Subject: [PATCH 041/135] =?UTF-8?q?=E6=B7=BB=E5=8A=A0docs=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yutt --- TC_Project.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/TC_Project.yml b/TC_Project.yml index 90fdd77d..d80437bb 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -34,4 +34,11 @@ projects: - project_id: TC2024080812 repos: - repo_name: anolis/anolis7.9els - dir_or_files: \ No newline at end of file + dir_or_files: + + - project_id: TC2024121821 + repos: + - repo_name: openanolis-copy/docs + dir_or_files: + - DEVELOPER_DOCS + - CESHI_ZHUANYONG/CI及代码门禁/日志文件 \ No newline at end of file -- Gitee From 167a6ebb74e322c64c5a6b27b759f298a53b7c7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E6=9D=B0?= <136683138@qq.com> Date: Fri, 27 Dec 2024 10:13:06 +0000 Subject: [PATCH 042/135] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 钟杰 <136683138@qq.com> --- TC_Project.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TC_Project.yml b/TC_Project.yml index d80437bb..95ee4825 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -1,5 +1,5 @@ projects: - - project_id: TC2024121001 + - project_id: TC2024121101 repos: - repo_name: openanolis-copy/docs dir_or_files: -- Gitee From 71da883505de1318b281d2cc8e2bd711a50d38a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E6=9D=B0?= <136683138@qq.com> Date: Mon, 30 Dec 2024 01:49:37 +0000 Subject: [PATCH 043/135] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 钟杰 <136683138@qq.com> --- TC_Project.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/TC_Project.yml b/TC_Project.yml index 95ee4825..0a3347f8 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -3,6 +3,7 @@ projects: repos: - repo_name: openanolis-copy/docs dir_or_files: + - dddd - project_id: TC2024080201 repos: - repo_name: openanolis-copy/community -- Gitee From 44bc006150c170216c7d7f56ce0363a4acff145b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E6=9D=B0?= <136683138@qq.com> Date: Mon, 30 Dec 2024 02:37:55 +0000 Subject: [PATCH 044/135] 23 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 钟杰 <136683138@qq.com> --- TC_Project.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TC_Project.yml b/TC_Project.yml index 0a3347f8..4aaf0565 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -1,5 +1,5 @@ projects: - - project_id: TC2024121101 + - project_id: TC20241211011 repos: - repo_name: openanolis-copy/docs dir_or_files: -- Gitee From 6eb4a2b70b6d17396befb9a3b9b4744b5c64b6a1 Mon Sep 17 00:00:00 2001 From: yutt Date: Mon, 30 Dec 2024 06:00:04 +0000 Subject: [PATCH 045/135] =?UTF-8?q?=E6=9D=83=E9=87=8D=E4=B8=BA0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yutt --- TC_Project.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TC_Project.yml b/TC_Project.yml index 4aaf0565..867dc916 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -1,5 +1,5 @@ projects: - - project_id: TC20241211011 + - project_id: TC2024121101 repos: - repo_name: openanolis-copy/docs dir_or_files: @@ -37,7 +37,7 @@ projects: - repo_name: anolis/anolis7.9els dir_or_files: - - project_id: TC2024121821 + - project_id: TC2024120001 repos: - repo_name: openanolis-copy/docs dir_or_files: -- Gitee From 3b7ff7d61f1c34f1cbe53c24944872a9e2f223a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E6=9D=B0?= <136683138@qq.com> Date: Mon, 30 Dec 2024 06:14:59 +0000 Subject: [PATCH 046/135] 23 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 钟杰 <136683138@qq.com> --- TC_Project.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TC_Project.yml b/TC_Project.yml index 867dc916..394b0e8f 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -3,7 +3,7 @@ projects: repos: - repo_name: openanolis-copy/docs dir_or_files: - - dddd + - dddd2323 - project_id: TC2024080201 repos: - repo_name: openanolis-copy/community -- Gitee From 2b090ce161b005e2443b2f03a18f04f54bb05e9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E6=9D=B0?= <136683138@qq.com> Date: Mon, 30 Dec 2024 07:04:23 +0000 Subject: [PATCH 047/135] =?UTF-8?q?=E6=96=B0=E5=A2=9ETC=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 钟杰 <136683138@qq.com> --- TC_Project.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/TC_Project.yml b/TC_Project.yml index 394b0e8f..3d09c1f0 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -1,4 +1,8 @@ projects: + - project_id: TC2024120502 + repos: + - repo_name: openanolis-copy/docs + dir_or_files: - project_id: TC2024121101 repos: - repo_name: openanolis-copy/docs -- Gitee From 5655594afcab70821e2e100f1c6ca3d38ecb9d0b Mon Sep 17 00:00:00 2001 From: yutt Date: Tue, 31 Dec 2024 09:43:44 +0000 Subject: [PATCH 048/135] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yutt --- TC_Project.yml | 49 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/TC_Project.yml b/TC_Project.yml index 3d09c1f0..316351aa 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -35,15 +35,56 @@ projects: dir_or_files: - sig/AI/content - sig/AI/sig-info.yaml - - sig/AI/README.md + - sig/AI/README.md - project_id: TC2024080812 repos: - repo_name: anolis/anolis7.9els dir_or_files: - + - project_id: TC2024120001 repos: - repo_name: openanolis-copy/docs dir_or_files: - - DEVELOPER_DOCS - - CESHI_ZHUANYONG/CI及代码门禁/日志文件 \ No newline at end of file + - DEVELOPER_DOCS + - CESHI_ZHUANYONG/CI及代码门禁/日志文件 + + - project_id: TC2024110203 + repos: + - repo_name: anolis/qemu-kvm + dir_or_files: + - project_id: TC2024120201 + repos: + - repo_name: src-anolis-os/qemu + dir_or_files: + - project_id: TC2024120201 + repos: + - repo_name: src-anolis-os/edk2 + dir_or_files: + - project_id: TC2024120201 + repos: + - repo_name: src-anolis-os/libvirt + dir_or_files: + - project_id: TC2024120201 + repos: + - repo_name: src-anolis-os/gcc + dir_or_files: + - project_id: TC2024120201 + repos: + - repo_name: src-anolis-os/tpm2-tools + dir_or_files: + - project_id: TC2024120201 + repos: + - repo_name: src-anolis-os/tpm2-abrmd + dir_or_files: + - project_id: TC2024110202 + repos: + - repo_name: anolis/cloud-kernel + dir_or_files: + - project_id: TC2024110202 + repos: + - repo_name: src-anolis-sig/cloud-kernel + dir_or_files: + - project_id: TC2024080205 + repos: + - repo_name: anolis/anolis-container + dir_or_files: \ No newline at end of file -- Gitee From c21b5500ea50d274376cc8ab6074456108035415 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Fri, 3 Jan 2025 13:37:01 +0800 Subject: [PATCH 049/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=954?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/test\347\256\200\344\273\213.md" | 3 - ...72\345\210\266\347\256\200\344\273\213.md" | 339 ------------------ 2 files changed, 342 deletions(-) delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/test\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/test\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/test\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/test\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" deleted file mode 100644 index 2a362235..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/test/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" +++ /dev/null @@ -1,339 +0,0 @@ -# 1. RAS机制简介 - - -为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: - - -**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 - - -**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 - - -**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 - - -RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 - - -# 2. RAS机制错误处理流程 - - -RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 - - -RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_0.png) - - -# 3. RAS机制评测流程 - - -RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 - - -APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 - - -从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 - - -如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 - - - - -| | -| --- | -| 0 Processor Correctable -1 Processor Uncorrectable non-fatal -2 Processor Uncorrectable fatal | -| 3 Memory Correctable -4 Memory Uncorrectable non-fatal -5 Memory Uncorrectable fatal | -| 6 PCI Express Correctable -7 PCI Express Uncorrectable non-fatal -8 PCI Express Uncorrectable fatal | -| 9 Platform Correctable -10 Platform Uncorrectable non-fatal -11 Platform Uncorrectable fatal | - - -Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_1.png) - - -上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 - - -错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: - - -1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 - - -2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 - - -3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 - - -# 4. CPU及内存错误注入演示 - - -CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 - - -## 4.1 环境准备 - - -### 1. 安装EINJ模块 - - -使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html - - -此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 - - -### 2. 安装RAS测试工具 - - -直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git - - -### 3. 安装rasdaemon - - -先安装依赖包yum install sqlite perl-DBD-SQLite - - -使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git - - - -``` -autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make -make install -``` - -在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 - - - -``` - -d, --disable 禁用RAS事件并退出 - -e, --enable 使能RAS事件并退出 - -f, --foreground 前台运行 - -r, --record 通过sqlite3记录事件 -``` - -rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 - - -查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 - - -本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 - - -## 4.2 CPU错误注入 - - -本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 - - -使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 - - - -``` -./einj_mem_uc core_non_fatal -0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 -injecting ... -triggering ... -Manually take page offline -Test passed -``` - -使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 - - - - -| | | | | -| --- | --- | --- | --- | -| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | - - -可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=17(core), cnt=0xd -INFO: RAS reg: -INFO: fr = 10a9a2 -INFO: status = 44800007 -INFO: addr = 8007e0e95fffb7ff -INFO: misc0 = 4 -INFO: misc1 = 0 -RTC: 2000-01-06 09:32:09 - core[8] mm(17) return: 0 ---handler(17) end -[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error -[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 -[40858.436229] {42}[Hardware Error]: event severity: recoverable -[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 -[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable -[40858.454204] {42}[Hardware Error]: section_type: ARM processor error -[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 -[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 -[40858.475041] {42}[Hardware Error]: running state: 0x1 -[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 -[40858.487456] {42}[Hardware Error]: Error info structure 0: -[40858.493013] {42}[Hardware Error]: num errors: 1 -[40858.497702] {42}[Hardware Error]: error_type: 0, cache error -[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 -[40858.509857] {42}[Hardware Error]: transaction type: Instruction -[40858.516109] {42}[Hardware Error]: cache level: 2 -[40858.521058] {42}[Hardware Error]: the error has not been corrected -[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered -``` - -## 4.3 内存错误注入 - - -使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 - - - -``` -./einj_mem_uc single -0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 -injecting ... -triggering ... -SIGBUS: addr = 0xffffabcb3400 -page not present -Test passed -``` - -BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=0(exception), cnt=0xa -MM Mem RAS handle,Intr:0 -Ch = 25810000 - |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 - |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 - |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 - |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 - |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 - |-ECCUSYN0~2:1FF,0,76 - |-SBRCTL:1C01591B,SBRSTS:0 -RasData->ExceptionEl: 0, UeCnt:0x1 -RTC: 2000-01-06 09:27:58 -Get SystemAddrss through mAddrTransProtocol start -Get SystemAddrss through mAddrTransProtocol end -s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 -Locate error dimm, Socket:0, Channel:2 Dimm:0 - core[8] mm(0) return: 0 ---handler(0) end -[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) -[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 -[40606.668367] {41}[Hardware Error]: event severity: recoverable -[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 -[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable -[40606.686342] {41}[Hardware Error]: section_type: memory error -[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) -[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 -[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 -[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC -[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered -``` - -## 4.4 rasdaemon日志读取 - - -rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 - - - -``` -[root@localhost ras-tools]# ras-mc-ctl --errors -Memory controller events: -1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -``` - -# 5. Q&A - - -Q:RAS机制是否需要BIOS支持? - - -A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 - - - - - -Q: x86和ARM64的APEI是否一致? - - -A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 - - - - - -Q: RAS注入的错误是真实的错误吗? - - -A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 - - - - - -Q: rasdaemon日志查看是否有更易用的方法? - - -A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; - - -最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 - - - - - -Q: 可否使用mcelog? - - -A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 - - - - - -Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? - - -A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 - - - - - -Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? - - -A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file -- Gitee From 01080fb61b7b2e475c6fb54aa89c81989f84f53f Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Fri, 3 Jan 2025 13:59:17 +0800 Subject: [PATCH 050/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=955?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ab\347\256\200\344\273\213.md" | 3 + .../aghgb\347\256\200\344\273\213.md" | 3 + ...72\345\210\266\347\256\200\344\273\213.md" | 339 ++++++++++++++++++ .../\347\256\200\344\273\213.md" | 3 + .../\347\256\200\344\273\2132.md" | 3 + .../ab\347\256\200\344\273\213.md" | 3 + .../aghgb\347\256\200\344\273\213.md" | 3 + ...72\345\210\266\347\256\200\344\273\213.md" | 339 ++++++++++++++++++ .../\347\256\200\344\273\213.md" | 3 + .../\347\256\200\344\273\2132.md" | 3 + .../ab\347\256\200\344\273\213.md" | 3 + .../aghgb\347\256\200\344\273\213.md" | 3 + ...72\345\210\266\347\256\200\344\273\213.md" | 339 ++++++++++++++++++ .../\347\256\200\344\273\213.md" | 3 + .../\347\256\200\344\273\2132.md" | 3 + 15 files changed, 1053 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" new file mode 100644 index 00000000..2a362235 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" @@ -0,0 +1,339 @@ +# 1. RAS机制简介 + + +为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: + + +**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 + + +**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 + + +**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 + + +RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 + + +# 2. RAS机制错误处理流程 + + +RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 + + +RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_0.png) + + +# 3. RAS机制评测流程 + + +RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 + + +APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 + + +从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 + + +如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 + + + + +| | +| --- | +| 0 Processor Correctable +1 Processor Uncorrectable non-fatal +2 Processor Uncorrectable fatal | +| 3 Memory Correctable +4 Memory Uncorrectable non-fatal +5 Memory Uncorrectable fatal | +| 6 PCI Express Correctable +7 PCI Express Uncorrectable non-fatal +8 PCI Express Uncorrectable fatal | +| 9 Platform Correctable +10 Platform Uncorrectable non-fatal +11 Platform Uncorrectable fatal | + + +Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_1.png) + + +上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 + + +错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: + + +1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 + + +2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 + + +3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 + + +# 4. CPU及内存错误注入演示 + + +CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 + + +## 4.1 环境准备 + + +### 1. 安装EINJ模块 + + +使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html + + +此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 + + +### 2. 安装RAS测试工具 + + +直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git + + +### 3. 安装rasdaemon + + +先安装依赖包yum install sqlite perl-DBD-SQLite + + +使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git + + + +``` +autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make +make install +``` + +在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 + + + +``` + -d, --disable 禁用RAS事件并退出 + -e, --enable 使能RAS事件并退出 + -f, --foreground 前台运行 + -r, --record 通过sqlite3记录事件 +``` + +rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 + + +查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 + + +本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 + + +## 4.2 CPU错误注入 + + +本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 + + +使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 + + + +``` +./einj_mem_uc core_non_fatal +0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 +injecting ... +triggering ... +Manually take page offline +Test passed +``` + +使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 + + + + +| | | | | +| --- | --- | --- | --- | +| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | + + +可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=17(core), cnt=0xd +INFO: RAS reg: +INFO: fr = 10a9a2 +INFO: status = 44800007 +INFO: addr = 8007e0e95fffb7ff +INFO: misc0 = 4 +INFO: misc1 = 0 +RTC: 2000-01-06 09:32:09 + core[8] mm(17) return: 0 +--handler(17) end +[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error +[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 +[40858.436229] {42}[Hardware Error]: event severity: recoverable +[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 +[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable +[40858.454204] {42}[Hardware Error]: section_type: ARM processor error +[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 +[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 +[40858.475041] {42}[Hardware Error]: running state: 0x1 +[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 +[40858.487456] {42}[Hardware Error]: Error info structure 0: +[40858.493013] {42}[Hardware Error]: num errors: 1 +[40858.497702] {42}[Hardware Error]: error_type: 0, cache error +[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 +[40858.509857] {42}[Hardware Error]: transaction type: Instruction +[40858.516109] {42}[Hardware Error]: cache level: 2 +[40858.521058] {42}[Hardware Error]: the error has not been corrected +[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered +``` + +## 4.3 内存错误注入 + + +使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 + + + +``` +./einj_mem_uc single +0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 +injecting ... +triggering ... +SIGBUS: addr = 0xffffabcb3400 +page not present +Test passed +``` + +BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=0(exception), cnt=0xa +MM Mem RAS handle,Intr:0 +Ch = 25810000 + |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 + |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 + |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 + |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 + |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 + |-ECCUSYN0~2:1FF,0,76 + |-SBRCTL:1C01591B,SBRSTS:0 +RasData->ExceptionEl: 0, UeCnt:0x1 +RTC: 2000-01-06 09:27:58 +Get SystemAddrss through mAddrTransProtocol start +Get SystemAddrss through mAddrTransProtocol end +s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 +Locate error dimm, Socket:0, Channel:2 Dimm:0 + core[8] mm(0) return: 0 +--handler(0) end +[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) +[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 +[40606.668367] {41}[Hardware Error]: event severity: recoverable +[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 +[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable +[40606.686342] {41}[Hardware Error]: section_type: memory error +[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) +[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 +[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 +[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC +[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered +``` + +## 4.4 rasdaemon日志读取 + + +rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 + + + +``` +[root@localhost ras-tools]# ras-mc-ctl --errors +Memory controller events: +1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +``` + +# 5. Q&A + + +Q:RAS机制是否需要BIOS支持? + + +A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 + + + + + +Q: x86和ARM64的APEI是否一致? + + +A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 + + + + + +Q: RAS注入的错误是真实的错误吗? + + +A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 + + + + + +Q: rasdaemon日志查看是否有更易用的方法? + + +A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; + + +最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 + + + + + +Q: 可否使用mcelog? + + +A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 + + + + + +Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? + + +A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 + + + + + +Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? + + +A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" new file mode 100644 index 00000000..2a362235 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" @@ -0,0 +1,339 @@ +# 1. RAS机制简介 + + +为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: + + +**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 + + +**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 + + +**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 + + +RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 + + +# 2. RAS机制错误处理流程 + + +RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 + + +RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_0.png) + + +# 3. RAS机制评测流程 + + +RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 + + +APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 + + +从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 + + +如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 + + + + +| | +| --- | +| 0 Processor Correctable +1 Processor Uncorrectable non-fatal +2 Processor Uncorrectable fatal | +| 3 Memory Correctable +4 Memory Uncorrectable non-fatal +5 Memory Uncorrectable fatal | +| 6 PCI Express Correctable +7 PCI Express Uncorrectable non-fatal +8 PCI Express Uncorrectable fatal | +| 9 Platform Correctable +10 Platform Uncorrectable non-fatal +11 Platform Uncorrectable fatal | + + +Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_1.png) + + +上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 + + +错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: + + +1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 + + +2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 + + +3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 + + +# 4. CPU及内存错误注入演示 + + +CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 + + +## 4.1 环境准备 + + +### 1. 安装EINJ模块 + + +使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html + + +此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 + + +### 2. 安装RAS测试工具 + + +直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git + + +### 3. 安装rasdaemon + + +先安装依赖包yum install sqlite perl-DBD-SQLite + + +使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git + + + +``` +autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make +make install +``` + +在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 + + + +``` + -d, --disable 禁用RAS事件并退出 + -e, --enable 使能RAS事件并退出 + -f, --foreground 前台运行 + -r, --record 通过sqlite3记录事件 +``` + +rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 + + +查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 + + +本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 + + +## 4.2 CPU错误注入 + + +本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 + + +使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 + + + +``` +./einj_mem_uc core_non_fatal +0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 +injecting ... +triggering ... +Manually take page offline +Test passed +``` + +使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 + + + + +| | | | | +| --- | --- | --- | --- | +| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | + + +可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=17(core), cnt=0xd +INFO: RAS reg: +INFO: fr = 10a9a2 +INFO: status = 44800007 +INFO: addr = 8007e0e95fffb7ff +INFO: misc0 = 4 +INFO: misc1 = 0 +RTC: 2000-01-06 09:32:09 + core[8] mm(17) return: 0 +--handler(17) end +[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error +[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 +[40858.436229] {42}[Hardware Error]: event severity: recoverable +[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 +[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable +[40858.454204] {42}[Hardware Error]: section_type: ARM processor error +[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 +[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 +[40858.475041] {42}[Hardware Error]: running state: 0x1 +[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 +[40858.487456] {42}[Hardware Error]: Error info structure 0: +[40858.493013] {42}[Hardware Error]: num errors: 1 +[40858.497702] {42}[Hardware Error]: error_type: 0, cache error +[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 +[40858.509857] {42}[Hardware Error]: transaction type: Instruction +[40858.516109] {42}[Hardware Error]: cache level: 2 +[40858.521058] {42}[Hardware Error]: the error has not been corrected +[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered +``` + +## 4.3 内存错误注入 + + +使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 + + + +``` +./einj_mem_uc single +0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 +injecting ... +triggering ... +SIGBUS: addr = 0xffffabcb3400 +page not present +Test passed +``` + +BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=0(exception), cnt=0xa +MM Mem RAS handle,Intr:0 +Ch = 25810000 + |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 + |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 + |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 + |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 + |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 + |-ECCUSYN0~2:1FF,0,76 + |-SBRCTL:1C01591B,SBRSTS:0 +RasData->ExceptionEl: 0, UeCnt:0x1 +RTC: 2000-01-06 09:27:58 +Get SystemAddrss through mAddrTransProtocol start +Get SystemAddrss through mAddrTransProtocol end +s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 +Locate error dimm, Socket:0, Channel:2 Dimm:0 + core[8] mm(0) return: 0 +--handler(0) end +[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) +[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 +[40606.668367] {41}[Hardware Error]: event severity: recoverable +[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 +[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable +[40606.686342] {41}[Hardware Error]: section_type: memory error +[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) +[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 +[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 +[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC +[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered +``` + +## 4.4 rasdaemon日志读取 + + +rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 + + + +``` +[root@localhost ras-tools]# ras-mc-ctl --errors +Memory controller events: +1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +``` + +# 5. Q&A + + +Q:RAS机制是否需要BIOS支持? + + +A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 + + + + + +Q: x86和ARM64的APEI是否一致? + + +A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 + + + + + +Q: RAS注入的错误是真实的错误吗? + + +A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 + + + + + +Q: rasdaemon日志查看是否有更易用的方法? + + +A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; + + +最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 + + + + + +Q: 可否使用mcelog? + + +A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 + + + + + +Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? + + +A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 + + + + + +Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? + + +A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" new file mode 100644 index 00000000..2a362235 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" @@ -0,0 +1,339 @@ +# 1. RAS机制简介 + + +为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: + + +**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 + + +**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 + + +**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 + + +RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 + + +# 2. RAS机制错误处理流程 + + +RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 + + +RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_0.png) + + +# 3. RAS机制评测流程 + + +RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 + + +APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 + + +从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 + + +如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 + + + + +| | +| --- | +| 0 Processor Correctable +1 Processor Uncorrectable non-fatal +2 Processor Uncorrectable fatal | +| 3 Memory Correctable +4 Memory Uncorrectable non-fatal +5 Memory Uncorrectable fatal | +| 6 PCI Express Correctable +7 PCI Express Uncorrectable non-fatal +8 PCI Express Uncorrectable fatal | +| 9 Platform Correctable +10 Platform Uncorrectable non-fatal +11 Platform Uncorrectable fatal | + + +Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_1.png) + + +上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 + + +错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: + + +1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 + + +2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 + + +3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 + + +# 4. CPU及内存错误注入演示 + + +CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 + + +## 4.1 环境准备 + + +### 1. 安装EINJ模块 + + +使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html + + +此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 + + +### 2. 安装RAS测试工具 + + +直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git + + +### 3. 安装rasdaemon + + +先安装依赖包yum install sqlite perl-DBD-SQLite + + +使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git + + + +``` +autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make +make install +``` + +在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 + + + +``` + -d, --disable 禁用RAS事件并退出 + -e, --enable 使能RAS事件并退出 + -f, --foreground 前台运行 + -r, --record 通过sqlite3记录事件 +``` + +rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 + + +查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 + + +本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 + + +## 4.2 CPU错误注入 + + +本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 + + +使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 + + + +``` +./einj_mem_uc core_non_fatal +0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 +injecting ... +triggering ... +Manually take page offline +Test passed +``` + +使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 + + + + +| | | | | +| --- | --- | --- | --- | +| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | + + +可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=17(core), cnt=0xd +INFO: RAS reg: +INFO: fr = 10a9a2 +INFO: status = 44800007 +INFO: addr = 8007e0e95fffb7ff +INFO: misc0 = 4 +INFO: misc1 = 0 +RTC: 2000-01-06 09:32:09 + core[8] mm(17) return: 0 +--handler(17) end +[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error +[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 +[40858.436229] {42}[Hardware Error]: event severity: recoverable +[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 +[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable +[40858.454204] {42}[Hardware Error]: section_type: ARM processor error +[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 +[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 +[40858.475041] {42}[Hardware Error]: running state: 0x1 +[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 +[40858.487456] {42}[Hardware Error]: Error info structure 0: +[40858.493013] {42}[Hardware Error]: num errors: 1 +[40858.497702] {42}[Hardware Error]: error_type: 0, cache error +[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 +[40858.509857] {42}[Hardware Error]: transaction type: Instruction +[40858.516109] {42}[Hardware Error]: cache level: 2 +[40858.521058] {42}[Hardware Error]: the error has not been corrected +[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered +``` + +## 4.3 内存错误注入 + + +使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 + + + +``` +./einj_mem_uc single +0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 +injecting ... +triggering ... +SIGBUS: addr = 0xffffabcb3400 +page not present +Test passed +``` + +BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=0(exception), cnt=0xa +MM Mem RAS handle,Intr:0 +Ch = 25810000 + |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 + |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 + |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 + |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 + |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 + |-ECCUSYN0~2:1FF,0,76 + |-SBRCTL:1C01591B,SBRSTS:0 +RasData->ExceptionEl: 0, UeCnt:0x1 +RTC: 2000-01-06 09:27:58 +Get SystemAddrss through mAddrTransProtocol start +Get SystemAddrss through mAddrTransProtocol end +s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 +Locate error dimm, Socket:0, Channel:2 Dimm:0 + core[8] mm(0) return: 0 +--handler(0) end +[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) +[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 +[40606.668367] {41}[Hardware Error]: event severity: recoverable +[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 +[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable +[40606.686342] {41}[Hardware Error]: section_type: memory error +[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) +[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 +[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 +[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC +[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered +``` + +## 4.4 rasdaemon日志读取 + + +rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 + + + +``` +[root@localhost ras-tools]# ras-mc-ctl --errors +Memory controller events: +1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +``` + +# 5. Q&A + + +Q:RAS机制是否需要BIOS支持? + + +A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 + + + + + +Q: x86和ARM64的APEI是否一致? + + +A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 + + + + + +Q: RAS注入的错误是真实的错误吗? + + +A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 + + + + + +Q: rasdaemon日志查看是否有更易用的方法? + + +A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; + + +最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 + + + + + +Q: 可否使用mcelog? + + +A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 + + + + + +Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? + + +A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 + + + + + +Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? + + +A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file -- Gitee From 709da5f7a263b62eb2da45be6cbc10df154a28a4 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Fri, 3 Jan 2025 14:43:35 +0800 Subject: [PATCH 051/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=956?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ab\347\256\200\344\273\213.md" | 0 .../aghgb\347\256\200\344\273\213.md" | 3 + .../gb\347\256\200\344\273\213.md" | 3 + ...72\345\210\266\347\256\200\344\273\213.md" | 339 ++++++++++++++++++ .../\347\256\200\344\273\213.md" | 3 + .../\347\256\200\344\273\2132.md" | 3 + .../ab\347\256\200\344\273\213.md" | 3 + .../aghgb\347\256\200\344\273\213.md" | 3 + .../gb\347\256\200\344\273\213.md" | 3 + ...72\345\210\266\347\256\200\344\273\213.md" | 339 ++++++++++++++++++ .../\347\256\200\344\273\213.md" | 3 + .../\347\256\200\344\273\2132.md" | 3 + .../gb\347\256\200\344\273\213.md" | 3 + .../aghgb\347\256\200\344\273\213.md" | 3 +- ...72\345\210\266\347\256\200\344\273\213.md" | 6 - 15 files changed, 710 insertions(+), 7 deletions(-) rename "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\213.md" => "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" (100%) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\347\256\200\344\273\2132.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" similarity index 100% rename from "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\213.md" rename to "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" new file mode 100644 index 00000000..2a362235 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" @@ -0,0 +1,339 @@ +# 1. RAS机制简介 + + +为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: + + +**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 + + +**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 + + +**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 + + +RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 + + +# 2. RAS机制错误处理流程 + + +RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 + + +RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_0.png) + + +# 3. RAS机制评测流程 + + +RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 + + +APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 + + +从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 + + +如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 + + + + +| | +| --- | +| 0 Processor Correctable +1 Processor Uncorrectable non-fatal +2 Processor Uncorrectable fatal | +| 3 Memory Correctable +4 Memory Uncorrectable non-fatal +5 Memory Uncorrectable fatal | +| 6 PCI Express Correctable +7 PCI Express Uncorrectable non-fatal +8 PCI Express Uncorrectable fatal | +| 9 Platform Correctable +10 Platform Uncorrectable non-fatal +11 Platform Uncorrectable fatal | + + +Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_1.png) + + +上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 + + +错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: + + +1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 + + +2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 + + +3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 + + +# 4. CPU及内存错误注入演示 + + +CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 + + +## 4.1 环境准备 + + +### 1. 安装EINJ模块 + + +使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html + + +此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 + + +### 2. 安装RAS测试工具 + + +直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git + + +### 3. 安装rasdaemon + + +先安装依赖包yum install sqlite perl-DBD-SQLite + + +使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git + + + +``` +autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make +make install +``` + +在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 + + + +``` + -d, --disable 禁用RAS事件并退出 + -e, --enable 使能RAS事件并退出 + -f, --foreground 前台运行 + -r, --record 通过sqlite3记录事件 +``` + +rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 + + +查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 + + +本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 + + +## 4.2 CPU错误注入 + + +本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 + + +使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 + + + +``` +./einj_mem_uc core_non_fatal +0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 +injecting ... +triggering ... +Manually take page offline +Test passed +``` + +使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 + + + + +| | | | | +| --- | --- | --- | --- | +| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | + + +可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=17(core), cnt=0xd +INFO: RAS reg: +INFO: fr = 10a9a2 +INFO: status = 44800007 +INFO: addr = 8007e0e95fffb7ff +INFO: misc0 = 4 +INFO: misc1 = 0 +RTC: 2000-01-06 09:32:09 + core[8] mm(17) return: 0 +--handler(17) end +[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error +[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 +[40858.436229] {42}[Hardware Error]: event severity: recoverable +[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 +[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable +[40858.454204] {42}[Hardware Error]: section_type: ARM processor error +[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 +[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 +[40858.475041] {42}[Hardware Error]: running state: 0x1 +[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 +[40858.487456] {42}[Hardware Error]: Error info structure 0: +[40858.493013] {42}[Hardware Error]: num errors: 1 +[40858.497702] {42}[Hardware Error]: error_type: 0, cache error +[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 +[40858.509857] {42}[Hardware Error]: transaction type: Instruction +[40858.516109] {42}[Hardware Error]: cache level: 2 +[40858.521058] {42}[Hardware Error]: the error has not been corrected +[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered +``` + +## 4.3 内存错误注入 + + +使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 + + + +``` +./einj_mem_uc single +0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 +injecting ... +triggering ... +SIGBUS: addr = 0xffffabcb3400 +page not present +Test passed +``` + +BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=0(exception), cnt=0xa +MM Mem RAS handle,Intr:0 +Ch = 25810000 + |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 + |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 + |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 + |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 + |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 + |-ECCUSYN0~2:1FF,0,76 + |-SBRCTL:1C01591B,SBRSTS:0 +RasData->ExceptionEl: 0, UeCnt:0x1 +RTC: 2000-01-06 09:27:58 +Get SystemAddrss through mAddrTransProtocol start +Get SystemAddrss through mAddrTransProtocol end +s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 +Locate error dimm, Socket:0, Channel:2 Dimm:0 + core[8] mm(0) return: 0 +--handler(0) end +[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) +[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 +[40606.668367] {41}[Hardware Error]: event severity: recoverable +[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 +[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable +[40606.686342] {41}[Hardware Error]: section_type: memory error +[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) +[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 +[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 +[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC +[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered +``` + +## 4.4 rasdaemon日志读取 + + +rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 + + + +``` +[root@localhost ras-tools]# ras-mc-ctl --errors +Memory controller events: +1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +``` + +# 5. Q&A + + +Q:RAS机制是否需要BIOS支持? + + +A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 + + + + + +Q: x86和ARM64的APEI是否一致? + + +A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 + + + + + +Q: RAS注入的错误是真实的错误吗? + + +A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 + + + + + +Q: rasdaemon日志查看是否有更易用的方法? + + +A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; + + +最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 + + + + + +Q: 可否使用mcelog? + + +A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 + + + + + +Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? + + +A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 + + + + + +Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? + + +A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\347\256\200\344\273\2132.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\347\256\200\344\273\2132.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\347\256\200\344\273\2132.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" new file mode 100644 index 00000000..2a362235 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" @@ -0,0 +1,339 @@ +# 1. RAS机制简介 + + +为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: + + +**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 + + +**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 + + +**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 + + +RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 + + +# 2. RAS机制错误处理流程 + + +RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 + + +RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_0.png) + + +# 3. RAS机制评测流程 + + +RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 + + +APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 + + +从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 + + +如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 + + + + +| | +| --- | +| 0 Processor Correctable +1 Processor Uncorrectable non-fatal +2 Processor Uncorrectable fatal | +| 3 Memory Correctable +4 Memory Uncorrectable non-fatal +5 Memory Uncorrectable fatal | +| 6 PCI Express Correctable +7 PCI Express Uncorrectable non-fatal +8 PCI Express Uncorrectable fatal | +| 9 Platform Correctable +10 Platform Uncorrectable non-fatal +11 Platform Uncorrectable fatal | + + +Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_1.png) + + +上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 + + +错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: + + +1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 + + +2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 + + +3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 + + +# 4. CPU及内存错误注入演示 + + +CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 + + +## 4.1 环境准备 + + +### 1. 安装EINJ模块 + + +使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html + + +此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 + + +### 2. 安装RAS测试工具 + + +直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git + + +### 3. 安装rasdaemon + + +先安装依赖包yum install sqlite perl-DBD-SQLite + + +使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git + + + +``` +autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make +make install +``` + +在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 + + + +``` + -d, --disable 禁用RAS事件并退出 + -e, --enable 使能RAS事件并退出 + -f, --foreground 前台运行 + -r, --record 通过sqlite3记录事件 +``` + +rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 + + +查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 + + +本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 + + +## 4.2 CPU错误注入 + + +本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 + + +使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 + + + +``` +./einj_mem_uc core_non_fatal +0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 +injecting ... +triggering ... +Manually take page offline +Test passed +``` + +使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 + + + + +| | | | | +| --- | --- | --- | --- | +| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | + + +可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=17(core), cnt=0xd +INFO: RAS reg: +INFO: fr = 10a9a2 +INFO: status = 44800007 +INFO: addr = 8007e0e95fffb7ff +INFO: misc0 = 4 +INFO: misc1 = 0 +RTC: 2000-01-06 09:32:09 + core[8] mm(17) return: 0 +--handler(17) end +[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error +[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 +[40858.436229] {42}[Hardware Error]: event severity: recoverable +[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 +[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable +[40858.454204] {42}[Hardware Error]: section_type: ARM processor error +[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 +[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 +[40858.475041] {42}[Hardware Error]: running state: 0x1 +[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 +[40858.487456] {42}[Hardware Error]: Error info structure 0: +[40858.493013] {42}[Hardware Error]: num errors: 1 +[40858.497702] {42}[Hardware Error]: error_type: 0, cache error +[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 +[40858.509857] {42}[Hardware Error]: transaction type: Instruction +[40858.516109] {42}[Hardware Error]: cache level: 2 +[40858.521058] {42}[Hardware Error]: the error has not been corrected +[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered +``` + +## 4.3 内存错误注入 + + +使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 + + + +``` +./einj_mem_uc single +0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 +injecting ... +triggering ... +SIGBUS: addr = 0xffffabcb3400 +page not present +Test passed +``` + +BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=0(exception), cnt=0xa +MM Mem RAS handle,Intr:0 +Ch = 25810000 + |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 + |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 + |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 + |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 + |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 + |-ECCUSYN0~2:1FF,0,76 + |-SBRCTL:1C01591B,SBRSTS:0 +RasData->ExceptionEl: 0, UeCnt:0x1 +RTC: 2000-01-06 09:27:58 +Get SystemAddrss through mAddrTransProtocol start +Get SystemAddrss through mAddrTransProtocol end +s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 +Locate error dimm, Socket:0, Channel:2 Dimm:0 + core[8] mm(0) return: 0 +--handler(0) end +[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) +[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 +[40606.668367] {41}[Hardware Error]: event severity: recoverable +[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 +[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable +[40606.686342] {41}[Hardware Error]: section_type: memory error +[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) +[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 +[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 +[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC +[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered +``` + +## 4.4 rasdaemon日志读取 + + +rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 + + + +``` +[root@localhost ras-tools]# ras-mc-ctl --errors +Memory controller events: +1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +``` + +# 5. Q&A + + +Q:RAS机制是否需要BIOS支持? + + +A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 + + + + + +Q: x86和ARM64的APEI是否一致? + + +A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 + + + + + +Q: RAS注入的错误是真实的错误吗? + + +A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 + + + + + +Q: rasdaemon日志查看是否有更易用的方法? + + +A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; + + +最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 + + + + + +Q: 可否使用mcelog? + + +A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 + + + + + +Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? + + +A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 + + + + + +Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? + + +A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" index 110c33fe..cebdf6d0 100644 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" @@ -1,3 +1,4 @@ 本项目专注于: - 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file +- 龙蜥社区贡献的CVE案例分享。 +- 漏洞利用技术分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" index 2a362235..9a33a7d1 100644 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" @@ -31,12 +31,6 @@ RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线) # 3. RAS机制评测流程 -RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 - - -APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 - - 从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 -- Gitee From ae491f81baddc8e4b944c09462f5e3097a7897c0 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Fri, 3 Jan 2025 14:46:21 +0800 Subject: [PATCH 052/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=957?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aghgb\347\256\200\344\273\213.md" | 4 - .../ab\347\256\200\344\273\213.md" | 3 - .../aghgb\347\256\200\344\273\213.md" | 3 - ...72\345\210\266\347\256\200\344\273\213.md" | 333 ------------------ .../\347\256\200\344\273\213.md" | 3 - .../\347\256\200\344\273\2132.md" | 3 - 6 files changed, 349 deletions(-) delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" deleted file mode 100644 index cebdf6d0..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" +++ /dev/null @@ -1,4 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 -- 漏洞利用技术分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" deleted file mode 100644 index 9a33a7d1..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" +++ /dev/null @@ -1,333 +0,0 @@ -# 1. RAS机制简介 - - -为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: - - -**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 - - -**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 - - -**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 - - -RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 - - -# 2. RAS机制错误处理流程 - - -RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 - - -RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_0.png) - - -# 3. RAS机制评测流程 - - -从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 - - -如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 - - - - -| | -| --- | -| 0 Processor Correctable -1 Processor Uncorrectable non-fatal -2 Processor Uncorrectable fatal | -| 3 Memory Correctable -4 Memory Uncorrectable non-fatal -5 Memory Uncorrectable fatal | -| 6 PCI Express Correctable -7 PCI Express Uncorrectable non-fatal -8 PCI Express Uncorrectable fatal | -| 9 Platform Correctable -10 Platform Uncorrectable non-fatal -11 Platform Uncorrectable fatal | - - -Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_1.png) - - -上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 - - -错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: - - -1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 - - -2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 - - -3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 - - -# 4. CPU及内存错误注入演示 - - -CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 - - -## 4.1 环境准备 - - -### 1. 安装EINJ模块 - - -使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html - - -此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 - - -### 2. 安装RAS测试工具 - - -直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git - - -### 3. 安装rasdaemon - - -先安装依赖包yum install sqlite perl-DBD-SQLite - - -使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git - - - -``` -autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make -make install -``` - -在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 - - - -``` - -d, --disable 禁用RAS事件并退出 - -e, --enable 使能RAS事件并退出 - -f, --foreground 前台运行 - -r, --record 通过sqlite3记录事件 -``` - -rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 - - -查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 - - -本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 - - -## 4.2 CPU错误注入 - - -本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 - - -使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 - - - -``` -./einj_mem_uc core_non_fatal -0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 -injecting ... -triggering ... -Manually take page offline -Test passed -``` - -使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 - - - - -| | | | | -| --- | --- | --- | --- | -| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | - - -可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=17(core), cnt=0xd -INFO: RAS reg: -INFO: fr = 10a9a2 -INFO: status = 44800007 -INFO: addr = 8007e0e95fffb7ff -INFO: misc0 = 4 -INFO: misc1 = 0 -RTC: 2000-01-06 09:32:09 - core[8] mm(17) return: 0 ---handler(17) end -[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error -[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 -[40858.436229] {42}[Hardware Error]: event severity: recoverable -[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 -[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable -[40858.454204] {42}[Hardware Error]: section_type: ARM processor error -[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 -[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 -[40858.475041] {42}[Hardware Error]: running state: 0x1 -[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 -[40858.487456] {42}[Hardware Error]: Error info structure 0: -[40858.493013] {42}[Hardware Error]: num errors: 1 -[40858.497702] {42}[Hardware Error]: error_type: 0, cache error -[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 -[40858.509857] {42}[Hardware Error]: transaction type: Instruction -[40858.516109] {42}[Hardware Error]: cache level: 2 -[40858.521058] {42}[Hardware Error]: the error has not been corrected -[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered -``` - -## 4.3 内存错误注入 - - -使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 - - - -``` -./einj_mem_uc single -0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 -injecting ... -triggering ... -SIGBUS: addr = 0xffffabcb3400 -page not present -Test passed -``` - -BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=0(exception), cnt=0xa -MM Mem RAS handle,Intr:0 -Ch = 25810000 - |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 - |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 - |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 - |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 - |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 - |-ECCUSYN0~2:1FF,0,76 - |-SBRCTL:1C01591B,SBRSTS:0 -RasData->ExceptionEl: 0, UeCnt:0x1 -RTC: 2000-01-06 09:27:58 -Get SystemAddrss through mAddrTransProtocol start -Get SystemAddrss through mAddrTransProtocol end -s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 -Locate error dimm, Socket:0, Channel:2 Dimm:0 - core[8] mm(0) return: 0 ---handler(0) end -[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) -[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 -[40606.668367] {41}[Hardware Error]: event severity: recoverable -[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 -[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable -[40606.686342] {41}[Hardware Error]: section_type: memory error -[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) -[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 -[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 -[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC -[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered -``` - -## 4.4 rasdaemon日志读取 - - -rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 - - - -``` -[root@localhost ras-tools]# ras-mc-ctl --errors -Memory controller events: -1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -``` - -# 5. Q&A - - -Q:RAS机制是否需要BIOS支持? - - -A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 - - - - - -Q: x86和ARM64的APEI是否一致? - - -A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 - - - - - -Q: RAS注入的错误是真实的错误吗? - - -A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 - - - - - -Q: rasdaemon日志查看是否有更易用的方法? - - -A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; - - -最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 - - - - - -Q: 可否使用mcelog? - - -A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 - - - - - -Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? - - -A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 - - - - - -Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? - - -A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\277\231\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file -- Gitee From 90ec03b793be761b0d8a1c1006e369266286b676 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Fri, 3 Jan 2025 16:14:12 +0800 Subject: [PATCH 053/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=957?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ab\347\256\200\344\273\213.md" | 3 - .../aghgb\347\256\200\344\273\213.md" | 3 - .../gb\347\256\200\344\273\213.md" | 3 - ...72\345\210\266\347\256\200\344\273\213.md" | 339 ------ .../\347\256\200\344\273\213.md" | 3 - .../\347\256\200\344\273\2132.md" | 3 - .../ab\347\256\200\344\273\213.md" | 3 - .../aghgb\347\256\200\344\273\213.md" | 3 - .../gb\347\256\200\344\273\213.md" | 3 - ...72\345\210\266\347\256\200\344\273\213.md" | 339 ------ .../\347\256\200\344\273\213.md" | 3 - .../\347\256\200\344\273\2132.md" | 3 - .../Release_Notes/ANCK_4.19_ReleaseNote.md" | 130 -- .../Release_Notes/ANCK_5.10_ReleaseNote.md" | 117 -- .../ab\347\256\200\344\273\213.md" | 3 - .../aghgb\347\256\200\344\273\213.md" | 3 - .../gb\347\256\200\344\273\213.md" | 3 - ...72\345\210\266\347\256\200\344\273\213.md" | 339 ------ .../\347\256\200\344\273\213.md" | 3 - .../\347\256\200\344\273\2132.md" | 3 - ...56\345\244\215\350\256\260\345\275\225.md" | 76 -- ...71\347\233\256\347\256\200\344\273\213.md" | 4 - ...43\347\240\201\345\210\206\346\236\220.md" | 641 ---------- ...trace_osnoise_\346\200\273\350\247\210.md" | 179 --- ...43\347\240\201\345\210\206\346\236\220.md" | 641 ---------- ...4\232_osnoise_\346\200\273\350\247\210.md" | 179 --- ...43\347\240\201\345\210\206\346\236\220.md" | 558 --------- ...43\347\240\201\345\210\206\346\236\220.md" | 210 ---- ...43\347\240\201\345\210\206\346\236\220.md" | 558 --------- ...43\347\240\201\345\210\206\346\236\220.md" | 210 ---- ...57\346\214\201\350\241\245\344\270\201.md" | 197 --- .../Pstore\346\200\273\350\247\210.md" | 366 ------ ...03\346\265\213\345\267\245\345\205\267.md" | 88 -- ...71\347\233\256\347\256\200\344\273\213.md" | 2 - ...61\345\212\250\345\210\227\350\241\250.md" | 0 ...45\212\250spec\350\247\204\350\214\203.md" | 104 -- ...21\350\200\205\346\214\207\345\215\227.md" | 185 --- ...45\344\270\201\350\247\204\350\214\203.md" | 48 - ...13\350\257\225\347\224\263\350\257\267.md" | 6 - ...06\346\210\220\347\224\263\350\257\267.md" | 6 - ...5\225\350\277\233\345\205\245Anolis_OS.md" | 53 - ...71\347\233\256\347\256\200\344\273\213.md" | 14 - ...72\345\210\266\347\256\200\344\273\213.md" | 340 ------ ...72\347\272\277\346\216\250\350\215\220.md" | 182 --- ...45\345\217\243\344\273\213\347\273\215.md" | 1028 ---------------- ...00\346\234\257\346\226\271\346\241\210.md" | 444 ------- ...71\347\233\256\347\256\200\344\273\213.md" | 4 - .../ab\347\256\200\344\273\213.md" | 3 - ...72\345\210\266\347\256\200\344\273\213.md" | 339 ------ .../\347\256\200\344\273\2132.md" | 3 - ...13\350\257\225\346\212\245\345\221\212.md" | 449 ------- ...50\346\210\267\346\211\213\345\206\214.md" | 374 ------ ...50\347\203\255\345\215\207\347\272\247.md" | 223 ---- ...346\272\220\351\232\224\347\246\273FAQ.md" | 0 ...00\346\234\257\344\273\213\347\273\215.md" | 169 --- ...77\347\224\250\347\256\200\344\273\213.md" | 1080 ----------------- 56 files changed, 10272 deletions(-) delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\347\256\200\344\273\2132.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/Release_Notes/ANCK_4.19_ReleaseNote.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/Release_Notes/ANCK_5.10_ReleaseNote.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270CVE\344\270\223\351\241\271/ANCK_CVE\344\277\256\345\244\215\350\256\260\345\275\225.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270CVE\344\270\223\351\241\271/\351\241\271\347\233\256\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace_osnoise_\344\273\243\347\240\201\345\210\206\346\236\220.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace_osnoise_\346\200\273\350\247\210.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace\357\274\232_osnoise_\344\273\243\347\240\201\345\210\206\346\236\220.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace\357\274\232_osnoise_\346\200\273\350\247\210.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257CONSOLE_\344\273\243\347\240\201\345\210\206\346\236\220.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257\357\274\232CONSOLE_\344\273\243\347\240\201\345\210\206\346\236\220.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257\357\274\232DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\244\232\345\220\216\347\253\257\346\224\257\346\214\201\350\241\245\344\270\201.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\346\200\273\350\247\210.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/\345\237\272\344\272\216pstore\347\232\204kdump\350\260\203\346\265\213\345\267\245\345\205\267.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/\351\241\271\347\233\256\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/Anolis_OS\346\224\257\346\214\201\347\232\204\351\251\261\345\212\250\345\210\227\350\241\250.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250spec\350\247\204\350\214\203.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250\350\241\245\344\270\201\350\247\204\350\214\203.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\345\246\202\344\275\225\346\217\220\344\272\244\347\241\254\344\273\266\345\205\274\345\256\271\346\200\247\346\265\213\350\257\225\347\224\263\350\257\267.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\345\246\202\344\275\225\346\217\220\344\272\244\347\254\254\344\270\211\346\226\271\351\251\261\345\212\250\351\233\206\346\210\220\347\224\263\350\257\267.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\347\254\254\344\270\211\346\226\271\351\251\261\345\212\250\345\246\202\344\275\225\350\277\233\345\205\245Anolis_OS.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\351\241\271\347\233\256\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK_ARM64_RAS\346\234\272\345\210\266\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK_boot_cmdline_\345\237\272\347\272\277\346\216\250\350\215\220.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK\345\206\205\346\240\270\345\212\237\350\203\275\344\270\216\346\216\245\345\217\243\344\273\213\347\273\215.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/datop\346\212\200\346\234\257\346\226\271\346\241\210.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/\351\241\271\347\233\256\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\347\241\254\350\265\204\346\272\220\351\232\224\347\246\273mpam\347\211\271\346\200\247\344\273\213\347\273\215/\351\276\231\350\234\245_ANCK_5.10_\345\200\232\345\244\251\345\271\263\345\217\260_MPAM_\346\265\213\350\257\225\346\212\245\345\221\212.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\347\241\254\350\265\204\346\272\220\351\232\224\347\246\273mpam\347\211\271\346\200\247\344\273\213\347\273\215/\351\276\231\350\234\245_ANCK_5.10_\345\200\232\345\244\251\345\271\263\345\217\260_MPAM_\347\224\250\346\210\267\346\211\213\345\206\214.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\260\203\345\272\246\345\231\250\347\203\255\345\215\207\347\272\247/Plugsched_\342\200\224\342\200\224_Linux_\345\206\205\346\240\270\350\260\203\345\272\246\345\231\250\347\203\255\345\215\207\347\272\247.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\350\265\204\346\272\220\351\232\224\347\246\273FAQ.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\351\276\231\350\234\245OS\350\265\204\346\272\220\351\232\224\347\246\273\346\212\200\346\234\257\344\273\213\347\273\215.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\351\276\231\350\234\245os\350\265\204\346\272\220\351\232\224\347\246\273\344\275\277\347\224\250\347\256\200\344\273\213.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" deleted file mode 100644 index 2a362235..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" +++ /dev/null @@ -1,339 +0,0 @@ -# 1. RAS机制简介 - - -为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: - - -**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 - - -**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 - - -**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 - - -RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 - - -# 2. RAS机制错误处理流程 - - -RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 - - -RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_0.png) - - -# 3. RAS机制评测流程 - - -RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 - - -APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 - - -从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 - - -如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 - - - - -| | -| --- | -| 0 Processor Correctable -1 Processor Uncorrectable non-fatal -2 Processor Uncorrectable fatal | -| 3 Memory Correctable -4 Memory Uncorrectable non-fatal -5 Memory Uncorrectable fatal | -| 6 PCI Express Correctable -7 PCI Express Uncorrectable non-fatal -8 PCI Express Uncorrectable fatal | -| 9 Platform Correctable -10 Platform Uncorrectable non-fatal -11 Platform Uncorrectable fatal | - - -Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_1.png) - - -上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 - - -错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: - - -1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 - - -2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 - - -3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 - - -# 4. CPU及内存错误注入演示 - - -CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 - - -## 4.1 环境准备 - - -### 1. 安装EINJ模块 - - -使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html - - -此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 - - -### 2. 安装RAS测试工具 - - -直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git - - -### 3. 安装rasdaemon - - -先安装依赖包yum install sqlite perl-DBD-SQLite - - -使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git - - - -``` -autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make -make install -``` - -在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 - - - -``` - -d, --disable 禁用RAS事件并退出 - -e, --enable 使能RAS事件并退出 - -f, --foreground 前台运行 - -r, --record 通过sqlite3记录事件 -``` - -rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 - - -查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 - - -本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 - - -## 4.2 CPU错误注入 - - -本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 - - -使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 - - - -``` -./einj_mem_uc core_non_fatal -0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 -injecting ... -triggering ... -Manually take page offline -Test passed -``` - -使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 - - - - -| | | | | -| --- | --- | --- | --- | -| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | - - -可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=17(core), cnt=0xd -INFO: RAS reg: -INFO: fr = 10a9a2 -INFO: status = 44800007 -INFO: addr = 8007e0e95fffb7ff -INFO: misc0 = 4 -INFO: misc1 = 0 -RTC: 2000-01-06 09:32:09 - core[8] mm(17) return: 0 ---handler(17) end -[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error -[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 -[40858.436229] {42}[Hardware Error]: event severity: recoverable -[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 -[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable -[40858.454204] {42}[Hardware Error]: section_type: ARM processor error -[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 -[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 -[40858.475041] {42}[Hardware Error]: running state: 0x1 -[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 -[40858.487456] {42}[Hardware Error]: Error info structure 0: -[40858.493013] {42}[Hardware Error]: num errors: 1 -[40858.497702] {42}[Hardware Error]: error_type: 0, cache error -[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 -[40858.509857] {42}[Hardware Error]: transaction type: Instruction -[40858.516109] {42}[Hardware Error]: cache level: 2 -[40858.521058] {42}[Hardware Error]: the error has not been corrected -[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered -``` - -## 4.3 内存错误注入 - - -使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 - - - -``` -./einj_mem_uc single -0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 -injecting ... -triggering ... -SIGBUS: addr = 0xffffabcb3400 -page not present -Test passed -``` - -BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=0(exception), cnt=0xa -MM Mem RAS handle,Intr:0 -Ch = 25810000 - |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 - |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 - |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 - |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 - |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 - |-ECCUSYN0~2:1FF,0,76 - |-SBRCTL:1C01591B,SBRSTS:0 -RasData->ExceptionEl: 0, UeCnt:0x1 -RTC: 2000-01-06 09:27:58 -Get SystemAddrss through mAddrTransProtocol start -Get SystemAddrss through mAddrTransProtocol end -s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 -Locate error dimm, Socket:0, Channel:2 Dimm:0 - core[8] mm(0) return: 0 ---handler(0) end -[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) -[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 -[40606.668367] {41}[Hardware Error]: event severity: recoverable -[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 -[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable -[40606.686342] {41}[Hardware Error]: section_type: memory error -[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) -[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 -[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 -[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC -[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered -``` - -## 4.4 rasdaemon日志读取 - - -rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 - - - -``` -[root@localhost ras-tools]# ras-mc-ctl --errors -Memory controller events: -1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -``` - -# 5. Q&A - - -Q:RAS机制是否需要BIOS支持? - - -A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 - - - - - -Q: x86和ARM64的APEI是否一致? - - -A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 - - - - - -Q: RAS注入的错误是真实的错误吗? - - -A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 - - - - - -Q: rasdaemon日志查看是否有更易用的方法? - - -A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; - - -最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 - - - - - -Q: 可否使用mcelog? - - -A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 - - - - - -Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? - - -A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 - - - - - -Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? - - -A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\347\256\200\344\273\2132.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\347\256\200\344\273\2132.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/1234a\346\265\213\350\257\225/\347\256\200\344\273\2132.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" deleted file mode 100644 index 2a362235..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" +++ /dev/null @@ -1,339 +0,0 @@ -# 1. RAS机制简介 - - -为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: - - -**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 - - -**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 - - -**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 - - -RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 - - -# 2. RAS机制错误处理流程 - - -RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 - - -RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_0.png) - - -# 3. RAS机制评测流程 - - -RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 - - -APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 - - -从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 - - -如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 - - - - -| | -| --- | -| 0 Processor Correctable -1 Processor Uncorrectable non-fatal -2 Processor Uncorrectable fatal | -| 3 Memory Correctable -4 Memory Uncorrectable non-fatal -5 Memory Uncorrectable fatal | -| 6 PCI Express Correctable -7 PCI Express Uncorrectable non-fatal -8 PCI Express Uncorrectable fatal | -| 9 Platform Correctable -10 Platform Uncorrectable non-fatal -11 Platform Uncorrectable fatal | - - -Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_1.png) - - -上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 - - -错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: - - -1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 - - -2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 - - -3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 - - -# 4. CPU及内存错误注入演示 - - -CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 - - -## 4.1 环境准备 - - -### 1. 安装EINJ模块 - - -使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html - - -此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 - - -### 2. 安装RAS测试工具 - - -直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git - - -### 3. 安装rasdaemon - - -先安装依赖包yum install sqlite perl-DBD-SQLite - - -使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git - - - -``` -autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make -make install -``` - -在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 - - - -``` - -d, --disable 禁用RAS事件并退出 - -e, --enable 使能RAS事件并退出 - -f, --foreground 前台运行 - -r, --record 通过sqlite3记录事件 -``` - -rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 - - -查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 - - -本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 - - -## 4.2 CPU错误注入 - - -本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 - - -使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 - - - -``` -./einj_mem_uc core_non_fatal -0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 -injecting ... -triggering ... -Manually take page offline -Test passed -``` - -使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 - - - - -| | | | | -| --- | --- | --- | --- | -| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | - - -可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=17(core), cnt=0xd -INFO: RAS reg: -INFO: fr = 10a9a2 -INFO: status = 44800007 -INFO: addr = 8007e0e95fffb7ff -INFO: misc0 = 4 -INFO: misc1 = 0 -RTC: 2000-01-06 09:32:09 - core[8] mm(17) return: 0 ---handler(17) end -[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error -[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 -[40858.436229] {42}[Hardware Error]: event severity: recoverable -[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 -[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable -[40858.454204] {42}[Hardware Error]: section_type: ARM processor error -[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 -[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 -[40858.475041] {42}[Hardware Error]: running state: 0x1 -[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 -[40858.487456] {42}[Hardware Error]: Error info structure 0: -[40858.493013] {42}[Hardware Error]: num errors: 1 -[40858.497702] {42}[Hardware Error]: error_type: 0, cache error -[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 -[40858.509857] {42}[Hardware Error]: transaction type: Instruction -[40858.516109] {42}[Hardware Error]: cache level: 2 -[40858.521058] {42}[Hardware Error]: the error has not been corrected -[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered -``` - -## 4.3 内存错误注入 - - -使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 - - - -``` -./einj_mem_uc single -0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 -injecting ... -triggering ... -SIGBUS: addr = 0xffffabcb3400 -page not present -Test passed -``` - -BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=0(exception), cnt=0xa -MM Mem RAS handle,Intr:0 -Ch = 25810000 - |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 - |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 - |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 - |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 - |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 - |-ECCUSYN0~2:1FF,0,76 - |-SBRCTL:1C01591B,SBRSTS:0 -RasData->ExceptionEl: 0, UeCnt:0x1 -RTC: 2000-01-06 09:27:58 -Get SystemAddrss through mAddrTransProtocol start -Get SystemAddrss through mAddrTransProtocol end -s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 -Locate error dimm, Socket:0, Channel:2 Dimm:0 - core[8] mm(0) return: 0 ---handler(0) end -[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) -[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 -[40606.668367] {41}[Hardware Error]: event severity: recoverable -[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 -[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable -[40606.686342] {41}[Hardware Error]: section_type: memory error -[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) -[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 -[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 -[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC -[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered -``` - -## 4.4 rasdaemon日志读取 - - -rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 - - - -``` -[root@localhost ras-tools]# ras-mc-ctl --errors -Memory controller events: -1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -``` - -# 5. Q&A - - -Q:RAS机制是否需要BIOS支持? - - -A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 - - - - - -Q: x86和ARM64的APEI是否一致? - - -A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 - - - - - -Q: RAS注入的错误是真实的错误吗? - - -A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 - - - - - -Q: rasdaemon日志查看是否有更易用的方法? - - -A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; - - -最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 - - - - - -Q: 可否使用mcelog? - - -A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 - - - - - -Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? - - -A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 - - - - - -Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? - - -A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\217\214\345\221\250\346\212\245/sadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/Release_Notes/ANCK_4.19_ReleaseNote.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/Release_Notes/ANCK_4.19_ReleaseNote.md" deleted file mode 100644 index e7a11105..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/Release_Notes/ANCK_4.19_ReleaseNote.md" +++ /dev/null @@ -1,130 +0,0 @@ -# 4.19.91-26.y - - -## 4.19.91-26 - - -发布时间:2022-05-24 - - -发布链接: - - -* -* - - -内核更新: - - -* 版本更新至 4.19.91-26 -* 重要内核缺陷及安全漏洞(CVE)修复 -* 龙蜥自研混部资源隔离特性Group Identity增加支持 -* 龙蜥自研多租户容器网络 QoS 隔离特性增强 -* 龙蜥自研冷 slab 内存监测与回收特性支持 -* 龙蜥自研 UKFEF 特性支持 -* Megaraid\_sas 设备驱动支持 -* virtio-net 支持 XDP Socket -* 基于 EROFS 实现 RAFS v6 格式支持 -* livepatch 增加 static key 支持 -* SMR zoned 设备支持 -* ext4 delalloc buffer写性能优化 -* Kunit 测试框架支持 -* ARM 架构支持 kdump crashkernel 分配4G以上内存 -* ARM 架构 CMN PMU 特性支持 -* perf c2c 功能支持 - - -## 4.19.91-26.1 - - -发布时间:2022-08-02 - - -发布链接: - - -* [https://anas.openanolis.cn/errata/detail/ANSA-2022:0602](https://anas.openanolis.cn/errata/detail/ANSA-2022:0603) -* - - -内核更新: - - -* 修复CVE: CVE-2022-32250 - - -## 4.19.91-26.2 - - -发布时间:2022-08-26 - - -发布链接: - - -* -* - - -内核更新: - - -* 修复CVE: CVE-2022-2586 - - -## 4.19.91-26.3 - - -发布时间:2022-09-02 - - -发布链接: - - -* -* - - -内核更新: - - -* 修复CVE: CVE-2022-2978 - - -## 4.19.91-26.4 - - -发布时间:2022-09-16 - - -发布链接: - - -* -* - - -内核更新: - - -* 修复CVE: CVE-2022-2639 - - -## 4.19.91-26.5 - - -发布时间:2022-10-11 - - -发布链接: - - -* -* - - -内核更新: - - -* 修复CVE: CVE-2022-3176 diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/Release_Notes/ANCK_5.10_ReleaseNote.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/Release_Notes/ANCK_5.10_ReleaseNote.md" deleted file mode 100644 index e5cb3fe2..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/Release_Notes/ANCK_5.10_ReleaseNote.md" +++ /dev/null @@ -1,117 +0,0 @@ -# 5.10.134-12.y - - -## 5.10.134-12 - - -发布时间: 2022-09-06 - - -发布链接: - - -内核更新: - - -* 内核升级到5.10.134 -* 重要的缺陷及安全漏洞修复 -* 支持倚天710处理器 -* 支持磐久M物理机 -* 优化在倚天平台上的基础性能 -* ARM64支持mpam特性 -* 增加AMD SEV热迁移能力的guest支持 -* ARM64 crashkernel支持预留4G以上内存 -* ARM64支持对kernel module的hotfix -* 支持ftrace osnoise tracer -* 支持 ext4 fast commit 特性,该特性对于 fsync 比较频繁的应用如 MySQL/PostgreSQL 数据库有比较明显的性能优化。相应的 e2fsprogs 版本更新至 1.46.0。 -* 支持网讯10GB网卡 - - -**龙蜥自研:** - - -* 支持datop监控NUMA跨node访问以及进程粒度内存冷热识别 -* 填充可执行二进制文件末尾2M未对齐部分,部分场景性能再提升2% -* 支持 XFS 16k 原子写特性,相比默认打开双写,有至多 50% 的性能提升,同时显著减少磁盘 IO。相应的 xfsprogs 和 mariadb 也更新至龙蜥 yum repo。相比硬件原子写方案,该方案至少有着以下优点: - - -a)基于 CoW 机制; - - -b)不依赖硬件; - - -c)无运行时 IO 链路配置依赖。 - - -另外,该优化效果可以与代码段大页特性叠加。 - - -使用手册: - - -* 支持 nydus + erofs over fscache 容器镜像加速。该特性由龙蜥社区贡献,于 5.19 合并到社区主线,并成为社区首个源生支持的容器镜像加速方案。相关技术博客: -* 支持 fd passthrough 和 fd attach 增强特性。其中 fd passthrough 能将常用场景的 IO 延迟降低到先前的 10%;fd attach 支持无损恢复 fuse 挂载点连接,提升生产环境的稳定性。 -* kidled支持匿名页、文件页以及slab的扫描。 -* 新增memory.use\_priority\_swap接口,支持按cgroup优先级进行内存swap。 -* SMC 新增 1-RTT、RDMA DIM 支持,优化 CQ 中断处理逻辑,数据路径 QPS 提升 40%。引入 SMC 自动化测试能力,修复数十个稳定性问题; - - -# 5.10.112-11.y - - -## 5.10.112-11 - - -发布时间: 2022-05-24 - - -内核更新: - - -* 内核升级到5.10.112 -* 重要的缺陷及安全漏洞修复 -* Hygon CSV2 机密虚拟机特性支持 -* 龙蜥自研代码多副本特性支持 -* 龙蜥自研代码大页功能增强 -* Guest OS 256 CPU 支持 -* 龙蜥自研Kfence增加内存越界 UAF等问题定位能力 -* SMC 多场景下吞吐、时延性能提升,建联速度提升,多个稳定性、兼容问题修复; -* Intel SPR 特性支持:AMX, vAMX, IPI虚拟化,Intel\_idle, TDX 等 -* AMD 特性支持:SEV-ES,ptdma,CPU frequency, k10temp, EDAC 等 -* 阿里倚天 710 特性支持:DDR PMU,PCIe PMU 驱动支持,CMN-700,RAS -* coresight 特性支持 -* ARM 架构特性支持: ARM SPE perf memory profiling/c2c, -* virtiofs: 支持文件级 DAX -* smmu event polling 支持 - - -## 5.10.112-11.1 - - -发布时间: 2022-07-15 - - -发布链接: - - -内核更新: - - -* 修复CVE: CVE-2022-34918 - - -## 5.10.112-11.2 - - -发布时间: 2022-08-05 - - -内核更新: - - -* 修复CVE:CVE-2022-32250 - - -  - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" deleted file mode 100644 index 2a362235..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" +++ /dev/null @@ -1,339 +0,0 @@ -# 1. RAS机制简介 - - -为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: - - -**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 - - -**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 - - -**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 - - -RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 - - -# 2. RAS机制错误处理流程 - - -RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 - - -RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_0.png) - - -# 3. RAS机制评测流程 - - -RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 - - -APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 - - -从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 - - -如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 - - - - -| | -| --- | -| 0 Processor Correctable -1 Processor Uncorrectable non-fatal -2 Processor Uncorrectable fatal | -| 3 Memory Correctable -4 Memory Uncorrectable non-fatal -5 Memory Uncorrectable fatal | -| 6 PCI Express Correctable -7 PCI Express Uncorrectable non-fatal -8 PCI Express Uncorrectable fatal | -| 9 Platform Correctable -10 Platform Uncorrectable non-fatal -11 Platform Uncorrectable fatal | - - -Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_1.png) - - -上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 - - -错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: - - -1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 - - -2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 - - -3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 - - -# 4. CPU及内存错误注入演示 - - -CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 - - -## 4.1 环境准备 - - -### 1. 安装EINJ模块 - - -使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html - - -此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 - - -### 2. 安装RAS测试工具 - - -直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git - - -### 3. 安装rasdaemon - - -先安装依赖包yum install sqlite perl-DBD-SQLite - - -使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git - - - -``` -autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make -make install -``` - -在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 - - - -``` - -d, --disable 禁用RAS事件并退出 - -e, --enable 使能RAS事件并退出 - -f, --foreground 前台运行 - -r, --record 通过sqlite3记录事件 -``` - -rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 - - -查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 - - -本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 - - -## 4.2 CPU错误注入 - - -本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 - - -使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 - - - -``` -./einj_mem_uc core_non_fatal -0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 -injecting ... -triggering ... -Manually take page offline -Test passed -``` - -使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 - - - - -| | | | | -| --- | --- | --- | --- | -| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | - - -可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=17(core), cnt=0xd -INFO: RAS reg: -INFO: fr = 10a9a2 -INFO: status = 44800007 -INFO: addr = 8007e0e95fffb7ff -INFO: misc0 = 4 -INFO: misc1 = 0 -RTC: 2000-01-06 09:32:09 - core[8] mm(17) return: 0 ---handler(17) end -[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error -[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 -[40858.436229] {42}[Hardware Error]: event severity: recoverable -[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 -[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable -[40858.454204] {42}[Hardware Error]: section_type: ARM processor error -[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 -[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 -[40858.475041] {42}[Hardware Error]: running state: 0x1 -[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 -[40858.487456] {42}[Hardware Error]: Error info structure 0: -[40858.493013] {42}[Hardware Error]: num errors: 1 -[40858.497702] {42}[Hardware Error]: error_type: 0, cache error -[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 -[40858.509857] {42}[Hardware Error]: transaction type: Instruction -[40858.516109] {42}[Hardware Error]: cache level: 2 -[40858.521058] {42}[Hardware Error]: the error has not been corrected -[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered -``` - -## 4.3 内存错误注入 - - -使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 - - - -``` -./einj_mem_uc single -0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 -injecting ... -triggering ... -SIGBUS: addr = 0xffffabcb3400 -page not present -Test passed -``` - -BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=0(exception), cnt=0xa -MM Mem RAS handle,Intr:0 -Ch = 25810000 - |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 - |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 - |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 - |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 - |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 - |-ECCUSYN0~2:1FF,0,76 - |-SBRCTL:1C01591B,SBRSTS:0 -RasData->ExceptionEl: 0, UeCnt:0x1 -RTC: 2000-01-06 09:27:58 -Get SystemAddrss through mAddrTransProtocol start -Get SystemAddrss through mAddrTransProtocol end -s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 -Locate error dimm, Socket:0, Channel:2 Dimm:0 - core[8] mm(0) return: 0 ---handler(0) end -[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) -[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 -[40606.668367] {41}[Hardware Error]: event severity: recoverable -[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 -[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable -[40606.686342] {41}[Hardware Error]: section_type: memory error -[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) -[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 -[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 -[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC -[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered -``` - -## 4.4 rasdaemon日志读取 - - -rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 - - - -``` -[root@localhost ras-tools]# ras-mc-ctl --errors -Memory controller events: -1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -``` - -# 5. Q&A - - -Q:RAS机制是否需要BIOS支持? - - -A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 - - - - - -Q: x86和ARM64的APEI是否一致? - - -A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 - - - - - -Q: RAS注入的错误是真实的错误吗? - - -A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 - - - - - -Q: rasdaemon日志查看是否有更易用的方法? - - -A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; - - -最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 - - - - - -Q: 可否使用mcelog? - - -A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 - - - - - -Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? - - -A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 - - - - - -Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? - - -A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270CVE\344\270\223\351\241\271/ANCK_CVE\344\277\256\345\244\215\350\256\260\345\275\225.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270CVE\344\270\223\351\241\271/ANCK_CVE\344\277\256\345\244\215\350\256\260\345\275\225.md" deleted file mode 100644 index f07dbce6..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270CVE\344\270\223\351\241\271/ANCK_CVE\344\277\256\345\244\215\350\256\260\345\275\225.md" +++ /dev/null @@ -1,76 +0,0 @@ - -# 4.19 - - - - -| | | -| --- | --- | -| 发布版本 | changelog | -| 4.19.91-26.3 | CVE-2022-2978 | -| 4.19.91-26.2 | CVE-2022-2586 | -| 4.19.91-26.1 | CVE-2022-32250 | - - -# 5.10 - - - - -| | | -| --- | --- | -| 发布版本 | changelog | -| 5.10.112-11.2 | CVE-2022-32250 | -| 5.10.112-11.1 | CVE-2022-34918 | -| 5.10.134-12 | CVE-2021-33655 -CVE-2021-33656 -CVE-2022-0494 -CVE-2022-0500 -CVE-2022-1012 -CVE-2022-1184 -CVE-2022-1462 -CVE-2022-1652 -CVE-2022-1729 -CVE-2022-1734 -CVE-2022-1786 -CVE-2022-1789 -CVE-2022-1836 -CVE-2022-1966 -CVE-2022-1972 -CVE-2022-1974 -CVE-2022-1975 -CVE-2022-2078 -CVE-2022-21123 -CVE-2022-21125 -CVE-2022-21166 -CVE-2022-21499 -CVE-2022-21505 -CVE-2022-2153 -CVE-2022-2318 -CVE-2022-23816 -CVE-2022-2503 -CVE-2022-2586 -CVE-2022-2588 -CVE-2022-26365 -CVE-2022-2639 -CVE-2022-28893 -CVE-2022-29581 -CVE-2022-2959 -CVE-2022-2978 -CVE-2022-29900 -CVE-2022-29901 -CVE-2022-32250 -CVE-2022-32296 -CVE-2022-32981 -CVE-2022-33740 -CVE-2022-33741 -CVE-2022-33742 -CVE-2022-33743 -CVE-2022-33744 -CVE-2022-33981 -CVE-2022-34918 -CVE-2022-36123 -CVE-2022-36879 -CVE-2022-36946 | - - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270CVE\344\270\223\351\241\271/\351\241\271\347\233\256\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270CVE\344\270\223\351\241\271/\351\241\271\347\233\256\347\256\200\344\273\213.md" deleted file mode 100644 index 7fe512a0..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270CVE\344\270\223\351\241\271/\351\241\271\347\233\256\347\256\200\344\273\213.md" +++ /dev/null @@ -1,4 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace_osnoise_\344\273\243\347\240\201\345\210\206\346\236\220.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace_osnoise_\344\273\243\347\240\201\345\210\206\346\236\220.md" deleted file mode 100644 index b66bf0b7..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace_osnoise_\344\273\243\347\240\201\345\210\206\346\236\220.md" +++ /dev/null @@ -1,641 +0,0 @@ -![](assets/Ftrace:_osnoise_代码分析/img_0.png) - - -前面一篇文章中,我们简要的osnoise的相关信息,本篇文章主要针对其源代码进行分析阐述。 - - - -# 一、数据结构: - - - -``` -/* - * NMI runtime info. - */ -struct osn_nmi { - u64 count; - u64 delta_start; -}; - -/* - * IRQ runtime info. - */ -struct osn_irq { - u64 count; - u64 arrival_time; - u64 delta_start; -}; - -#define IRQ_CONTEXT 0 -#define THREAD_CONTEXT 1 -/* - * sofirq runtime info. - */ -struct osn_softirq { - u64 count; - u64 arrival_time; - u64 delta_start; -}; - -/* - * thread runtime info. - */ -struct osn_thread { - u64 count; - u64 arrival_time; - u64 delta_start; -}; - -/* - * Runtime information: this structure saves the runtime information used by - * one sampling thread. - */ -struct osnoise_variables { - struct task_struct *kthread; - bool sampling; - pid_t pid; - struct osn_nmi nmi; - struct osn_irq irq; - struct osn_softirq softirq; - struct osn_thread thread; - local_t int_counter; -}; -``` - - -osnoise用来记录结果的主要数据结构为`struct osnoise_variables`其中: - - -+ `struct task_struct *kthread`:采样线程的tcb。 -+ `bool sampling`:采样开关 -+ `pit_t pid`:采样线程的pid -+ `struct osn_nmi nmi`:保存nmi噪声的相关信息 -+ `struct osn_irq irq`:保存irq噪声的相关信息 -+ `struct osn_softiq softirq`:保存softirq噪声的相关信息 -+ `struct osn_thread thread`:保存其他线程噪声的相关信息 -+ `local_t int_counter`:保存噪声的总次数 - - - -# 二、工作原理: - - -## 2.1 注册trace\_point - - -如第一篇,osnoise引入了一组trace\_point。通过这些trace\_point,开发人员可以获取噪声的详细信息。注册trace\_point的代码如下(以irq\_noise为例): - - - -``` -TRACE_EVENT(irq_noise, - - TP_PROTO(int vector, const char *desc, u64 start, u64 duration), - - TP_ARGS(vector, desc, start, duration), - - TP_STRUCT__entry( - __field( u64, start ) - __field( u64, duration) - __string( desc, desc ) - __field( int, vector ) - - ), - - TP_fast_assign( - __assign_str(desc, desc); - __entry->vector = vector; - __entry->start = start; - __entry->duration = duration; - ), - - TP_printk("%s:%d start %llu.%09u duration %llu ns", - __get_str(desc), - __entry->vector, - __print_ns_to_secs(__entry->start), - __print_ns_without_secs(__entry->start), - __entry->duration) -); -``` - - -关于trace\_point这里我们不做过多介绍,感兴趣的读者可以去内核文件`include/trace/events/osnoise.h`下查看相应源代码。 - - -## 2.2 注册osnoise tracer - - -这部分主要是涉及到osnoise的初始化过程,该过程主要就是将osnoise注册近ftrace中并且初始化相关的tracefs。注册的过程通过`register_tracer(&osnoise_tracer)`实现。 - - - -``` -static struct tracer osnoise_tracer __read_mostly = { - .name = "osnoise", - .init = osnoise_tracer_init, - .reset = osnoise_tracer_reset, - .start = osnoise_tracer_start, - .stop = osnoise_tracer_stop, - .print_header = print_osnoise_headers, - .allow_instances = true, -}; -``` - - -## 2.3 注册tracepoint钩子函数: - - -osnoise 统计信息的方式就是通过在相应的tracepoint中注册钩子函数。因此这部分即是osnoise的核心部分,本篇文章将重点分析该模块。 - - -osnoise首先会将各种事件的钩子函数插入对应的tracepoint中,这一动作由`osnoise_hook_events()`函数执行,将该函数裁剪后如下: - - - -``` -static int osnoise_hook_events(void) -{ - ... - retval = hook_irq_events(); - ... - retval = hook_softirq_events(); - ... - retval = hook_thread_events(); - ... -} -``` - - -该函数主要是针对irq、softirq、thread事件插入一些采样函数。 - - -### hook\_irq\_events - - -hook\_irq\_events()主要是实现对irq事件的统计。如下: - - - -``` -static int hook_irq_events(void) -{ - ... - ret = register_trace_irq_handler_entry(trace_irqentry_callback, NULL); - ... - ret = register_trace_irq_handler_exit(trace_irqexit_callback, NULL); - ... -} -``` - - -主要是在irq\_handler\_entry 和 irq\_handler\_exit处插入相应的处理函数。最终插入的处理函数为osnoise\_trace\_irq\_entry() 和 osnoise\_trace\_irq\_exit()。 - - - -``` -void osnoise_trace_irq_entry(int id) -{ - struct osnoise_variables *osn_var = this_cpu_osn_var(); - - if (!osn_var->sampling) - return; - - osn_var->irq.arrival_time = time_get(); - set_int_safe_time(osn_var, &osn_var->irq.delta_start); - osn_var->irq.count++; - - local_inc(&osn_var->int_counter); -} -void osnoise_trace_irq_exit(int id, const char *desc) -{ - struct osnoise_variables *osn_var = this_cpu_osn_var(); - int duration; - - if (!osn_var->sampling) - return; - - duration = get_int_safe_duration(osn_var, &osn_var->irq.delta_start); - trace_irq_noise(id, desc, osn_var->irq.arrival_time, duration); - osn_var->irq.arrival_time = 0; - cond_move_softirq_delta_start(osn_var, duration); - cond_move_thread_delta_start(osn_var, duration); -} -``` - - -在irq handler的入口处插入的函数为osnoise\_trace\_irq\_entry,分析该函数: - - -+ 在irq.arrival\_time中记录本次irq事件的开始时间。 -+ 在irq.delta\_start中记录本次irq事件的准确开始时间。 -+ irq噪声事件的次数+1。 -+ 噪声事件总体次数+1。 - - -在这里我们发现,除了在irq.arrival\_time中记录了一个irq开始时间之外,还通过set\_int\_safe\_time函数在 irq.delta\_start中都记录了一个开始时间。那么他们之间有什么区别呢?在这里我们先按下不表,后文会对其进行解释分析。 - - -在irq handler的出口处插入的函数为osnoise\_trace\_irq\_exit,该函数的主要作用: - - -+ 根据之前记录的osn\_var->irq.delta\_start计算出本次irq事件的持续时间。 -+ 调用trace\_irq\_noise将本次irq事件的**中断号,中断名称、开始时间、持续时间**放到ftrace的ringbuffer中。 -+ 清空osn\_var->irq.arrival\_time 表示此次irq事件结束。 - - -我们注意到在该函数的末尾处有cond\_move\_softirq\_delta\_start 以及 cond\_move\_thread\_delta\_start函数。其实形如此类的函数一共有三个: - - -+ cond\_move\_irq\_delta\_start -+ cond\_move\_softirq\_delta\_start -+ cond\_move\_thread\_delta\_start - - -函数的形式都是一样的,我们以 cond\_move\_softirq\_delta\_start()为例: - - - -``` -static inline void -cond_move_softirq_delta_start(struct osnoise_variables *osn_var, u64 duration) -{ - if (osn_var->softirq.delta_start) - osn_var->softirq.delta_start += duration; -} -``` - - -+ 这个函数会在osnoise\_trace\_irq\_exit、trace\_osnoise\_callback中调用,前者我们知道是irq事件退出时的钩子函数,而后者则是nmi事件的钩子函数。 -+ 可以看到该函数的主要功能是将softirq.delta\_start的开始时间推后一个duration。 - - -换句话说,这个函数是为了校准低优先级事件的开始时间。以下图为例: - - -+ 在t1时刻进入了softirq,此时记录**softirq.arrival\_time = t1**,**softirq.delta\_time = t1**。 -+ 然后在t2时刻,来了一个irq抢占了softirq,进入irq的执行函数。 -+ t3时刻离开irq执行完毕继续执行softirq。irq执行时间**duration = t3-t2**。同时调用cond\_move\_softirq\_delta\_start,更新softirq开始时间**softirq.delta\_start += duration;** -+ 在t4时刻softirq执行完毕退出。 - - -那么本次softirq的持续时间实际上应该是t4 - (t1 + duration) = t4 - **softirq.delta\_start。** - - -![](assets/Ftrace:_osnoise_代码分析/img_1.png) - -因此,需要高优先级的对低优先级的事件的时间进行校准。 - - -+ 对于nmi事件,需要调用 - - -- cond\_move\_irq\_delta\_start -- cond\_move\_softirq\_delta\_start -- cond\_move\_thread\_delta\_start - - -+ 对于irq事件,需要调用 - - -- cond\_move\_softirq\_delta\_start -- cond\_move\_thread\_delta\_start - - -+ 对于softirq事件,需要调用 - - -- cond\_move\_thread\_delta\_start - - -### hook\_softirq\_events - - -与irq的钩子函数一样,需要注册tracepoint softirq\_entry、softirq\_exit的钩子函数。最终注册的钩子函数如下: - - - -``` -static void trace_softirq_entry_callback(void *data, unsigned int vec_nr) -{ - struct osnoise_variables *osn_var = this_cpu_osn_var(); - - if (!osn_var->sampling) - return; - - osn_var->softirq.arrival_time = time_get(); - set_int_safe_time(osn_var, &osn_var->softirq.delta_start); - osn_var->softirq.count++; - - local_inc(&osn_var->int_counter); -} -static void trace_softirq_exit_callback(void *data, unsigned int vec_nr) -{ - struct osnoise_variables *osn_var = this_cpu_osn_var(); - int duration; - - if (!osn_var->sampling) - return; - - if (unlikely(timerlat_enabled())) - if (!timerlat_softirq_exit(osn_var)) - return; - - duration = get_int_safe_duration(osn_var, &osn_var->softirq.delta_start); - trace_softirq_noise(vec_nr, osn_var->softirq.arrival_time, duration); - cond_move_thread_delta_start(osn_var, duration); - osn_var->softirq.arrival_time = 0; -} -``` - - -可以发现对softirq的统计方式与对irq的统计方式一摸一样,在这里我们便不做详细分析,读者可以参考上面对hook\_irq\_events()的分析。 - - -### hook\_thread\_events - - -osnoise通过在tracepoint sched\_switch注册钩子函数,来统计thread noise。函数如下所示: - - - -``` -static void -trace_sched_switch_callback(void *data, bool preempt, - struct task_struct *p, - struct task_struct *n, - unsigned int prev_state) -{ - struct osnoise_variables *osn_var = this_cpu_osn_var(); - - if (p->pid != osn_var->pid) - thread_exit(osn_var, p); - - if (n->pid != osn_var->pid) - thread_entry(osn_var, n); -} -static void -thread_entry(struct osnoise_variables *osn_var, struct task_struct *t) -{ - if (!osn_var->sampling) - return; - /* - * The arrival time will be used in the report, but not to compute - * the execution time, so it is safe to get it unsafe. - */ - osn_var->thread.arrival_time = time_get(); - - set_int_safe_time(osn_var, &osn_var->thread.delta_start); - - osn_var->thread.count++; - local_inc(&osn_var->int_counter); -} -static void -thread_exit(struct osnoise_variables *osn_var, struct task_struct *t) -{ - int duration; - - if (!osn_var->sampling) - return; - - if (unlikely(timerlat_enabled())) - if (!timerlat_thread_exit(osn_var)) - return; - - duration = get_int_safe_duration(osn_var, &osn_var->thread.delta_start); - - trace_thread_noise(t, osn_var->thread.arrival_time, duration); - - osn_var->thread.arrival_time = 0; -} -``` - - -sched\_switch()为线程切换的核心函数,在该trace\_sched\_switch函数中的p表示前一个线程,n表示下一个要执行的线程,即从线程p切换到线程n。 - - -此时存在三种情况: - - -+ 从采样线程切换到其他线程 - - -- 执行thread\_entry()函数,标志一个噪声的进入 - - -+ 从其他线程切换到采样线程 - - -- 执行thread\_exit()函数,标志上一个噪声的结束 - - -+ 从其他线程切换到其他线程 - - -- 先执行thread\_exit()函数,标志上一个噪声的结束 -- 再执行thread\_entry()函数,标志下一个噪声的进入 - - -换句话说,该钩子函数会统计除了采样线程外其他所有线程执行的时间。其中thread\_entry()和thread\_exit()的具体实现与上面对irq事件统计的函数实现类似,此处不再过多赘述。 - - -### nmi\_events - - -对于NMI事件的统计比较特殊,在ftrace\_nmi\_enter和ftrace\_nmi\_exit中直接调用trace\_osnoise\_callback获取nmi noise,并且调用trace\_nmi\_noise将duration放到ftrace的ringbuffer中。 - - - -``` -static inline void ftrace_nmi_exit(void) -{ - ... - if (trace_osnoise_callback_enabled) - trace_osnoise_callback(false); - ... -} -static inline void ftrace_nmi_exit(void) -{ - ... - if (trace_osnoise_callback_enabled) - trace_osnoise_callback(false); - ... -} -void trace_osnoise_callback(bool enter) -{ - struct osnoise_variables *osn_var = this_cpu_osn_var(); - u64 duration; - - if (!osn_var->sampling) - return; - - /* - * Currently trace_clock_local() calls sched_clock() and the - * generic version is not NMI safe. - */ - if (!IS_ENABLED(CONFIG_GENERIC_SCHED_CLOCK)) { - if (enter) { - osn_var->nmi.delta_start = time_get(); - local_inc(&osn_var->int_counter); - } else { - duration = time_get() - osn_var->nmi.delta_start; - - trace_nmi_noise(osn_var->nmi.delta_start, duration); - - cond_move_irq_delta_start(osn_var, duration); - cond_move_softirq_delta_start(osn_var, duration); - cond_move_thread_delta_start(osn_var, duration); - } - } - - if (enter) - osn_var->nmi.count++; -} -``` - - -主要函数为trace\_osnoise\_callback(bool enter),该函数通过一个bool值来判断当前是进入nmi中断还是退出nmi中断,进而进行相应的处理,统计方法和其他事件统计方法一直。可以看到在NMI的钩子函数中,会调用到 - - -+ cond\_move\_irq\_delta\_start(osn\_var, duration); -+ cond\_move\_softirq\_delta\_start(osn\_var, duration); -+ cond\_move\_softirq\_delta\_start(osn\_var, duration); - - -这三个函数去校准其他低优先级事件的统计。与我们之前的分析一致。 - - -## 2.4 采样 - - -上面介绍了osnoise对各类事件采样的方法,接下来,我们分析一下osnoise的采样流程。osnoise开始采样的函数调用流程为osnoise\_tracer\_start->osnoise\_workload\_start->start\_per\_cpu\_kthreads->start\_kthread->osnoise\_main->run\_osnoise。 - - - -采样的核心函数为run\_osnoise,将代码裁剪后如下: - - - -``` -static int run_osnoise(void) -{ - ... - - threshold = tracing_thresh ? : 5000; - - osn_var->sampling = true; - - runtime = osnoise_data.sample_runtime * NSEC_PER_USEC; - - stop_in = osnoise_data.stop_tracing * NSEC_PER_USEC; - - start = time_get(); - - last_int_count = set_int_safe_time(osn_var, &last_sample); - - do { - - int_count = set_int_safe_time(osn_var, &sample); - - noise = time_sub(sample, last_sample); - - total = time_sub(sample, start); - - if (total < last_total) { - osnoise_taint("total overflow!"); - break; - } - - last_total = total; - - if (noise >= threshold) { - int interference = int_count - last_int_count; - - if (noise > max_noise) - max_noise = noise; - - if (!interference) - hw_count++; - - sum_noise += noise; - - trace_sample_threshold(last_sample, noise, interference); - - if (osnoise_data.stop_tracing) - if (noise > stop_in) - osnoise_stop_tracing(); - } - - last_sample = sample; - last_int_count = int_count; - - } while (total < runtime && !kthread_should_stop()); - - osn_var->sampling = false; - - ... -} -``` - - - -分析采样函数的主体逻辑流程图如下所示: - - -![](assets/Ftrace:_osnoise_代码分析/img_2.png) - - -即通过不断的轮询TSC寄存器,将每次轮询的间隙与预设的threshold进行对比,判断是否发生噪声,如果发生了噪声且噪声不是由其他可测量事件所造成的,就认为发生了硬件噪声。 - - -其中: - - -* threshold :两次轮询TSC寄存器时间之差,被认为是噪声的最小值,默认设为5us。 -* osn\_var->sampling:标志位,标志是否开启采样。 -* runtime:预设的本次采样时间。 -* start :记录本次采样开始的时间 -* last\_sample : 记录上次读取tsc寄存器的值 -* sample : 记录本次读取tsc寄存器的值 -* noise = time\_sub(sample, last\_sample) : 计算本次和上次轮询tsc寄存器的时间之差。 -* total :记录从采样开始到现在所经历的时间 -* 如果noise >= threshold,则视为发生了噪声,进行统计计算 - - -+ max\_noise: 记录最大的单个噪声值 -+ interference: 记录本次噪声内事件发生的次数,如果为0则代表是硬件噪声。 -+ hw\_count: 记录硬件噪声的次数,当interference为0时,增加。 - - -* 轮询tsc寄存器,直到total>=runtime,结束本次采样。 - - - -# 三、小结 - - -以上便是对osnoise的代码分析。osnoise就是站在一个普通进程的视角上,统计所有会打断他的事件,包含irq、softirq、nmi、thread、hw。 - - -对于前四种事件内核中都提供了相应的tracepoint,只需要注册相应的回掉函数到tracepoint中即可统计到相关的信息。而hw无法被直接统计测量,因此在osnoise中就通过不断的轮询tsc寄存器,将任意两次轮询的差值与threshold进行比较,如果大于threshold就认为发生了噪声,当发生噪声时如果其他四个事件都未发生就认为发生了硬件延迟。 - - -由于irq、softirq、nmi、thread都有相应的tracepoint可以供我们使用,在不考虑hw的情况下我们其实可以直接在用户态实现相关信息的采集。下篇文章我们会尝试在用户态,利用bcc通过动态插桩的方式来实现一个简单的osnoise背景噪声统计工具。 - - - - - - - - - - - - - - - - - - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace_osnoise_\346\200\273\350\247\210.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace_osnoise_\346\200\273\350\247\210.md" deleted file mode 100644 index 782c9a33..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace_osnoise_\346\200\273\350\247\210.md" +++ /dev/null @@ -1,179 +0,0 @@ - - - -# Ftrace: osnoise 总览 - - - - - - - - -![](assets/Ftrace:_osnoise_总览/img_0.png) - - -## 一、osnoise是什么? - - - - -在linux系统中,一个普通线程在执行过程中会被各种各样的事件所干扰打断,如NMI、IRQ、SOFTIRQ、来自硬件的干扰以及来自其他线程的干扰。这些事件对于一个普通线程来说,就相当于噪声一样的存在。在Linux 5.14-rc1中,引入了一个新的tracer——osnoise tracer。osnoise从一个线程的视角出发,统计出所有对他有干扰的噪声,进而协助开发人员分析系统背景噪声情况。 - - -### 1.1 噪声分类 - - -在osnoise tracer中,将统计的噪声分为了以下五个大类: - - -+ IRQ:硬中断 -+ SOFTIRQ:软中断 -+ NMI:不可屏蔽中断 -+ HW:来自硬件的噪声。 -+ THREAD:来自其他线程的影响。 - - -其中,HW(hardware latency)表示某些底层硬件或者固件的行为引起的大型系统延迟。在Ftrace中,有一个名为hwlat\_detector的tracer,它的主要目的就是用来检测硬件噪声。osnoise的设计思想借鉴了hwlat\_detector。 - - -### 1.2 hwlat - - -hwlat\_detector的工作原理简单来说就是在一段时间内,关闭irq、softirq以及抢占,然后不断的去轮询TSC(Time Stamp Counter)寄存器的值。由于关闭了中断及抢占,任意两次读取之间的间隙都是由于硬件噪声或者来自其他不可屏蔽中断的噪声(NMI)。 - - -如图所示: - - -![](assets/Ftrace:_osnoise_总览/img_1.png) - - -在一段时间内,采样线程不断的去循环读取TSC寄存器,在一个循环内会连续读取两次TSC寄存器。假设本次循环读取的时间分别为t1、t2,上次循环读取的时间为last\_t1、last\_t2。则: - - -+ t1与t2的时间之差,last\_t1、last\_t2的时间之差,称为inner\_latency。 -+ t1与last\_t2的时间之差,称为outer\_latency。 -+ tracing\_thresh为预设的阀值,如果观察到任何超过阀值的延迟就认为发生了噪声事件。 -+ 在hwlat中,会不断的计算inner\_latency和outer\_latency。然后将其值与预设的tracing\_thresh值进行对比,如果大于tracing\_thresh,就认为发生了噪声事件。 -+ 在hwlat采样期间,会同时追踪nmi中断事件。因此,观察到的任何超过阀值的延迟如果不是nmi造成的,那么就认为是hardware latency。 - - -### 1.3 osnoise实现 - - -前面我们介绍了hwlat的实现。简而言之,hwlat关闭irq、softirq、抢占等事件,通过不断的轮询TSC寄存器以及追踪NMI中断来探测延迟事件,观察到的任何延迟都是由NMI或者硬件造成的。 - - -osnoise的实现思想和hwlat类似,不过osnoise不会关闭irq、softirq、抢占等事件,而是在采样的同时追踪各类事件。在irq\_handler\_entry、irq\_handler\_exit、softirq\_entry、softirq\_exit、sched\_switch、nmi\_enter、nmi\_exit处也插入相应的钩子函数。进而统计出各类事件发生的次数以及持续时间。如果观测到的任意延迟不是由以上时间造成的,那么就认为是硬件噪声。 - - -## 二、osnoise tracer - - -### 2.1 配置文件 - - -osnoise在`/sys/kernel/debug/tracing/` 目录下有一系列可配置文件, 含义如下: - - -* **osnoise/cpus:** osnoise采样的目标cpu,默认是所有cpu。 -* **osnoise/period\_us:** osnoise线程的周期。默认是1000000ms,即1s。 -* **osnoise/runtime\_us:** osnoise线程在一个周期内的采样时间。默认是1000000ms,即1s。 -* **osnoise/stop\_tracing\_us:** 当单个噪声的最大值超过这个阀值时,停止采样。默认为0,即关闭该选项。 -* **osnoise/stop\_tracing\_total\_us:** 当总计噪声超过这个阀值时,停止采样。默认为0,即关闭该选项。 -* **tracing\_thresh**: 两次轮询TSC寄存器时间之差,被认为是噪声的最小值,单位为us。当配置为0时,默认设为5us。 - - -### 2.2 使用方法 - - -1. 将osnoise写入的current\_tracer: - - -`echo osnoise > /sys/kernel/debug/tracing/current_tracer` - - -2. 打开traceing\_on: - - -`echo 1 > /sys/kernel/debug/tracing/tracing_on` - - -3. 查看trace结果: - - -`cat /sys/kernel/debug/tracing/trace` - - - - - -![](assets/Ftrace:_osnoise_总览/img_2.png) - - -这里显示的是系统整体采样的结果各个字段的含义如下: - - -* TASK-PID:采样线程的PID。 -* CPU:采样的CPU ID -* TIMESTAMP:时间戳 -* RUNTIME IN US:采样时间,单位us -* NOISE IN US:本次采样时间内的总计噪声时间,单位us。 -* %OF CPU AVAILABLE:在一个RUNTIME周期内,采样线程可以获得的cpu利用率。 -* HW、NMI、IRQ、SIRQ、THREAD:分别表示各类噪声事件发生的次数。 - - -## 三、osnoise trace\_point - - -### 3.1 trace\_point - - -osnoise除了提供tracer外,还提供了一组trace\_points,以协助开发人员对噪声进行进一步分析。可以在`/sys/kernel/debug/tracing/events/osnoise/`看到相关tracepoint: - - -* **sample\_threshold:** 追踪任何高于阀值的噪声事件。阀值即为上文提到的tracing\_thresh,默认为5us。 -* **nmi\_noise:** nmi噪声,包含其持续时间。 -* **irq\_noise:** irq噪声,包含其持续时间。 -* **softirq\_noise:** softirq噪声,包含其持续时间 -* **thread\_noise:** 其他线程噪声,包含其持续时间 - - -### 3.2 使用方法 - - -前面我们已经介绍了osnoise tracer的使用,它可以让我们直观的看到整个系统级别的各种噪声事件的总和。如果我们像看到每种噪声或者是说指定噪声类型的事件的详细信息,就需要用到osnoise提供的trace\_point。 - - -打开trace\_point总开关: - - -`echo 1 > /sys/kernel/debug/tracing/events/osnoise/enable` - - -查看trace日志: - - -`cat /sys/kernel/debug/tracing/trace` - - -输出如下所示: - - -![](assets/Ftrace:_osnoise_总览/img_3.png) - - - -日志中包含了所有噪声的详细信息,包括其名字,开始事件,持续时间等等。关于其输出的具体格式可以查看对应trace\_point文件夹下的format文件。 - - -trace\_ponit文件位置在`/sys/kernel/debug/tracing/events/osnoise/`下。 - - -除了总开关外,每个事件有自己单独的开关,在对应tracepoint目录下。如irq\_noise的开关为`/sys/kernel/debug/tracing/events/osnoise/irq_noise/enable`。用户可以根据自己的需求只追踪相应的事件,从而过滤掉其他不需要关注的信息。 - - - - - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace\357\274\232_osnoise_\344\273\243\347\240\201\345\210\206\346\236\220.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace\357\274\232_osnoise_\344\273\243\347\240\201\345\210\206\346\236\220.md" deleted file mode 100644 index d8d8d5f7..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace\357\274\232_osnoise_\344\273\243\347\240\201\345\210\206\346\236\220.md" +++ /dev/null @@ -1,641 +0,0 @@ -![](assets/Ftrace:_osnoise_代码分析/img_0.png) - - -前面一篇文章中,我们简要的介绍了一下osnoise的相关信息,本篇文章主要针对其源代码进行分析阐述。 - - - -# 一、数据结构: - - - -``` -/* - * NMI runtime info. - */ -struct osn_nmi { - u64 count; - u64 delta_start; -}; - -/* - * IRQ runtime info. - */ -struct osn_irq { - u64 count; - u64 arrival_time; - u64 delta_start; -}; - -#define IRQ_CONTEXT 0 -#define THREAD_CONTEXT 1 -/* - * sofirq runtime info. - */ -struct osn_softirq { - u64 count; - u64 arrival_time; - u64 delta_start; -}; - -/* - * thread runtime info. - */ -struct osn_thread { - u64 count; - u64 arrival_time; - u64 delta_start; -}; - -/* - * Runtime information: this structure saves the runtime information used by - * one sampling thread. - */ -struct osnoise_variables { - struct task_struct *kthread; - bool sampling; - pid_t pid; - struct osn_nmi nmi; - struct osn_irq irq; - struct osn_softirq softirq; - struct osn_thread thread; - local_t int_counter; -}; -``` - - -osnoise用来记录结果的主要数据结构为`struct osnoise_variables`其中: - - -+ `struct task_struct *kthread`:采样线程的tcb。 -+ `bool sampling`:采样开关 -+ `pit_t pid`:采样线程的pid -+ `struct osn_nmi nmi`:保存nmi噪声的相关信息 -+ `struct osn_irq irq`:保存irq噪声的相关信息 -+ `struct osn_softiq softirq`:保存softirq噪声的相关信息 -+ `struct osn_thread thread`:保存其他线程噪声的相关信息 -+ `local_t int_counter`:保存噪声的总次数 - - - -# 二、工作原理: - - -## 2.1 注册trace\_point - - -如第一篇文章所述,osnoise引入了一组trace\_point。通过这些trace\_point,开发人员可以获取噪声的详细信息。注册trace\_point的代码如下(以irq\_noise为例): - - - -``` -TRACE_EVENT(irq_noise, - - TP_PROTO(int vector, const char *desc, u64 start, u64 duration), - - TP_ARGS(vector, desc, start, duration), - - TP_STRUCT__entry( - __field( u64, start ) - __field( u64, duration) - __string( desc, desc ) - __field( int, vector ) - - ), - - TP_fast_assign( - __assign_str(desc, desc); - __entry->vector = vector; - __entry->start = start; - __entry->duration = duration; - ), - - TP_printk("%s:%d start %llu.%09u duration %llu ns", - __get_str(desc), - __entry->vector, - __print_ns_to_secs(__entry->start), - __print_ns_without_secs(__entry->start), - __entry->duration) -); -``` - - -关于trace\_point这里我们不做过多介绍,感兴趣的读者可以去内核文件`include/trace/events/osnoise.h`下查看相应源代码。 - - -## 2.2 注册osnoise tracer - - -这部分主要是涉及到osnoise的初始化过程,该过程主要就是将osnoise注册近ftrace中并且初始化相关的tracefs。注册的过程通过`register_tracer(&osnoise_tracer)`实现。 - - - -``` -static struct tracer osnoise_tracer __read_mostly = { - .name = "osnoise", - .init = osnoise_tracer_init, - .reset = osnoise_tracer_reset, - .start = osnoise_tracer_start, - .stop = osnoise_tracer_stop, - .print_header = print_osnoise_headers, - .allow_instances = true, -}; -``` - - -## 2.3 注册tracepoint钩子函数: - - -osnoise 统计信息的方式就是通过在相应的tracepoint中注册钩子函数。因此这部分即是osnoise的核心部分,本篇文章将重点分析该模块。 - - -osnoise首先会将各种事件的钩子函数插入对应的tracepoint中,这一动作由`osnoise_hook_events()`函数执行,将该函数裁剪后如下: - - - -``` -static int osnoise_hook_events(void) -{ - ... - retval = hook_irq_events(); - ... - retval = hook_softirq_events(); - ... - retval = hook_thread_events(); - ... -} -``` - - -该函数主要是针对irq、softirq、thread事件插入一些采样函数。 - - -### hook\_irq\_events - - -hook\_irq\_events()主要是实现对irq事件的统计。如下: - - - -``` -static int hook_irq_events(void) -{ - ... - ret = register_trace_irq_handler_entry(trace_irqentry_callback, NULL); - ... - ret = register_trace_irq_handler_exit(trace_irqexit_callback, NULL); - ... -} -``` - - -主要是在irq\_handler\_entry 和 irq\_handler\_exit处插入相应的处理函数。最终插入的处理函数为osnoise\_trace\_irq\_entry() 和 osnoise\_trace\_irq\_exit()。 - - - -``` -void osnoise_trace_irq_entry(int id) -{ - struct osnoise_variables *osn_var = this_cpu_osn_var(); - - if (!osn_var->sampling) - return; - - osn_var->irq.arrival_time = time_get(); - set_int_safe_time(osn_var, &osn_var->irq.delta_start); - osn_var->irq.count++; - - local_inc(&osn_var->int_counter); -} -void osnoise_trace_irq_exit(int id, const char *desc) -{ - struct osnoise_variables *osn_var = this_cpu_osn_var(); - int duration; - - if (!osn_var->sampling) - return; - - duration = get_int_safe_duration(osn_var, &osn_var->irq.delta_start); - trace_irq_noise(id, desc, osn_var->irq.arrival_time, duration); - osn_var->irq.arrival_time = 0; - cond_move_softirq_delta_start(osn_var, duration); - cond_move_thread_delta_start(osn_var, duration); -} -``` - - -在irq handler的入口处插入的函数为osnoise\_trace\_irq\_entry,分析该函数: - - -+ 在irq.arrival\_time中记录本次irq事件的开始时间。 -+ 在irq.delta\_start中记录本次irq事件的准确开始时间。 -+ irq噪声事件的次数+1。 -+ 噪声事件总体次数+1。 - - -在这里我们发现,除了在irq.arrival\_time中记录了一个irq开始时间之外,还通过set\_int\_safe\_time函数在 irq.delta\_start中都记录了一个开始时间。那么他们之间有什么区别呢?在这里我们先按下不表,后文会对其进行解释分析。 - - -在irq handler的出口处插入的函数为osnoise\_trace\_irq\_exit,该函数的主要作用: - - -+ 根据之前记录的osn\_var->irq.delta\_start计算出本次irq事件的持续时间。 -+ 调用trace\_irq\_noise将本次irq事件的**中断号,中断名称、开始时间、持续时间**放到ftrace的ringbuffer中。 -+ 清空osn\_var->irq.arrival\_time 表示此次irq事件结束。 - - -我们注意到在该函数的末尾处有cond\_move\_softirq\_delta\_start 以及 cond\_move\_thread\_delta\_start函数。其实形如此类的函数一共有三个: - - -+ cond\_move\_irq\_delta\_start -+ cond\_move\_softirq\_delta\_start -+ cond\_move\_thread\_delta\_start - - -函数的形式都是一样的,我们以 cond\_move\_softirq\_delta\_start()为例: - - - -``` -static inline void -cond_move_softirq_delta_start(struct osnoise_variables *osn_var, u64 duration) -{ - if (osn_var->softirq.delta_start) - osn_var->softirq.delta_start += duration; -} -``` - - -+ 这个函数会在osnoise\_trace\_irq\_exit、trace\_osnoise\_callback中调用,前者我们知道是irq事件退出时的钩子函数,而后者则是nmi事件的钩子函数。 -+ 可以看到该函数的主要功能是将softirq.delta\_start的开始时间推后一个duration。 - - -换句话说,这个函数是为了校准低优先级事件的开始时间。以下图为例: - - -+ 在t1时刻进入了softirq,此时记录**softirq.arrival\_time = t1**,**softirq.delta\_time = t1**。 -+ 然后在t2时刻,来了一个irq抢占了softirq,进入irq的执行函数。 -+ t3时刻离开irq执行完毕继续执行softirq。irq执行时间**duration = t3-t2**。同时调用cond\_move\_softirq\_delta\_start,更新softirq开始时间**softirq.delta\_start += duration;** -+ 在t4时刻softirq执行完毕退出。 - - -那么本次softirq的持续时间实际上应该是t4 - (t1 + duration) = t4 - **softirq.delta\_start。** - - -![](assets/Ftrace:_osnoise_代码分析/img_1.png) - -因此,需要高优先级的对低优先级的事件的时间进行校准。 - - -+ 对于nmi事件,需要调用 - - -- cond\_move\_irq\_delta\_start -- cond\_move\_softirq\_delta\_start -- cond\_move\_thread\_delta\_start - - -+ 对于irq事件,需要调用 - - -- cond\_move\_softirq\_delta\_start -- cond\_move\_thread\_delta\_start - - -+ 对于softirq事件,需要调用 - - -- cond\_move\_thread\_delta\_start - - -### hook\_softirq\_events - - -与irq的钩子函数一样,需要注册tracepoint softirq\_entry、softirq\_exit的钩子函数。最终注册的钩子函数如下: - - - -``` -static void trace_softirq_entry_callback(void *data, unsigned int vec_nr) -{ - struct osnoise_variables *osn_var = this_cpu_osn_var(); - - if (!osn_var->sampling) - return; - - osn_var->softirq.arrival_time = time_get(); - set_int_safe_time(osn_var, &osn_var->softirq.delta_start); - osn_var->softirq.count++; - - local_inc(&osn_var->int_counter); -} -static void trace_softirq_exit_callback(void *data, unsigned int vec_nr) -{ - struct osnoise_variables *osn_var = this_cpu_osn_var(); - int duration; - - if (!osn_var->sampling) - return; - - if (unlikely(timerlat_enabled())) - if (!timerlat_softirq_exit(osn_var)) - return; - - duration = get_int_safe_duration(osn_var, &osn_var->softirq.delta_start); - trace_softirq_noise(vec_nr, osn_var->softirq.arrival_time, duration); - cond_move_thread_delta_start(osn_var, duration); - osn_var->softirq.arrival_time = 0; -} -``` - - -可以发现对softirq的统计方式与对irq的统计方式一摸一样,在这里我们便不做详细分析,读者可以参考上面对hook\_irq\_events()的分析。 - - -### hook\_thread\_events - - -osnoise通过在tracepoint sched\_switch注册钩子函数,来统计thread noise。函数如下所示: - - - -``` -static void -trace_sched_switch_callback(void *data, bool preempt, - struct task_struct *p, - struct task_struct *n, - unsigned int prev_state) -{ - struct osnoise_variables *osn_var = this_cpu_osn_var(); - - if (p->pid != osn_var->pid) - thread_exit(osn_var, p); - - if (n->pid != osn_var->pid) - thread_entry(osn_var, n); -} -static void -thread_entry(struct osnoise_variables *osn_var, struct task_struct *t) -{ - if (!osn_var->sampling) - return; - /* - * The arrival time will be used in the report, but not to compute - * the execution time, so it is safe to get it unsafe. - */ - osn_var->thread.arrival_time = time_get(); - - set_int_safe_time(osn_var, &osn_var->thread.delta_start); - - osn_var->thread.count++; - local_inc(&osn_var->int_counter); -} -static void -thread_exit(struct osnoise_variables *osn_var, struct task_struct *t) -{ - int duration; - - if (!osn_var->sampling) - return; - - if (unlikely(timerlat_enabled())) - if (!timerlat_thread_exit(osn_var)) - return; - - duration = get_int_safe_duration(osn_var, &osn_var->thread.delta_start); - - trace_thread_noise(t, osn_var->thread.arrival_time, duration); - - osn_var->thread.arrival_time = 0; -} -``` - - -sched\_switch()为线程切换的核心函数,在该trace\_sched\_switch函数中的p表示前一个线程,n表示下一个要执行的线程,即从线程p切换到线程n。 - - -此时存在三种情况: - - -+ 从采样线程切换到其他线程 - - -- 执行thread\_entry()函数,标志一个噪声的进入 - - -+ 从其他线程切换到采样线程 - - -- 执行thread\_exit()函数,标志上一个噪声的结束 - - -+ 从其他线程切换到其他线程 - - -- 先执行thread\_exit()函数,标志上一个噪声的结束 -- 再执行thread\_entry()函数,标志下一个噪声的进入 - - -换句话说,该钩子函数会统计除了采样线程外其他所有线程执行的时间。其中thread\_entry()和thread\_exit()的具体实现与上面对irq事件统计的函数实现类似,此处不再过多赘述。 - - -### nmi\_events - - -对于NMI事件的统计比较特殊,在ftrace\_nmi\_enter和ftrace\_nmi\_exit中直接调用trace\_osnoise\_callback获取nmi noise,并且调用trace\_nmi\_noise将duration放到ftrace的ringbuffer中。 - - - -``` -static inline void ftrace_nmi_exit(void) -{ - ... - if (trace_osnoise_callback_enabled) - trace_osnoise_callback(false); - ... -} -static inline void ftrace_nmi_exit(void) -{ - ... - if (trace_osnoise_callback_enabled) - trace_osnoise_callback(false); - ... -} -void trace_osnoise_callback(bool enter) -{ - struct osnoise_variables *osn_var = this_cpu_osn_var(); - u64 duration; - - if (!osn_var->sampling) - return; - - /* - * Currently trace_clock_local() calls sched_clock() and the - * generic version is not NMI safe. - */ - if (!IS_ENABLED(CONFIG_GENERIC_SCHED_CLOCK)) { - if (enter) { - osn_var->nmi.delta_start = time_get(); - local_inc(&osn_var->int_counter); - } else { - duration = time_get() - osn_var->nmi.delta_start; - - trace_nmi_noise(osn_var->nmi.delta_start, duration); - - cond_move_irq_delta_start(osn_var, duration); - cond_move_softirq_delta_start(osn_var, duration); - cond_move_thread_delta_start(osn_var, duration); - } - } - - if (enter) - osn_var->nmi.count++; -} -``` - - -主要函数为trace\_osnoise\_callback(bool enter),该函数通过一个bool值来判断当前是进入nmi中断还是退出nmi中断,进而进行相应的处理,统计方法和其他事件统计方法一直。可以看到在NMI的钩子函数中,会调用到 - - -+ cond\_move\_irq\_delta\_start(osn\_var, duration); -+ cond\_move\_softirq\_delta\_start(osn\_var, duration); -+ cond\_move\_softirq\_delta\_start(osn\_var, duration); - - -这三个函数去校准其他低优先级事件的统计。与我们之前的分析一致。 - - -## 2.4 采样 - - -上面介绍了osnoise对各类事件采样的方法,接下来,我们分析一下osnoise的采样流程。osnoise开始采样的函数调用流程为osnoise\_tracer\_start->osnoise\_workload\_start->start\_per\_cpu\_kthreads->start\_kthread->osnoise\_main->run\_osnoise。 - - - -采样的核心函数为run\_osnoise,将代码裁剪后如下: - - - -``` -static int run_osnoise(void) -{ - ... - - threshold = tracing_thresh ? : 5000; - - osn_var->sampling = true; - - runtime = osnoise_data.sample_runtime * NSEC_PER_USEC; - - stop_in = osnoise_data.stop_tracing * NSEC_PER_USEC; - - start = time_get(); - - last_int_count = set_int_safe_time(osn_var, &last_sample); - - do { - - int_count = set_int_safe_time(osn_var, &sample); - - noise = time_sub(sample, last_sample); - - total = time_sub(sample, start); - - if (total < last_total) { - osnoise_taint("total overflow!"); - break; - } - - last_total = total; - - if (noise >= threshold) { - int interference = int_count - last_int_count; - - if (noise > max_noise) - max_noise = noise; - - if (!interference) - hw_count++; - - sum_noise += noise; - - trace_sample_threshold(last_sample, noise, interference); - - if (osnoise_data.stop_tracing) - if (noise > stop_in) - osnoise_stop_tracing(); - } - - last_sample = sample; - last_int_count = int_count; - - } while (total < runtime && !kthread_should_stop()); - - osn_var->sampling = false; - - ... -} -``` - - - -分析采样函数的主体逻辑流程图如下所示: - - -![](assets/Ftrace:_osnoise_代码分析/img_2.png) - - -即通过不断的轮询TSC寄存器,将每次轮询的间隙与预设的threshold进行对比,判断是否发生噪声,如果发生了噪声且噪声不是由其他可测量事件所造成的,就认为发生了硬件噪声。 - - -其中: - - -* threshold :两次轮询TSC寄存器时间之差,被认为是噪声的最小值,默认设为5us。 -* osn\_var->sampling:标志位,标志是否开启采样。 -* runtime:预设的本次采样时间。 -* start :记录本次采样开始的时间 -* last\_sample : 记录上次读取tsc寄存器的值 -* sample : 记录本次读取tsc寄存器的值 -* noise = time\_sub(sample, last\_sample) : 计算本次和上次轮询tsc寄存器的时间之差。 -* total :记录从采样开始到现在所经历的时间 -* 如果noise >= threshold,则视为发生了噪声,进行统计计算 - - -+ max\_noise: 记录最大的单个噪声值 -+ interference: 记录本次噪声内事件发生的次数,如果为0则代表是硬件噪声。 -+ hw\_count: 记录硬件噪声的次数,当interference为0时,增加。 - - -* 轮询tsc寄存器,直到total>=runtime,结束本次采样。 - - - -# 三、小结 - - -以上便是对osnoise的代码分析。osnoise就是站在一个普通进程的视角上,统计所有会打断他的事件,包含irq、softirq、nmi、thread、hw。 - - -对于前四种事件内核中都提供了相应的tracepoint,只需要注册相应的回掉函数到tracepoint中即可统计到相关的信息。而hw无法被直接统计测量,因此在osnoise中就通过不断的轮询tsc寄存器,将任意两次轮询的差值与threshold进行比较,如果大于threshold就认为发生了噪声,当发生噪声时如果其他四个事件都未发生就认为发生了硬件延迟。 - - -由于irq、softirq、nmi、thread都有相应的tracepoint可以供我们使用,在不考虑hw的情况下我们其实可以直接在用户态实现相关信息的采集。下篇文章我们会尝试在用户态,利用bcc通过动态插桩的方式来实现一个简单的osnoise背景噪声统计工具。 - - - - - - - - - - - - - - - - - - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace\357\274\232_osnoise_\346\200\273\350\247\210.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace\357\274\232_osnoise_\346\200\273\350\247\210.md" deleted file mode 100644 index 782c9a33..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace\357\274\232_osnoise_\346\200\273\350\247\210.md" +++ /dev/null @@ -1,179 +0,0 @@ - - - -# Ftrace: osnoise 总览 - - - - - - - - -![](assets/Ftrace:_osnoise_总览/img_0.png) - - -## 一、osnoise是什么? - - - - -在linux系统中,一个普通线程在执行过程中会被各种各样的事件所干扰打断,如NMI、IRQ、SOFTIRQ、来自硬件的干扰以及来自其他线程的干扰。这些事件对于一个普通线程来说,就相当于噪声一样的存在。在Linux 5.14-rc1中,引入了一个新的tracer——osnoise tracer。osnoise从一个线程的视角出发,统计出所有对他有干扰的噪声,进而协助开发人员分析系统背景噪声情况。 - - -### 1.1 噪声分类 - - -在osnoise tracer中,将统计的噪声分为了以下五个大类: - - -+ IRQ:硬中断 -+ SOFTIRQ:软中断 -+ NMI:不可屏蔽中断 -+ HW:来自硬件的噪声。 -+ THREAD:来自其他线程的影响。 - - -其中,HW(hardware latency)表示某些底层硬件或者固件的行为引起的大型系统延迟。在Ftrace中,有一个名为hwlat\_detector的tracer,它的主要目的就是用来检测硬件噪声。osnoise的设计思想借鉴了hwlat\_detector。 - - -### 1.2 hwlat - - -hwlat\_detector的工作原理简单来说就是在一段时间内,关闭irq、softirq以及抢占,然后不断的去轮询TSC(Time Stamp Counter)寄存器的值。由于关闭了中断及抢占,任意两次读取之间的间隙都是由于硬件噪声或者来自其他不可屏蔽中断的噪声(NMI)。 - - -如图所示: - - -![](assets/Ftrace:_osnoise_总览/img_1.png) - - -在一段时间内,采样线程不断的去循环读取TSC寄存器,在一个循环内会连续读取两次TSC寄存器。假设本次循环读取的时间分别为t1、t2,上次循环读取的时间为last\_t1、last\_t2。则: - - -+ t1与t2的时间之差,last\_t1、last\_t2的时间之差,称为inner\_latency。 -+ t1与last\_t2的时间之差,称为outer\_latency。 -+ tracing\_thresh为预设的阀值,如果观察到任何超过阀值的延迟就认为发生了噪声事件。 -+ 在hwlat中,会不断的计算inner\_latency和outer\_latency。然后将其值与预设的tracing\_thresh值进行对比,如果大于tracing\_thresh,就认为发生了噪声事件。 -+ 在hwlat采样期间,会同时追踪nmi中断事件。因此,观察到的任何超过阀值的延迟如果不是nmi造成的,那么就认为是hardware latency。 - - -### 1.3 osnoise实现 - - -前面我们介绍了hwlat的实现。简而言之,hwlat关闭irq、softirq、抢占等事件,通过不断的轮询TSC寄存器以及追踪NMI中断来探测延迟事件,观察到的任何延迟都是由NMI或者硬件造成的。 - - -osnoise的实现思想和hwlat类似,不过osnoise不会关闭irq、softirq、抢占等事件,而是在采样的同时追踪各类事件。在irq\_handler\_entry、irq\_handler\_exit、softirq\_entry、softirq\_exit、sched\_switch、nmi\_enter、nmi\_exit处也插入相应的钩子函数。进而统计出各类事件发生的次数以及持续时间。如果观测到的任意延迟不是由以上时间造成的,那么就认为是硬件噪声。 - - -## 二、osnoise tracer - - -### 2.1 配置文件 - - -osnoise在`/sys/kernel/debug/tracing/` 目录下有一系列可配置文件, 含义如下: - - -* **osnoise/cpus:** osnoise采样的目标cpu,默认是所有cpu。 -* **osnoise/period\_us:** osnoise线程的周期。默认是1000000ms,即1s。 -* **osnoise/runtime\_us:** osnoise线程在一个周期内的采样时间。默认是1000000ms,即1s。 -* **osnoise/stop\_tracing\_us:** 当单个噪声的最大值超过这个阀值时,停止采样。默认为0,即关闭该选项。 -* **osnoise/stop\_tracing\_total\_us:** 当总计噪声超过这个阀值时,停止采样。默认为0,即关闭该选项。 -* **tracing\_thresh**: 两次轮询TSC寄存器时间之差,被认为是噪声的最小值,单位为us。当配置为0时,默认设为5us。 - - -### 2.2 使用方法 - - -1. 将osnoise写入的current\_tracer: - - -`echo osnoise > /sys/kernel/debug/tracing/current_tracer` - - -2. 打开traceing\_on: - - -`echo 1 > /sys/kernel/debug/tracing/tracing_on` - - -3. 查看trace结果: - - -`cat /sys/kernel/debug/tracing/trace` - - - - - -![](assets/Ftrace:_osnoise_总览/img_2.png) - - -这里显示的是系统整体采样的结果各个字段的含义如下: - - -* TASK-PID:采样线程的PID。 -* CPU:采样的CPU ID -* TIMESTAMP:时间戳 -* RUNTIME IN US:采样时间,单位us -* NOISE IN US:本次采样时间内的总计噪声时间,单位us。 -* %OF CPU AVAILABLE:在一个RUNTIME周期内,采样线程可以获得的cpu利用率。 -* HW、NMI、IRQ、SIRQ、THREAD:分别表示各类噪声事件发生的次数。 - - -## 三、osnoise trace\_point - - -### 3.1 trace\_point - - -osnoise除了提供tracer外,还提供了一组trace\_points,以协助开发人员对噪声进行进一步分析。可以在`/sys/kernel/debug/tracing/events/osnoise/`看到相关tracepoint: - - -* **sample\_threshold:** 追踪任何高于阀值的噪声事件。阀值即为上文提到的tracing\_thresh,默认为5us。 -* **nmi\_noise:** nmi噪声,包含其持续时间。 -* **irq\_noise:** irq噪声,包含其持续时间。 -* **softirq\_noise:** softirq噪声,包含其持续时间 -* **thread\_noise:** 其他线程噪声,包含其持续时间 - - -### 3.2 使用方法 - - -前面我们已经介绍了osnoise tracer的使用,它可以让我们直观的看到整个系统级别的各种噪声事件的总和。如果我们像看到每种噪声或者是说指定噪声类型的事件的详细信息,就需要用到osnoise提供的trace\_point。 - - -打开trace\_point总开关: - - -`echo 1 > /sys/kernel/debug/tracing/events/osnoise/enable` - - -查看trace日志: - - -`cat /sys/kernel/debug/tracing/trace` - - -输出如下所示: - - -![](assets/Ftrace:_osnoise_总览/img_3.png) - - - -日志中包含了所有噪声的详细信息,包括其名字,开始事件,持续时间等等。关于其输出的具体格式可以查看对应trace\_point文件夹下的format文件。 - - -trace\_ponit文件位置在`/sys/kernel/debug/tracing/events/osnoise/`下。 - - -除了总开关外,每个事件有自己单独的开关,在对应tracepoint目录下。如irq\_noise的开关为`/sys/kernel/debug/tracing/events/osnoise/irq_noise/enable`。用户可以根据自己的需求只追踪相应的事件,从而过滤掉其他不需要关注的信息。 - - - - - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257CONSOLE_\344\273\243\347\240\201\345\210\206\346\236\220.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257CONSOLE_\344\273\243\347\240\201\345\210\206\346\236\220.md" deleted file mode 100644 index 41ecbb17..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257CONSOLE_\344\273\243\347\240\201\345\210\206\346\236\220.md" +++ /dev/null @@ -1,558 +0,0 @@ -![](assets/Pstore前端:CONSOLE_代码分析/img_0.png) - - -作者:新绎 - - - -# 写在前面 - - -pstore中提供了多种前端来实现捕获各种系统信息来加以调试。这篇文章中,我们会对pstore其中之一的前端`PSTORE\_CONSOLE`进行分析,从原理上分析pstore如何获取kernel printk的信息。 - - -# pstore console注册 - - -`pstore console`前端注册函数在`fs/pstore/platform.c`中被定义,通过后端初始化过程中被调用并注册,从而能够在系统执行`prink`时获取输出信息,并通过`write`方法将`prink`的输出写入到相应的后端当中。 - - - -``` -static void pstore_console_write(struct console *con, const char *s, unsigned c) -{ - struct pstore_record record; - - if (!c) - return; - - pstore_record_init(&record, psinfo); - record.type = PSTORE_TYPE_CONSOLE; - - record.buf = (char *)s; - record.size = c; - psinfo->write(&record); -} - -static struct console pstore_console = { - .write = pstore_console_write, - .index = -1, -}; - -static void pstore_register_console(void) -{ - /* Show which backend is going to get console writes. */ - strscpy(pstore_console.name, psinfo->name, - sizeof(pstore_console.name)); - /* - * Always initialize flags here since prior unregister_console() - * calls may have changed settings (specifically CON_ENABLED). - */ - pstore_console.flags = CON_PRINTBUFFER | CON_ENABLED | CON_ANYTIME; - register_console(&pstore_console); -} -``` - - -其中,pstore\_console的flag开启了3个选项:`CON\_PRINTBUFFER`,`CON\_ENABLED`和`CON\_ANYTIME`。 - - -`CON\_PRINTBUFFER`:只有开启了才会接受prink的输出 - - -`CON\_ENABLED`:console使能,如果没有开启这个flag需要手动使能(在cmdline中定义) - - -`CON\_ANYTIME`:可以在cpu离线时进行调用 - - - -``` -//console.h -/* - * The interface for a console, or any other device that wants to capture - * console messages (printer driver?) - * - * If a console driver is marked CON_BOOT then it will be auto-unregistered - * when the first real console is registered. This is for early-printk drivers. - */ - -#define CON_PRINTBUFFER (1) -#define CON_CONSDEV (2) /* Last on the command line */ -#define CON_ENABLED (4) -#define CON_BOOT (8) -#define CON_ANYTIME (16) /* Safe to call when cpu is offline */ -#define CON_BRL (32) /* Used for a braille device */ -#define CON_EXTENDED (64) /* Use the extended output format a la /dev/kmsg */ - -struct console { - char name[16]; - void (*write)(struct console *, const char *, unsigned); - int (*read)(struct console *, char *, unsigned); - struct tty_driver *(*device)(struct console *, int *); - void (*unblank)(void); - int (*setup)(struct console *, char *); - int (*match)(struct console *, char *name, int idx, char *options); - short flags; - short index; - int cflag; - void *data; - struct console *next; -}; -``` - - -# printk总览 - - -![](assets/Pstore前端:CONSOLE_代码分析/img_1.png) - - - -# printk向console输出过程分析 - - -pstore中注册好console之后,console会被动地获取printk的输出,接下来我们分析printk是对console进行输出。 - - -## cmdline解析 - - -如果console的flag中定义了`CON\_ENABLED`,那么console会默认使能。如果没有定义,则需要在cmdline中手动使能。 - - -`kernel/printk.c`中将`'console='`的解析函数`console\_setup`注册到`obs\_kernel\_param`,在kernel启动过程中会遍历所有`obs\_kernel\_param`,接着会调用`console\_setup`来解析。 - - -我们通过在cmdline中定义`console=xxx`则能够被`console\_setup`所解析并使能相应的console。 - - - -参数是`'console='`的值字符串,如“ttyS0,115200”,`console\_setup`对`console=`参数值做解析,以ttyS0,115200为例,`buf=“ttyS”`,`idx=0`,`options="115200"`,`brl\_options=NULL`。 - - - -``` -//printk.c 解析cmdline -/* - * Set up a console. Called via do_early_param() in init/main.c - * for each "console=" parameter in the boot command line. - */ -static int __init console_setup(char *str) -{ - char buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for "ttyS" */ - char *s, *options, *brl_options = NULL; - int idx; - - if (_braille_console_setup(&str, &brl_options)) - return 1; - - /* - * Decode str into name, index, options. - */ - if (str[0] >= '0' && str[0] <= '9') { - strcpy(buf, "ttyS"); - strncpy(buf + 4, str, sizeof(buf) - 5); - } else { - strncpy(buf, str, sizeof(buf) - 1); - } - buf[sizeof(buf) - 1] = 0; - options = strchr(str, ','); - if (options) - *(options++) = 0; -#ifdef __sparc__ - if (!strcmp(str, "ttya")) - strcpy(buf, "ttyS0"); - if (!strcmp(str, "ttyb")) - strcpy(buf, "ttyS1"); -#endif - for (s = buf; *s; s++) - if (isdigit(*s) || *s == ',') - break; - idx = simple_strtoul(s, NULL, 10); - *s = 0; - - __add_preferred_console(buf, idx, options, brl_options); - console_set_on_cmdline = 1; - return 1; -} -__setup("console=", console_setup); -``` - - -`console\_setup`最后调用`\_\_add\_preferred\_console`: - - -kernel利用结构体数组`console\_cmdline[8]`,最多可支持8个cmdline传入的console参数。 - - -`\_\_add\_preferred\_console`将name,idx,options保存到数组下一个成员`console\_cmdline`结构体中,如果数组中已有重名,则不添加,并置`selected\_console`为最新添加的`console\_cmdline`的下标。 - - - -**一个例子:** - - -如cmdline中有“console=ttyS0,115200 console=ttyS1,9600” - - -则在`console\_cmdline[8]`数组中`console\_cmdline[0]`代表ttyS0,`console\_cmdline[1]`代表ttyS1,而`preferred\_console=1`。 - - - -``` -//printk.c __add_preferred_console -static int __add_preferred_console(char *name, int idx, char *options, - char *brl_options) -{ - struct console_cmdline *c; - int i; - - /* - * See if this tty is not yet registered, and - * if we have a slot free. - */ - for (i = 0, c = console_cmdline; - i < MAX_CMDLINECONSOLES && c->name[0]; - i++, c++) { - if (strcmp(c->name, name) == 0 && c->index == idx) { - if (!brl_options) - preferred_console = i; - return 0; - } - } - if (i == MAX_CMDLINECONSOLES) - return -E2BIG; - if (!brl_options) - preferred_console = i; - strlcpy(c->name, name, sizeof(c->name)); - c->options = options; - braille_set_options(c, brl_options); - - c->index = idx; - return 0; -} -``` - - -## printk console选择 - - -printk内容会一直存在log\_buf中,log\_buf满了之后则会从头在开始存,覆盖掉原来的数据。 - - -log\_buf的大小由kernel `menuconfig`中的`CONFIG\_LOG\_BUF\_SHIFT`配置。 - - -根据printk的实现原理,printk最后调用`console\_unlock`实现log\_buf数据刷出到设备。 - - -kernel下每次printk打印,首先存log\_buf,然后遍历console\_drivers,找到合适console(如果有`execlusive\_console`,则往`execlusive\_console`写,如果没有,则为所有使能的console),刷出log。 - - -**默认情况下**`**execlusive\_console=NULL**`,所以printk默认是向所有enable的console写 - - -只有一种情况是指定`execlusive\_console`,就是在console注册时 - - - -``` -//printk.c call_console_drivers -/* - * Call the console drivers, asking them to write out - * log_buf[start] to log_buf[end - 1]. - * The console_lock must be held. - */ -static void call_console_drivers(const char *ext_text, size_t ext_len, - const char *text, size_t len) -{ - struct console *con; - - trace_console_rcuidle(text, len); - - if (!console_drivers) - return; - - for_each_console(con) { - if (exclusive_console && con != exclusive_console) - continue; - if (!(con->flags & CON_ENABLED)) - continue; - if (!con->write) - continue; - if (!cpu_online(smp_processor_id()) && - !(con->flags & CON_ANYTIME)) - continue; - if (con->flags & CON_EXTENDED) - con->write(con, ext_text, ext_len); - else - con->write(con, text, len); - } -} -``` - - -## printk console注册 - - -注意:linux提供了early console机制(通过`CONFIG\_EARLY\_PRINTK`进行使能),用于实现为设备注册console之前的早期log的输出,对应console也称为boot console,简称bcon。这个console在kernel启动的早期阶段就会被注册,主要通过输出设备(比如串口设备)的简单的write方法直接进行数据打印。而这个write方法也就是平台实现。这时候作为输出的串口设备是基于bootloader中已经初始化完成的。 - - - -1. 如果注册的是bootconsole(kernel早期启动打印),需要检查console\_drivers中没有real console,也就是说bootconsole必须是第一个注册的console。 -2. 检查new console是否是cmdline指定的console,如果是,则使能(`CON\_ENABLE`)并初始化该console -3. 如果该new console没有使能,退出 -4. 如果new console为bootconsole,则newcon不需要输出register之前的log(`newcon->flags &= ~CON\_PRINTBUFFER`),因为如果bootconsole和new console是同一个设备则会之前的log就输出2次 -5. 把new console加入`console\_drivers`链表,对于置位`CON\_CONSDEV`的console,放在链表首 -6. 加锁 -7. 如果new console置位`CON\_PRINTBUFFER`,则将log全部刷出(暂时修改printk输出的指定唯一`exclusive\_console`为new console,保证将之前的log只输出到new console) -8. 解锁(console\_unlock()会重新把`exclusive\_console`设置为NULL) -9. 如果有bootconsole并且不是作为real console继续使用,则unregister bootconsole(从`console\_drivers`中删掉) - -``` -//printk.c register_console -/* - * The console driver calls this routine during kernel initialization - * to register the console printing procedure with printk() and to - * print any messages that were printed by the kernel before the - * console driver was initialized. - * - * This can happen pretty early during the boot process (because of - * early_printk) - sometimes before setup_arch() completes - be careful - * of what kernel features are used - they may not be initialised yet. - * - * There are two types of consoles - bootconsoles (early_printk) and - * "real" consoles (everything which is not a bootconsole) which are - * handled differently. - * - Any number of bootconsoles can be registered at any time. - * - As soon as a "real" console is registered, all bootconsoles - * will be unregistered automatically. - * - Once a "real" console is registered, any attempt to register a - * bootconsoles will be rejected - */ -void register_console(struct console *newcon) -{ - int i; - unsigned long flags; - struct console *bcon = NULL; - struct console_cmdline *c; - static bool has_preferred; - - if (console_drivers) - for_each_console(bcon) - if (WARN(bcon == newcon, - "console '%s%d' already registered\n", - bcon->name, bcon->index)) - return; - - /* - * before we register a new CON_BOOT console, make sure we don't - * already have a valid console - */ - if (console_drivers && newcon->flags & CON_BOOT) { - /* find the last or real console */ - for_each_console(bcon) { - if (!(bcon->flags & CON_BOOT)) { - pr_info("Too late to register bootconsole %s%d\n", - newcon->name, newcon->index); - return; - } - } - } - - if (console_drivers && console_drivers->flags & CON_BOOT) - bcon = console_drivers; - - if (!has_preferred || bcon || !console_drivers) - has_preferred = preferred_console >= 0; - - /* - * See if we want to use this console driver. If we - * didn't select a console we take the first one - * that registers here. - */ - if (!has_preferred) { - if (newcon->index < 0) - newcon->index = 0; - if (newcon->setup == NULL || - newcon->setup(newcon, NULL) == 0) { - newcon->flags |= CON_ENABLED; - if (newcon->device) { - newcon->flags |= CON_CONSDEV; - has_preferred = true; - } - } - } - - /* - * See if this console matches one we selected on - * the command line. - */ - for (i = 0, c = console_cmdline; - i < MAX_CMDLINECONSOLES && c->name[0]; - i++, c++) { - if (!newcon->match || - newcon->match(newcon, c->name, c->index, c->options) != 0) { - /* default matching */ - BUILD_BUG_ON(sizeof(c->name) != sizeof(newcon->name)); - if (strcmp(c->name, newcon->name) != 0) - continue; - if (newcon->index >= 0 && - newcon->index != c->index) - continue; - if (newcon->index < 0) - newcon->index = c->index; - - if (_braille_register_console(newcon, c)) - return; - - if (newcon->setup && - newcon->setup(newcon, c->options) != 0) - break; - } - - newcon->flags |= CON_ENABLED; - if (i == preferred_console) { - newcon->flags |= CON_CONSDEV; - has_preferred = true; - } - break; - } - - if (!(newcon->flags & CON_ENABLED)) - return; - - /* - * If we have a bootconsole, and are switching to a real console, - * don't print everything out again, since when the boot console, and - * the real console are the same physical device, it's annoying to - * see the beginning boot messages twice - */ - if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV)) - newcon->flags &= ~CON_PRINTBUFFER; - - /* - * Put this console in the list - keep the - * preferred driver at the head of the list. - */ - console_lock(); - if ((newcon->flags & CON_CONSDEV) || console_drivers == NULL) { - newcon->next = console_drivers; - console_drivers = newcon; - if (newcon->next) - newcon->next->flags &= ~CON_CONSDEV; - } else { - newcon->next = console_drivers->next; - console_drivers->next = newcon; - } - - if (newcon->flags & CON_EXTENDED) - if (!nr_ext_console_drivers++) - pr_info("printk: continuation disabled due to ext consoles, expect more fragments in /dev/kmsg\n"); - - if (newcon->flags & CON_PRINTBUFFER) { - /* - * console_unlock(); will print out the buffered messages - * for us. - */ - logbuf_lock_irqsave(flags); - console_seq = syslog_seq; - console_idx = syslog_idx; - /* - * We're about to replay the log buffer. Only do this to the - * just-registered console to avoid excessive message spam to - * the already-registered consoles. - * - * Set exclusive_console with disabled interrupts to reduce - * race window with eventual console_flush_on_panic() that - * ignores console_lock. - */ - exclusive_console = newcon; - exclusive_console_stop_seq = console_seq; - logbuf_unlock_irqrestore(flags); - } - console_unlock(); - console_sysfs_notify(); - - /* - * By unregistering the bootconsoles after we enable the real console - * we get the "console xxx enabled" message on all the consoles - - * boot consoles, real consoles, etc - this is to ensure that end - * users know there might be something in the kernel's log buffer that - * went to the bootconsole (that they do not see on the real console) - */ - pr_info("%sconsole [%s%d] enabled\n", - (newcon->flags & CON_BOOT) ? "boot" : "" , - newcon->name, newcon->index); - if (bcon && - ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV) && - !keep_bootcon) { - /* We need to iterate through all boot consoles, to make - * sure we print everything out, before we unregister them. - */ - for_each_console(bcon) - if (bcon->flags & CON_BOOT) - unregister_console(bcon); - } -} - -EXPORT_SYMBOL(register_console); -``` - - -## printk打印级别 - - -printk可以根据设置的日志级别来确定这个语句最后是否能够打印出来。 - - -查看此文件:`cat /proc/sys/kernel/printk` - - -该文件有四个数字值,它们根据日志记录消息的重要性,定义将其发送到何处。 - - - - 1. 控制台日志级别:优先级高于该值的消息将被打印至控制台 - 2. 默认的消息日志级别:将用该优先级来打印没有优先级的消息 - 3. 最低的控制台日志级别:控制台日志级别可被设置的最小值(最高优先级) - 4. 默认的控制台日志级别:控制台日志级别的缺省值 - -内核中共提供了八种不同的日志级别,在 `linux/kernel.h` 中有相应的宏对应。 - - - -``` -#define KERN_EMERG "<0>" /* systemis unusable */ -#define KERN_ALERT "<1>" /* actionmust be taken immediately */ -#define KERN_CRIT "<2>" /*critical conditions */ -#define KERN_ERR "<3>" /* errorconditions */ -#define KERN_WARNING "<4>" /* warning conditions */ -#define KERN_NOTICE "<5>" /* normalbut significant */ -#define KERN_INFO "<6>" /*informational */ -#define KERN_DEBUG "<7>" /*debug-level messages */ -``` - - -**可以通过在cmdline中加入“loglevel=X”的语句,来调整日志输入级别。**其中X就是我们想要设置的console\_loglevel的值。 - - -# 总结 - - -pstore实现console前端的方式很简单:通过注册一个console并且使能即可实现。 - - -默认情况下,printk会对所有使能的console进行输出,将log\_buf中的数据写入到使能的console当中。 - - -当对pstore的console进行输出时,会触发pstore console的write,将数据写入到相应后端。 - - - - - - - - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" deleted file mode 100644 index d00e1b42..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" +++ /dev/null @@ -1,210 +0,0 @@ -![](assets/Pstore前端:DMESG_代码分析/img_0.png) - - -作者:新绎 - - - -## 写在前面 - - -pstore中提供了多种前端来实现捕获各种系统信息从而加以调试。这篇文章中,我们会对pstore其中之一的前端PSTORE\_DMESG进行分析,从原理上分析pstore如何获取当内核发生panic时kmsg信息。 - - -## Pstore注册kmsg\_dumper - - -kmsg\_dumper结构体有两个重要成员:回调函数`dump()`以及相应的`kmsg_dump_reason`。通过对`dump()`进行实现,我们就可以将相应的log信息保存到我们希望保存的地方,并且可以通过`kmsg_dump_reason`来对需要保存的信息进行筛选。 - - - -``` -//kmsg_dump.h -/** -* struct kmsg_dumper - kernel crash message dumper structure -* @list: Entry in the dumper list (private) -* @dump: Call into dumping code which will retrieve the data with -* through the record iterator -* @max_reason: filter for highest reason number that should be dumped -* @registered: Flag that specifies if this is already registered -*/ -struct kmsg_dumper { - struct list_head list; - void (*dump)(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason); - enum kmsg_dump_reason max_reason; - bool active; - bool registered; - - /* private state of the kmsg iterator */ - u32 cur_idx; - u32 next_idx; - u64 cur_seq; - u64 next_seq; -}; - -/* - * Keep this list arranged in rough order of priority. Anything listed after - * KMSG_DUMP_OOPS will not be logged by default unless printk.always_kmsg_dump - * is passed to the kernel. - */ -enum kmsg_dump_reason { - KMSG_DUMP_UNDEF, - KMSG_DUMP_PANIC, - KMSG_DUMP_OOPS, - KMSG_DUMP_EMERG, - KMSG_DUMP_RESTART, - KMSG_DUMP_HALT, - KMSG_DUMP_POWEROFF, -}; -``` - - -我们可以看到,目前有7种定义的`kmsg\_dump\_reason`,而pstore则关心在系统出现panic时的log信息。在pstore的实现中,pstore通过`pstore\_cannot\_block\_path()`函数对相应的信息进行过滤。 - - - -``` -//pstore_cannot_block_path() -/* - * Should pstore_dump() wait for a concurrent pstore_dump()? If - * not, the current pstore_dump() will report a failure to dump - * and return. - */ -static bool pstore_cannot_block_path(enum kmsg_dump_reason reason) -{ - /* In NMI path, pstore shouldn't block regardless of reason. */ - if (in_nmi()) - return true; - - switch (reason) { - /* In panic case, other cpus are stopped by smp_send_stop(). */ - case KMSG_DUMP_PANIC: - /* Emergency restart shouldn't be blocked. */ - case KMSG_DUMP_EMERG: - return true; - default: - return false; - } -} -``` - - -其中dmesg前端的主要工作就是为其实现一个`dump()`函数,该函数将从log buffer中读取log信息,然后将其封装为recored之后写入对应的后端设备,其主要定义如下: - - - -``` -//pstore_dump() -static struct kmsg_dumper pstore_dumper = { - .dump = pstore_dump, -} - -static void pstore_dump(struct kmsg_dumper *dumper, - enum kmsg_dump_reason reason) -{ - … - while (total < kmsg_bytes) { - … - pstore_record_init(&record, psinfo); - … - header_size = snprintf(dst, dst_size, "%s#%d Part%u\n", why, - oopscount, part); - dst_size -= header_size; - - if (!kmsg_dump_get_buffer(&iter, true, dst + header_size, - dst_size, &dump_size)) - break; - - if (big_oops_buf) { - zipped_len = pstore_compress(dst, psinfo->buf, - header_size + dump_size, - psinfo->bufsize); - … - } else { - record.size = header_size + dump_size; - } - - ret = psinfo->write(&record); - … - } - … -} - -``` - - -## kmsg\_dump实现 - - -printk实现了一个`kmsg\_dump()`函数,用于方便其它模块dump内核的log buffer,当内核发生oops、panic或重启等事件时,都会调用该函数dump log信息。其代码实现如下: - - - -``` -void kmsg_dump(enum kmsg_dump_reason reason) -{ - … - list_for_each_entry_rcu(dumper, &dump_list, list) { - enum kmsg_dump_reason max_reason = dumper->max_reason; - - if (max_reason == KMSG_DUMP_UNDEF) { - max_reason = always_kmsg_dump ? KMSG_DUMP_MAX : - KMSG_DUMP_OOPS; - } - if (reason > max_reason) - continue; - - dumper->dump(dumper, reason); - } - rcu_read_unlock(); -} -``` - - -使用`kmsg\_dump()`之前要先使用`kmsg\_dump\_register()`来注册一个dumper,用于实际的log写操作。 - - -我们先来看看`kmsg\_dump\_register`的定义,只定义了一个dump\_list,将系统中所有注册的dump都挂在同一个list下,这就说明系统可以注册多个dumper。 - - - -``` -int kmsg_dump_register(struct kmsg_dumper *dumper) -{ - … - if (!dumper->registered) { - dumper->registered = 1; - list_add_tail_rcu(&dumper->list, &dump_list); - err = 0; - } - … -} -``` - - -## 总结 - - -pstore dmesg主要工作流程如下: - - -(1)初始化一个record结构体 - - -(2)先向其写入pstore头信息,如dmesg reason、oops发生次数等 - - -(3)从log buffer中读取一行log信息 - - -(4)若需要压缩信息,则执行压缩操作 - - -(5)调用后端的写函数,将record写入相应的后端设备 - - - - - - - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257\357\274\232CONSOLE_\344\273\243\347\240\201\345\210\206\346\236\220.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257\357\274\232CONSOLE_\344\273\243\347\240\201\345\210\206\346\236\220.md" deleted file mode 100644 index 41ecbb17..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257\357\274\232CONSOLE_\344\273\243\347\240\201\345\210\206\346\236\220.md" +++ /dev/null @@ -1,558 +0,0 @@ -![](assets/Pstore前端:CONSOLE_代码分析/img_0.png) - - -作者:新绎 - - - -# 写在前面 - - -pstore中提供了多种前端来实现捕获各种系统信息来加以调试。这篇文章中,我们会对pstore其中之一的前端`PSTORE\_CONSOLE`进行分析,从原理上分析pstore如何获取kernel printk的信息。 - - -# pstore console注册 - - -`pstore console`前端注册函数在`fs/pstore/platform.c`中被定义,通过后端初始化过程中被调用并注册,从而能够在系统执行`prink`时获取输出信息,并通过`write`方法将`prink`的输出写入到相应的后端当中。 - - - -``` -static void pstore_console_write(struct console *con, const char *s, unsigned c) -{ - struct pstore_record record; - - if (!c) - return; - - pstore_record_init(&record, psinfo); - record.type = PSTORE_TYPE_CONSOLE; - - record.buf = (char *)s; - record.size = c; - psinfo->write(&record); -} - -static struct console pstore_console = { - .write = pstore_console_write, - .index = -1, -}; - -static void pstore_register_console(void) -{ - /* Show which backend is going to get console writes. */ - strscpy(pstore_console.name, psinfo->name, - sizeof(pstore_console.name)); - /* - * Always initialize flags here since prior unregister_console() - * calls may have changed settings (specifically CON_ENABLED). - */ - pstore_console.flags = CON_PRINTBUFFER | CON_ENABLED | CON_ANYTIME; - register_console(&pstore_console); -} -``` - - -其中,pstore\_console的flag开启了3个选项:`CON\_PRINTBUFFER`,`CON\_ENABLED`和`CON\_ANYTIME`。 - - -`CON\_PRINTBUFFER`:只有开启了才会接受prink的输出 - - -`CON\_ENABLED`:console使能,如果没有开启这个flag需要手动使能(在cmdline中定义) - - -`CON\_ANYTIME`:可以在cpu离线时进行调用 - - - -``` -//console.h -/* - * The interface for a console, or any other device that wants to capture - * console messages (printer driver?) - * - * If a console driver is marked CON_BOOT then it will be auto-unregistered - * when the first real console is registered. This is for early-printk drivers. - */ - -#define CON_PRINTBUFFER (1) -#define CON_CONSDEV (2) /* Last on the command line */ -#define CON_ENABLED (4) -#define CON_BOOT (8) -#define CON_ANYTIME (16) /* Safe to call when cpu is offline */ -#define CON_BRL (32) /* Used for a braille device */ -#define CON_EXTENDED (64) /* Use the extended output format a la /dev/kmsg */ - -struct console { - char name[16]; - void (*write)(struct console *, const char *, unsigned); - int (*read)(struct console *, char *, unsigned); - struct tty_driver *(*device)(struct console *, int *); - void (*unblank)(void); - int (*setup)(struct console *, char *); - int (*match)(struct console *, char *name, int idx, char *options); - short flags; - short index; - int cflag; - void *data; - struct console *next; -}; -``` - - -# printk总览 - - -![](assets/Pstore前端:CONSOLE_代码分析/img_1.png) - - - -# printk向console输出过程分析 - - -pstore中注册好console之后,console会被动地获取printk的输出,接下来我们分析printk是对console进行输出。 - - -## cmdline解析 - - -如果console的flag中定义了`CON\_ENABLED`,那么console会默认使能。如果没有定义,则需要在cmdline中手动使能。 - - -`kernel/printk.c`中将`'console='`的解析函数`console\_setup`注册到`obs\_kernel\_param`,在kernel启动过程中会遍历所有`obs\_kernel\_param`,接着会调用`console\_setup`来解析。 - - -我们通过在cmdline中定义`console=xxx`则能够被`console\_setup`所解析并使能相应的console。 - - - -参数是`'console='`的值字符串,如“ttyS0,115200”,`console\_setup`对`console=`参数值做解析,以ttyS0,115200为例,`buf=“ttyS”`,`idx=0`,`options="115200"`,`brl\_options=NULL`。 - - - -``` -//printk.c 解析cmdline -/* - * Set up a console. Called via do_early_param() in init/main.c - * for each "console=" parameter in the boot command line. - */ -static int __init console_setup(char *str) -{ - char buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for "ttyS" */ - char *s, *options, *brl_options = NULL; - int idx; - - if (_braille_console_setup(&str, &brl_options)) - return 1; - - /* - * Decode str into name, index, options. - */ - if (str[0] >= '0' && str[0] <= '9') { - strcpy(buf, "ttyS"); - strncpy(buf + 4, str, sizeof(buf) - 5); - } else { - strncpy(buf, str, sizeof(buf) - 1); - } - buf[sizeof(buf) - 1] = 0; - options = strchr(str, ','); - if (options) - *(options++) = 0; -#ifdef __sparc__ - if (!strcmp(str, "ttya")) - strcpy(buf, "ttyS0"); - if (!strcmp(str, "ttyb")) - strcpy(buf, "ttyS1"); -#endif - for (s = buf; *s; s++) - if (isdigit(*s) || *s == ',') - break; - idx = simple_strtoul(s, NULL, 10); - *s = 0; - - __add_preferred_console(buf, idx, options, brl_options); - console_set_on_cmdline = 1; - return 1; -} -__setup("console=", console_setup); -``` - - -`console\_setup`最后调用`\_\_add\_preferred\_console`: - - -kernel利用结构体数组`console\_cmdline[8]`,最多可支持8个cmdline传入的console参数。 - - -`\_\_add\_preferred\_console`将name,idx,options保存到数组下一个成员`console\_cmdline`结构体中,如果数组中已有重名,则不添加,并置`selected\_console`为最新添加的`console\_cmdline`的下标。 - - - -**一个例子:** - - -如cmdline中有“console=ttyS0,115200 console=ttyS1,9600” - - -则在`console\_cmdline[8]`数组中`console\_cmdline[0]`代表ttyS0,`console\_cmdline[1]`代表ttyS1,而`preferred\_console=1`。 - - - -``` -//printk.c __add_preferred_console -static int __add_preferred_console(char *name, int idx, char *options, - char *brl_options) -{ - struct console_cmdline *c; - int i; - - /* - * See if this tty is not yet registered, and - * if we have a slot free. - */ - for (i = 0, c = console_cmdline; - i < MAX_CMDLINECONSOLES && c->name[0]; - i++, c++) { - if (strcmp(c->name, name) == 0 && c->index == idx) { - if (!brl_options) - preferred_console = i; - return 0; - } - } - if (i == MAX_CMDLINECONSOLES) - return -E2BIG; - if (!brl_options) - preferred_console = i; - strlcpy(c->name, name, sizeof(c->name)); - c->options = options; - braille_set_options(c, brl_options); - - c->index = idx; - return 0; -} -``` - - -## printk console选择 - - -printk内容会一直存在log\_buf中,log\_buf满了之后则会从头在开始存,覆盖掉原来的数据。 - - -log\_buf的大小由kernel `menuconfig`中的`CONFIG\_LOG\_BUF\_SHIFT`配置。 - - -根据printk的实现原理,printk最后调用`console\_unlock`实现log\_buf数据刷出到设备。 - - -kernel下每次printk打印,首先存log\_buf,然后遍历console\_drivers,找到合适console(如果有`execlusive\_console`,则往`execlusive\_console`写,如果没有,则为所有使能的console),刷出log。 - - -**默认情况下**`**execlusive\_console=NULL**`,所以printk默认是向所有enable的console写 - - -只有一种情况是指定`execlusive\_console`,就是在console注册时 - - - -``` -//printk.c call_console_drivers -/* - * Call the console drivers, asking them to write out - * log_buf[start] to log_buf[end - 1]. - * The console_lock must be held. - */ -static void call_console_drivers(const char *ext_text, size_t ext_len, - const char *text, size_t len) -{ - struct console *con; - - trace_console_rcuidle(text, len); - - if (!console_drivers) - return; - - for_each_console(con) { - if (exclusive_console && con != exclusive_console) - continue; - if (!(con->flags & CON_ENABLED)) - continue; - if (!con->write) - continue; - if (!cpu_online(smp_processor_id()) && - !(con->flags & CON_ANYTIME)) - continue; - if (con->flags & CON_EXTENDED) - con->write(con, ext_text, ext_len); - else - con->write(con, text, len); - } -} -``` - - -## printk console注册 - - -注意:linux提供了early console机制(通过`CONFIG\_EARLY\_PRINTK`进行使能),用于实现为设备注册console之前的早期log的输出,对应console也称为boot console,简称bcon。这个console在kernel启动的早期阶段就会被注册,主要通过输出设备(比如串口设备)的简单的write方法直接进行数据打印。而这个write方法也就是平台实现。这时候作为输出的串口设备是基于bootloader中已经初始化完成的。 - - - -1. 如果注册的是bootconsole(kernel早期启动打印),需要检查console\_drivers中没有real console,也就是说bootconsole必须是第一个注册的console。 -2. 检查new console是否是cmdline指定的console,如果是,则使能(`CON\_ENABLE`)并初始化该console -3. 如果该new console没有使能,退出 -4. 如果new console为bootconsole,则newcon不需要输出register之前的log(`newcon->flags &= ~CON\_PRINTBUFFER`),因为如果bootconsole和new console是同一个设备则会之前的log就输出2次 -5. 把new console加入`console\_drivers`链表,对于置位`CON\_CONSDEV`的console,放在链表首 -6. 加锁 -7. 如果new console置位`CON\_PRINTBUFFER`,则将log全部刷出(暂时修改printk输出的指定唯一`exclusive\_console`为new console,保证将之前的log只输出到new console) -8. 解锁(console\_unlock()会重新把`exclusive\_console`设置为NULL) -9. 如果有bootconsole并且不是作为real console继续使用,则unregister bootconsole(从`console\_drivers`中删掉) - -``` -//printk.c register_console -/* - * The console driver calls this routine during kernel initialization - * to register the console printing procedure with printk() and to - * print any messages that were printed by the kernel before the - * console driver was initialized. - * - * This can happen pretty early during the boot process (because of - * early_printk) - sometimes before setup_arch() completes - be careful - * of what kernel features are used - they may not be initialised yet. - * - * There are two types of consoles - bootconsoles (early_printk) and - * "real" consoles (everything which is not a bootconsole) which are - * handled differently. - * - Any number of bootconsoles can be registered at any time. - * - As soon as a "real" console is registered, all bootconsoles - * will be unregistered automatically. - * - Once a "real" console is registered, any attempt to register a - * bootconsoles will be rejected - */ -void register_console(struct console *newcon) -{ - int i; - unsigned long flags; - struct console *bcon = NULL; - struct console_cmdline *c; - static bool has_preferred; - - if (console_drivers) - for_each_console(bcon) - if (WARN(bcon == newcon, - "console '%s%d' already registered\n", - bcon->name, bcon->index)) - return; - - /* - * before we register a new CON_BOOT console, make sure we don't - * already have a valid console - */ - if (console_drivers && newcon->flags & CON_BOOT) { - /* find the last or real console */ - for_each_console(bcon) { - if (!(bcon->flags & CON_BOOT)) { - pr_info("Too late to register bootconsole %s%d\n", - newcon->name, newcon->index); - return; - } - } - } - - if (console_drivers && console_drivers->flags & CON_BOOT) - bcon = console_drivers; - - if (!has_preferred || bcon || !console_drivers) - has_preferred = preferred_console >= 0; - - /* - * See if we want to use this console driver. If we - * didn't select a console we take the first one - * that registers here. - */ - if (!has_preferred) { - if (newcon->index < 0) - newcon->index = 0; - if (newcon->setup == NULL || - newcon->setup(newcon, NULL) == 0) { - newcon->flags |= CON_ENABLED; - if (newcon->device) { - newcon->flags |= CON_CONSDEV; - has_preferred = true; - } - } - } - - /* - * See if this console matches one we selected on - * the command line. - */ - for (i = 0, c = console_cmdline; - i < MAX_CMDLINECONSOLES && c->name[0]; - i++, c++) { - if (!newcon->match || - newcon->match(newcon, c->name, c->index, c->options) != 0) { - /* default matching */ - BUILD_BUG_ON(sizeof(c->name) != sizeof(newcon->name)); - if (strcmp(c->name, newcon->name) != 0) - continue; - if (newcon->index >= 0 && - newcon->index != c->index) - continue; - if (newcon->index < 0) - newcon->index = c->index; - - if (_braille_register_console(newcon, c)) - return; - - if (newcon->setup && - newcon->setup(newcon, c->options) != 0) - break; - } - - newcon->flags |= CON_ENABLED; - if (i == preferred_console) { - newcon->flags |= CON_CONSDEV; - has_preferred = true; - } - break; - } - - if (!(newcon->flags & CON_ENABLED)) - return; - - /* - * If we have a bootconsole, and are switching to a real console, - * don't print everything out again, since when the boot console, and - * the real console are the same physical device, it's annoying to - * see the beginning boot messages twice - */ - if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV)) - newcon->flags &= ~CON_PRINTBUFFER; - - /* - * Put this console in the list - keep the - * preferred driver at the head of the list. - */ - console_lock(); - if ((newcon->flags & CON_CONSDEV) || console_drivers == NULL) { - newcon->next = console_drivers; - console_drivers = newcon; - if (newcon->next) - newcon->next->flags &= ~CON_CONSDEV; - } else { - newcon->next = console_drivers->next; - console_drivers->next = newcon; - } - - if (newcon->flags & CON_EXTENDED) - if (!nr_ext_console_drivers++) - pr_info("printk: continuation disabled due to ext consoles, expect more fragments in /dev/kmsg\n"); - - if (newcon->flags & CON_PRINTBUFFER) { - /* - * console_unlock(); will print out the buffered messages - * for us. - */ - logbuf_lock_irqsave(flags); - console_seq = syslog_seq; - console_idx = syslog_idx; - /* - * We're about to replay the log buffer. Only do this to the - * just-registered console to avoid excessive message spam to - * the already-registered consoles. - * - * Set exclusive_console with disabled interrupts to reduce - * race window with eventual console_flush_on_panic() that - * ignores console_lock. - */ - exclusive_console = newcon; - exclusive_console_stop_seq = console_seq; - logbuf_unlock_irqrestore(flags); - } - console_unlock(); - console_sysfs_notify(); - - /* - * By unregistering the bootconsoles after we enable the real console - * we get the "console xxx enabled" message on all the consoles - - * boot consoles, real consoles, etc - this is to ensure that end - * users know there might be something in the kernel's log buffer that - * went to the bootconsole (that they do not see on the real console) - */ - pr_info("%sconsole [%s%d] enabled\n", - (newcon->flags & CON_BOOT) ? "boot" : "" , - newcon->name, newcon->index); - if (bcon && - ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV) && - !keep_bootcon) { - /* We need to iterate through all boot consoles, to make - * sure we print everything out, before we unregister them. - */ - for_each_console(bcon) - if (bcon->flags & CON_BOOT) - unregister_console(bcon); - } -} - -EXPORT_SYMBOL(register_console); -``` - - -## printk打印级别 - - -printk可以根据设置的日志级别来确定这个语句最后是否能够打印出来。 - - -查看此文件:`cat /proc/sys/kernel/printk` - - -该文件有四个数字值,它们根据日志记录消息的重要性,定义将其发送到何处。 - - - - 1. 控制台日志级别:优先级高于该值的消息将被打印至控制台 - 2. 默认的消息日志级别:将用该优先级来打印没有优先级的消息 - 3. 最低的控制台日志级别:控制台日志级别可被设置的最小值(最高优先级) - 4. 默认的控制台日志级别:控制台日志级别的缺省值 - -内核中共提供了八种不同的日志级别,在 `linux/kernel.h` 中有相应的宏对应。 - - - -``` -#define KERN_EMERG "<0>" /* systemis unusable */ -#define KERN_ALERT "<1>" /* actionmust be taken immediately */ -#define KERN_CRIT "<2>" /*critical conditions */ -#define KERN_ERR "<3>" /* errorconditions */ -#define KERN_WARNING "<4>" /* warning conditions */ -#define KERN_NOTICE "<5>" /* normalbut significant */ -#define KERN_INFO "<6>" /*informational */ -#define KERN_DEBUG "<7>" /*debug-level messages */ -``` - - -**可以通过在cmdline中加入“loglevel=X”的语句,来调整日志输入级别。**其中X就是我们想要设置的console\_loglevel的值。 - - -# 总结 - - -pstore实现console前端的方式很简单:通过注册一个console并且使能即可实现。 - - -默认情况下,printk会对所有使能的console进行输出,将log\_buf中的数据写入到使能的console当中。 - - -当对pstore的console进行输出时,会触发pstore console的write,将数据写入到相应后端。 - - - - - - - - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257\357\274\232DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257\357\274\232DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" deleted file mode 100644 index d00e1b42..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257\357\274\232DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" +++ /dev/null @@ -1,210 +0,0 @@ -![](assets/Pstore前端:DMESG_代码分析/img_0.png) - - -作者:新绎 - - - -## 写在前面 - - -pstore中提供了多种前端来实现捕获各种系统信息从而加以调试。这篇文章中,我们会对pstore其中之一的前端PSTORE\_DMESG进行分析,从原理上分析pstore如何获取当内核发生panic时kmsg信息。 - - -## Pstore注册kmsg\_dumper - - -kmsg\_dumper结构体有两个重要成员:回调函数`dump()`以及相应的`kmsg_dump_reason`。通过对`dump()`进行实现,我们就可以将相应的log信息保存到我们希望保存的地方,并且可以通过`kmsg_dump_reason`来对需要保存的信息进行筛选。 - - - -``` -//kmsg_dump.h -/** -* struct kmsg_dumper - kernel crash message dumper structure -* @list: Entry in the dumper list (private) -* @dump: Call into dumping code which will retrieve the data with -* through the record iterator -* @max_reason: filter for highest reason number that should be dumped -* @registered: Flag that specifies if this is already registered -*/ -struct kmsg_dumper { - struct list_head list; - void (*dump)(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason); - enum kmsg_dump_reason max_reason; - bool active; - bool registered; - - /* private state of the kmsg iterator */ - u32 cur_idx; - u32 next_idx; - u64 cur_seq; - u64 next_seq; -}; - -/* - * Keep this list arranged in rough order of priority. Anything listed after - * KMSG_DUMP_OOPS will not be logged by default unless printk.always_kmsg_dump - * is passed to the kernel. - */ -enum kmsg_dump_reason { - KMSG_DUMP_UNDEF, - KMSG_DUMP_PANIC, - KMSG_DUMP_OOPS, - KMSG_DUMP_EMERG, - KMSG_DUMP_RESTART, - KMSG_DUMP_HALT, - KMSG_DUMP_POWEROFF, -}; -``` - - -我们可以看到,目前有7种定义的`kmsg\_dump\_reason`,而pstore则关心在系统出现panic时的log信息。在pstore的实现中,pstore通过`pstore\_cannot\_block\_path()`函数对相应的信息进行过滤。 - - - -``` -//pstore_cannot_block_path() -/* - * Should pstore_dump() wait for a concurrent pstore_dump()? If - * not, the current pstore_dump() will report a failure to dump - * and return. - */ -static bool pstore_cannot_block_path(enum kmsg_dump_reason reason) -{ - /* In NMI path, pstore shouldn't block regardless of reason. */ - if (in_nmi()) - return true; - - switch (reason) { - /* In panic case, other cpus are stopped by smp_send_stop(). */ - case KMSG_DUMP_PANIC: - /* Emergency restart shouldn't be blocked. */ - case KMSG_DUMP_EMERG: - return true; - default: - return false; - } -} -``` - - -其中dmesg前端的主要工作就是为其实现一个`dump()`函数,该函数将从log buffer中读取log信息,然后将其封装为recored之后写入对应的后端设备,其主要定义如下: - - - -``` -//pstore_dump() -static struct kmsg_dumper pstore_dumper = { - .dump = pstore_dump, -} - -static void pstore_dump(struct kmsg_dumper *dumper, - enum kmsg_dump_reason reason) -{ - … - while (total < kmsg_bytes) { - … - pstore_record_init(&record, psinfo); - … - header_size = snprintf(dst, dst_size, "%s#%d Part%u\n", why, - oopscount, part); - dst_size -= header_size; - - if (!kmsg_dump_get_buffer(&iter, true, dst + header_size, - dst_size, &dump_size)) - break; - - if (big_oops_buf) { - zipped_len = pstore_compress(dst, psinfo->buf, - header_size + dump_size, - psinfo->bufsize); - … - } else { - record.size = header_size + dump_size; - } - - ret = psinfo->write(&record); - … - } - … -} - -``` - - -## kmsg\_dump实现 - - -printk实现了一个`kmsg\_dump()`函数,用于方便其它模块dump内核的log buffer,当内核发生oops、panic或重启等事件时,都会调用该函数dump log信息。其代码实现如下: - - - -``` -void kmsg_dump(enum kmsg_dump_reason reason) -{ - … - list_for_each_entry_rcu(dumper, &dump_list, list) { - enum kmsg_dump_reason max_reason = dumper->max_reason; - - if (max_reason == KMSG_DUMP_UNDEF) { - max_reason = always_kmsg_dump ? KMSG_DUMP_MAX : - KMSG_DUMP_OOPS; - } - if (reason > max_reason) - continue; - - dumper->dump(dumper, reason); - } - rcu_read_unlock(); -} -``` - - -使用`kmsg\_dump()`之前要先使用`kmsg\_dump\_register()`来注册一个dumper,用于实际的log写操作。 - - -我们先来看看`kmsg\_dump\_register`的定义,只定义了一个dump\_list,将系统中所有注册的dump都挂在同一个list下,这就说明系统可以注册多个dumper。 - - - -``` -int kmsg_dump_register(struct kmsg_dumper *dumper) -{ - … - if (!dumper->registered) { - dumper->registered = 1; - list_add_tail_rcu(&dumper->list, &dump_list); - err = 0; - } - … -} -``` - - -## 总结 - - -pstore dmesg主要工作流程如下: - - -(1)初始化一个record结构体 - - -(2)先向其写入pstore头信息,如dmesg reason、oops发生次数等 - - -(3)从log buffer中读取一行log信息 - - -(4)若需要压缩信息,则执行压缩操作 - - -(5)调用后端的写函数,将record写入相应的后端设备 - - - - - - - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\244\232\345\220\216\347\253\257\346\224\257\346\214\201\350\241\245\344\270\201.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\244\232\345\220\216\347\253\257\346\224\257\346\214\201\350\241\245\344\270\201.md" deleted file mode 100644 index ae0745cb..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\244\232\345\220\216\347\253\257\346\224\257\346\214\201\350\241\245\344\270\201.md" +++ /dev/null @@ -1,197 +0,0 @@ - -![](assets/Pstore多后端支持补丁/img_0.png) - - -作者:新绎 - - -## 写在前面 - - -目前,pstore一次只支持打开一个后端。 如果一个新的后端想稍后注册, pstore将拒绝这个请求并返回一个错误。这个设计迫使我们关闭现有后端以使用新后端。 - - -内核支持某些类型的后端,例如ramoops和blk。在实际使用当中,我们还可以自行实现多种类型的后端。不同的后端根据不同的场景或业务进行信息收集。因此,他们需要同时工作,以满足各种需求。 - - -## 原始实现 - - -具体来说,由于全局变量`psinfo`的存在, pstore只接受第一个注册后端。如果一个新的后端想稍后注册, pstore将拒绝这个请求并返回一个错误。 - - - -``` -int pstore_register(struct pstore_info *psi) -{ - if (backend && strcmp(backend, psi->name)) { - pr_warn("ignoring unexpected backend '%s'\n", psi->name); - return -EPERM; - } - - /* Sanity check flags. */ - if (!psi->flags) { - pr_warn("backend '%s' must support at least one frontend\n", - psi->name); - return -EINVAL; - } - - /* Check for required functions. */ - if (!psi->read || !psi->write) { - pr_warn("backend '%s' must implement read() and write()\n", - psi->name); - return -EINVAL; - } - - mutex_lock(&psinfo_lock); - if (psinfo) { - pr_warn("backend '%s' already loaded: ignoring '%s'\n", - psinfo->name, psi->name); - mutex_unlock(&psinfo_lock); - return -EBUSY; - } - ... -} -``` - - -psinfo作为后端信息的存储结构体,一个psinfo只能保存一个后端。 - - - -``` -struct pstore_info { - struct module *owner; - const char *name; - - spinlock_t buf_lock; - char *buf; - size_t bufsize; - - struct mutex read_mutex; - - int flags; - int max_reason; - void *data; - - int (*open)(struct pstore_info *psi); - int (*close)(struct pstore_info *psi); - ssize_t (*read)(struct pstore_record *record); - int (*write)(struct pstore_record *record); - int (*write_user)(struct pstore_record *record, - const char __user *buf); - int (*erase)(struct pstore_record *record); -}; -``` - - -## 多后端实现 - - -### 修改全局变量 - - -在原始`fs/pstore/internal.h`中定义了全局变量`psinfo` - - -`extern struct pstore\_info \*psinfo;` - - -psinfo为后端信息的存储结构体,一个psinfo只能保存一个后端 - - -修改后: - - -`extern struct pstore\_backends \*psback;` - - -`psback`保存了所有使能`psinfo`的双向链表头节点。 - - -启动`psback`以及双向链表的定义如下: - - - -``` -struct pstore_info_list { - struct pstore_info *psi; - struct list_head list; - int index; -}; - -/** - * struct pstore_backends - management of pstore backends - * @list_entry: entry of pstore backend driver information list - * @front_cnt: count of each enabled frontend - * @flag: bitmap of enabled pstore backend - * @fs_ready: whether the pstore filesystem is ready - * - */ - -struct pstore_backends { - struct list_head list_entry; - int front_cnt[PSTORE_TYPE_MAX]; - u16 flag; - bool fs_ready; -}; -``` - - -### 前端复用 - - -为了防止每注册一个后端就要注册相应的前端造成过多开销,我们选择对已经注册好的前端进行复用。如果当多个后端同时使能了同一前端,那么这个前端将会把自己收集的信息多写到这几个后端当中。 - - -![image.png](../../../assets/内核调测/Pstore多后端支持补丁/img_1.png) - - - -代码实现: - - - -``` -static void pstore_dump(struct kmsg_dumper *dumper, - enum kmsg_dump_reason reason) -{ - struct pstore_info_list *entry; - - rcu_read_lock(); - list_for_each_entry_rcu(entry, &psback->list_entry, list) - if (entry->psi->flags & PSTORE_FLAGS_DMESG) - pstore_do_dump(dumper, reason, entry->psi, entry->index); - rcu_read_unlock(); -} -``` - - -通过rcu锁以及对双向链表遍历的方式,前端可以线程安全地获取所有使能的后端,并且根据后端的使能情况执行写操作。 - - -### 让文件系统更直观 - - -由于多后端的存在,不同后端的输出文件将显得格外混乱,所以通过文件夹对不同后端进行分类的想法是自然而然产生的。 - - -通过修改`inode.c`,在`sys/fs/pstore`下建立相应后端的子文件夹,实现文件归类 - - -![](../../../assets/内核调测/Pstore多后端支持补丁/img_2.png) - - - -## 总结 - - -多后端支持的引入让pstore的使用更加灵活,可以根据不同后端功能以及业务场景同时使能多个后端,实现互不干扰,和谐共存。 - - - - - - - - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\346\200\273\350\247\210.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\346\200\273\350\247\210.md" deleted file mode 100644 index fa9fdd8e..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\346\200\273\350\247\210.md" +++ /dev/null @@ -1,366 +0,0 @@ -![](assets/Pstore总览/img_0.png) - - -作者:新绎 - - -## pstore概述 - - -### 定义 - - -pstore文件系统,是Persistent Storage的缩写,最早设计的目的是在内核Panic/Oops时能自动转存内核日志(log\_buf)到持久化内存(Persistent Ram),在Panic重启后,把转存的日志以文件形式呈现到用户空间以分析内核崩溃问题。随着版本的不断演进,pstore开始支持console,ftrace等一系列信息获取,提供多方位的日志抓捕功能,来帮助维护人员快速定位问题。 - - -### 对比kdump - - -kdump作为一个重量级的问题分析工具,在发生panic时通过kexec加载crash kernel,该kernel会收集内存所有信息到dump core文件中予以保存。kdump的方案适用于服务器这种有大量资源的设备,功能也非常强大,但对嵌入式设备非常不友好。而pstore是个轻量级的内核崩溃日志转存的方案,虽然不能保存所有完整的寄存器等信息,但是不需要大量的内存空间进行部署,功能简洁轻量,在移动端和嵌入式设备的调试中被广泛地使用。 - - -  - - - -## pstore配置方法 - - -### config选项(基于kernel version 5.10) - - -pstore的各个模块需要在内核编译时通过config进行使能。 - - - -pstore的各个模块需要在内核编译时通过config进行使能。 - - - - -| | | -| --- | --- | -| `CONFIG_PSTORE` | pstore文件系统使能 | - - -* 前端 - - - - -| | | -| --- | --- | -| `CONFIG_PSTORE_PMSG` | 用户空间信息,/dev/pmsg0 | -| `CONFIG_PSTORE_CONSOLE` | 控制台输出,所有内核信息 | -| `CONFIG_PSTORE_FTRACE` | 函数调用序列, ftrace 信息 | - - -* 后端 - - - - -| | | -| --- | --- | -| `CONFIG_PSTORE_RAM` | 持久化内存(重启后不会丢失数据的内存) | -| `CONFIG_PSTORE_ZONE` | 实现存储空间的分配和管理 | -| `CONFIG_PSTORE_BLK` | 所有可写的块设备 | - - -* 压缩算法(**只针对DMESG前端数据**) - - - - -| | | -| --- | --- | -| `CONFIG_PSTORE_COMPRESS` | 压缩算法使能 | -| `CONFIG_PSTORE_DEFLATE_COMPRESS` | 默认压缩算法(deflate) | -| `CONFIG_PSTORE_LZO_COMPRESS` | LZO压缩 | -| `CONFIG_PSTORE_LZ4_COMPRESS` | LZ4压缩 | -| `CONFIG_PSTORE_LZ4HC_COMPRESS` | LZHC(high compression)压缩 | -| `CONFIG_PSTORE_842_COMPRESS` | 842压缩 | -| `CONFIG_PSTORE_ZSTD_COMPRESS` | zstd压缩 | - - -#### RAM后端(ramoops)配置方式 - - - -**cmdline方式** - - -example: - - -`ramoops.mem_address=0x800000 ramoops.mem_size=0x10000 ramoops.console_size=0x4000` - - -提供选项: - - -`mem_address`,`mem_size`,`mem_type`,`record_size`,`console_size`,`pmsg_size` - - -`max_reason`,`ramoops_ecc`,`dump_oops` - - -**Platform Data方式** - - - -``` -#include - [...] - - static struct ramoops_platform_data ramoops_data = { - .mem_size = <...>, - .mem_address = <...>, - .mem_type = <...>, - .record_size = <...>, - .max_reason = <...>, - .ecc = <...>, - }; - - static struct platform_device ramoops_dev = { - .name = "ramoops", - .dev = { - .platform_data = &ramoops_data, - }, - }; - - [... inside a function ...] - int ret; - - ret = platform_device_register(&ramoops_dev); - if (ret) { - printk(KERN_ERR "unable to register platform device\n"); - return ret; - } - -``` - -**设备树方式** - - - -``Documentation/devicetree/bindings/reserved-memory/ramoops.yaml``. - - - -``` - For example:: - - reserved-memory { - #address-cells = <2>; - #size-cells = <2>; - ranges; - - ramoops@8f000000 { - compatible = "ramoops"; - reg = <0 0x8f000000 0 0x100000>; - record-size = <0x4000>; - console-size = <0x4000>; - }; - }; -``` - -#### BLK后端配置方式 - - -**cmdline方式** - - -example: - - -`pstore_blk.blkdev=/dev/mmcblk0p7 pstore_blk.kmsg_size=64 best_effort=y` - - -提供选项: - - -`blkdev`,`kmsg_size`,`pmsg_size`,`console_size`,`ftrace_size`,`max_reason` - - -  - - -**Kconfig方式** - - -在编译时设置config - - -`CONFIG_PSTORE_BLK_BLKDEV` - - -`CONFIG_PSTORE_BLK_KMSG_SIZE` - - -`CONFIG_PSTORE_BLK_MAX_REASON` - - -`CONFIG_PSTORE_BLK_PMSG_SIZE` - - -`CONFIG_PSTORE_BLK_CONSOLE_SIZE` - - -`CONFIG_PSTORE_BLK_FTRACE_SIZE` - - -### 配置查看 - - -检查 pstore 配置成功与否。 -`cat /sys/module/pstore/parameters/*` - - -![](../../../assets/内核调测/Pstore总览/img_1.png) - - - -如图配置,backend = ramoops,compress = deflate,update\_ms = -1 - - -检查相关预留 size 是否配置成功(这里以ramoops后端为例) -`ls /sys/module/ramoops/parameters` -`cat /sys/module/ramoops/parameters/*` - - -![](../../../assets/内核调测/Pstore总览/img_2.png) - - -## pstore使用 - - -pstore使用十分简单,只要我们使能成功,并且检查各项配置都正确,那么pstore已经可以正常工作了。 - - -我们可以通过手动触发crash来查看pstore捕获的日志。 - - -`echo c > /proc/sysrq-trigger` - - -在重启之后,我们可以在`/sys/fs/pstore/*` 看到加载的 pstore 数据 - - -`ls /sys/fs/pstore/` - - -![](../../../assets/内核调测/Pstore总览/img_3.png) - - -## pstore框架梳理 - - -这里后端以ramoops为例,kernel version = 5.10 - - -**【右键-在新标签页中打开图片】[查看原图](https://oss.openanolis.cn/fragment/uqbmggfmkvyziugluctq)** - - -![](../../../assets/内核调测/Pstore总览/img_4.png) - - - -### pstore初始化 - - -pstore的初始化分为两步,首先是pstore前端和后端的初始化,接着是pstore文件系统的初始化 - - -pstore前后端:`postcore_initcall(ramoops_init);` - - -pstore文件系统:`late_initcall(pstore_init);` - - -![](../../../assets/内核调测/Pstore总览/img_5.png) - - -通过查看相关模块初始化定义,我们发现pstore前后端位于`postcore_initcall`(优先级2)被初始化,而pstore文件系统则在`late_initcall`(优先级7)才会被初始化 - - -#### pstore前后端初始化 - - -**主要函数** - - -fs/pstore/ram.c: - - -`static int __init ramoops_init(void)` - - -`static int ramoops_probe(struct platform_device *pdev)` - - -fs/pstore/platform.c: - - -`int pstore_register(struct pstore_info *psi)` - - -**流程** - - -1、解析并初始化前后端各种配置参数 - - -2、根据参数为每一个使能的前端申请持久化内存空间 - - -3、检测到内存中已经存在合法数据:开辟临时内存空间old\_log,将数据写入到old\_log,并刷新持久化内存 - - -4、根据flag以此判断是否注册前端,如果使能则对前端进行注册 - - -#### pstore文件系统初始化 - - -**主要函数** - - -fs/pstore/inode.c: - - -`pstore_init_fs()` - - -`register_filesystem(&pstore_fs_type);` - - -**流程** - - -1、选择压缩函数 - - -2、文件系统初始化,读取old\_log数据并在/sys/fs/pstore下挂载 - - -  - - -### pstore写入数据 - - -pstore根据前端的不同,各个前端会分别调用pstore后端的写方法向自己的空间写入数据。 - - -具体各个前端的工作模式将会在“Pstore:前端”各章节文档介绍。 - - - - - - - -  - - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/\345\237\272\344\272\216pstore\347\232\204kdump\350\260\203\346\265\213\345\267\245\345\205\267.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/\345\237\272\344\272\216pstore\347\232\204kdump\350\260\203\346\265\213\345\267\245\345\205\267.md" deleted file mode 100644 index 4236a696..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/\345\237\272\344\272\216pstore\347\232\204kdump\350\260\203\346\265\213\345\267\245\345\205\267.md" +++ /dev/null @@ -1,88 +0,0 @@ -## 简介 - - -基于pstore的kdump调测工具是一个用于收集并存储crash kernel启动并执行vmcore转储过程中串口打印信息的工具,为kdump提供新的feature。 -方便对crash kernel启动并执行dump过程中所遇到的问题进行定位,能够覆盖crash kernel启动的绝大部分时间点。 -目前支持内核态以及用户态信息的全收集。 - - -仓库链接: - - -\*目前对于内核pstore的改动已完成,正在进行用户态kdumpctl的整合 - - -## 背景 - - -目前kdump服务在使用过程中难免会遇到各种问题,导致vmcore无法正常生成。而在各种使用环境和因素的情况下,可能存在问题定位没有串口可用或者需要较高权限和复杂的流程来申请CN串口,那么我们需要一个机制来对crash kernel的打印信息进行转储,方便我们后续进行查看。 - - -当前新版的kdump支持在vmcore转储过程中对crash kernel的dmesg顺带进行保存,如下图所示: - - -![](assets/基于pstore的kdump调测工具/img_0.png) - - -但是,这样的dmesg信息存储需要在crash kernel成功进入用户态并执行相应的脚本进行实现,如果crash kernel在内核态启动的过程中出现panic,亦或是kdump相关脚本没有正常工作,那么dmesg将无法进行保存。所以目前的crash kernel的dmesg保存机制能覆盖问题的点比较少,我们需要一个能够cover更多问题的调测工具。 - - -## 原理 - - -### pstore相关原理及修改 - - -pstore相关介绍和对应的补丁修改参见: - - -[Pstore总览 - OpenAnolis 龙蜥操作系统开源社区](https://openanolis.cn/sig/Cloud-Kernel/doc/623611346526568454) - - -[Pstore多后端支持补丁](https://openanolis.cn/sig/Cloud-Kernel/doc/646804783491448879) - - -当前的pstore的内核态与用户态的log存储逻辑如下: - - -![](assets/基于pstore的kdump调测工具/img_1.png) - - -对于用户态信息,pmsg只会接受用户对其的输入信息,而不会主动获取。而可以产生用户态输出的程序和服务有许多,包括各种service以及dump相关脚本,如果想采用这样一个方案进行用户态信息的收集,我们需要对用户态的输出进行重定向到pmsg。这样的操作有两个比较大的问题: - - -1、重定向后原有的串口将不显示输出 - - -2、如果想cover所有用户态输出,需要在用户态进行大量的修改 - - -所以,我们希望从根源上高效地解决问题。我们注意到所以用户态向串口输出都会走tty驱动,那么我们可以实现一个新的pstore前端,该前端在tty驱动前有一个hook点,我们可以直接获取到用户态向tty驱动的输出,从而获取相关的log信息。 - - -![](assets/基于pstore的kdump调测工具/img_2.png) - - -## 工具流程 - - -基于pstore的kdump调测工具主要工作在crash kernel中,在crash kernel中配置好pstore后端ramoops相应的参数(内存地址,预留空间大小等),在crash kernel启动过程中会使能pstore并且获取内核态以及用户态的信息,实时输出到ramoops配置好的持久化内存当中。 - - -由于机器重启不会掉电(正常情况下),当我们重回第一个kernel的之后,我们对那块内存进行解析,就可以获取crash kernel相应的log输出。 - - -![](assets/基于pstore的kdump调测工具/img_3.png) - - -## 使用 - - -我们对工具进行了包装,与kdump进行融合,pstore相关的配置将由相应的脚本自动实现,使用者无需进行配置。在正常使用过程中,我们将工具包装进了kdumpctl命令。 - - -只需要在crash kernel执行过后输入kdumpctl showdebug,就可以很方便地对crash kernel的log输出进行查看。 - - -![](assets/基于pstore的kdump调测工具/img_4.png) - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/\351\241\271\347\233\256\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/\351\241\271\347\233\256\347\256\200\344\273\213.md" deleted file mode 100644 index 8f8b3d07..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/\351\241\271\347\233\256\347\256\200\344\273\213.md" +++ /dev/null @@ -1,2 +0,0 @@ -致力于各种内核调测技术的研发和产品化,包括但不限于kdump/pvdump, pstore, ftrace, 各种probes, perf/pmu, ebpf等技术。 - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/Anolis_OS\346\224\257\346\214\201\347\232\204\351\251\261\345\212\250\345\210\227\350\241\250.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/Anolis_OS\346\224\257\346\214\201\347\232\204\351\251\261\345\212\250\345\210\227\350\241\250.md" deleted file mode 100644 index e69de29b..00000000 diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250spec\350\247\204\350\214\203.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250spec\350\247\204\350\214\203.md" deleted file mode 100644 index 540c85ff..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250spec\350\247\204\350\214\203.md" +++ /dev/null @@ -1,104 +0,0 @@ -### spec文件命名 - - -驱动名、仓库名保持一致,因此spec文件的命名方式为「驱动名.spec」。 - - -### spec内容规范 - - -下面提供了spec文件的通用模板,在合入驱动时需根据实际的驱动修改pkg等字段,需修改的字段如下: - - -1)「pkg」,需修改成驱动名。 - - -2)「Summary」,需修改为该驱动的描述。 - - -3)「License」,需按照实际的license修改。 - - -4)「URL」,可修改为驱动官网链接。 - - -5)「%description」,需修改成该驱动的描述。 - - -6)「%build」,需根据实际的编译方式修改。 - - -7)「%install」,需根据实际的安装路径修改。 - - - -``` -%global pkg ast -%global pkgversion 1.0 -%global kernel kernel version -%define anolis_release 1 - -Name: kmod-%{pkg} -Version: %(echo %{kernel} | sed -E 's/-/~/g; s/\.(el|al|alios)[0-9]+$//g') -Release: %{pkgversion}.%{anolis_release}%{?dist} -Summary: ASPEED Graphics DRM Driver -License: LBPLv2+ and MIT -URL: https://www.aspeedtech.com/support_driver/ -Patch0: source-git.patch - -# 安装依赖, 和内核版本对应 -Requires: kernel = %{kernel} -Requires(post): kmod -Requires(post): dracut - -# 构建依赖, 和内核版本对应 -BuildRequires: kernel-devel = %{kernel} -BuildRequires: kernel-headers = %{kernel} -BuildRequires: elfutils-libelf-devel -BuildRequires: gcc -BuildRequires: kernel-rpm-macros -BuildRequires: kmod -BuildRequires: make -BuildRequires: redhat-rpm-config -BuildRequires: xz - -%description -RPM Package for ASPEED Graphics DRM Driver - -%prep -%autosetup -p1 -c -T - -%build -pushd src -%{__make} -C /usr/src/kernels/%{kernel}.%{_arch} %{?_smp_mflags} M=$PWD modules -popd - -%install -mkdir -p %{buildroot}/lib/modules/%{kernel}.%{_arch}/extra/drivers/gpu/drm/ast -%{__install} -D -t %{buildroot}/lib/modules/%{kernel}.%{_arch}/extra/drivers/gpu/drm/ast src/ast.ko - -# Make .ko objects temporarily executable for automatic stripping -find %{buildroot}/lib/modules -type f -name \*.ko -exec chmod u+x \{\} \+ - -# Generate depmod.conf -%{__install} -d %{buildroot}/%{_sysconfdir}/depmod.d/ -for kmod in $(find %{buildroot}/lib/modules/%{kernel}.%{_arch}/extra -type f -name \*.ko -printf "%%P\n" | sort) -do - echo "override $(basename $kmod .ko) * extra/$(dirname $kmod)" >> %{buildroot}/%{_sysconfdir}/depmod.d/%{pkg}.conf -done - -%clean -%{__rm} -rf %{buildroot} - -%post -depmod -a %{kernel}.%{_arch} -dracut -v -f /boot/initramfs-%{kernel}.%{_arch}.img %{kernel}.%{_arch} - -%files -%defattr(644,root,root,755) -%license licenses -/lib/modules/%{kernel}.%{_arch} -%config(noreplace) %{_sysconfdir}/depmod.d/%{pkg}.conf - -%changelog -``` diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227.md" deleted file mode 100644 index f8053a0c..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227.md" +++ /dev/null @@ -1,185 +0,0 @@ -### 简介 - - -龙蜥社区采用Out-of-tree(OOT)的方式管理部分第三方驱动,这部分驱动的版本可以在已发布的内核版本的基础上迭代小版本。一个驱动对应着两个仓库,一个source tree仓库用于管理源码,一个rpm tree仓库用于管理编译打包RPM包。 - - -#### 代码管理 - - -Source tree仓库的代码组织形式为「src目录」+ 「licenses目录」+ 「spec文件」,「src目录」用于存放驱动源码,「licenses目录」用于存放license,「spec文件」用于编译打包RPM包。 - - -#### 版本管理 - - -当前[Cloud Kernel](https://gitee.com/anolis/cloud-kernel)有devel-4.19和devel-5.10两个分支对应两个版本,因此source tree仓库也分有devel-4.19和devel-5.10两个分支用于分别适配Cloud Kernel的两个版本。 - - -**Cloud Kernel发布版本:** - - -当Cloud Kernel发布版本时会基于OOT驱动source tree仓库的devel-xxx分支拉取release分支,例如要发布4.19.91-27版本,拉取的分支为release-4.19.91-27,然后构建系统将代码和spec文件传到rpm tree仓库编译出包,打包的RPM包会随着Cloud Kernel的版本一起发布。 - - -**OOT单独迭代小版本:** - - -当Cloud Kernel的下一个版本还未发布时,OOT驱动可以单独在已经发布的大版本的基础上迭代小版本,例如在4.19.91-27的版本基础上发布4.19.91-27-1版本。 - - -### 如何向OOT合入新的驱动 - - -下文将以ast为实际例子进行流程说明。 - - -#### 创建source tree仓库和rpm tree仓库 - - -Maintainer会为驱动创建source tree仓库和rpm tree仓库,然后**将创建好的仓库地址同步到bugzilla**,仓库地址例如:https://gitee.com/anolis/ast 和 https://gitee.com/src-anolis-sig/ast。 - - -#### 注册账号/登录 - - -参与龙蜥OOT开发,需要先注册龙蜥社区及 Gitee 平台账号,并将两个账号关联。 -步骤如下: - - -* [注册龙蜥社区账号](https://gitee.com/link?target=https%3A%2F%2Fpassport.openanolis.cn%2Fregister)(已有账号的略过此步); -* [注册 Gitee 账号](https://gitee.com/signup)(已有账号的略过此步); -* 关联两个账号:因涉及下节提到的 CLA 签署,需要将两个账号关联,直接登录龙蜥社区在【账号设置】 -> 【安全设置】里可以操作绑定 Gitee 账号。 - - -          ![](../../../assets/内核驱动/OOT驱动开发者指南/img_0.png) - - -签署CLA -向龙蜥OOT贡献代码,必须先签署 CLA。 可以登录龙蜥社区后, 打开[CLA页面](https://openanolis.cn/pact/contributor) 进行 CLA 签署。 - - -注意: - - -* 以人个名义贡献的,可签署个人 CLA; -* 以公司名义贡献的,需要签署公司 CLA; -* 详情请咨询贵公司相关法务。 - - -#### fork代码仓库 - - -1、将maintainer创建好的source tree仓库fork到自己的账户,龙蜥采用PR(Pull Request)的方式合并源码。 - - - ![](../../../assets/内核驱动/OOT驱动开发者指南/img_1.png) - - -2、将fork到个人账号的source tree仓库clone到本地的开发环境。 - - -![](../../../assets/内核驱动/OOT驱动开发者指南/img_2.png) - - -#### 补丁制作 - - -1、根据[OOT驱动补丁规范](https://openanolis.cn/sig/Cloud-Kernel/doc/695239829190715269),并且按照「src目录」+ 「licenses目录」+「spec文件」的格式(「src目录」存放源码,「licenses目录」用于存放license,spec文件为编译RPM包所需的文件)制作补丁,spec文件的命名和格式需按照[OOT驱动spec规范](https://openanolis.cn/sig/Cloud-Kernel/doc/684402508139285258??preview=null)上传。 - - -2、将commit push到个人账号下的source tree仓库。 - - -#### 提交PR(Pull Request) - - -1、登录gitee,进入个人账户下的仓库页面。 - - -![](../../../assets/内核驱动/OOT驱动开发者指南/img_3.png) - - -2、在「Pull Request栏」点击「新建Pull Request」,创建PR。 - - -![](../../../assets/内核驱动/OOT驱动开发者指南/img_4.png) - - -3、填写PR信息: - - -* 选择目标仓库为被fork的source tree仓库。 -* 选择正确的**源及目标分支**。 -* 选择合适的评审人即maintainer,maintainer会将他的账号同步到bugzilla或者钉钉群。 -* 「标题」和「说明」请参考[PR(Pull Request)规范](https://openanolis.cn/sig/Cloud-Kernel/doc/607605992881480196)填写。 - - -![](../../../assets/内核驱动/OOT驱动开发者指南/img_5.png) - - -4、当您提交完PR后,会有机器人自动帮您进行代码审核验证。 - - -* 代码**检测通过**,会有如下提示: - - -![](../../../assets/内核驱动/OOT驱动开发者指南/img_6.png) - - -* 代码**检测未通过**: - + 请自行修改代码后,使用**git push --force**重新push至个人仓库下。 - + 在pr链接下评论 **/retest** 重新触发代码检测。 - + 若因为某些特殊原因导致无法通过检测,可联系maintainer回复**/skip-test**跳过检测。详见:[龙蜥内核代码门禁系统](https://openanolis.cn/sig/SIG-Infra/doc/594387296754325258)。 - - -![](../../../assets/内核驱动/OOT驱动开发者指南/img_7.png) - - -5、评审人(maintainer)回复通过并附上签名。 - - -![](../../../assets/内核驱动/OOT驱动开发者指南/img_8.png) - - -6、依次将PR链接和评审人签名添加到相应 commit log 末尾处,并且使用git push --force 提交更新。 - - -注意:PR链接放在评审人签名前面 - - -格式: - - -Link: https://gitee.com/anolis/cloud-kernel/pulls/xxx Reviewed-by: xxx <邮箱> - - -![](../../../assets/内核驱动/OOT驱动开发者指南/img_9.png) - - -让最后10个 commit 都加上PR链接Link: https://gitee.com/anolis/cloud-kernel/pulls/xxx 以及评审人签名Reviewed-by: Linus Torvalds 的命令: - - -git filter-branch -f --msg-filter ' cat && echo "Link: https://gitee.com/anolis/cloud-kernel/pulls/xxx" && echo "Reviewed-by: Linus Torvalds "' HEAD~10..HEAD - - -  - - -7、在PR下评论 **/check-sig**提交签名及PR链接检查命令。 - - -![](../../../assets/内核驱动/OOT驱动开发者指南/img_10.png) - - -8、联系maintainer评论**/merge** 即可进入代码合入流程。 - - -![](../../../assets/内核驱动/OOT驱动开发者指南/img_11.png) - - -9、(可选)最后还需指定一人作为source tree仓库的maintainer,社区maintainer会为该maintainer添加仓库权限,新maintainer负责后续source tree仓库的维护。 - - -  - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250\350\241\245\344\270\201\350\247\204\350\214\203.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250\350\241\245\344\270\201\350\247\204\350\214\203.md" deleted file mode 100644 index 8522a7f0..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250\350\241\245\344\270\201\350\247\204\350\214\203.md" +++ /dev/null @@ -1,48 +0,0 @@ -将代码合入OOT驱动仓库时,请根据如下规范制作补丁。 - - -注意:**所有补丁内容均不能出现中文** - - -## 范例 - - - -``` -sched/fair: Fix wrong cpu selecting from isolated domain - -ANBZ: #1468 - -#commit body ...... - -Signed-off-by: Andrew Morton -Link: https://gitee.com/anolis/cloud-kernel/pulls/xxx -Reviewed-by: Linus Torvalds -``` - -## 范例细则 - - -* 补丁标题/subject:保持原标题不变。 -* 补丁日志/commit log - + 第一行 - - 附上对应问题的bugzilla ID号。如果还没有bugzilla ID,需要前往[bugzilla](https://bugzilla.openanolis.cn/)提交问题。 - * 格式:**ANBZ +冒号+空格+#+bugzilla ID** - * 范例:**ANBZ: #42** - * "ANBZ" 即是 "Anolis bugzilla" - + 第二行 - - 空行。 - + 第三行及其之后 - - 具体的commit 内容。 -* 补丁签名/SOB - + 保留原补丁的完整签名,在其后追加合入人的签名 - - 格式:**Signed-off-by: <名字> <邮箱地址>** - - 范例:Signed-off-by: Andrew Morton -* PR链接(初次提交不需要,评审通过后再追加至commit log尾部) - + 在回合人签名后面追加PR链接 - - 格式:**Link: ** - - 范例:Link: -* Reviewed-by(初次提交不需要,评审通过后再追加至commit log尾部) - + 在PR链接后追加评审人签名 - - 格式:**Reviewed-by: <名字> <邮箱地址>** - - 范例:Reviewed-by: Linus Torvalds diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\345\246\202\344\275\225\346\217\220\344\272\244\347\241\254\344\273\266\345\205\274\345\256\271\346\200\247\346\265\213\350\257\225\347\224\263\350\257\267.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\345\246\202\344\275\225\346\217\220\344\272\244\347\241\254\344\273\266\345\205\274\345\256\271\346\200\247\346\265\213\350\257\225\347\224\263\350\257\267.md" deleted file mode 100644 index 0ba118fa..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\345\246\202\344\275\225\346\217\220\344\272\244\347\241\254\344\273\266\345\205\274\345\256\271\346\200\247\346\265\213\350\257\225\347\224\263\350\257\267.md" +++ /dev/null @@ -1,6 +0,0 @@ -请按照硬件兼容测试申请流程: https://openanolis.cn/sig/HCT/doc/423293128473364249 , - -下载安装ancert,ancert快速开始手册:https://openanolis.cn/sig/HCT/doc/515463617816101039 - -针对第三方驱动设备执行硬件兼容性测试,审核通过之后,同步测试结果到bugzilla。 - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\345\246\202\344\275\225\346\217\220\344\272\244\347\254\254\344\270\211\346\226\271\351\251\261\345\212\250\351\233\206\346\210\220\347\224\263\350\257\267.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\345\246\202\344\275\225\346\217\220\344\272\244\347\254\254\344\270\211\346\226\271\351\251\261\345\212\250\351\233\206\346\210\220\347\224\263\350\257\267.md" deleted file mode 100644 index a4041592..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\345\246\202\344\275\225\346\217\220\344\272\244\347\254\254\344\270\211\346\226\271\351\251\261\345\212\250\351\233\206\346\210\220\347\224\263\350\257\267.md" +++ /dev/null @@ -1,6 +0,0 @@ -如果您有意向往Anolis OS中集成您的第三方驱动,请首先提一个龙蜥社区bugzilla用于跟踪合入流程。 - -具体操作步骤详见"[向CloudKernel报告BUG](https://openanolis.cn/sig/Cloud-Kernel/doc/607601736106142822)",其中「Component」选择「drivers」以保证社区能够第一时间看到。 - -![](https://oss.openanolis.cn/sig/barzdgeglncfymauwenf) - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\347\254\254\344\270\211\346\226\271\351\251\261\345\212\250\345\246\202\344\275\225\350\277\233\345\205\245Anolis_OS.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\347\254\254\344\270\211\346\226\271\351\251\261\345\212\250\345\246\202\344\275\225\350\277\233\345\205\245Anolis_OS.md" deleted file mode 100644 index 50466a9d..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\347\254\254\344\270\211\346\226\271\351\251\261\345\212\250\345\246\202\344\275\225\350\277\233\345\205\245Anolis_OS.md" +++ /dev/null @@ -1,53 +0,0 @@ -### 第三方驱动集成形式(Intree 或 Out-of-tree) - - -第三方驱动分为两种集成形式:第一种是集成到[Cloud Kernel](https://gitee.com/anolis/cloud-kernel)里面,与内核版本同步迭代,称为intree;第二种是采用单独的仓库管理,可以在大版本的基础上快速迭代小版本,称为out-of-tree(OOT)。 - - -两种集成形式的判定原则为: - - -* 使用较广泛的驱动,在其他主流OS intree支持,则Anolis OS也优先考虑intree支持。 -* 综合厂商意愿和多方意见决定是否intree。 -* 如果第三方驱动与Anolis内核中的相关代码有冲突,则选择out-of-tree。 -* 如果第三方驱动处于开发活跃期,版本节奏与Anolis OS不匹配,则选择out-of-tree。 - - -### 第三方驱动集成流程 - - -1、第三方厂商提交第三方驱动集成申请,具体操作请点击 [如何提交第三方驱动集成申请](https://openanolis.cn/sig/Cloud-Kernel/doc/658176089664054811) 。 - - -2、如果是外设驱动相关,第三方厂商还需要提交硬件兼容性测试申请,具体操作请点击 [如何硬件兼容性测试申请](https://openanolis.cn/sig/Cloud-Kernel/doc/658195172967044331) 。 - - -3、强烈建议你加入 [Cloud Kernel SIG](https://openanolis.cn/sig/Cloud-Kernel) 钉钉交流群,可用群号「**35675176」**或扫 [这里](https://openanolis.cn/sig/Cloud-Kernel) 末尾的二维码入群,入群后请查看群公告。 - - -  - - -通过bugzilla或钉钉群决策出来该第三方驱动是intree还是out-of-tree后,分别走不同的合入流程: - - -#### Intree流程 - - -1、第三方厂商提PR(Pull Request)将驱动合入到Anolis kernel中, 具体操作请点击 [内核开发者指南](https://openanolis.cn/sig/Cloud-Kernel/doc/657676881630727957) 。 - - -2、根据上述指南完成提交后,第三方厂商更新信息关闭bugzilla。 - - -#### Out-of-tree流程 - - -社区maintainer会创建source tree仓库和rpm tree仓库,将仓库信息同步至bugzilla中。 - - -1、第三方厂商提交PR(Pull Request)将源码 + spec文件合入到source tree仓库,具体操作请点击 [OOT驱动开发者指南](https://openanolis.cn/sig/Cloud-Kernel/doc/660356858711892913?preview=null) 。 - - -2、根据上述指南完成提交后,第三方厂商更新信息关闭bugzilla。 - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\351\241\271\347\233\256\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\351\241\271\347\233\256\347\256\200\344\273\213.md" deleted file mode 100644 index 98854f24..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\351\241\271\347\233\256\347\256\200\344\273\213.md" +++ /dev/null @@ -1,14 +0,0 @@ -本项目致力于维护Anolis OS各个版本的第三方驱动,例如适配支持最新的硬件型号,但不限于硬件外设驱动。 - - -  - - -相关文档: - - -#### [第三方驱动如何进入Anolis OS](https://openanolis.cn/sig/Cloud-Kernel/doc/657632139127603555?preview=) - - -#### [Anolis OS支持的驱动列表](https://openanolis.cn/sig/Cloud-Kernel/doc/657632317528069334?preview=) - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK_ARM64_RAS\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK_ARM64_RAS\346\234\272\345\210\266\347\256\200\344\273\213.md" deleted file mode 100644 index c3c53de1..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK_ARM64_RAS\346\234\272\345\210\266\347\256\200\344\273\213.md" +++ /dev/null @@ -1,340 +0,0 @@ -# 1. RAS机制简介 - - -为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: - - -**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。  - - -**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 - - -**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 - - -RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 - - -# 2. RAS机制错误处理流程 - - -RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 - - -RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_0.png) - - -# 3. RAS机制评测流程 - - -RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 - - -APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 - - -从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 - - -如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 - - - - -| | -| --- | -| 0 Processor Correctable -1 Processor Uncorrectable non-fatal -2 Processor Uncorrectable fatal | -| 3 Memory Correctable -4 Memory Uncorrectable non-fatal -5 Memory Uncorrectable fatal | -| 6 PCI Express Correctable -7 PCI Express Uncorrectable non-fatal -8 PCI Express Uncorrectable fatal | -| 9 Platform Correctable -10 Platform Uncorrectable non-fatal -11 Platform Uncorrectable fatal | - - -Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_1.png) - - -上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 - - -错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: - - -1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 - - -2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 - - -3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 - - -# 4. CPU及内存错误注入演示 - - -CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 - - -##  4.1 环境准备 - - -### 1. 安装EINJ模块 - - -使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html - - -此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 - - -### 2. 安装RAS测试工具 - - -直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git - - -### 3. 安装rasdaemon - - -先安装依赖包yum install sqlite perl-DBD-SQLite - - -使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git - - - -``` -autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make -make install -``` - -在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 - - - -``` - -d, --disable 禁用RAS事件并退出 - -e, --enable 使能RAS事件并退出 - -f, --foreground 前台运行 - -r, --record 通过sqlite3记录事件 -``` - -rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 - - -查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 - - -本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 - - -## 4.2 CPU错误注入 - - -本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 - - -使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 - - - -``` -./einj_mem_uc core_non_fatal -0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 -injecting ... -triggering ... -Manually take page offline -Test passed -``` - -使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 - - - - -| | | | | -| --- | --- | --- | --- | -| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined.  | - - -可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=17(core), cnt=0xd -INFO: RAS reg: -INFO: fr = 10a9a2 -INFO: status = 44800007 -INFO: addr = 8007e0e95fffb7ff -INFO: misc0 = 4 -INFO: misc1 = 0 -RTC: 2000-01-06 09:32:09 - core[8] mm(17) return: 0 ---handler(17) end -[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error -[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 -[40858.436229] {42}[Hardware Error]: event severity: recoverable -[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 -[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable -[40858.454204] {42}[Hardware Error]: section_type: ARM processor error -[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 -[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 -[40858.475041] {42}[Hardware Error]: running state: 0x1 -[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 -[40858.487456] {42}[Hardware Error]: Error info structure 0: -[40858.493013] {42}[Hardware Error]: num errors: 1 -[40858.497702] {42}[Hardware Error]: error_type: 0, cache error -[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 -[40858.509857] {42}[Hardware Error]: transaction type: Instruction -[40858.516109] {42}[Hardware Error]: cache level: 2 -[40858.521058] {42}[Hardware Error]: the error has not been corrected -[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered -``` - -## 4.3 内存错误注入 - - -使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 - - - -``` -./einj_mem_uc single -0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 -injecting ... -triggering ... -SIGBUS: addr = 0xffffabcb3400 -page not present -Test passed -``` - -BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=0(exception), cnt=0xa -MM Mem RAS handle,Intr:0 -Ch = 25810000 - |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 - |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 - |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 - |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 - |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 - |-ECCUSYN0~2:1FF,0,76 - |-SBRCTL:1C01591B,SBRSTS:0 -RasData->ExceptionEl: 0, UeCnt:0x1 -RTC: 2000-01-06 09:27:58 -Get SystemAddrss through mAddrTransProtocol start -Get SystemAddrss through mAddrTransProtocol end -s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 -Locate error dimm, Socket:0, Channel:2 Dimm:0 - core[8] mm(0) return: 0 ---handler(0) end -[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) -[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 -[40606.668367] {41}[Hardware Error]: event severity: recoverable -[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 -[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable -[40606.686342] {41}[Hardware Error]: section_type: memory error -[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) -[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 -[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 -[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC -[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered -``` - -## 4.4 rasdaemon日志读取 - - -rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 - - - -``` -[root@localhost ras-tools]# ras-mc-ctl --errors -Memory controller events: -1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -``` - -# 5. Q&A - - -Q:RAS机制是否需要BIOS支持? - - -A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 - - -  - - -Q: x86和ARM64的APEI是否一致? - - -A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 - - -  - - -Q: RAS注入的错误是真实的错误吗? - - -A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 - - -  - - -Q: rasdaemon日志查看是否有更易用的方法? - - -A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; - - - 最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 - - -  - - -Q: 可否使用mcelog? - - -A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 - - -  - - -Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? - - -A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 - - -  - - -Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? - - -A:需要检查是否是rasdaemon某些选项未开启。 - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK_boot_cmdline_\345\237\272\347\272\277\346\216\250\350\215\220.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK_boot_cmdline_\345\237\272\347\272\277\346\216\250\350\215\220.md" deleted file mode 100644 index 2afffe55..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK_boot_cmdline_\345\237\272\347\272\277\346\216\250\350\215\220.md" +++ /dev/null @@ -1,182 +0,0 @@ -## cgroup.memory=nokmem - - -### kmem 是什么 - - -kmem 是cgroup 的一个扩展,全称CONFIG\_MEMCG\_KMEM - - -内核内存:专用于Linux内核系统服务使用,是不可swap的,因而这部分内存非常宝贵的。但现实中存在很多针对内核内存资源的攻击,如不断地fork新进程从而耗尽系统资源,即所谓的“fork bomb”。 - - -为了防止这种攻击,社区中提议通过linux内核限制cgroup中的kmem容量,从而限制恶意进程的行为,即kernel memory accounting机制。 - - -内核内存统计对所有内存控制组默认使能,在启动时传递cgroup.memory=nokmem参数可以禁用该功能,在禁用后,内核内存就不会被统计。 - - -### 带来的性能影响 - - -#### 相关代码 - - -通过解析cmdline,是否传入nokmem会控制cgroup\_memory\_nokmem的值。 - - - -``` -static int __init cgroup_memory(char *s) -{ - char *token; - - while ((token = strsep(&s, ",")) != NULL) { - if (!*token) - continue; - if (!strcmp(token, "nosocket")) - cgroup_memory_nosocket = true; - if (!strcmp(token, "nokmem")) - cgroup_memory_nokmem = true; - } - return 0; -} -__setup("cgroup.memory=", cgroup_memory); -``` - -cgroup\_memory\_nokmem涉及到的相关函数如下: - - -each slab object pointer to an memcg respectively when kmem account enable, slab page can be used by root mem\_cgroup and children memcg. slab object age is recorded in slab\_age of page when kmem account disable. Otherwise, an special obj\_cgroups pointer will store the value. - - -int kidled\_alloc\_slab\_age(struct page \*page, struct kmem\_cache \*s, gfp\_t flags) - - -static unsigned short \*kidled\_get\_slab\_age\_array(void \*object) - - -static int memcg\_online\_kmem(struct mem\_cgroup \*memcg) - - -意味着使能该参数后,会在slab管理的page分配和释放流程上增加额外的处理逻辑,下面通过实际对比测试来直观的感受一下对应的开销。 - - -#### 数据测试 - - -通过lmbench对cgroup.memory=nokmem是否使能进行内存测试(5次取平均): - - - - -| | | | -| --- | --- | --- | -| 测试环境 | 开启cgroup\_memory\_nokmem | Communication bandwidths (Pipe,越大越好) | -| an8-4.19, memory cgroup 500M | 是 | 4234 | -| 否 | 3705 | -| an8-5.10, memory cgroup 500M | 是 | 4125 | -| 否 | 3659 | - - -### 其他问题 - - -#### kmem.slabinfo造成cpu使用率异常 - - -该问题只存在于4.19内核,5.10内核实现逻辑改变无此问题,参见mm/slab\_common.c - - -通过CONFIG\_SLAB或CONFIG\_SLUB\_DEBUG会使能kmem.slabinfo,目前anolis默认开启CONFIG\_SLUB\_DEBUG  - - - -``` -#if defined(CONFIG_SLAB) || defined(CONFIG_SLUB_DEBUG) - { - .name = "kmem.slabinfo", - .seq_start = memcg_slab_start, - .seq_next = memcg_slab_next, - .seq_stop = memcg_slab_stop, - .seq_show = memcg_slab_show, - }, -#endif -``` - -slabinfo通过链表的方式进行组织,意味着访问的时间复杂度为O(n),通过读取相应cgroup下的memory.kmem.slabinfo,可以查看相应的slabinfo信息。 - - - -``` -void *memcg_slab_start(struct seq_file *m, loff_t *pos) -{ - struct mem_cgroup *memcg = mem_cgroup_from_css(seq_css(m)); - - mutex_lock(&slab_mutex); - return seq_list_start(&memcg->kmem_caches, *pos); -} - -void *memcg_slab_next(struct seq_file *m, void *p, loff_t *pos) -{ - struct mem_cgroup *memcg = mem_cgroup_from_css(seq_css(m)); - - return seq_list_next(p, &memcg->kmem_caches, pos); -} - -void memcg_slab_stop(struct seq_file *m, void *p) -{ - mutex_unlock(&slab_mutex); -} - -int memcg_slab_show(struct seq_file *m, void *p) -{ - struct kmem_cache *s = list_entry(p, struct kmem_cache, - memcg_params.kmem_caches_node); - struct mem_cgroup *memcg = mem_cgroup_from_css(seq_css(m)); - - if (p == memcg->kmem_caches.next) - print_slabinfo_header(m); - cache_show(s, m); - return 0; -} -``` - -通过特定操作cgroup,可以让memory cgroup产生泄漏,复现方法如下: - - -通过不断创建新的memory cgroup,执行文件操作,并删除memory cgroup,我们可以看到,/sys/fs/cgroup/memory中的cgroup并没有增加,而/proc/cgroup显示存在大量的memory cgroup。 - - - -``` -for ((i=0;i<100000;++i)); do - mkdir -p /sys/fs/cgroup/memory/test/test$i - echo $$ > /sys/fs/cgroup/memory/test/test$i/tasks - mkdir -p /tmp/test/ - echo 'date' > /tmp/test/test$i - echo $$ > /sys/fs/cgroup/memory/test/tasks - rmdir /sys/fs/cgroup/memory/test/test$i -done -``` - -脚本执行前: - - -![](assets/ANCK_boot_cmdline_基线推荐/img_0.png) - - -脚本执行后: - - -![](assets/ANCK_boot_cmdline_基线推荐/img_1.png) - - -但是在执行脚本后,查看/sys/fs/cgroup/memory,并不存在对应数量的memory cgroup,产生泄漏。这样,大量的memory cgroup会造成访问slabinfo链表的执行时间大量增加,造成不必要的cpu访问开销。 - - -### 结论 - - -基于性能测试以及存在的潜在问题,存量的版本建议通过 boot cmdline cgroup.memory=nokmem 来关闭 kmem ,并保证用户习惯的兼容性。 - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK\345\206\205\346\240\270\345\212\237\350\203\275\344\270\216\346\216\245\345\217\243\344\273\213\347\273\215.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK\345\206\205\346\240\270\345\212\237\350\203\275\344\270\216\346\216\245\345\217\243\344\273\213\347\273\215.md" deleted file mode 100644 index 5e0b9291..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK\345\206\205\346\240\270\345\212\237\350\203\275\344\270\216\346\216\245\345\217\243\344\273\213\347\273\215.md" +++ /dev/null @@ -1,1028 +0,0 @@ -本文介绍龙蜥内核已支持的内核功能与接口。 - - -# Group Identity - - -Group Identity功能可以对每一个CPU cgroup设置身份标识,以区分cgroup中的任务优先级。Group Identity核心是双红黑树设计,在CFS(Completely Fair Scheduler)调度队列的单红黑树基础上,新增了一颗低优先级的红黑树,用于存放低优先级任务。系统内核在调度包含具有身份标识的任务时,会根据不同的优先级做相应处理。 - - -在业务的混合部署(延迟敏感型和计算型任务混合部署在同一台实例)场景中,Linux内核调度器需要为高优先级任务赋予更多的调度机会以最小化调度延迟,并需要把低优先级任务对内核调度带来的影响降到最低。 - - -基于该场景,ANCK提供了Group Identity功能,为CPU cgroup新增了配置调度优先级的接口,且不同优先级的任务具有以下特点: -* 高优先级任务的唤醒延迟最小化。 -* 低优先级任务不对高优先级任务造成性能影响。主要体现在: - + 低优先级任务的唤醒不会对高优先级任务造成性能影响。 - + 低优先级任务不会通过共享硬件unit而对高优先级任务造成性能影响。 - - - - -| | | -| --- | --- | -| 接口 | 说明 | -| `cpu.identity` | 默认取值为0,表示身份标识为`ID_NORMAL`。 -该接口是一个位段,一共有5个比特位,该接口各个比特位的取值说明如下: -* 空值:表示身份标识为`ID_NORMAL`。 -* 比特位0:表示身份标识为`ID_UNDERCLASS`。 -* 比特位1:表示身份标识为`ID_HIGHCLASS`。 -* 比特位2:表示身份标识为`ID_SMT_EXPELLER`。 -* 比特位3:表示身份标识为`ID_IDLE_SAVER`。 -* 比特位4:表示身份标识为`ID_IDLE_SEEKER`。 - - - -例如,如果设置一个cgroup的身份标识为`ID_HIGHCLASS`和`ID_IDLE_SEEKER`,那么将比特位1和4置为1,其他比特位置为0,得到的二进制表示为:10010,转化为十进制为:18,则执行`echo 18 > /sys/fs/cgroup/cpu/$cg/cpu.identity`即可完成写入。 | -| `cpu.bvt_warp_ns` | 默认取值为0,表示身份标识为`ID_NORMAL`。该接口的取值说明如下: -* 2:表示同时具有身份标识`ID_SMT_EXPELLER`、`ID_IDLE_SEEKER`、`ID_HIGHCLASS`,对应的identity值为22。 -* 1:表示同时具有身份标识`ID_HIGHCLASS`、`ID_IDLE_SEEKER`,对应的identity值为18。 -* 0:表示身份标识为`ID_NORMAL`,对应的identity值为0。 -* -1:表示同时具有身份标识`ID_UNDERCLASS`、`ID_IDLE_SAVER`,对应的identity值为9。 -* -2:表示同时具有身份标识`ID_UNDERCLASS`、`ID_IDLE_SAVER`,对应的identity值为9。 - | - - -  - - -# 在cgroup v1接口开启CPU Burst功能 - - - -在容器服务中,容器允许使用的CPU资源被内核的CFS Bandwidth Controller(带宽控制器)限流。当您在cgroup v1接口开启CPU Burst功能后,CPU Burst功能允许容器突发使用限流之外的CPU资源。该功能既可以保证容器运行的服务质量,又不降低容器部署密度。 -  - - - - -CPU Burst功能允许突发使用的CPU资源依赖于日常的资源积累。比如,容器在日常运行中使用的CPU资源未超过CPU限流,则空余的CPU资源将会被积累。后续当容器运行需要大量CPU资源时,将通过CPU Burst功能突发使用CPU资源,这部分突发使用的资源来源于已积累的资源。以休假体系作为类比: - - -假如您每年休假时间为4天(CPU限流),未休的假期可以存放起来后续使用,但存放上限为4天(CPU Burst)。当您第一年、第二年各只休了1天的假期,那么没有休息的6天假期可以存放起来。当第三年的时候,理论上您可以休息共计10天的假期,但因为有存放上限(CPU Burst),则实际可以休息至多8天的假期。 - - -## 开启CPU Burst功能 - - -1. 检查cgroup v1接口中的CPU Burst功能的全局开关是否已打开。 - - -  - -``` -cat /proc/sys/kernel/sched_cfs_bw_burst_enabled -``` - - - -返回结果说明: - - * 如果返回结果为`1`,则表示CPU Burst功能的全局开关已打开。 - -   - **说明** 默认情况下,cgroup v1接口中的CPU Burst功能的全局开关为打开状态。 - * 如果返回结果不为`1`,则表示CPU Burst功能的全局开关已关闭。您可以运行以下命令打开全局开关: - -   - - ``` - echo 1 > /proc/sys/kernel/sched_cfs_bw_burst_enabled - ``` -2. 在具体的子cgroup中开启CPU Burst功能。 -默认情况下,cgroup v1接口中的CPU Burst功能在各个子cgroup中均未开启。具体的开启方式如下: - 1. 进入子cgroup路径下,检查CFS Bandwidth Controller限流是否处于生效状态。 - - -   - - ``` - cd /sys/fs/cgroup/cpu/子cgroup目录名称/ - cat cpu.cfs_period_us - cat cpu.cfs_quota_us - ``` - - - - 如果`cpu.cfs_quota_us`对应的返回结果为正整数,则表示CFS Bandwidth Controller限流处于生效状态,进而在启用CPU Burst功能后,容器才可以获得超出CPU限流的CPU资源。 - 2. 检查当前默认的CPU Burst设置。 - - -   - - ``` - cat cpu.cfs_burst_us - ``` - - - - 返回结果的默认值为`0`,表示CPU Burst功能未开启。 - 3. 设置`cpu.cfs_burst_us`的值以开启CPU Burst功能。 - 您可以设置一个适用的正整数启用CPU Burst功能,且这个正整数表示子cgroup突发额外使用的CPU资源的上限。本文通过以下示例场景,介绍如何开启CPU Burst功能。 - - 1. 配置CFS Bandwidth Controller带宽控制器默认的`cpu.cfs_quota_us`与`cpu.cfs_period_us`。 - 以下配置,将CPU资源的使用周期(`cpu.cfs_period_us`)设置为100ms,每个周期中的CPU限流(`cpu.cfs_quota_us`)设置为400ms,则子cgroup将会持续获得4个CPU资源(`cpu.cfs_quota_us`/`cpu.cfs_period_us`)。 - -   - - ``` - echo 400000 > cpu.cfs_quota_us - echo 100000 > cpu.cfs_period_us - ``` - 2. 配置`cpu.cfs_burst_us`以开启CPU Burst功能。 - 以下配置,将CPU Burst的值设置为600ms,表示开启了CPU Burst功能,且允许子cgroup可以突发额外使用最多6个CPU资源(`cpu.cfs_burst_us`/`cpu.cfs_period_us`)。 - -   - - ``` - echo 600000 > cpu.cfs_burst_us - ``` - - -## 查询CPU Burst的统计数据 - - -1. 进入待查询数据的子cgroup路径下。 - - -  - -``` -cd /sys/fs/cgroup/cpu/子cgroup目录名称/ -``` -2. 查看统计数据。 - - -  - -``` -cat cpu.stat -``` - - -返回结果中,主要的信息说明如下: - - * `nr_burst`数据:当前子cgroup触发CPU Burst的次数。 - * `burst_time`数据:当前子cgroup突发使用CPU资源的时间。 - - - - - -  - -# 在cgroup v1接口开启PSI功能 - - - -PSI(Pressure Stall Information)是一个可以监控CPU、内存及IO性能异常的内核功能。有关PSI功能的详细信息,您可以通过内核文档`Documentation/accounting/psi.txt`了解。 - -## 为cgroup v1接口开启PSI功能 - - -默认情况下cgroup v1接口的PSI功能为关闭状态。按照以下步骤开启PSI功能。 - - -1. 运行`grubby`命令,修改启动参数。 -参数`args`中默认为`"psi=1"`,表示cgroup v2启用PSI功能。将参数修改为`"psi=1 psi_v1=1"`,表示为cgroup v1接口开启PSI功能。 本示例中内核版本为`4.19.81-17.an7.x86_64`,您在操作中需要更换为实际的内核版本,内核版本的查看命令为`uname -a`。 - -  - -``` -sudo grubby --update-kernel="/boot/vmlinuz-4.19.81-17.an7.x86_64" --args="psi=1 psi_v1=1" -``` -2. 重启系统使该功能生效。 - - -  - -``` -sudo reboot -``` - - -## 确认cgroup v1接口的PSI功能已启用 - - -系统重启后,您可以执行命令,确认内核`/proc/cmdline`中已启用cgroup v1接口的PSI功能。 - -  - -``` -cat /proc/cmdline | grep "psi=1 psi_v1=1" -``` - - - -## 查询CPU、内存及IO的监控数据 - - -当您开启cgroup v1接口的PSI功能时,CPU、内存及IO的PSI监控数据均会输出到cpuacct控制器下,您可以通过以下命令查看详细的监控数据。 - -  - -``` -cat /sys/fs/cgroup/cpuacct/cpu.pressure -cat /sys/fs/cgroup/cpuacct/memory.pressure -cat /sys/fs/cgroup/cpuacct/io.pressure -``` - - - - - - - - -# Memcg后台异步回收 - - - - -在社区内核系统中,系统分配内存并在相应memcg中的统计达到memcg设定的内存上限时,会触发memcg级别的直接内存回收。直接内存回收是发生在内存分配上下文的同步回收,因此会影响当前进程的性能。 - - -为了解决这个问题,ANCK增加了memcg粒度的后台异步回收功能。该功能的实现不同于全局kswapd内核线程的实现,并没有创建对应的memcg kswapd内核线程,而是采用了workqueue机制来实现,并在cgroup v1和cgroup v2两个接口中,均新增了4个memcg控制接口。 - - -注意事项: -* 当前memcg的内存分配,可能会递归触发父组的后台异步回收。 -* 触发memcg后台异步回收时,会从当前被触发的memcg开始,自上而下做层级回收。 -* 当memory.high接口被配置,并且memory.high的值比memory.limit\_in\_bytes接口的值小的时候,接口memory.wmark\_high和memory.wmark\_low水位线的计算将基于memory.high而不是memory.limit\_in\_bytes。 - - - - -| 接口 | 说明 | -| --- | --- | -| memory.wmark\_ratio | 该接口用于设置是否启用memcg后台异步回收功能,以及设置异步回收功能开始工作的memcg内存水位线。单位是相对于memcg limit的百分之几。取值范围:0~100 -* 默认值为0,该值也表示禁用memcg后台异步回收功能。 -* 取值为非0时,表示开启memcg后台异步回收功能并设置对应的水位线。 - | -| memory.wmark\_high | 只读接口,说明如下: -* 当memcg内存使用超过该接口的值时,后台异步回收功能启动。 -* 该接口的值由`(memory.limit_in_bytes * memory.wmark_ratio / 100)`计算获得。 -* memcg后台异步回收功能被禁用时,memory.wmark\_high默认为一个极大值,从而达到永不触发后台异步回收功能的目的。 -* memcg根组目录下不存在该接口文件。 - | -| memory.wmark\_low | 只读接口,说明如下: -* 当memcg内存使用低于该接口的值时,后台异步回收结束。 -* 该接口的值由`memory.wmark_high - memory.limit_in_bytes * memory.wmark_scale_factor / 10000`计算得出。 -* memcg根组目录下不存在该接口文件。 - | -| memory.wmark\_scale\_factor | 该接口用于控制memory.wmark\_high和memory.wmark\_low之间的间隔。单位是相对于memcg limit的万分之几。取值范围:1~1000 -* 该接口在创建时,会继承父组的值(该值为50),该值也是默认值,即memcg limit的千分之五。 -* memcg根组目录不存在该接口文件。 - | - - - - - -# Memcg全局最低水位线分级 - - - - -在Linux内核中,全局内存回收对系统性能影响很大。当时延敏感型业务和资源消耗型任务共同部署时,资源消耗型任务时常会瞬间申请大量的内存,使得系统的空闲内存触及全局最低水位线(global wmark\_min),引发系统所有任务进入直接内存回收的慢速路径,引发时延敏感型业务的性能抖动。在此场景下,无论是全局kswapd后台回收还是memcg后台回收,都将无法处理该问题。 - - -基于上述场景下的问题,ANCK新增了memcg全局最低水位线分级功能。在global wmark\_min的基础上,将资源消耗型任务的global wmark\_min上移,使其提前进入直接内存回收。将时延敏感型业务的global wmark\_min下移,使其尽量避免直接内存回收。这样当资源消耗型任务瞬间申请大量内存的时候,会通过上移的global wmark\_min将其短时间抑制,避免时延敏感型业务发生直接内存回收。等待全局kswapd回收一定量的内存后,再解除资源消耗型任务的短时间抑制。 - - - - - -## 功能接口说明 - - -实现memcg全局最低水位线分级功能的接口为memory.wmark\_min\_adj。该接口的值,表示基于全局最低水位线(global wmark\_min)所作出的调整(adjustment)百分比。取值范围:-25 ~ 50,取值范围说明如下: -* 该接口创建时,继承父组的值(值为0),即默认值为0。 -* 取值范围中的负值是基于调整范围`[0, WMARK_MIN]`的百分比,其中`WMARK_MIN`表示global wmark\_min的值,例如: - -  - -``` -memory.wmark_min_adj=-25, memcg WMARK_MIN is "WMARK_MIN + (WMARK_MIN - 0) * (-25%)" -``` - - - -  -**说明** 负值也表示global wmark\_min下移,即提高时延敏感型业务的内存子系统服务质量(memcg QoS)。 -* 取值范围中的正值是基于调整范围`[WMARK_MIN, WMARK_LOW]`的百分比,其中`WMARK_MIN`和`WMARK_LOW`分别表示global wmark\_min和global wmark\_low的值,例如: - -  - -``` -memory.wmark_min_adj=50, memcg WMARK_MIN is "WMARK_MIN + (WMARK_LOW - WMARK_MIN) * 50%" -``` - - - -  -**说明** 正值也表示global wmark\_min上移,即降低资源消耗型任务的内存子系统服务质量(memcg QoS)。 -* 当偏移后的global wmark\_min被触发后,会执行抑制操作,抑制操作的时间和超出的内存使用为线性比例关系。抑制时间的取值范围:1ms ~ 1000ms。 - - - -  -**说明** memcg根组目录下不存在该接口文件。 - - -## 接口注意事项 - - -在多层级目录的memcg中,有一个`effective memory.wmark_min_adj`的概念,即最终生效的memory.wmark\_min\_adj值。具体规则是在memcg层级路径上遍历取最大值(中间节点的默认值0除外)。例如,有以下层级关系示例。 - -  - -``` - root - / \ - A D - / \ - B C - / \ - E F -``` - - -则各层级设置的接口值与最终生效的接口值,对应关系如下所示。 - - - | 层级 | 各层级设置的接口值 | 最终生效的接口值 | -| --- | --- | --- | -| A | -10 | -10 | -| B | -25 | -10 | -| C | 0 | 0 | -| D | 50 | 50 | -| E | -25 | -10 | -| F | 50 | 50 | - - - -  -**说明** -* 运行命令`cat /sys/fs/cgroup/memory//memory.wmark_min_adj`输出的值为最终生效的值,其中变量``是memcg的根路径。 -* 本功能建议配合较高的全局最低水位线(global wmark\_min)来使用,例如将global wmark\_min值设置为2 GB或更高,您可以通过/proc/sys/vm/min\_free\_kbytes进行设置。 - - - - - -## 功能配置示例 - - -示例一:为时延敏感型业务所在memcg配置全局最低水位线分级。 - - -1. 运行命令`mkdir /sys/fs/cgroup/memory/test-lc`创建测试文件。 -2. 运行命令`echo -25 > /sys/fs/cgroup/memory/test-lc/memory.wmark_min_adj`向接口写入值`-25`,提高时延敏感型业务的memcg QoS。 - - -示例二:为资源消耗型任务所在memcg配置全局最低水位线分级。 - - -1. 运行命令`mkdir /sys/fs/cgroup/memory/test-be`创建测试文件。 -2. 运行命令`echo 25 > /sys/fs/cgroup/memory/test-be/memory.wmark_min_adj`向接口写入值`25`,降低资源消耗型任务的memcg QoS。 - - - - - - -# Memcg OOM优先级策略功能 - - - - -在现有内核系统中,内存紧张情况下内核会遍历cgroup,选择耗用内存较多的cgroup进行内存回收,甚至在回收失败的情况下直接OOM,并停止当前cgroup下的所有任务。这对于当前cgroup包含的核心业务来说,会造成很大的影响。为此我们希望这类包含核心业务的cgroup占有的内存不被回收,或者cgroup下的任务在OOM中可以存活下来,以便让内核去选择其他的cgroup进行内存回收或者OOM。 - - -为了解决这个问题,ANCK增加了memcg OOM优先级配置功能。该功能在进行OOM操作时,会首先判定cgroup的优先级,选择低优先级的cgroup进行OOM操作。 - - -## memcg OOM优先级接口功能说明 - - - - - | 接口 | 说明 | -| --- | --- | -| `memory.use_priority_oom` | 该接口用于设置是否启用memcg OOM优先级策略功能,取值为0或者1。该接口不会继承,默认值为0。 -* 取值为0时,表示禁用memcg OOM优先级策略功能。 -* 取值为1时,表示开启memcgOOM优先级策略功能。 - | -| `memory.priority` | 该接口提供13个级别的memcg优先级以支持不同重要程度的业务。取值范围为0~12,数值越大表示优先级越高。该接口不会继承,默认值为0。 -* 实现一定程度的内存QoS,此处需要说明的优先级值非全局变量,只能在同父cgroup下的兄弟节点进行比较。 -* 对于优先级相等的兄弟节点来说,会按照组的内存使用量来排序选择内存使用最大的进行OOM操作。 - | - - -## 接口配置示例 - - -按如下所示创建6个cgroup子节点A、 B、 C、 D、 E、 F,开启`memory.use_priority_oom`接口,并通过`memory.priority`接口设置OOM的优先级。 - -  - -``` - root - / \ - A B - / \ / \ - C D E F -``` - - -则各层级设置的接口值,对应关系如下所示: -* A:10 -* B:8 -* C:5 -* D:6 -* E:7 -* F:8 - - - -当在root中进行OOM操作时,它首先迭代查找它的两个子节点A和B,由于B的优先级值低于A,所以会选择B节点作为下一个迭代cgroup继续进行迭代,最终会在子节点E上进行OOM操作,因为它的优先级比其他的兄弟节点低。 - - -  - - -# THP reclaim功能 - - - - - - - -Linux操作系统的内存采用分页管理模式,其中的THP(Transparent Huge Page)是指内核中2 MiB或1 GiB大小的大页面(普通的小页面大小为4 KiB),一般被称为透明大页。基于应用程序使用到的内存范围越来越大,地址转换产生的开销变得不可忽视。因此,当服务器上的应用程序申请内存时,内核会根据进程的实际情况动态分配透明大页,透明大页可以减少TLB(Translation Lookaside Buffer) Miss的出现概率,从而提升应用程序的性能。 - - -THP在带来性能提升的同时,也产生了一定副作用,即可能产生Memory bloating(内存膨胀)问题。该问题产生的原因说明:透明大页申请释放的粒度为2 MiB(即512个小页面),相较于小页面,透明大页更容易产生内存碎片,进而导致内核分配的内存容量大于实际需要的内存容量。 - - -Memory bloating可能引发OOM(Out Of Memory)。例如,一个应用程序实际需要使用2个小页面,即8 KiB内存,但是内核分配了1个透明大页。此时,除去应用程序实际需要的内存(2个小页面),透明大页剩下的内存(510个小页面)大小均为0。最终可能会因RSS(Resident Set Size)内存用量增加而导致OOM。 - - -为解决THP可能引发的内存问题。ANCK增加了memcg粒度的THP reclaim功能。在内核回收内存时,该功能会把透明大页拆分为小页面,并将其中的全零页面(zero subpage)回收,从而避免内存的快速膨胀引发OOM。但您需要注意,由于THP reclaim功能会将透明大页拆分为小页面,所以相较于2 MiB大小的透明大页,THP reclaim功能会在一定程度上造成内存性能的回退。 - - -## 接口说明 - - -实现THP reclaim功能的接口说明,如下表所述: - - - | 接口 | 说明 | -| --- | --- | -| `memory.thp_reclaim` | 开启或关闭THP reclaim功能。支持以下配置项: -* reclaim:开启THP reclaim功能。 -* swap:预留配置项,目前暂无实际功能。 -* disable:关闭THP reclaim功能。 - - -THP reclaim功能默认为关闭状态,即接口默认值为disable。 | -| `memory.thp_reclaim_stat` | 查看THP reclaim功能当前的状态。接口内的参数说明如下: -* queue\_length:当前被THP reclaim管理的透明大页数量。 -* split\_hugepage:累计拆分的透明大页数量。 -* reclaim\_subpage:累计回收的全零页面(zero subpage)数量。 - - -该接口的参数值按照NUMA node的顺序(node0、node1)从左到右排列。 | -| `memory.thp_reclaim_ctrl` | 控制THP reclaim功能的触发机制。目前支持以下配置项: -* threshold:默认值为16。表示当透明大页中的全零页面(zero subpage)数量超过该值时,会触发THP reclaim功能。 -* reclaim:用于主动触发THP reclaim功能。 - | -| `/sys/kernel/mm/transparent_hugepage/reclaim` | THP reclaim功能的全局配置接口。支持以下配置项: -* memcg:该接口的默认配置项。表示每个memory cgroup按照各自的配置开启或关闭THP reclaim,即以每个memory cgroup中的`memory.thp_reclaim`接口配置为准。 -* reclaim:强制开启所有memory cgroup的THP reclaim功能。 -* swap:预留配置项,目前暂无实际功能。 -* disable:强制关闭所有memory cgroup的THP reclaim功能。 - | - - - -## 接口配置的操作说明 - - -本示例操作中,将创建一个名为test的memory cgroup,以test为例介绍THP reclaim接口的操作说明。 - - -1. 运行以下命令,创建一个名为test的memory cgroup。 - - -  - -``` -mkdir /sys/fs/cgroup/memory/test/ -``` -2. 运行以下命令,开启test的THP reclaim功能。 - - -  - -``` -echo reclaim > /sys/fs/cgroup/memory/test/memory.thp_reclaim -``` -3. 运行以下命令,确认test的THP reclaim功能成功开启。 - - -  - -``` -cat /sys/fs/cgroup/memory/test/memory.thp_reclaim -``` - - - -返回结果如下图所示,被`[]`包裹的配置项为生效配置项,`[reclaim]`表示test的THP reclaim功能已开启。![开启THP功能](../../../assets/基础能力和版本演进/ANCK内核功能与接口介绍/img_0.png) -4. 运行以下命令,通过THP reclaim功能的全局配置接口强制开启THP reclaim功能。 - - -  - -``` -echo reclaim > /sys/kernel/mm/transparent_hugepage/reclaim -``` - - -如果您想强制关闭THP reclaim功能,可运行以下命令: - -  - -``` -echo disable > /sys/kernel/mm/transparent_hugepage/reclaim -``` - - - -  -**说明** THP reclaim功能的全局配置接口`/sys/kernel/mm/transparent_hugepage/reclaim`在设置为强制开启(`reclaim`)或强制关闭(`disable`)时,接口生效的优先级会高于各个memory cgroup中的`memory.thp_reclaim`接口,但不会影响各个memory cgroup中`memory.thp_reclaim`接口的配置。 -5. 运行以下命令,配置test的`memory.thp_reclaim_ctrl`接口的`threshold`配置项。 - - -  - -``` -echo "threshold 32" > /sys/fs/cgroup/memory/test/memory.thp_reclaim_ctrl -``` - - - -此时,如果透明大页中的全零页面数量超过32,则会触发THP reclaim的全零页面回收功能。 -6. 主动触发THP reclaim的全零页面回收功能。 -主动触发后,THP reclaim会把所有超过`threshold`配置的全零页面回收。配置项`reclaim`存在以下配置方式: - -  -**说明** 该配置项的调用方式为同步调用,并且为只写配置项,即您只能向`memory.thp_reclaim_ctrl`接口写入`reclaim`以主动触发THP reclaim的全零页面回收功能,但不能通过cat命令查看到`reclaim`配置项。 - - - * 运行以下命令,会主动触发当前memory cgroup的THP reclaim的全零页面回收功能。 - -   - - ``` - echo "reclaim 1" > /sys/fs/cgroup/memory/test/memory.thp_reclaim_ctrl - ``` - * 运行以下命令,会主动递归触发当前memory cgroup以及该cgroup下所有子cgroup的THP reclaim的全零页面回收功能。 - -   - - ``` - echo "reclaim 2" > /sys/fs/cgroup/memory/test/memory.thp_reclaim_ctrl - ``` - - - 除了通过`reclaim`主动触发THP reclaim的全零页面回收功能。THP reclaim还会伴随内存回收而触发: - + 内存出现OOM时,会触发THP reclaim的全零页面回收功能。 - + 当memory cgroup触发memory后台异步回收时,会触发THP reclaim的全零页面回收功能。关于memory后台异步回收的更多信息,请参见"Memcg后台异步回收"。 -7. 运行以下命令,查看test的THP reclaim功能状态。 - - -  - -``` -cat /sys/fs/cgroup/memory/test/memory.thp_reclaim_stat -``` - - - -返回结果示例如下: - -  - -``` -queue_length 14 -split_hugepage 523 -reclaim_subpage 256207 -``` - - -## C语言代码测试样例 - - -本章节基于C语言提供了进程申请透明大页的代码测试样例。您可以通过以下测试样例,查看到THP reclaim功能在开启与关闭时的区别。 - - -1. 运行以下命令,为内存使用量限制接口`memory.limit_in_bytes`设置1 GiB的限制。 - - -  - -``` -echo 1G > /sys/fs/cgroup/memory/test/memory.limit_in_bytes -``` - - - -设置后,您可以运行以下命令查看`memory.limit_in_bytes`接口的值。 - -  - -``` -cat /sys/fs/cgroup/memory/test/memory.limit_in_bytes -``` - - -查看结果如下图所示:![异步回收机制](../../../assets/基础能力和版本演进/ANCK内核功能与接口介绍/img_1.png) -2. 运行以下命令,关闭memcg后台异步回收功能。 -关于memory后台异步回收的更多信息,请参见"Memcg后台异步回收"。 - -  - -``` -echo 0 > /sys/fs/cgroup/memory/test/memory.wmark_ratio -``` -3. 分别在开启或关闭THP reclaim功能的前提下,运行以下C语言代码进行测试,并查看测试结果。 - - -  - -``` -// 申请1 G内存(即512个透明大页),其中10个透明大页包含部分全零页面。 -#define HUGEPAGE_SIZE 4096 * 512 -int main() -{ - int i, thp = 512; - char *addr; - posix_memalign((void **)&addr, HUGEPAGE_SIZE, HUGEPAGE_SIZE * thp); - - for (i = 0; i < 10; i++) { - memset(addr, 0xc, HUGEPAGE_SIZE >> 1); - addr += HUGEPAGE_SIZE; - } - - for (; i < thp; i++) { - memset(addr, 0xc, HUGEPAGE_SIZE); - addr += HUGEPAGE_SIZE; - } - - pause(); - return 0; -} -``` - - - -测试结果根据THP reclaim功能的开启状态有所不同: - - * 在THP reclaim功能关闭时,进程申请最后一个透明大页会发生OOM。 - * 在THP reclaim功能开启时,进程申请透明大页过程中,THP reclaim会把前序申请的透明大页拆分为小页,并回收其中的全零页面,最终不会发生OOM。 - - - - - -  - -# 启用cgroup writeback功能 - - - - - -## 背景信息 - - - -控制群组(control group)简称为cgroup,分为v1和v2两个版本。本文介绍如何启用cgroup v1的cgroup writeback功能,并对进程进行Buffered I/O限速。 - - -## 使用限制 - - -在启用cgroup writeback功能之后,您可以先确认内存子系统(memcg)和IO子系统(blkcg)的映射关系是否符合下文所述的规则,再对进程进行Buffered I/O限速。 - - -cgroup writeback功能需要memcg和blkcg协同工作,完成Buffered I/O的限速,但是内核接口cgroup v1的各个控制子系统间默认不协同工作。因此需要通过一定的规则把memcg和blkcg连接起来,规则为:通过任意一个memcg必须可以找到与之唯一对应的blkcg。即memcg和blkcg的映射关系可以是一对一或多对一,不可以是一对多或多对多。 - - -例如,存在进程A和B,对它们进行Buffered I/O限速,需要遵循以下约束。 -* 如果A和B分属不同的memcg,它们可以映射到不同的blkcg,只需各自一一对应。例如:A属于`memcg1`,`blkcg1`;B属于`memcg2`,`blkcg0`。 -* 如果A和B分属不同的memcg,它们也可以映射到同一个blkcg。例如:A属于`memcg1`,B属于`memcg2`,A和B都属于`blkcg2`。 -* 如果A和B属于相同的memcg,那么它们只能映射到同一个blkcg。例如:A和B均属于`memcg0`,它们同时属于`blkcg3`。 - - -为了避免出现意外情况,建议您在启用cgroup writeback功能后,对进程进行Buffered I/O限速前,优先设置blkcg的`cgroup.procs`接口,向该接口写入一个进程ID来保证blkcg映射的唯一性。同时您也可以通过工具查看memcg和blkcg的映射关系,详情请参见确认memcg和blkcg的映射关系。 -  -在实际运维中,可能出现进程移动到其它cgroup的情况。根据上述规则,如果进程在memcg之间移动,不会出现问题,但如果进程在blkcg之间移动,将会出现异常情况。为了避免产生异常,该功能的代码中定义了规则:一旦工作中的blkcg内的进程发生blkcg间的移动,则将映射关系直接指向root blkcg。由于一般情况是不在root blkcg设置限流阈值,所以当映射关系直接指向root blkcg时,限速功能会失效。 - -  -**注意** 内核代码虽定义了规则避免出现意外,但您需要在实际操作中尽量避免将进程在blkcg间移动。 - - -## 开启cgroup writeback功能 - - -cgroup v1接口中的cgroup writeback功能默认是关闭的,按照以下步骤开启该功能。 - - -1. 通过命令`grubby`内添加`cgwb_v1`字段开启该功能。 -本示例中内核版本为`4.19.36-12.an7.x86_64`,您在操作中需要更换为实际的内核版本,内核版本的查看命令为`uname -a`。 - -  - -``` -sudo grubby --update-kernel="/boot/vmlinuz-4.19.36-12.an7.x86_64" --args="cgwb_v1" -``` -2. 重启系统使功能生效。 - - -  - -``` -sudo reboot -``` -3. 使用以下命令读取内核文件`/proc/cmdline`,确认内核命令行参数中带有`cgwb_v1`字段。此时,blkcg下的`blkio.throttle.write_bps_device`及`blkio.throttle.write_iops_device`接口能够对Buffered I/O进行限速。 - - -  - -``` -cat /proc/cmdline | grep cgwb_v1 -``` - - -## 确认memcg和blkcg的映射关系 - - -当您对进程进行Buffered I/O限速之前,您可以使用以下任意一种方式诊断memcg和blkcg的映射关系是否为一对一或多对一。 - - -* 查看memcg与blkcg映射关系。 - -  - -``` -sudo cat /sys/kernel/debug/bdi/bdi_wb_link -``` - - -返回结果示例如下,该示例表示memcg和blkcg符合一对一的映射规则。 - -  - -``` -memory <---> blkio -memcg1: 35 <---> blkcg1: 48 -``` -* 使用ftrace内核监测工具。 - 1. 开启ftrace工具。 - -   - - ``` - sudo bash -c "echo 1 > /sys/kernel/debug/tracing/events/writeback/insert_memcg_blkcg_link/enable" - ``` - 2. 查看信息输出接口。 - -   - - ``` - sudo cat /sys/kernel/debug/tracing/trace_pipe - ``` - - - 输出内容示例如下,其中`memcg_ino=35 blkcg_ino=48`表示memcg和blkcg符合一对一的映射规则。 - -   - - ``` - <...>-1537 [006] .... 99.511327: insert_memcg_blkcg_link: memcg_ino=35 blkcg_ino=48 old_blkcg_ino=0 - ``` - - -## 验证cgroup writeback是否生效 - - -本示例将模拟出两个产生I/O的进程,用于验证cgroup writeback功能是否有效。 - - - -  -**说明** -* 由于`dd`命令的反馈速度较快,结果使用`iostat`命令查看。 -* 由于`dd`命令为顺序写入,顺序IO回刷时,会生成1 MB数据再回刷,因此设置阈值时,`blkio.throttle.write_bps_device`不得小于1 MB(1048576)。如果设置值小于1 MB,可能会引发IO hang。 - - - - -1. 模拟出两个产生I/O的进程,并按照限制条件优先设置blkcg的`cgroup.procs`接口。 - - -  - -``` -sudo mkdir /sys/fs/cgroup/blkio/blkcg1 -sudo mkdir /sys/fs/cgroup/memory/memcg1 -sudo bash -c "echo $$ > /sys/fs/cgroup/blkio/blkcg1/cgroup.procs" # $$为您的进程ID -sudo bash -c "echo $$ > /sys/fs/cgroup/memory/memcg1/cgroup.procs" # $$为您的进程ID -``` -2. 使用blkcg下的`blkio.throttle.write_bps_device`接口对Buffered I/O进行限速。 - - -  - -``` -sudo bash -c "echo 254:48 10485760 > /sys/fs/cgroup/blkio/blkcg1/blkio.throttle.write_bps_device" # 通过设备号配置磁盘的回写限流bps为10 M -``` -3. 使用不带参数`oflag=sync`的`dd`命令产生缓存异步I/O。 - - -  - -``` -sudo dd if=/dev/zero of=/mnt/vdd/testfile bs=4k count=10000 -``` -4. 使用iostat工具查询结果。查看输出列`wMB/s`,如果被限制到10 MB/s,则表示cgroup writeback功能已生效。 - - -  - -``` -iostat -xdm 1 vdd -``` - - - - - - -# 增强容器资源可见性 - - - - - - - -标准Linux的容器资源视图功能接口默认状态下是未启动的,当您在启动该功能后,如果在容器中使用top、free等命令,让容器读取以下接口的数据时,将直接获取容器资源信息,而不是获取容器所在的宿主机(即ECS实例)资源信息。 -* /proc/cpuinfo -* /proc/meminfo -* /sys/devices/system/cpu/online - - - -## 接口说明 - - - - - | 接口 | 说明 | -| --- | --- | -| /proc/sys/kernel/rich\_container\_enable | 该接口控制容器资源视图功能是否开启。取值范围: -* 0:关闭容器资源视图功能。 -* 1:开启容器资源视图功能。 - - -默认值:0 | -| /proc/sys/kernel/rich\_container\_source | 该接口控制cgroup接口的数据源。取值范围: -* 0:使用指针current所在的cgroup接口作为数据源。 -* 1:使用child reaper(即当前PID Namespace的1号进程)所在的cgroup作为数据源。 - - -默认值:0 | -| /proc/sys/kernel/rich\_container\_cpuinfo\_source | 该接口控制/proc/cpuinfo接口以及/sys/devices/system/cpu/online接口显示的CPU数量。取值范围: -* 0:使用Kubernetes的Request和Limit数据的比值(`Request/Limit`),即`quota`与`period`的比值(`quota/period`)。 -* 1:使用cpuset.cpus接口中的CPU数据源。 -* 2:使用`cpu.shares` 值除以 `/proc/sys/kernel/rich_container_cpuinfo_sharesbase`值的向上取整后的数据(原始数据如果包含小数,则整数位加1后,只取整数作为最终数据,例如:原始数据为1.1,则最终数据为2)。最终数据最多不超过实际在线CPU的数量。 - - -默认值:0 | -| /proc/sys/kernel/rich\_container\_cpuinfo\_sharesbase | 当/proc/sys/kernel/rich\_container\_cpuinfo\_source接口的取值为2时,需要使用该接口作为计算公式的一部分获取最终数据。取值范围:大于等于2的整数值。 -默认值:1024 | - - -## 接口使用示例 - - -本示例中,已在一台Linux实例中部署Docker,并创建了一个内存大小为1 GB的容器。 - - -* 如果您未开启容器资源视图功能,即/proc/sys/kernel/rich\_container\_enable接口的值为0。当您在容器中运行free -m命令时,查看到的资源信息如下图所示,该信息为容器所在的宿主机(Linux实例)资源信息。![free](../../../assets/基础能力和版本演进/ANCK内核功能与接口介绍/img_2.png) -* 如果您在宿主机(Linux实例)中运行命令echo 1 > /proc/sys/kernel/rich\_container\_enable开启了容器资源视图功能,当您在容器中运行free -m命令时,查看到的资源信息如下图所示,该信息为容器资源信息。![free](../../../assets/基础能力和版本演进/ANCK内核功能与接口介绍/img_3.png) - - -## 特殊场景说明 - - -一般情况下,开启容器资源视图功能后,使用相关接口的默认值即可满足常规需求,但您需要注意以下特殊场景的接口配置: - - -对于非共享PID Namespace的Pod,其中的每一个容器都是独立的PID Namespace,如果使用systemd启动某个特权容器,容器的进程号为1号,则采集监控数据的任务可能位于容器的某个子cgroup中,而不是根cgroup。 - - -例如,当您通过SSH登录容器并运行cat /proc/cpuinfo命令后: -* 如果/proc/sys/kernel/rich\_container\_source取值为默认值0,则指针current实际是位于容器的sshd.service所创建的子cgroup中,此时查看的结果为错误数据。 -* 如果您运行echo 1 > /proc/sys/kernel/rich\_container\_source命令,使用child reaper(即当前PID Namespace的1号进程)所在的cgroup作为数据源,即可查看到正确的数据。 - - - - - - - -# 修改TCP TIME-WAIT超时时间 - - - - -在Linux的内核中,TCP/IP协议的TIME-WAIT状态持续60秒且无法修改。但在某些场景下,例如TCP负载过高时,适当调小该值有助于提升网络性能。ANCK新增内核接口用于修改TCP TIME-WAIT超时时间,本文主要介绍该接口的使用方法。 - - - -## 背景信息 - - - -TCP/IP协议的TIME-WAIT状态是指应用关闭用于通信的套接口(socket)之后,TCP/IP协议栈保持socket处于打开状态。该状态默认持续60秒,用来保证完成服务器和客户端的数据传输。当处于TIME-WAIT状态的连接数过多时,可能会影响到网络性能。因此ANCK提供了可修改TIME-WAIT超时时间的接口,用于在特定场景提高网络性能。例如,高并发业务场景。该接口的取值范围为[1, 600],单位为秒。如果不修改该接口,TIME-WAIT超时时间的默认值保持60秒不变。 - - -## 注意事项 - - -将TCP TIME-WAIT超时时间修改为小于60秒与TCP/IP协议quiet time概念相违背,可能导致您的系统将旧数据当做新数据接收,或者复制的新数据当做旧数据拒绝。因此请在网络专家建议下调整。了解TCP/IP协议quiet time的相关概念,请参见[IETF RFC 793标准](https://tools.ietf.org/html/rfc793)。 - - -## 配置方法 - - -您可以通过以下两种方式修改TIME-WAIT超时时间,其中参数[$TIME\_VALUE]为您修改的TIME-WAIT超时时间。 - - -* 通过`sysctl`命令修改TIME-WAIT超时时间。 - -  - -``` -sysctl -w "net.ipv4.tcp_tw_timeout=[$TIME_VALUE]" -``` -* 以root权限使用`echo`命令,将值修改到`/proc/sys/net/ipv4/tcp_tw_timeout`接口中。 - -  - -``` -echo [$TIME_VALUE] > /proc/sys/net/ipv4/tcp_tw_timeout -``` - - -例如,在Nginx配置7层代理等存在大量短连接的场景下,阿里云推荐您将TIME-WAIT超时时间修改为5s。运行以下任一命令修改超时时间: - -  -**说明** 服务器中是否存在大量短连接,您可以运行`netstat -ant | grep TIME_WAIT | wc -l`命令进行判断。 - - -  - -``` -sysctl -w "net.ipv4.tcp_tw_timeout=5" -``` - - - -  - -``` -echo 5 > /proc/sys/net/ipv4/tcp_tw_timeout -``` - - - - - - - - - - - - - - - - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/datop\346\212\200\346\234\257\346\226\271\346\241\210.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/datop\346\212\200\346\234\257\346\226\271\346\241\210.md" deleted file mode 100644 index f3563b40..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/datop\346\212\200\346\234\257\346\226\271\346\241\210.md" +++ /dev/null @@ -1,444 +0,0 @@ - -# 概述 - - -在本文中,我们基于社区DAMON设计用于跟踪实时内存热点数据的工具DATOP, 采用划分内存区域采样的方式,并自适应区域构建技术来获取极低的开销损耗,在此基础上,还增加了numa 仿真功能,用于收集任务跨numa访存情况,为了评估其准确性和低开销能力,我们选取和测试了多个benchmark,并与基线进行比较, 结果表明:**DATOP工具运行时开销非常小(保持在不到4%左右),此外开销不受负载大小的影响,仍然保持出色的监控质量,通过多方面测试,我们得出结论:DATOP工具在识别冷热内存以及跨numa访存方面具备优秀的表现能力。** - - -# 背景:云计算大规模复杂场景下内存面临的挑战 - - -云计算领域场景下,海量用户数据的增长,对计算机软件和硬件设计都带来了巨大的挑战,尤其是内存设备如DRAM的速率提升并没有跟上这种高速增长趋势,在数据中心中,海量数据的处理,常常让服务器饱受内存不足之苦。 - - -为克服低内存容量,混合内存使用如DRAM搭配PMEM成为未来数据中心的主流方案,但是如何快速识别热点数据并让其准确保持在DRAM中运行是影响性能的关键因素,这就要求系统具备快速识别热点数据的能力,并能动态跟踪捕获热点数据的变化,让其处于高性能的DRAM中,但是不幸的是,现有工具为达到一定的准确度,通常会耗费大量的时间,并引入额外的overhead,造成性能回退。 - - -此外服务器硬件架构的快速迭代,cpu核数越来越多,numa节点也越来越多,例如amd服务器numa node数目达到8个,arm服务器飞腾s2500 numa节点达到16个,跨numa节点访存带来的性能影响日益突出,如何低开销高效的识别出跨numa热点数据,并优化之,对于提升系统服务质量,有着重要的意义。 - - -# datop:轻量级靶向热点内存扫描工具 - - -## 热点扫描原理及策略 - - -在内存领域,对内存进行优化其实依靠预测内存的行为而做的决策,但是能够高效准确的预测内存的走势,其实是非常困难的,此外内存的策略优化对于用户来说,是不透明的,因此现有内存领域的各种策略机制,在实际生产环境中,并未取得很好的效果,也正是基于这些原因,社区推出了一种新的内存调控机制DAMON(Data Access Monitor),它试图让向用户展示内存的动作行为,让用户可根据这些行为相应的调整内存管理策略。 - - -### 三大chunks - - -服务器现有硬件能支持非常巨大的地址空间,内存容量动不动达到几个T的大小,工作负载耗用内存几个G也是很普遍的事,随机毫无规律的划分地址空间可肯定是不可取的,并且在实际使用中,只有小部分区域被实际映射到内存并被访问,DAMON通过分析和论证,先将地址分为三大chunks,这三个chunks区域之间的空隙是给定地址空间中两个最大的未映射区域。 - - -**图1:** - - -![](assets/datop技术方案/img_0.png) - - -在大多数情况下,两个最大的未映射区域是堆与最上层mmap() ed区域之间的空隙,以及最下层mmap() ed区域与堆栈之间的空隙, 因为这些间隙在通常的地址空间中是非常大的,排除这些就足够了,所以针对一个工作负载而言,DAMON只需要监控一下这些区域就足够了, 此外,随着工作负载的运行,映射区域发生变化,例如部分最大ummaped区域易主,所以damon设置了一个update周期,去周期性检测这些三大chunks的有效性,重新查找有效的三大chunks,并和现有监测得区域进行对比,删减或者增加。 - - -### region拆分与合并 - - -在获取三大chunks后,damon会按照设定规则,去将这三个chuns划分为不均等的若干分regions, 如下图2所示: - - -**图2:** - - -![](assets/datop技术方案/img_1.png) - - -这些regions后面会随着热点频率去动态调整,进行拆分或者合并操作,其算法原理大致如下: - - -**拆分原则:** - - -1. 大于等于2倍 DAMON\_MIN\_REGION才能拆分; -2. 才分region的size不能小于DAMON\_MIN\_REGION; -3. region可以拆分为3个,当regions个数大于max\_nr\_regions的2/3后,降低拆分个数,由3变2; -4. region个数必须保持在min\_nr\_regions和max\_nr\_regions范围内; - - -**合并原则:** - - -1. 两合并的regions必须收尾地址相等; -2. 两者热点统计值之差必须小于设定阈值范围内; - - -### region采样与热点统计 - - -“trace page access bit”技术作为跟踪热点内存通用那就的技术手段,被业界广泛使用,但是该技术有一个固有的缺陷,那就是随着工作负载耗用内存增加,自身带来的开销和跟踪质量都会变糟,而damon通过region划分, 再结合空间采样方式良好的解决了该缺陷:假设一个region中,所有page都有相同的访问模式,这样的话,只需要监控一个page就够了。这样一来,在每个region里面,会随机选择一个page,在bitmap中把它对应的“accessed(访问过)”bit先清零,然后时不时地检查一下,如果这个page被访问过了,那么就算作这个region都被访问过了,它不是监视所有的页面,而是只监视reigon里面随机抽取的一个页面,该页面在某个采样时刻代表着这个region, 并将该值记录下来, 随着采样的不断进行,该region的热点就被统计下来了。 - - - -``` -void check_access(region ∗ r) { - if (!r−>sampled_page) - goto next ; - if (accessed(r−>sampled_page) ) - r−>nr_accesses++; - next: - r−>sampled_page = rand_page(r->sampled_page); - clear_accessed(r−>sampled_page); -} -``` - -上述伪代码只是介绍其采样和统计实现方法,其更复杂的逻辑处理关系,例如region合并和拆分后nr\_access的值处理,以及nr\_access周期性清零等本文不再介绍,有兴趣的读者可以依据damon实现源码自行分析。 - - -### numa仿真实现 - - -社区damon能有有效的识别工作负载内存的冷热情况,但是对于工作负载内存跨numa访存这块,是无法做出判断的, 然而在实际业务中,跨numa访问造成的性能衰退问题真实存在,尤其是现今服务硬件多numa架构numa数目越来越多,正式基于以上原因,我们丰富了damon kernel部分代码,增加了内存numa访存情况。 - - -和热点统计一样,numa仿真不会统计region中所有page的跨numa访问情况,而是利用damon空间采样方式,将damon获取的page在clear了access bit后,将其设置为pte none. - - - -``` -void check_numa(region ∗ r) { - if (!r−>sampled_page) - goto next ; - if (local_numa_node(r−>sampled_page) ) - r−>nr_local++; - else - r->nr_remote++; - next: - r−>sampled_page = rand_page(r->sampled_page); - set_page_none(r−>sampled_page); -} -``` - -同样该部分伪代码只是介绍其numa基本实现,在实际中我们需要考虑pte处于swap,和page属于大页的情况,此外在pte设置为none后,会造成再次访问该page时发生page\_fault和tlb miss的情况,我们测试发现,在某些频繁访问某块内存的工作负载中,造成一定的性能损耗,所以在实际使用中,我们增加了numa仿真开关,需要的时候去开启该功能。 - - -### 小结 - - -基于上述几小节对damon以及numa仿真在kernel部分的实现机制的介绍,让我们对datop工具的实现原理有了清楚的认识,datop包括内核态部分和用户态部分,用户态可以通过perf调用功能,将内核态通过trace统计的热点信息捕获,并排序显示出来,详细调用流程入下图3显示。 - - -**图3:** - - -![](../../../assets/基础能力和版本演进/datop技术方案/img_2.png) - - -在用户态,DATOP通过trace\_event、damon dbgfs、以及numa switch接口和内核进行交互: - - -**蓝色**绘制线部分:该部分是和用户态显示的核心, 通过内核kdamond线程将采样统计的相关值传递给trace接口, 用户态通过trace\_event方式获取region区域热点信息,包括区域大小,access统计,进程信息以及跨numa统计等,最终通过窗口向用户展示。 - - -**黑色**绘制线部分:该部分用于控制内核态线程kdamond的相关行为,通过damon dbfs接口,用于设置采样频率,更新周期,region个数划分,监控进程配置,kdamond线程的开启和关闭等。 - - -**绿色**绘制线部分用于设定numa仿真功能的开启和关闭,此功能针对支持多numa的场景。 - - -**红色**绘制线部分是热点工具的核心执行单元,用户态通过dbgfs接口开启监控后,kdamond线程被创建, 首先会查找被监控进程的三大chunks, 找到后,按照damon dbgfs接口设定的region个数方范围,对其进行拆分,此后按照设定好的采样频率进入周期性循环工作,直到被监控进程停止运行或用户操作dbgfs接口,停止监控,在周期性循环中,会对region热点进行随机采样并统计,此外还判定用户是否开启numa仿真功能,若开启还会对region跨numa情况进行统计,处理完成后,会更新采样结果,并通过trace event传递给用户,以上操作完成后,会依据kdamond线程运行时间,并在指定周期内,通过热点统计值对region进行拆分和合并操作,此外在更长的周期到来后,还会从新检查chunks的准确性,并按多加少减原则,修改region,以此保证热点内存跟踪的实时性和准确性。 - - -至此DATOP技术实现原理介绍完毕,后面会进入介绍使用和数据测试方面的介绍。 - - -## 使用 - - -在龙蜥社区 5.10版本内核支持damon代码以及自研的numa仿真部分代码,结合开源的用户态工具datop: 工具就可以运行起来了,datop工具支持单、多进程以及cgroup粒度内存热点监控以及跨numa访存监控 两种方式,详细使用可以参考源码readme部分。 - - -**注:**cgroup粒度监控功能会在近期开源。 - - -## DATOP工具对部分关联性能指标影响说明 - - -为评估了DATOP工具在使用中对系统造成的影响,此处采用lmbench作为作为被监控进程进行了测试。 - - - - -| | | | -| --- | --- | --- | -| 测试情况 | 虚拟机 32vCPU 4 node | 物理机 96cpu 4node | -|   | 被监控进程个数 | 未开numa仿真 -和base对比 | 开numa仿真功能 | base对比 | 未开numa仿真 | base对比 | 开numa仿真 | base对比 | -|   -用户态overhead | 1 | 最高0.4%, | 稳定后0.1%不到 | 最高0.4% | 稳定后0.1%不到 | 最高0.2% | 稳定后不到0.1% | 0.2% | 稳定后不到0.1% | -| 4 | 最高0.7% | 0.2% | 最高0.8% | 稳定后0.2% | 最高0.2% | 稳定后不到0.1% | 最高0.3 | 稳定后不到0.1% | -|   -kernel overhead | 1 | 最高2% | 0.1% | 2.3% | 0.2% | 最高0.4% | 稳定后不到0.1% | 最高0.6% | 稳定后不到0.1% | -| 4 | 最高2.5% | 0.2% | 2.8% | 0.2% | 最高0.6% | 稳定后不到0.1 | 最高0.7% | 稳定后不到0.2% | - - -以上测试可能会存在一定的误差的,测试目主要是为了充分验证热点工具内核态代码引入,对内核以及应用程序的影响,通过测试,可以看出datop工具以及kernel部分,造成系统整机cpu使用率增加不超过1%。 - - -## 关于numa仿真测试统计正确性验证说明 - - -### 测试方法一 - - -构造一个执行程序,并创建两个线程a和b,这两个线程将会共享代码段部分代码,进行反复性读测试 - - -在测试前,将线程1和程序绑定在同一个numa节点,将线程2绑定在不同numa节点。 - - -在测试前先通过/proc/pid/smaps确认下代码段映射地址,如下图4所示。 - - -**图4:** - - -![](../../../assets/基础能力和版本演进/datop技术方案/img_3.png) - - -通过perf工具在不通时刻抓取numa仿真统计相关值,如下所示: - - - -``` -kdamond.0 target_id=18446462601994805632 nr_regions=10 400000-402000: 12 5243 0 -kdamond.0 target_id=18446462601994805376 nr_regions=10 400000-402000: 8 0 5427 -... -kdamond.0 target_id=18446462601994805632 nr_regions=10 400000-402000: 9 7669 0 -kdamond.0 target_id=18446462601994805376 nr_regions=10 400000-402000: 7 0 7913 -``` - -从测试来看,虚拟地址0x400000-0x402000为属于代码段, 两线程共享该部分内存,通过perf采样统计可以看出, 本地线程1访问这块地址次数为5243次, 远端线程访问次数为5427次,隔一段时间后第二次统计本地线程1为7669,远端线程为7913,基本一致,说明numa仿真功能统计正确。 - - -### 测试方法二 - - -构造一个应用程序,申请1G左右大小的空间MSIZE,通过设置numa\_alloc等版本操作,将MSIZE绑定在node0和node1, 通过交叉访问,统计其跨numa的情况。 - - -下图是datop工具显示程序跨numa的情况,按照预定设置,两者访问占比50%,结果满足预期。 - - - -``` - INDEX TYPE START END SIZE(KiB) ACCESS AGE LOCAL REMOTE - 1 rw-p ffff49a34000 ffff515aa000 126424 2 0 50.02% 49.98% - 2 rw-p ffff4a636000 ffff52662000 131248 1 0 50.01% 49.99% - 3 rw-p ffff4f31d000 ffff52cb3000 58968 1 1 49.98% 50.02% - 4 rw-p ffff5704f000 ffff586f9000 23208 1 1 49.77% 50.23% - 5 rw-p ffff5b5a5000 ffff5cbd1000 22704 1 1 49.78% 50.22% - 6 rw-p ffff5cbd1000 ffff5ff58000 52764 2 0 49.71% 50.29% - 7 rw-p ffff5ff58000 ffff64ca4000 79152 1 0 49.71% 50.29% -``` - -同样采用numastat正是下该程序node访问情况,如下图所示: - - - -``` -Per-node process memory usage (in MBs) for PID 111676 (lt-numademo) - Node 0 Node 1 Node 2 - --------------- --------------- --------------- -Huge 0.00 0.00 0.00 -Heap 0.02 0.00 0.00 -Stack 0.01 0.00 0.00 -Private 565.24 564.00 0.00 ----------------- --------------- --------------- --------------- -Total 565.27 564.00 0.00 -``` - -从测试结果来看,node0和node1这块两者各自占比50%左右,复合预期,说明numa仿真统计这块正确性没有问题。 - - -## benchmark测试结果 - - -此处我们选取了几款常用的benchmark作为其测试,评估datop监控对其测试结果造成的影响。 - - -### unixbench - - -选取unixbench中fstime和context1两者耗用内存较多的作为测试参考。 - - - - -| | | | -| --- | --- | --- | -|   | 虚拟机 | 物理机 | -| 测试类 | 关numa仿真 | 开numa仿真 | 关numa仿真 | 开numa仿真 | -|   -  -fstime | 1573.6 | 1589.4 | 1955.6 | 1960.0 | -| 1591.4 | 1574.2 | 1966.1 | 1960.7 | -| 1575.6 | 1592.3 | 1963.5 | 1977.4 | -|   -  -context1 | 475.4 | 473.3 | 556.5 | 557.4 | -| 471.2 | 472.1 | 555.3 | 560.0 | -| 473.4 | 474.6 | 557.6 | 558.2 | - - -从以上测试数据来看,将unixbench作为被监控对象,在开和不开numa仿真功能下,不会造成其性能衰退。 - - -### stream - - -stream通常用于内存带宽测试,会按照多种形式频繁访问内存,正好基于这一特性验证datop工具对其影响。 - - -测试指令:numactl -m 0 -C 5 ./stream - - - - -| | | | -| --- | --- | --- | -| | 虚拟机 | 物理机 | -| 测试项 | 关numa仿真 | 开numa仿真 | 关numa仿真 | 开numa仿真 | -|   -Copy | 1499.4 | 1487.2 | 1678.0 | 1673.1 | -| 1495.5 | 1493.5 | 1674.3 | 1665.5 | -| 1473.0 | 1479.1 | 1675.2 | 1680.7 | -|   -Scale | 1459.1 | 1483.9 | 1585.9 | 1588.5 | -| 1490.9 | 1451.3 | 1590.0 | 1597.3 | -| 1475.1 | 1472.1 | 1588.8 | 1595.6 | -|   -Add | 1960.3 | 1937.0 | 1983.7 | 1974.6 | -| 1962.2 | 1955.6 | 1991.9 | 1991.4 | -| 1957.3 | 1944.9 | 1992.3 | 1996.2 | -|   -Triad | 1867.8 | 1860.2 | 1976.6 | 2017.5 | -| 1862.5 | 1873.1 | 2035.0 | 2025.3 | -| 1852.1 | 1859.5 | 2011.9 | 1997.0 | - - -从以上测试数据来看,将stream作为被监控对象,在开和不开numa仿真功能下,不会造成其性能衰退。 - - -### mbw - - -测试指令:numactl -m 0 -C 5 ./mbw - - - - -| | | | -| --- | --- | --- | -|   | 虚拟机 | 物理机 | -| 测试项 | 关numa仿真 | 开numa仿真 | 关numa仿真 | 开numa仿真 | -|   -MEMCPY -MiB/s | 2714.146 | 2627.115 | 2645.083 | 2621.095 | -| 2713.336 | 2634.099 | 2643.614 | 2616.979 | -| 2718.278 | 2625.363 | 2646.133 | 2629.780 | -|   -DUMB -MiB/s | 1019.456 | 1019.602 | 751.405 | 745.045 | -| 1018.745 | 1018.746 | 768.279 | 763.038 | -| 1018.080 | 1020.929 | 773.796 | 746.797 | -|   -MCBLOCK -MiB/s | 5139.354 | 5151.532 | 2668.374 | 2649.498 | -| 5155.516 | 5150.471 | 2666.596 | 2650.973 | -| 5148.191 | 5149.887 | 2667.449 | 2645.573 | - - -通过测试发现mbw: - - -在虚拟机测试时memcopy项时候存在3%左右性能衰退,其他测试项未见明显差异。 - - -在物理机测试时,三类测试项都存稍微的性能衰退, 其中MEMCPY衰退不到1%,DUMB衰退2.6%,MCBLOCK不到1%。 - - -  - - -### 小结 - - -在对比mbw和stream测试时,有个较为奇怪的问题了,steam测试copy并没有发生性能衰退,而mbw发生了3%的性能衰退,笔者通过分析其各自源码发现,发现stream copy测试过程中,每一次copy大小是小于4K的,而stream memcopy测试过程中每一次copy远大于4K,一个页的大小,这就导致stream memcpoy测试过程中会应为numa仿真设置pte表为空被命中的概率相比stream copy要大的多, 会造成更多的page fault问题,通过perf抓取分析也正好论证了这一点,所以mbw memcopy出现了性能衰退。 - - -这也充分说明,针对频繁访问一次超过4K大小的内存区域的应用程序,datop工具会造成一定的性能衰退影响,这也是numa仿真设置开关的原因,可根据实际情况按需打开。 - - -# 热点数据扫描试用 - - -我们可以对那些**内存访问密集模型进行简单的测试,获取到较稳定的热点**。例如redis get操作(测试命令:redis-benchmark -r 20000000 -n 20000000 -t get -d 1024 -c 32 -P 8)。 - - -**图5:** - - -![](../../../assets/基础能力和版本演进/datop技术方案/img_4.png) - - -图5中INDEX:表示region索引,TYPE表示region的虚拟地址类型,START表示region的起始地址,END表示reigon结束地址,SIZE表示region大小为多少,单位KiB, ACCESS表示热点程度,值越大表示越热,AGE表示热点波动情况,值越大表示冷热状态稳定,波动小,LOCAL表示这段region区域本地numa访问占比,REMOTE表示远端numa访问占比。 - - -图5是按采集的ACCESS进行排序获取的热点较高的14个regions。目前测试,可以确定在一段时间内这些regions的统计基本稳定,并且存在大量的匿名页热点, 此外通过刻意numa本地绑定测试,也正确的统计numa访存情况。 - - -  - - -另外,我们以mysql为例,验证下跨代码端部分存在跨numa的情况。 - - -**图6:** - - -![](../../../assets/基础能力和版本演进/datop技术方案/img_5.png) - - -上图6的热点监控命令为:datop -p 168368 -r 100,400。mysql中的热点显示与redis有些不同,存在大量属于"r-xp"的热点,并且存在跨numa访问的情况,我们之前测试中同样发现mysql的代码段热点高于匿名页,所以针对不同的场景,需要具体分析热点以及跨numa的内存段属性,然后做相应的优化措施。 - - -以上的测试数据表明:**该热点工具可以用于反映进程代码段、匿名段的相对热点,以及跨numa访存情况,用于判断进程使用大页,页迁移,冷内存回收等方面提供测试量化手段,进而达到有针对性优化的目的。** - - -# 参考 - - - - - -[Memory-management optimization with DAMON](https://lwn.net/Articles/812707/) - - -[Using DAMON for proactive reclaim](https://lwn.net/Articles/863753/) - - -[DAMON Extended To Offer Physical Memory Address Space Monitoring](https://www.phoronix.com/scan.php?page=news_item&px=DAMON-Physical-Monitoring) - - -[Proactively reclaiming idle memory](https://lwn.net/Articles/787611/) - - -[Intel® Optane™ Memory](https://www.intel.com/content/www/us/en/products/details/memory-storage/optane-memory.html) - - -[damon用户态工具damo](https://github.com/awslabs/damo) - - -  - - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/\351\241\271\347\233\256\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/\351\241\271\347\233\256\347\256\200\344\273\213.md" deleted file mode 100644 index 2c784154..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/\351\241\271\347\233\256\347\256\200\344\273\213.md" +++ /dev/null @@ -1,4 +0,0 @@ -本项目聚焦于: -- 龙蜥内核的基础能力建设,包括基础功能、兼容性、稳定性和性能,建立相关基线。 -- 跟踪行业和upstream发展动态,负责下一代龙蜥内核版本演进。 - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" deleted file mode 100644 index 2a362235..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" +++ /dev/null @@ -1,339 +0,0 @@ -# 1. RAS机制简介 - - -为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: - - -**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 - - -**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 - - -**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 - - -RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 - - -# 2. RAS机制错误处理流程 - - -RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 - - -RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_0.png) - - -# 3. RAS机制评测流程 - - -RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 - - -APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 - - -从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 - - -如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 - - - - -| | -| --- | -| 0 Processor Correctable -1 Processor Uncorrectable non-fatal -2 Processor Uncorrectable fatal | -| 3 Memory Correctable -4 Memory Uncorrectable non-fatal -5 Memory Uncorrectable fatal | -| 6 PCI Express Correctable -7 PCI Express Uncorrectable non-fatal -8 PCI Express Uncorrectable fatal | -| 9 Platform Correctable -10 Platform Uncorrectable non-fatal -11 Platform Uncorrectable fatal | - - -Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_1.png) - - -上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 - - -错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: - - -1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 - - -2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 - - -3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 - - -# 4. CPU及内存错误注入演示 - - -CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 - - -## 4.1 环境准备 - - -### 1. 安装EINJ模块 - - -使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html - - -此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 - - -### 2. 安装RAS测试工具 - - -直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git - - -### 3. 安装rasdaemon - - -先安装依赖包yum install sqlite perl-DBD-SQLite - - -使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git - - - -``` -autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make -make install -``` - -在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 - - - -``` - -d, --disable 禁用RAS事件并退出 - -e, --enable 使能RAS事件并退出 - -f, --foreground 前台运行 - -r, --record 通过sqlite3记录事件 -``` - -rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 - - -查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 - - -本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 - - -## 4.2 CPU错误注入 - - -本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 - - -使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 - - - -``` -./einj_mem_uc core_non_fatal -0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 -injecting ... -triggering ... -Manually take page offline -Test passed -``` - -使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 - - - - -| | | | | -| --- | --- | --- | --- | -| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | - - -可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=17(core), cnt=0xd -INFO: RAS reg: -INFO: fr = 10a9a2 -INFO: status = 44800007 -INFO: addr = 8007e0e95fffb7ff -INFO: misc0 = 4 -INFO: misc1 = 0 -RTC: 2000-01-06 09:32:09 - core[8] mm(17) return: 0 ---handler(17) end -[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error -[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 -[40858.436229] {42}[Hardware Error]: event severity: recoverable -[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 -[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable -[40858.454204] {42}[Hardware Error]: section_type: ARM processor error -[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 -[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 -[40858.475041] {42}[Hardware Error]: running state: 0x1 -[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 -[40858.487456] {42}[Hardware Error]: Error info structure 0: -[40858.493013] {42}[Hardware Error]: num errors: 1 -[40858.497702] {42}[Hardware Error]: error_type: 0, cache error -[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 -[40858.509857] {42}[Hardware Error]: transaction type: Instruction -[40858.516109] {42}[Hardware Error]: cache level: 2 -[40858.521058] {42}[Hardware Error]: the error has not been corrected -[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered -``` - -## 4.3 内存错误注入 - - -使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 - - - -``` -./einj_mem_uc single -0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 -injecting ... -triggering ... -SIGBUS: addr = 0xffffabcb3400 -page not present -Test passed -``` - -BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=0(exception), cnt=0xa -MM Mem RAS handle,Intr:0 -Ch = 25810000 - |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 - |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 - |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 - |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 - |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 - |-ECCUSYN0~2:1FF,0,76 - |-SBRCTL:1C01591B,SBRSTS:0 -RasData->ExceptionEl: 0, UeCnt:0x1 -RTC: 2000-01-06 09:27:58 -Get SystemAddrss through mAddrTransProtocol start -Get SystemAddrss through mAddrTransProtocol end -s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 -Locate error dimm, Socket:0, Channel:2 Dimm:0 - core[8] mm(0) return: 0 ---handler(0) end -[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) -[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 -[40606.668367] {41}[Hardware Error]: event severity: recoverable -[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 -[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable -[40606.686342] {41}[Hardware Error]: section_type: memory error -[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) -[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 -[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 -[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC -[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered -``` - -## 4.4 rasdaemon日志读取 - - -rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 - - - -``` -[root@localhost ras-tools]# ras-mc-ctl --errors -Memory controller events: -1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -``` - -# 5. Q&A - - -Q:RAS机制是否需要BIOS支持? - - -A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 - - - - - -Q: x86和ARM64的APEI是否一致? - - -A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 - - - - - -Q: RAS注入的错误是真实的错误吗? - - -A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 - - - - - -Q: rasdaemon日志查看是否有更易用的方法? - - -A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; - - -最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 - - - - - -Q: 可否使用mcelog? - - -A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 - - - - - -Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? - - -A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 - - - - - -Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? - - -A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\347\241\254\350\265\204\346\272\220\351\232\224\347\246\273mpam\347\211\271\346\200\247\344\273\213\347\273\215/\351\276\231\350\234\245_ANCK_5.10_\345\200\232\345\244\251\345\271\263\345\217\260_MPAM_\346\265\213\350\257\225\346\212\245\345\221\212.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\347\241\254\350\265\204\346\272\220\351\232\224\347\246\273mpam\347\211\271\346\200\247\344\273\213\347\273\215/\351\276\231\350\234\245_ANCK_5.10_\345\200\232\345\244\251\345\271\263\345\217\260_MPAM_\346\265\213\350\257\225\346\212\245\345\221\212.md" deleted file mode 100644 index 4ff5c36d..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\347\241\254\350\265\204\346\272\220\351\232\224\347\246\273mpam\347\211\271\346\200\247\344\273\213\347\273\215/\351\276\231\350\234\245_ANCK_5.10_\345\200\232\345\244\251\345\271\263\345\217\260_MPAM_\346\265\213\350\257\225\346\212\245\345\221\212.md" +++ /dev/null @@ -1,449 +0,0 @@ -from arm-sig: - - -# 一、测试总结 - - -针对龙蜥 OS MPAM 特性的整体测试情况如下: - - -* 经过对 MPAM 的功能性验证,目前 L3 cache 资源隔离和监控功能均正常,内存带宽隔离效果甚微,监控功能可用。 -* 测试用例覆盖 MPAM 接口读写测试、并发压力测试等多种类型,测试结果未发现问题。 -* 针对 MPAM ESR 中断,验证了 PARTID、PMG、monitor 相关异常能否触发中断、告知错误类型,中断监测功能正常可用。 - - -# 二、MPAM 功能验证 - - -## 2.1 cache 隔离功能验证 - - -### 2.1.1 不同配置对实际 cache 占有量的影响 - - -L3 cache 资源隔离以 ways 的方式进行配置。倚天机器共有 16 ways,测试对不同 ways 的隔离效果进行了验证。 - - - -``` -numactl -m 0 -C 16 memhog -r10000000 100000m > /mnt/log -``` - -程序和资源隔离 group 绑定分别采用了 pid 绑定(tasks)和 cpu 绑定(cpus)两种方式。通过 schemata 接口设置程序所能够使用的 ways 数目,通过 mon\_data/mon\_L3\_0\*/llc\_occupancy 接口读取程序的 L3 cache 占用。多次读取取平均值,并与理想的 cache ways 大小进行对比。 - - -测试结果显示,L3 cache 隔离功能**效果显著**,无论是通过 tasks 绑定还是 cpus 绑定,均可以得到与理想值相接近的隔离效果。 - - -![](assets/龙蜥_ANCK_5.10_倚天平台_MPAM_测试报告/img_0.png) - - -### 2.1.2 不同配置对 mem latency 的影响 - - -latency 作为一个重要的性能指标,在一些对时延敏感的场景来说,有很重要的参考作用,此处使用 lat\_mem\_rd 测试 cache 在不同的 ways 下,内存 latency 的分布情况,也从侧面验证 MPAM 对 cache 的隔离功能。 - - - -``` -#设置步长为512字节 -numactl -C 10 -m 0 ./lat_mem_rd -N 1 -P 1 145M 512 -``` - -测试结果显示,随着 cache way 数目的增加,加载相同内存的 latency 逐渐减小。 - - -![](assets/龙蜥_ANCK_5.10_倚天平台_MPAM_测试报告/img_1.png) - - -### 2.1.3 L3 cache 抗干扰测试 - - - -``` -# workload -numactl -m 1 -C 64-127 memhog -r10000000 100000m > /mnt/log -# distractor -numactl -m 1 -C 64-127 memhog -r10000000 100000m > /mnt/log -``` - -workload:保持 L3:1=fff0 配置无变化 - - -distractor: 测试 L3:1=,mask 值分别为 0-f(无干扰)、0010-fff0(有干扰) - - -测试结果显示: - - -在无干扰情况下,workload 的 L3 cache 占用量基本无变化; - - -随着干扰 way 数逐渐变多,workload 和 distractor 两者的 L3 cache占比逐渐趋同,总量不变。 - - -![](assets/龙蜥_ANCK_5.10_倚天平台_MPAM_测试报告/img_2.png) - - -### 2.1.4 模拟混部 L3 cache 隔离测试 - - -分别以 SPECjbb 2015 和 stress-ng 程序模拟在线环境和离线环境,对L3 cache隔离功能进行测试。两个环境均运行在 NUMA node 1 上。 - - -在前 40s 的时间内,两个程序共享 L3 cache 资源。在约 40s 后,开始隔离在线和离线L3 cache资源的使用,在离线任务 L3 cache 的配比分别为 0xffff 和 0xf。 - - -![](assets/龙蜥_ANCK_5.10_倚天平台_MPAM_测试报告/img_3.png) - - -通过实验结果可以看到,在 L3 cache 资源共享的情况下,离线资源对在线资源干扰和压制明显,L3 cache 竞争激烈,波动幅度很大;在对 L3 cache 资源进行隔离后,一方面离线得到了持续有效的压制,L3 cache 占有率大幅下降,另一方面在线性能提升明显,而且波动幅度变小。 - - -## 2.2 MB 隔离功能验证 - - -### 2.2.1 不同配置对内存带宽的影响 - - - -``` -gcc -O3 -fopenmp -DSTREAM_ARRAY_SIZE=100000000 -DNTIMES=1000 stream.c -o stream -# 单node测试 -numactl -m 1 -C 64-127 ./stream -# 单CPU测试 -numactl -m 1 -C 72 ./stream -``` - -MB 资源隔离以百分比的方式进行配置。测试以 5% 为粒度,通过设置 schemata 接口让内存带宽从 5% 逐次递增到 100%,通过读取 mon\_data/mon\_MB\_0\*/mbm\_local\_bytes 接口读取带宽值,最终取多次测量的平均值。 - - -通过测试结果可以发现,不同百分比下的测试MB带宽值和100%带宽下的MB带宽值基本相等,倚天机器的 MB 带宽隔离**效果甚微**。 - - -#### 单 node(64 CPU) MB 配置结果 - - - - -| | | | -| --- | --- | --- | -| **percent** | **stream测试值[Copy] (MB/s)** | **mbm\_local\_bytes接口值 (MB/s)** | -| 5 | 104808.5 | 104800.0 | -| 10 | 105028.3 | 105730.5 | -| 20 | 104459.3 | 104915.1 | -| 40 | 105077.6 | 105852.0 | -| 60 | 104980.6 | 105178.7 | -| 80 | 104924.8 | 105182.8 | -| 100 | 104828.1 | 105855.8 | - - -#### 单 CPU MB 配置结果 - - - - -| | | | -| --- | --- | --- | -| **percent** | **stream测试值[Copy] (MB/s)** | **mbm\_local\_bytes接口值 (MB/s)** | -| 5 | 25948.7 | 24147.7 | -| 10 | 25934.0 | 24433.1 | -| 20 | 25913.5 | 22771.2 | -| 40 | 25897.9 | 24559.4 | -| 60 | 25952.9 | 24079.7 | -| 80 | 25866.5 | 24246.4 | -| 100 | 25952.1 | 24171.9 | - - -# 三、MPAM稳定性测试 - - -## 3.1 resctrl mount/umount - - -**测试方法** - - -挂载 resctrl 文件系统,设置 schemata 资源隔离接口,随机写 cpus/cpus\_list、tasks 接口,读取mon\_data 资源监控接口,最后卸载 resctrl 文件系统。重复 1000000 次。 - - -**测试结果** - - -resctrl 文件系统相关接口仍可正常使用。 - - -## 3.2 接口写入测试 - - -### 3.2.1 schemata 写入 - - -**测试方法** - - -创建两个 group,生成随机 L3 cache mask 和 MB 内存带宽值,并分别写入两个 group 的 schemata 接口,之后读取 schemata 接口,验证当前值是否与写入值相同。重复测试 1000000 次。 - - -**测试结果** - - -schemata 均可正常写入。 - - -### 3.2.2 schemata 错误写入 - - -对 schemata 接口写入多种错误参数,验证 schemata 是否可以正确识别处理。 - - -验证的错误类型及验证结果如下: - - - - -| | | | -| --- | --- | --- | -| **错误写入示例** | **last\_cmd\_status输出** | **测试结果** | -| L3:0=10000 | Mask out of range | PASS | -| L3:2=ff;3=ff | Unknown domain | PASS | -| L3 | Missing ':' | PASS | -| L3: | Missing 'L3' value | PASS | -| L3:0 | Missing '=' or non-numeric domain | PASS | -| L30:0=fff | Unknown or unsupported resource name 'L30' | PASS | -| L3:0=fghi | Non-hex character in the mask fghi | PASS | -| L3:1=ff;1=f4 | Duplicate domain 1 | PASS | -| MB:0=150 | MB value 150 out of range 5-100 | PASS | -| MB:0=4 | MB value 4 out of range 5-100 | PASS | -| MB:0=FOO | Non-decimal digit in MB | PASS | -| MB | Missing ':' | PASS | -| MB:0 | Missing 'MB' value | PASS | -| MB:2=55 | Unknown domain | PASS | -| MB:1=23;1=56 | Duplicate domain 1 | PASS | -| L3:0=ff (with cdp) | Unknown or unsupported resource name 'L3' | PASS | - - -### 3.2.3 cpus/cpus\_list 写入 - - -测试方法 - - -随机写入 cpus/cpus\_list 接口 1000000 次,验证是否写入成功,并且 cpus 接口和 cpus\_list 接口的值是否相对应。 - - -测试结果 - - -cpus/cpus\_list 均可正常写入,并保持值的相等。 - - -### 3.2.4 cpus/cpus\_list 错误写入 - - - - -| | | | -| --- | --- | --- | -| **错误写入示例** | **last\_cmd\_status输出** | **测试结果** | -| echo 156 > cpus\_list | Can only assign online CPUs | PASS | -| echo 4096 > cpus\_list | Bad CPU list/mask | PASS | -| echo ffff > cpus\_list | Bad CPU list/mask | PASS | -| echo 3-12 > cpus | Bad CPU list/mask | PASS | - - -### 3.2.5 tasks 写入 - - -**测试方法** - - -创建 500 个进程,并将其 pid 写入 tasks 接口,验证进程对应 pid 是否存在。之后 kill 掉所有进程,验证其 pid 是否已从 tasks 文件中移除。重复 1000000 次。 - - -**测试结果** - - -tasks 接口均可正常写入和移除。 - - -### 3.2.6 tasks 错误写入 - - - - -| | | | -| --- | --- | --- | -| **错误示例** | **stderr** | **测试结果** | -| 将不存在pid写入tasks | echo: write error: No such process | PASS | -| echo hello > tasks | echo: write error: Invalid argument | PASS | - - -### 3.2.7 mode 写入 - - -mode 接口默认值为 shareable,当前MPAM接口暂不支持 mode 接口值的修改。 - - - - -| | | -| --- | --- | -| **Mode** | **支持情况** | -| shareable | 支持 | -| exclusive | 不支持 | -| pseudo-locksetup | 不支持 | -| pseudo-locked | 不支持 | - - -## 3.3 group mkdir/rmdir 测试 - - -### 3.3.1 max group 创建 - - -**测试方法** - - -以 info/\*/num\_closids 为基准,创建所能达到的最多 group。重复 1000000 次。 - - -**测试结果** - - -倚天 PARTID 数目为 64 个,因此除了 default group 外,最多能够创建 63 个 group。一般情况下均可达到最大值。但在部分 group 被使用过的情况下,由于其对应的 PARTID 在 L3 cache中占用量可能超过 /sys/fs/resctrl/info/L3\_MON/max\_threshold\_occupancy,从而导致该 PARTID 在一定时间内不可用。 - - -### 3.3.2 group 随机创建/删除 - - -**测试方法** - - -随机创建/删除 group 共计 2000\*(num\_closids-1),验证 group 分配和回收功能是否正常。 - - -**测试结果** - - -group 随机创建和删除,group 分配/回收接口仍可正常运作。 - - -### 3.3.3 mon\_group 创建/删除 - - -当前社区版本MPAM代码下 num\_rmids 均为 1,暂不支持 mon\_groups 目录下 mon group 的创建和删除。 - - -## 3.4 并发读写测试 - - -### 3.4.1 L3 cache 监控接口并发读取 - - -**测试方法** - - -创建 5 个 group,每个 group 中写入 10 个进程:memhog -r1000000000 1m > /mnt/log - - -同时 10 个进程并发读 mon\_data/L3\_MON/llc\_occupancy,持续时间 60 min。 - - -**测试结果** - - -测试过程中未出现resctrl接口崩溃或不可用问题。 - - -### 3.4.2 MB 监控接口并发读取 - - -**测试方法** - - -创建 5 个 group,每个 group 中写入 10 个进程:memhog -r1000000000 1m > /mnt/log - - -同时 10 个进程并发读 mon\_data/mon\_MB\_\*/mbm\_local\_bytes,持续时间 60 min。 - - -**测试结果** - - -测试过程中未出现 resctrl 接口崩溃或不可用问题。 - - -### 3.4.3 schemata 接口并发写入 - - -**测试方法** - - -创建 5 个 group,每个 group 中写入 10 个进程:memhog -r1000000000 1m > /mnt/log - - -同时 10 个进程并发随机写入 schemata,持续时间 60 min。 - - -**测试结果** - - -测试过程中未出现 resctrl 接口崩溃或不可用问题。 - - -### 3.4.4 cpus/cpus\_list 接口并发写入 - - -**测试方法** - - -创建 1 个 group,10 个进程并发写入随机 cpus/cpus\_list,持续时间 60 min。 - - -**测试结果** - - -测试过程未出现接口崩溃或不可用问题。 - - -### 3.4.5 tasks 接口并发写入 - - -**测试方法** - - -创建 1 个 group,10 个进程并发创建 300 个 task 并写入 tasks 接口。 - - -**测试结果** - - -测试过程未出现接口崩溃或不可用问题。 - - -# 四、MPAM 错误中断验证 - - -## 4.1 L3 cache 资源错误中断验证 - - - - -| | | | | -| --- | --- | --- | --- | -| 错误码 | 描述 | 结果 | 备注 | -| 0 | No error captured in MPAMF\_ESR | 无 | 非异常情况 | -| 1 | MPAMCFG\_PART\_SEL out of range | 可触发 |   | -| 2 | Request PARTID out of range | 可触发 |   | -| 3 | MSMON out of range PARTID/PMG | 可触发 |   | -| 4 | Request PMG out of range | 不可触发 | PMG>1时无法写入 | -| 5 | MSMON\_CFG\_MON\_SEL out of range | 可触发 |   | -| 6 | MPAMCFG\_INTPARTID out of range | 未测试 | 暂不支持PARTID narrowing | -| 7 | INTERNAL unexpected | 未测试 | 暂不支持PARTID narrowing | -| 8 | MPAMCFG\_PART\_SEL.RIS unimplemented | 不可触发 | RIS>1时无法写入 | -| 9 | MPAMCFG\_PART\_SEL.RIS no control | 不可触发 | RIS>1时无法写入 | -| 10 | MSMON\_CFG\_MON\_SEL.RIS unimplemented | 不可触发 | RIS>1时无法写入 | -| 11 | MSMON\_CFG\_MON\_SEL.RIS no monitor | 不可触发 | RIS>1时无法写入 | -| 12:18 | Reserved | - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\347\241\254\350\265\204\346\272\220\351\232\224\347\246\273mpam\347\211\271\346\200\247\344\273\213\347\273\215/\351\276\231\350\234\245_ANCK_5.10_\345\200\232\345\244\251\345\271\263\345\217\260_MPAM_\347\224\250\346\210\267\346\211\213\345\206\214.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\347\241\254\350\265\204\346\272\220\351\232\224\347\246\273mpam\347\211\271\346\200\247\344\273\213\347\273\215/\351\276\231\350\234\245_ANCK_5.10_\345\200\232\345\244\251\345\271\263\345\217\260_MPAM_\347\224\250\346\210\267\346\211\213\345\206\214.md" deleted file mode 100644 index 917ca23c..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\347\241\254\350\265\204\346\272\220\351\232\224\347\246\273mpam\347\211\271\346\200\247\344\273\213\347\273\215/\351\276\231\350\234\245_ANCK_5.10_\345\200\232\345\244\251\345\271\263\345\217\260_MPAM_\347\224\250\346\210\267\346\211\213\345\206\214.md" +++ /dev/null @@ -1,374 +0,0 @@ -from arm-sig: - - -# 一、引言 - - -MPAM(Memory System Resource Partitioning and Monitoring)是 ARM v8 引入的新特性,对标 x86 的 RDT 特性,可以实现对 Cache、内存带宽、SMMU 等资源的分配及监控功能。该特性可以从硬件层面减少不同工作负载之间的性能干扰,确保高优先级任务性能的稳定性,在虚拟化、混部等业务中取得了良好的效果。 - - -# 二、MPAM特性简介 - - -## 2.1 MPAM整体框架 - - -MPAM 特性的整体框架如图1所示。其中,MPAM 硬件上是通过 MSC(Memory System Component)实现的。MPAM 将提供资源管理功能组件称为 MSC,可以对资源请求进行处理。完整的系统模型中一般拥有多个 MSC,分别负责管理不同资源。MPAM 为资源访问请求添加了 PARTID 和 PMG 标识,MSC 可以对该标识进行区分处理,进而实现资源的隔离和监控功能。 - - -根据 MPAM 手册的介绍,除了基本的 Cache 和内存带宽资源隔离和监控外,MPAM 可以实现比 Intel RDT 更为丰富的资源隔离和监控特性,包括: - - -* 提供对 SMMU 资源的支持 -* 提供对 Cache 和内存带宽资源进行最大最小值限制 -* 提供基于优先级的资源隔离支持 - - -![](assets/龙蜥_ANCK_5.10_倚天平台_MPAM_用户手册/img_0.png) - - -MPAM 驱动作为核心部分,对下完成了 MPAM 硬件功能的访问和设置,包括 MPAM 资源的获取和初始化、MPAM 中断初始化以及对 MPAM 相关寄存器的读写,对上则与 resctrl fs 用户态接口层进行交互。 - - -resctrl fs 接口层以资源调配 group 为单位提供了资源隔离和监控的用户态接口,并通过 info 接口暴露 MPAM 硬件相关信息。此外,其底层还完成了 PARTID 和 PMG 的分配和回收。 - - -## 2.2 MPAM资源隔离特性 - - -MPAM 资源隔离特性的关键是由 MSC 组件维护的资源配置表。资源配置表中包含了不同 PARTID 和对应资源分配方案的映射。 - - -![](assets/龙蜥_ANCK_5.10_倚天平台_MPAM_用户手册/img_1.png) - - -对于每一次资源请求,该资源对应的 MSC 会通过请求中的 PARTID 查找自身的配置表,然后按照表中与该 PARTID 相对应的方案进行资源分配。这样,通过将不同业务应用或VM与不同PARTID相绑定,就可以达到资源隔离的目的。 - - -通过图2左侧部分可以看到,不同资源分配方案的表示方法是有所区别的,这与资源的拆分方式不同有关。Cache 资源使用了 Bit Map,每一bit表示了对应的 Cache way 是否能够被分配;内存带宽资源则使用了百分比,表示该方案能够分配的内存带宽比例。 - - -## 2.3 MPAM资源监控特性 - - -资源监控可以看做是 MPAM 在支持资源隔离功能后的附加功能。MPAM 除了拥有资源隔离组件外,还拥有一定数目的资源 monitor。资源 monitor 可以实现对特定标识的资源使用情况的监控。 - - -为了实现对使用同一个 PARTID 的不同 task 分别进行资源监控,MPAM引入了PMG(Performance Monitoring Group)的概念。资源监控接口通过选取对应的 PARTID 和 PMG,即可获取到对应的资源使用情况。 - - -![](assets/龙蜥_ANCK_5.10_倚天平台_MPAM_用户手册/img_2.png) - - -## 2.4 龙蜥 OS 对倚天 MPAM 特性的支持 - - -龙蜥 OS 5.10.134-12.al8 版本基于 resctrl 文件系统实现了对倚天芯片的 MPAM 特性的支持,同时保证了对 x86 RDT 特性和鲲鹏的 MPAM 特性的兼容。对应的代码仓库在 中。其中,MPAM 支持相关代码路径包括: - - -* drivers/platform/mpam —— MPAM 驱动代码 -* drivers/acpi/arm64 —— MPAM ACPI 解析代码 -* fs/resctrl —— 用户态接口实现代码 -* arch/x86/kernel/cpu/resctrl —— x86 RDT 特性架构相关代码 -* drivers/staging/kunpeng/mpam —— 鲲鹏 MPAM 特性相关代码 - - -目前,龙蜥 OS 针对倚天芯片提供了 L3 Cache 和内存带宽两种资源的资源隔离和监控接口。接口的主要特性如下: - - -* 提供最大 64 个 PARTID 支持 -* 提供 4 个 monitor 支持 -* 支持 per-numa 的 16 way L3 CAT(Cache Allocation Technology)特性 -* 支持 per-numa 的 16 way L3 CDP(Code and Data Prioritization)特性 -* 支持 per-numa 的 L3 Cache 资源监控特性 -* 支持 per-numa 的粒度为 5% 的 MBA(Memory Bandwidth Allocation)特性(受硬件限制,该特性目前效果较差) -* 支持 per-numa 的内存带宽资源监控特性 -* 支持 MPAM 寄存器错误中断检测 - - -对应测试文档在。 - - -# 三、MPAM的使用 - - -## 3.1 开启MPAM - - -1. 首先需要确保当前内核支持 MPAM 功能,需要设置`CONFIG_ARM64_MPAM`和`CONFIG_RESCTRL`; -2. 在 cmdline 或 grub.cfg 文件中添加`mpam=acpi`,使能 MPAM 功能; -3. 系统启动后,需要手动挂载 resctrl 文件系统到 /sys/fs/resctrl 目录。 - - - -``` -mount -t resctrl resctrl /sys/fs/resctrl -``` - -## 3.2 MPAM 用户态接口 - - -MPAM 的用户态接口复用了 Intel RDT 功能的 resctrl 文件系统。resctrl 文件系统的目录结构如下图。 - - -![](assets/龙蜥_ANCK_5.10_倚天平台_MPAM_用户手册/img_3.png) - - -### 3.2.1 资源调配 group - - -开启 MPAM 功能后,操作系统中的每个进程(线程)都会与 resctrl 文件系统中的一个资源调配 group 相绑定。每个资源调配 group 在 MPAM 中对应着一个 PARTID。在 /sys/fs/resctrl 下新创建的每个目录将分别对应一个新的资源调配 group,每个资源调配 group 中会自动添加以下文件和目录: - - - -``` -|-- cpus -|-- cpus_list -|-- id -|-- mode -|-- mon_data -|-- mon_groups -|-- schemata -|-- size -`-- tasks -``` - -其中各文件和目录的作用为: - - -**schemata**:表示该 group 对各个资源的分配方案,可读写。 - - -**mon\_data**:该目录中各个文件包含了对各个资源的监控值,只读。 - - -**cpus**:以 bitmask 的形式表示该 group 所控制的逻辑 CPU,可读写。 - - -**cpus\_list**: 与 cpus 含义一致,但以 range 的形式(如0-63)表示该 group 所控制的逻辑 CPU,可读写。 - - -**tasks**:表示该 group 所控制的 task pid,可读写。 - - -**id**:创建 group 时随机生成,用于唯一标识一个 group,只读。 - - -**mode**:表示当前 group 的分配方式,目前仅支持 shareable 方式。 - - -**mon\_groups**: 该目录用于创建仅用于监控功能的子 group,暂不可用。 - - -**size**:表示该 group 下各个资源所能使用的资源大小,只读。 - - -观察 /sys/fs/resctrl 目录可以发现,该目录自带了一个资源调配 group。这个 group 是作为 MPAM 开启后各 cpu 和 task 使用的默认 group 使用的。该 group 默认可以实现对各资源 100% 的占用。 - - -### 3.2.2 资源隔离与schemata文件 - - -使用资源隔离特性的关键是 schemata 文件,schemata 中包含了对该 group 的资源分配方案。其基本格式为如下: - - - -``` -MB:0= 100;1= 80 -L3:0=ffff;1=fff0 -``` - -其中, - - -* L3 cache 资源的分配以 bit mask 进行表示,`L3:0=ffff;1=fff0`表示所属该 group 的 cpu 和 task 可以分配到 NUMA 0 的 L3 cache 的完整 16 way,NUMA 1 的 L3 cache 的高 12 way。 -* 内存带宽资源的分配以百分比进行表示,`MB:0=100;1=80`表示所属该 group 的 cpu 和 task 可以分配到 NUMA 0 最多 100% 的内存带宽,NUMA 1 最多 80% 的内存带宽。 - - -### 3.2.3 资源监控与mon\_data目录 - - -mon\_data 目录下相关文件完成了 MPAM 的资源监控特性,倚天中 mon\_data 目录结构如下: - - - -``` -mon_data -|-- mon_L3_00 -| `-- llc_occupancy -|-- mon_L3_01 -| `-- llc_occupancy -|-- mon_MB_00 -| `-- mbm_local_bytes -`-- mon_MB_01 - `-- mbm_local_bytes -``` - -其中, - - -* L3 cache 资源监控对应着 mon\_L3\_ 目录,该目录下包含了对应 NUMA 节点下 L3 cache 资源的当前使用情况。目前该目录下只有 llc\_occupancy 一个文件,该文件以byte为单位显示了当前 group 各个 task 的 L3 cache 用量。 -* 内存带宽资源监控对应着 mon\_MB\_ 目录,该目录下包含了对应 NUMA 节点下内存带宽资源的当前使用情况。目前该目录下只有 mbm\_local\_bytes 一个文件,该文件以 byte/s 为单位显示了当前 group 各个 task 的内存带宽统计值。 - - -### 3.2.4 info目录 - - -/sys/fs/resctrl 目录下除了包含一个默认 group 所需要的相关文件和目录外,还有一个 info 目录。info 目录中包含了当前机器能够支持 MPAM 扩展中资源分配和监测功能的详细信息。目前倚天机器上该目录中有以下内容: - - - -``` -info/ -|-- L3 -| |-- bit_usage -| |-- cbm_mask -| |-- min_cbm_bits -| |-- num_closids -| `-- shareable_bits -|-- L3_MON -| |-- max_threshold_occupancy -| |-- mon_features -| `-- num_rmids -|-- MB -| |-- bandwidth_gran -| |-- delay_linear -| |-- min_bandwidth -| `-- num_closids -|-- MB_MON -| |-- mon_features -| `-- num_rmids -`-- last_cmd_status -``` - -* L3 目录包含了 L3 cache 资源隔离特性的相关信息,其中各文件及其含义为 - - -+ **bit\_usaged**:以 bitmask 的形式表示 L3 各 way 当前的使用情况,在倚天机器中,默认为`0=XXXXXXXXXXXXXXXX;1=XXXXXXXXXXXXXXXX`。 -+ **cbm\_mask**:对应着 L3 cache 资源可以设置的最大 bitmask,同时该 mask 也对应着 100% 的 cache 资源占用。 -+ **min\_cbm\_bit**:对 L3 cache 资源可以设置的最小 bit 数。 -+ **num\_closids**:L3 cache 资源所能够创建的最大 group 数目,该值包含了 resctrl 文件系统挂载后自带的默认group。 -+ **shareable\_bits**:以 bitmask 的形式表示 L3 cache 资源与其他实体(例如I/O)的共享情况。 - - -* L3\_MON 目录包含了 L3 cache 资源监控特性的相关信息,其中各文件及其含义为 - - -+ **max\_threshold\_occupancy**:资源监控 monitor 被释放之后可能无法立即使用,因为之前的 cache 占用会影响 monitor 结果的准确性。max\_threshold\_occupancy 用于配置可以真正释放 monitor 的 cache占用。 -+ **mon\_features**:显示 L3 cache 有哪些资源监控特性,与 mon\_data/mon\_L3\_xx 中文件相对应。 -+ **num\_rmids**:可用的 monitor 数目,倚天机器该值为 4。 - - -* MB 目录包含了内存带宽资源隔离特性相关信息,其中各文件及其含义为: - - -+ **bandwidth\_gran**:内存带宽设置的百分比粒度,倚天机器该值为 5。 -+ **delay\_linear**:与 Intel 机器中内存带宽资源隔离特性相关的值,倚天机器中默认为 true,即 1。 -+ **min\_bandwidth**:内存带宽百分比设置的最小值,与 bandwidth\_gran 相等,倚天机器中该值为 5。 -+ **num\_closids**:内存带宽资源所能够创建的最大 group,该数目包含了 resctrl 文件系统的默认 group。 - - -* MB\_MON 目录包含了内存带宽资源监控特性相关信息,其中各文件及其含义为: - - -+ **mon\_features**:显示内存带宽有哪些资源监控特性,与 mon\_data/mon\_MB\_xx 中文件相对应。 -+ **num\_rmids**:可用的 monitor 数目,倚天机器该值为 4。 - - -* **last\_cmd\_status**:文件中包含了相关指令所出现的问题,可以通过读取该指令获取 resctrl 文件系统中相关操作失败的原因。 - - -## 3.3 MPAM 使用示例 - - -### 3.3.1 配置两个资源调配 group - - - -``` -mount -t resctrl resctrl /sys/fs/resctrl -cd /sys/fs/resctrl -# 创建两个资源调配group p0和p1 -mkdir p0 p1 -# 令p0使用Node0的高12路L3 Cache,Node1的低12路L3 Cache -echo "L3:0=0xfff0;1=0x0fff" > /sys/fs/resctrl/p0/schemata -# 令p1使用Node0的低12路L3 Cache,Node1的高12路L3 Cache -echo "L3:0=0x0fff;1=0xfff0" > /sys/fs/resctrl/p1/schemata -# 限制p0和p1的MB上限不超过50% -echo "MB:0=50;1=50" > /sys/fs/resctrl/p0/schemata -echo "MB:0=50;1=50" > /sys/fs/resctrl/p1/schemata -# 读取两个文件 -cat /sys/fs/resctrl/p0/schemata -cat /sys/fs/resctrl/p1/schemata -``` - -此时 /sys/fs/resctrl/p0/schemata 和 /sys/fs/resctrl/p1/schemata 两个文件中的内容分别为: - - - -``` -MB:0=50;1=50 -L3:0=fff0;1=0fff -``` - - -``` -MB:0=50;1=50 -L3:0=0fff;1=fff0 -``` - -### 3.3.2 为指定进程/线程分配资源调配 group - - -以 3.3.1 中已创建的 p0 资源调配 group 为例,此处限制 pid 为 12345 的进程/线程使用 p0 资源调配 group 所限定的资源。需要注意的是,新创建的子进程将继承父进程的 PARTID 和 PMG 信息,但已创建的子进程将不受影响。 - - - -``` -# 将pid 12345加入p0资源调配group -echo 12345 > /sys/fs/resctrl/p0/tasks -``` - -之后,pid 为 12345 的进程/线程将自动从 /sys/fs/resctrl/tasks 移动到 /sys/fs/resctrl/p0/tasks 文件中。 - - -### 3.3.3 为指定cpu分配资源调配 group - - - -``` -# 将cpu 99、100、101移入p1资源调配group -echo "99-101" > /sys/fs/resctrl/p1/cpus_list -# 或者 -echo "38,00000000,00000000,00000000" > /sys/fs/resctrl/p1/cpus_list -``` - -之后,cpu 99-101 将从 /sys/fs/resctrl/cpus\_list 中移动到 /sys/fs/resctrl/p1/cpus\_list 中。 - - -### 3.3.4 读取 cache/内存带宽 的 monitor 值 - - -仍然以 3.3.1 中创建的 p0 资源调配group为例,要获取 p0 资源组各进程的资源占用值,通过 cat 即可得到实时监控结果。 - - - -``` -cat /sys/fs/resctrl/p0/mon_data/mon_L3_0*/llc_occupancy -cat /sys/fs/resctrl/p0/mon_data/mon_MB_0*/mbm_local_bytes -``` - -## 3.4 模拟混部L3 cache隔离 - - -混部是 MPAM 资源隔离的一个重要应用场景。此处分别以 SPECjbb 2015 和 stress-ng 程序分别模拟云环境上广泛使用的 java 类在线作业上和离线作业,对 MPAM 的 L3 cache 隔离功能进行验证。 - - -在前 40s 的时间内,两个程序共享L3 cache所有资源。在约 40s 后,开始隔离在线和离线L3 cache资源的使用,在离线任务 L3 cache 的配比分别为 0xffff 和 0xf。 - - -![](assets/龙蜥_ANCK_5.10_倚天平台_MPAM_用户手册/img_4.png) - - -通过实验结果可以看到,在 L3 cache 资源共享的情况下,离线资源对在线资源干扰明显,L3 cache 竞争激烈,波动幅度很大;在对 L3 cache 资源进行隔离后,一方面离线得到了持续有效的压制,L3 cache 占有率大幅下降,另一方面在线性能提升明显,平均 L3 cache 占用提升了约 78%,且波动幅度变小,L3 cache 占用更加稳定。 - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\260\203\345\272\246\345\231\250\347\203\255\345\215\207\347\272\247/Plugsched_\342\200\224\342\200\224_Linux_\345\206\205\346\240\270\350\260\203\345\272\246\345\231\250\347\203\255\345\215\207\347\272\247.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\260\203\345\272\246\345\231\250\347\203\255\345\215\207\347\272\247/Plugsched_\342\200\224\342\200\224_Linux_\345\206\205\346\240\270\350\260\203\345\272\246\345\231\250\347\203\255\345\215\207\347\272\247.md" deleted file mode 100644 index 897bbc10..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\260\203\345\272\246\345\231\250\347\203\255\345\215\207\347\272\247/Plugsched_\342\200\224\342\200\224_Linux_\345\206\205\346\240\270\350\260\203\345\272\246\345\231\250\347\203\255\345\215\207\347\272\247.md" +++ /dev/null @@ -1,223 +0,0 @@ -![](assets/Plugsched_——_Linux_内核调度器热升级/img_0.png) -文/龙蜥社区内核开发人员 陈善佩、吴一昊、邓二伟 - -# Plugsched 是什么 -Plugsched 是 Linux 内核调度器子系统热升级的 SDK, **它可以实现在不重启系统、应用的情况下动态替换调度器子系统,毫秒级 downtime** 。Plugsched 可以对生产环境中的内核调度特性动态地进行增、删、改,以满足不同场景或应用的需求,且支持回滚。 - -基于 plugsched 实现的调度器热升级,不修改现有内核代码,就能获得较好的可修改能力,天然支持线上的老内核版本。如果提前在内核调度器代码的关键数据结构中加入 Reserve 字段,可以额外获得修改数据结构的能力,进一步提升可修改能力。 - -Plugsched 开源链接:https://gitee.com/anolis/plugsched - - - -# Plugsched 可以解决什么问题 -那么 Plugsched 诞生的背景或者想要解决的问题是什么?我们认为有以下 4 点: - -* **应用场景不同,最佳调度策略不同:** 应用种类极大丰富,应用特征也是千变万化 (throughput-oriented workloads, us-scale latency critical workloads, soft real-time, and energy efficiency requirements),使得调度策略的优化比较复杂,不存在“一劳永逸”的策略。因此,允许用户定制调度器满足不同的场景是必要的。 -* **调度器迭代慢:** Linux 内核经过很多年的更新迭代,代码变得越来越繁重。调度器是内核最核心的子系统之一,它的结构复杂,与其它子系统紧密耦合,这使得开发和调试变得越发困难。此外,Linux 很少增加新的调度类,尤其是不太可能接受非通用或场景针对型的调度器,上游社区在调度领域发展缓慢。 -* **内核升级困难:** 调度器内嵌 (built-in)在内核中,上线调度器的优化或新特性需要升级内核版本。内核发布周期通常是数月之久,这将导致新的调度器无法及时应用在生产系统中。再者,要在集群范围升级新内核,涉及业务迁移和停机升级,对业务方来说代价昂贵。 -* **无法升级子系统。** kpatch 和 livepatch 是函数粒度的热升级方案,可修改能力较弱,不能实现复杂的逻辑改动; eBPF 技术在内核网络中广泛应用,但现在调度器还不支持 ebpf hook,将来即使支持,也只是实现局部策略的灵活修改,可修改能力同样较弱。 - -Plugsched 能将调度器子系统从内核中提取出来,以模块的形式对内核调度器进行热升级。通过对调度器模块的修改,能够针对不同业务定制化调度器,而且使用模块能够更敏捷的开发新特性和优化点,并且可以在不中断业务的情况下上线。 - -![](assets/Plugsched_——_Linux_内核调度器热升级/img_1.png) -图1 plugsched:业务不中断 - - - -**使用 plugsched 具有以下 6 大优势:** -* **与内核发布解耦:** 调度器版本与内核版本解耦,不同业务可以使用不同调度策略;建立持续运维能力,加速调度问题修复、策略优化落地;提升调度领域创新空间,加快调度器技术演进和迭代; -* **可修改能力强:** 可以实现复杂的调度特性和优化策略,能人之所不能; -* **维护简单:** 不修改内核代码,或少量修改内核代码,保持内核主线干净整洁;在内核代码 Tree 外独立维护非通用调度策略,采用 RPM 的形式发布和上线; -* **简单易用:** 容器化的 SDK 开发环境,一键生成 RPM,开发测试简洁高效; -* **向下兼容:** 支持老内核版本,使得存量业务也能及时享受新技术红利; -* **高效的性能:** 毫秒级 downtime,可忽略的 overhead。 - - - -# Plugsched 应用案例 -Plugsched 相比 kpatch 和 livepatch 可修改能力更强,热升级范围更广,plugsched 是子系统范围的热升级,而后者是函数级别的热升级。**对于 plugsched 而言,无论是 bugfix,还是性能优化,甚至是特性的增、删、改,都可胜任**。鉴于 plugsched 较强的可修改能力,它可应用到以下场景: - -* **快速开发、验证、上线新特性,稳定后放入内核主线;** -* **针对不同业务场景做定制优化,以 RPM 包的形式发布和维护非通用调度器特性;** -* **统一管理调度器热补丁,避免多个热补丁之间的冲突而引发故障。** - - - -**应用案例1:新增 Group Identity 调度特性** -Group Identity 是阿里云用于混部场景的调度特性,它基于 CFS 调度器增加了一颗存储低优先级任务的红黑树,而且会对每一个 cgroup 分配一个默认优先级,用户也可自行配置其优先级,当队列中存在高优先级任务时,低优先级任务会停止运行。我们利用 plugsched 对 anck 4.19 的一个老版本内核(没有该调度特性)进行调度器热升级,并将 Group Identity 调度特性移植到生成的调度器模块中,涉及 7 个文件,2500+ 行的修改量。 - -安装该调度器模块后,在系统中创建两个 cpu cgroup A 和 B,并绑定同一个 CPU,分别设置最高和最低优先级,然后各自创建一个 busy loop 任务。理论上,当 A 中有任务执行时,B 中的任务会停止运行。此时用 top 工具查看该 CPU 利用率,发现只有一个利用率是 100% 的 busy loop 任务,说明模块中的 Group Identity 特性已生效;而动态卸载该模块后,出现了两个各占 50% CPU 的 busy loop 任务,说明模块已经失效。 - - - -**应用案例2:与内核发布解耦及定制化调度器** -阿里云某客户使用的旧版本内核,由于该内核调度器对 load 的统计算法不合理,导致 CPU 利用率过高,虽然修复补丁已经合入内核主线,但是新内核版本还未发布,而且业务方也不打算更换内核,因为集群中部署了大量的业务,升级内核成本较高。 - -除此之外,客户的内核开发人员对其混部业务场景(Group Identity 调度特性)进行了针对性的优化,想将优化内容合入内核主线。但是,阿里云内核开发人员发现,该优化内容在其它场景中有性能回退,属于非通用优化,因此不允许将优化内容合入主线。 - -于是,客户的内核开发人员使用 plugsched 将优化修复内容全部移植到调度器模块中,最后规模部署。该案例可以体现出 plugsched 的与内核发布解耦、定制化调度器的优势。 - - - -# 如何使用 Plugsched -目前,plugsched 默认支持 Anolis OS 7.9 ANCK 系统发行版,其它系统需要[调整边界配置](./docs/Support-various-Linux-distros.md)。为了减轻搭建运行环境的复杂度,我们提供了的容器镜像和 Dockerfile,开发人员不需要自己去搭建开发环境。为了方便演示,这里购买了一台阿里云 ECS(64CPU + 128GB),并安装 Anolis OS 7.9 ANCK 系统发行版,我们将会对内核调度器进行热升级。 - -1. 登陆云服务器后,先安装一些必要的基础软件包: -```shell -# yum install anolis-repos -y -# yum install podman kernel-debuginfo-$(uname -r) kernel-devel-$(uname -r) --enablerepo=Plus-debuginfo --enablerepo=Plus -y -``` - -2. 创建临时工作目录,下载系统内核的 SRPM 包: -```shell -# mkdir /tmp/work -# uname -r -4.19.91-25.2.an7.x86_64 -# cd /tmp/work -# wget https://mirrors.openanolis.cn/anolis/7.9/Plus/source/Packages/kernel-4.19.91-25.2.an7.src.rpm -``` - -3. 启动并进入容器: -```shell -# podman run -itd --name=plugsched -v /tmp/work:/tmp/work -v /usr/src/kernels:/usr/src/kernels -v /usr/lib/debug/lib/modules:/usr/lib/debug/lib/modules docker.io/plugsched/plugsched-sdk -# podman exec -it plugsched bash -# cd /tmp/work -``` - -4. 提取 4.19.91-25.1.al7.x86_64 内核源码: -```shell -# plugsched-cli extract_src kernel-4.19.91-25.2.an7.src.rpm ./kernel -``` - -5. 进行边界划分与提取: -```shell -# plugsched-cli init 4.19.91-25.2.an7.x86_64 ./kernel ./scheduler -``` - -6. 提取后的调度器模块代码在 ./scheduler/kernel/sched/mod 中, 新增一个 sched\_feature 并打包生成 rpm 包: -```diff -diff --git a/scheduler/kernel/sched/mod/core.c b/scheduler/kernel/sched/mod/core.c -index 9f16b72..21262fd 100644 ---- a/scheduler/kernel/sched/mod/core.c -+++ b/scheduler/kernel/sched/mod/core.c -@@ -3234,6 +3234,9 @@ static void __sched notrace __schedule(bool preempt) - struct rq *rq; - int cpu; - -+ if (sched_feat(PLUGSCHED_TEST)) -+ printk_once("I am the new scheduler: __schedule\n"); -+ - cpu = smp_processor_id(); - rq = cpu_rq(cpu); - prev = rq->curr; -diff --git a/scheduler/kernel/sched/mod/features.h b/scheduler/kernel/sched/mod/features.h -index 4c40fac..8d1eafd 100644 ---- a/scheduler/kernel/sched/mod/features.h -+++ b/scheduler/kernel/sched/mod/features.h -@@ -1,4 +1,6 @@ - /* SPDX-License-Identifier: GPL-2.0 */ -+SCHED_FEAT(PLUGSCHED_TEST, false) -+ - /* - * Only give sleepers 50% of their service deficit. This allows - * them to run sooner, but does not allow tons of sleepers to -``` -```shell -# plugsched-cli build /tmp/work/scheduler -``` - -7. 将生成的 rpm 包拷贝到宿主机,退出容器,查看当前 sched\_features: -```text -# cp /usr/local/lib/plugsched/rpmbuild/RPMS/x86_64/scheduler-xxx-4.19.91-25.2.an7.yyy.x86_64.rpm /tmp/work -# exit -exit -# cat /sys/kernel/debug/sched_features -GENTLE_FAIR_SLEEPERS START_DEBIT NO_NEXT_BUDDY LAST_BUDDY CACHE_HOT_BUDDY WAKEUP_PREEMPTION NO_HRTICK NO_DOUBLE_TICK NONTASK_CAPACITY TTWU_QUEUE NO_SIS_AVG_CPU SIS_PROP NO_WARN_DOUBLE_CLOCK RT_PUSH_IPI RT_RUNTIME_SHARE NO_LB_MIN ATTACH_AGE_LOAD WA_IDLE WA_WEIGHT WA_BIAS NO_WA_STATIC_WEIGHT UTIL_EST ID_IDLE_AVG ID_RESCUE_EXPELLEE NO_ID_EXPELLEE_NEVER_HOT NO_ID_LOOSE_EXPEL ID_LAST_HIGHCLASS_STAY -``` - -8. 安装调度器包,且新增了一个 PLUGSCHED\_TEST sched\_feature(关闭状态): -```text -# rpm -ivh /tmp/work/scheduler-xxx-4.19.91-25.2.an7.yyy.x86_64.rpm -# lsmod | grep scheduler -scheduler 503808 1 -# dmesg | tail -n 10 -[ 2186.213916] cni-podman0: port 1(vethfe1a04fa) entered forwarding state -[ 6092.916180] Hi, scheduler mod is installing! -[ 6092.923037] scheduler: total initialization time is 6855921 ns -[ 6092.923038] scheduler module is loading -[ 6092.924136] scheduler load: current cpu number is 64 -[ 6092.924137] scheduler load: current thread number is 667 -[ 6092.924138] scheduler load: stop machine time is 249471 ns -[ 6092.924138] scheduler load: stop handler time is 160616 ns -[ 6092.924138] scheduler load: stack check time is 85916 ns -[ 6092.924139] scheduler load: all the time is 1097321 ns -# cat /sys/kernel/debug/sched_features -NO_PLUGSCHED_TEST GENTLE_FAIR_SLEEPERS START_DEBIT NO_NEXT_BUDDY LAST_BUDDY CACHE_HOT_BUDDY WAKEUP_PREEMPTION NO_HRTICK NO_DOUBLE_TICK NONTASK_CAPACITY TTWU_QUEUE NO_SIS_AVG_CPU SIS_PROP NO_WARN_DOUBLE_CLOCK RT_PUSH_IPI RT_RUNTIME_SHARE NO_LB_MIN ATTACH_AGE_LOAD WA_IDLE WA_WEIGHT WA_BIAS NO_WA_STATIC_WEIGHT UTIL_EST ID_IDLE_AVG ID_RESCUE_EXPELLEE NO_ID_EXPELLEE_NEVER_HOT NO_ID_LOOSE_EXPEL ID_LAST_HIGHCLASS_STAY -``` - -9. 打开新的 sched\_feature,“I am the new scheduler: \_\_schedule” 信息出现在 dmesg 日志中: -```text -# echo PLUGSCHED_TEST > /sys/kernel/debug/sched_features -# dmesg | tail -n 5 -[ 6092.924138] scheduler load: stop machine time is 249471 ns -[ 6092.924138] scheduler load: stop handler time is 160616 ns -[ 6092.924138] scheduler load: stack check time is 85916 ns -[ 6092.924139] scheduler load: all the time is 1097321 ns -[ 6512.539300] I am the new scheduler: __schedule -``` - -10. 卸载调度器包后,新的 sched\_feature 被删除: -```text -# rpm -e scheduler-xxx -# dmesg | tail -n 8 -[ 6717.794923] scheduler module is unloading -[ 6717.809110] scheduler unload: current cpu number is 64 -[ 6717.809111] scheduler unload: current thread number is 670 -[ 6717.809112] scheduler unload: stop machine time is 321757 ns -[ 6717.809112] scheduler unload: stop handler time is 142844 ns -[ 6717.809113] scheduler unload: stack check time is 74938 ns -[ 6717.809113] scheduler unload: all the time is 14185493 ns -[ 6717.810189] Bye, scheduler mod has be removed! -# -# cat /sys/kernel/debug/sched_features -GENTLE_FAIR_SLEEPERS START_DEBIT NO_NEXT_BUDDY LAST_BUDDY CACHE_HOT_BUDDY WAKEUP_PREEMPTION NO_HRTICK NO_DOUBLE_TICK NONTASK_CAPACITY TTWU_QUEUE NO_SIS_AVG_CPU SIS_PROP NO_WARN_DOUBLE_CLOCK RT_PUSH_IPI RT_RUNTIME_SHARE NO_LB_MIN ATTACH_AGE_LOAD WA_IDLE WA_WEIGHT WA_BIAS NO_WA_STATIC_WEIGHT UTIL_EST ID_IDLE_AVG ID_RESCUE_EXPELLEE NO_ID_EXPELLEE_NEVER_HOT NO_ID_LOOSE_EXPEL ID_LAST_HIGHCLASS_STAY -``` -**注意:不可以用“rmmod”命令直接卸载调度器模块,应使用“rpm 或 yum”标准命令卸载调度器包。** - - - -# Plugsched 实现原理 -**我们通过以上知道了 Plugsched 是什么、应用案例,那它实现原理是什么?** - -调度器子系统在内核中并非是一个独立的模块,而是内嵌在内核中,与内核其它部分紧密相连。 - -**Plugsched 采用“模块化”的思想**:它提供了边界划分程序,确定调度器子系统的边界,把调度器从内核代码中提取到独立的目录中,开发人员可对提取出的调度器代码进行修改,然后编译成新的调度器内核模块,动态替换内核中旧的调度器。对子系统进行边界划分和代码提取,需要处理函数和数据,而后生成一个独立的模块。 - -**对于函数而言**,调度器模块对外呈现了一些关键的函数,以这些函数为入口就可以进入模块中,我们称之为接口函数。通过替换内核中的这些接口函数,内核就可以绕过原有的执行逻辑进入新的调度器模块中执行,即可完成函数的升级。模块中的函数,除了接口函数外,还有内部函数,其它的则是外部函数。 - -**对于数据**,调度器模块默认使用并继承内核中原有的数据,对于调度器重要的数据,比如运行队列状态等,可以通过状态重建技术自动重新初始化,这类数据属于私有数据,而其它则是共享数据。为了灵活性,plugsched 允许用户手动设置私有数据,手动设置的私有数据会在模块中保留定义,但需要对它们进行初始化。对于结构体而言,plugsched 将只被调度器访问的结构体成员分类为内部成员,其它为非内部成员。调度器模块允许修改内部成员的语义,禁止修改非内部成员的语义。如果结构体所有成员都是内部成员,则调度器模块允许修改整个结构体。但是,建议优先使用结构体中的保留字段,而不是修改现有成员。 - - - -# Plugsched 设计方案 -Plugsched 主要包含两大部分,第一部分是调度器模块边界划分与代码提取部分,第二部分是调度器模块热升级部分,这两部分是整个方案的核心。其整体设计方案如下: - -![](assets/Plugsched_——_Linux_内核调度器热升级/img_2.png) -图2 plugsched 整体架构 - - - -首先进行的是调度器模块边界划分和代码提取流程,由于调度器本身并不是模块,因此需要明确调度器的边界才能将它模块化。边界划分程序会根据边界配置信息(主要包含代码文件、接口函数等信息)从内核源代码中将调度器模块的代码提取到指定目录,然后开发人员可在此基础上进行调度器模块的开发,最后编译生成调度器 RPM 包,并可安装在对应内核版本的系统中。安装后会替换掉内核中原有的调度器,安装过程会经历以下几个关键过程: - -* **符号重定位**:解析模块对部分内核符号的访问; -* **栈安全检查**:类似于 kpatch,函数替换前必须进行栈安全检查,否则会出现宕机的风险。plugsched 对栈安全检查进行了并行和二分优化,提升了栈安全检查的效率,降低了停机时间; -* **接口函数替换**:用模块中的接口函数动态替换内核中的函数; -* **调度器状态重建**:采用通用方案自动同步新旧调度器的状态,极大的简化数据状态的一致性维护工作。 - - - -# 总结 -Plugsched 使得调度器从内核中解放出来,开发人员可以对调度器进行专项定制,而不局限于内核通用调度器;内核维护也变得更加轻松,因为开发人员只需要关注通用调度器的开发与迭代,定制化调度器可通过 RPM 包的形式进行发布;内核调度器代码也会变得简洁,无需再被各个场景的优化混淆起来。 - -未来,plugsched 会支持新版本内核和其它平台,持续对其易用性进行优化,并提供更多的应用案例。最后,欢迎更多的开发者能参与到 plugsched 中。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\350\265\204\346\272\220\351\232\224\347\246\273FAQ.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\350\265\204\346\272\220\351\232\224\347\246\273FAQ.md" deleted file mode 100644 index e69de29b..00000000 diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\351\276\231\350\234\245OS\350\265\204\346\272\220\351\232\224\347\246\273\346\212\200\346\234\257\344\273\213\347\273\215.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\351\276\231\350\234\245OS\350\265\204\346\272\220\351\232\224\347\246\273\346\212\200\346\234\257\344\273\213\347\273\215.md" deleted file mode 100644 index 4a59a079..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\351\276\231\350\234\245OS\350\265\204\346\272\220\351\232\224\347\246\273\346\212\200\346\234\257\344\273\213\347\273\215.md" +++ /dev/null @@ -1,169 +0,0 @@ - -# 背景介绍 - - - 2014年,阿里开始了第一次探索混部,经过七年磨练,这把资源利用率大幅提升的利剑正式开始商用。通过从计算资源、内存资源、存储资源、网络资源等全链路的隔离以及毫秒级的自适应调度能力,阿里可以在双十一的流量下进行全时混部,通过智能化的决策与运维能力,支撑着内部百万级的Pod混部,不管是CPU与GPU资源,普通容器与安全容器,包括国产化环境各种异构基础设施,都能实现高效混部,这让阿里核心电商业务生产集群成本下降了50%以上,同时核心业务受到的干扰小于5%。在商用化对外线下输出的版本里面,我们将完全基于云原生社区标准,以插件化的方式无缝的安装在k8s集群为输出形态交付客户。其中核心的OS层隔离能力,已经发布到支持多架构的开源、中立、开放的Linux操作系统发行版-龙蜥(Anolis OS)中。 - - -# 混部和资源隔离之间的关系:**资源隔离是混部的基石** - - -混部就是将不同类型的业务在同一台机器上混合部署起来,让它们共享机器上的CPU、内存、IO等资源,目的就是最大限度地提高资源利用率,从而降低采购和运营等成本。混部通常是将不同优先级的任务混合在一起,例如高优先的实时任务(对时延敏感,资源消耗低;称为在线)和低优先级批处理任务(对时延不敏感,资源消耗高;称为离线),当高优先级业务需要资源时,低优先级任务需要立即归还,并且低优先级任务的运行不能对高优先级任务造成明显干扰。 - - -为了满足混部的需求,在单机维度的内核资源隔离技术是最为关键的一项技术,龙蜥云内核在资源隔离的技术上深耕多年,并且在行业中处于领先地位,这些内核资源隔离技术主要涉及内核中的调度、内存和IO这三大子系统,并且在各个子系统领域根据云原生的混部场景进行了深入的改造和优化,关键优化包括但不限于:cpu group identity技术,SMT expeller技术,基于cgroup的内存异步回收技术等。其中cpu group identity已经申请对应的专利,有独立的知识产权。这些关键的技术使客户有能力在云原生混部场景中根据业务特点给出最优解决方案,可有效提高用户的资源使用率并最终降低用户资源的使用成本,非常适用于容器云混部场景,同时也是大规模化混合部署方案所强依赖的关键技术。 - - -下图是资源隔离能力在整个混部方案中的位置:![](../../../assets/社区研发项目/资源隔离与混部/龙蜥OS资源隔离技术介绍/img_0.png) - - -# 为什么需要资源隔离:**资源隔离会遇到哪些拦路虎** - - -假设我们现在有一台服务器,上面运行了高优的在线业务,以及离线任务也在上面运行运行。在线任务对响应时间 (Response Time, RT) 的需求是很明确的,要求尽可能低的RT,故被称之为延迟敏感型(Latency-Sensitive, LS) 负载;离线任务永远是有多少资源吃多少资源的,故此类负载被称之为 Best Effort (BE),如果我们对在线和离线任务不加干涉,那么离线任务很有可能会频繁、长期占用各种资源,从而让在线任务没有机会调度,或者调度不及时,或者获取不到带宽等等,从而出现在线业务RT急剧升高的情况。所以在这种场景下我们一定需要必要的手段来对在线和离线容器进行资源使用上的隔离,来确保在线高优容器在使用资源时可以及时的获取,最终能够在提升整体资源使用率的情况下保障高优容器的QoS。 - - -我们这边通过一个例子,说明一下在线和离线混着跑的时候,可能出现的情况: - - -* 首先最有可能发生在离线竞争的,可能是CPU,因为CPU调度是核心,在线和离线任务可能分别会调度到一个核上,相互抢执行时间; -* 当然任务也可能会分别跑到相互对应的一对HT上,相互竞争指令发射带宽和其他流水线资源; -* 接下来CPU的各级缓存必然是会被消耗掉的,而缓存资源是有限的,所以这里涉及到了缓存资源划分的问题; -* 再接下来,假设我们已经完美解决了各级缓存的资源划分,后面还是有问题。首先是内存是CPU缓存的下一级,内存本身也类似,会发生争抢,对于在线和离线任务分别来说都是需要像CPU缓存一样进行资源划分的; -* 另外当CPU最后一级缓存(Last Level Cache, LLC)没有命中的时候,内存的带宽(我们称之为运行时容量,以有别于内存大小划分这种静态容量)会变高,所以内存和CPU缓存之间的资源消耗,是相互影响的; -* 然后我们假设CPU和内存资源都没问题,对于本机来说现在隔离已经做得很好了,但是在线高优的业务和离线任务的运行过程中都是和网络有密切的关系,那么很容易理解,网络也可能是需要隔离的; -* 最后,线上部分机型对IO的使用可能会发生抢占,我们需要有效的IO隔离策略。 - - -以上就是一个很简单的资源隔离流程的思路,可以看到每一环都有可能会出现干扰或者竞争。 - - -# 隔离技术方案介绍:**独有的隔离技术方案,各显神通** - - -内核资源隔离技术主要涉及内核中的调度、内存和 IO 这三大子系统,这些技术基于 Linux CGroup V1 提供资源的基本隔离划分以及 QoS 保障,适用于容器云场景,同时也是大规模化混合部署方案所强依赖的关键技 术。 - - -除了基本的 CPU、内存和 IO 资源隔离技术外,龙蜥内核还实现有资源隔离视图、资源监控指标 SLI (ServiceLevelIndicator) 以及资源竞争分析工具等,提供一整套集监控、告警、运维、诊断等整套的资源隔 离和混部解决方案,如下图所示 - - -![](../../../assets/社区研发项目/资源隔离与混部/龙蜥OS资源隔离技术介绍/img_1.png) - - -## 弹性容器场景的调度器优化 - - -如何保证计算服务质量的同时尽可能提高计算资源利用率,是容器调度的经典问题。随着 CPU 利用率不断 提升,CPU 带宽控制器暴露出弹性不足的问题日趋严重,面对容器的短时间 CPU 突发需求,带宽控制器需要对容器的 CPU 使用进行限流,避免影响负载延迟和吞吐。 - - -Anolis OS 中的 CPU Burst 技术是一种弹性容器带宽控制技术,在满足平均 CPU 使用率低于一定限制的条件下,CPU Burst 允许短时间的 CPU 突发使用,实现服务质量提升和容器负载加速。 - - -在容器场景中使用 CPU Burst 之后,测试容器的服务质量显著提升,如下图所示,在实测中可以发现使用该特性技术以后,RT长尾问题几乎消失。 - - -![](../../../assets/社区研发项目/资源隔离与混部/龙蜥OS资源隔离技术介绍/img_2.png) - - -## Group Identity 技术 - - -为了满足业务方在cpu资源隔离上的需求,在满足cpu资源利用最大化的情况下,保证高优业务的服务质量不受影响,或将影响范围控制在一定范围,此时内核调度器需要赋予高优先级的任务更多的调度机会来最小化其调度延迟,并把低优先级任务对其带来的影响降到最低,这是行业中通用的需求。 - - -为了满足以上需求,我们引入了Group Identity的概念,即每个cpu cgroup会有一个身份识别,以CPU CGroup组为单位实现调度特殊优先级,提升高优先级组的及时抢占能力确保了高优先级任务的性能,适用于在线和离线混跑的业务场景。当在离线混部时,可以最大程度降低由于离线业务引入的在线业务调度不及时的问题,增加高优先业务的cpu抢占时机等底层等核心技术保障在线业务在cpu调度延迟上不受离线业务的影响。 - - -## SMT expeller - - -在某些线上业务场景中,使用超线程的情况下的 QPS 比未使用超线程时下降明显,并且相应 RT 也增加了 不少。根本原因跟超线程的物理性质有关,超线程技术在一个物理核上模拟两个逻辑核,两个逻辑核具有各自独立的寄存器(eax、ebx、ecx、msr等等)和APIC,但会共享使用物理核的执行资源,包括执行引擎、L1/L2缓存、TLB和系统总线等等。这就意味着,如果一对HT的一个核上跑了在线任务,与此同时它对应的HT核上跑了一个离线任务,那么它们之间是会发生竞争的。这就是我们需要解决的问题。 - - -为了尽可能减轻这种竞争的影响,我们想要让一个核上的在线任务执行的时候,它对应的HT上不再运行离线任务;或者当一个核上有离线任务运行的时候,而在线任务调度到了其对应的HT上时,离线任务会被驱赶走。听起来离线混得很惨对不对,但是这就是我们保证HT资源不被争抢的机制。 - - -SMT expeller 特性是基于 Group Identity 框架进一步实现了超线程(HT)隔离调度,保障高优先级业务不会受到来自 HT 的低优先级任务干扰。通过 Group Identity 框架进一步实现的超线程调度隔离,可以很好的保障高优先级业务不会受到来自对应HT上的低优先级任务的干扰。 - - -## 处理器硬件资源管理技术 - - -龙蜥内核支持 Intel®Resource Director Technology(Intel®RDT),它是一种处理器支持的硬件资源 管理技术。包括监控 Cache 资源的 Cache Monitoring Technology (CMT) ,监控内存带宽的 Memory Bandwidth Monitoring (MBM),负责 Cache 资源分配的 Cache Allocation Technology(CAT) 和监 控内存带宽的 Memory Bandwidth Allocation(MBA)。 - - -其中,CAT 使得 LLC(Last Level Cache)变成了一种支持 QualityofService(QoS) 的资源。在 混部环境里面,如果没有 LLC 的隔离,离线应用不停的读写数据导致大量的 LLC 占用,会导致在线的 LLC 被 不断污染,影响数据访问甚至硬件中断延迟升高、性能下降。 - - -MBA 用于内存带宽分配。对于内存带宽敏感的业务来说,内存带宽比 LLC 控制更能影响性能和时延。在 混部环境里面,离线通常是资源消耗型的,特别是一些 AI 类型的作业对内存带宽资源的消耗非常大,内存占用 带宽一旦达到瓶颈,可能使得在线业务的性能和时延成倍的下降,并表现出 CPU 水位上升。龙蜥内核目前已经 全面支持多种处理器的资源隔离功能。 - - -## Memcg 后台回收 - - -在原生的内核系统中,当容器的内存使用量达到他的使用上限时,此时再申请使用内存时,在当前的进程上下文中就会进行直接内存回收的动作,这无疑会影响当前进程的执行效率,引起性能问题。那我们是否有方法当容器的内存达到一定水线的时候让其提前进行内存的异步回收,这样就有比较大的概率避免容器内的进程在申请使用内存时由于内存使用达到上限而进入直接内存回收。 - - -我们知道在内核中有一个kswapd的后台内核线程,用来当系统的内存使用量达到一定水位以后来进行异步的内存回收,但是这里有一种情况,比如当前高优的业务容器的内存使用已经达到一个比较高的情况,但是宿主机的总体的空闲内存还有很多,这样内核的kswapd的线程就不会被唤醒进行内存回收,这样这些内存使用压力大的高优容器的内存就没有机会被回收,所以这是个比较大的矛盾,由于目前原生内核中是没有memory cgroup级别的内存异步回收机制,也就是说容器的内存回收严重依赖宿主机层面的kswapd的回收或者只能依靠自己的同步回收,这会严重的影响一些高优容器的业务由于内存回收不及时引入的性能问题。 - - -基于以上背景,anolis os提供了一个类似宿主机层面的kswapd的基于memcg的异步回收策略,用于按照用户需求提前进行容器级别的内存回收机制,做到提前内存释压。 - - -具体的异步回收过程可以通过下面这幅图进行描述: - - -![](../../../assets/社区研发项目/资源隔离与混部/龙蜥OS资源隔离技术介绍/img_3.png) - - -## Memcg 全局水位线分级 - - -通常资源消耗型的离线任务可能会时常瞬间申请大量的内存,使得系统的空闲内存触及全局min水线,引发系统所有任务进入直接内存回收的慢速流程,时延敏感型的在线业务很容易发生性能抖动。此场景下,无论是全局kswapd后台回收还是memcg级别的后台回收机制,都是无能为力的。 - - -我们基于"内存消耗型的离线任务通常对时延不敏感"这样一个事实,设计了"memcg的全局min水线分级功能"来解决上述抖动难题。在标准upstream全局共享min水线的基础上,将离线任务的全局min水线上移让其提前进入直接内存回收,同时将时延敏感的在线任务的全局min水线下移,在一定程度上实现了离线任务和在线任务的min水线隔离。这样当离线任务瞬间大量内存申请的时候,会将离线任务抑制在其上移的min水线,避免了在线任务发生直接内存回收,随后当全局kswapd回收一定量的内存后,离线任务的短时间抑制得以解除。 - - -我们的核心思想就是通过为在离线容器设置不同标准的全局水位线来控制在离线容器申请内存的动作,这样能让离线容器的任务在申请内存时先与在线业务进入直接内存回收,用于解决离线容器瞬间申请大量内存引发的问题。 - - -对linux内存管理有一定基础的同学也可以查阅下面这幅图,他详细的记录了在离线容器混部过程中在多种水位线的作用下的一个走势图: - - -![](../../../assets/社区研发项目/资源隔离与混部/龙蜥OS资源隔离技术介绍/img_4.png) - - -## memcg OOM 优先级 - - -在真实的业务场景中,特别是内存超卖环境,当发生global OOM的时候,有理由去选择杀掉那些优先级比较低的离线业务,而保护高优先级在线业务;当发生离线memcg OOM的时候,有理由去选择杀掉那些优先级比较低的作业,而保高优先级离线作业。这其实是云原生场景中一个比较通用的需求,但是目前的标准Linux内核并不具备这个能力,在选择杀进程的时候,内核会有一个算法去选择victim,但通常是找一个oom score最大的进程杀,这个被杀的进程有可能是在线高优业务进程,这并不是我们想看到的。 - - -基于以上原因,anolis os提供了一个memcg OOM优先级的特性,通过该特性我们可以保障在系统由于内存紧张而发生OOM时通过选择低优的业务进程进行kill,从而避免高优业务进程被杀的可能,可以大幅降低由于在线业务进程退出而给客户业务带来的影响。 - - -## CGroupV1 Writeback 限流 - - -block IO cgroup自合入内核之后,一直存在一个问题:只能对direct IO进行限流(buffer IO之后短期内执行fsync也可以限流),因为这些IO到达block throttle层时,当前进程就是真正发起IO的进程,根据进程可以获取到相应的cgroup从而正确记账,如果超过了用户设置的带宽/IOPS上限,则进行限制。对于那些buffer写,且最终由kworker线程下发的IO,block throttle层无法通过当前进程获取IO所属的cgroup,也就无法对这些IO进行限流。 - - -基于以上背景,目前在Cgroup V2版本中已经支持异步IO限流,但是在Cgroup V1中并不支持,由于目前在云原生环境下主要还是使用Cgroup V1版本,阿里云内核团队通过建立page<->memcg<->blkcg这三者的关系实现了在Cgroup V1中对IO异步限流的功能,限流的主要算法基本上和Cgroup V2保持一致。 - - -## blk-iocost 权重控制 - - -正常情况下,为了避免一个IO饥饿型作业轻易耗尽整个系统IO资源,我们会设置每个cgroup的IO带宽上限,其最大缺点是即使设备空闲,配置上限的cgroup在其已发送IO超过上限时不能继续发送IO,引起存储资源浪费。 - - -基于以上需求,出现了一种IO控制器-IOCOST,该控制器是基于blkcg的权重来分配磁盘的资源,可以做到在满足业务IO QOS的前提下,尽最大程度利用磁盘的IO资源,一旦出现磁盘IO能力达到上限导致触及QOS设置的目标时,此时iocost控制器会通过权重来控制各个group的io使用,在此基础上,blk-iocost又拥有一定的自适应能力,尽可能的避免磁盘能力被浪费。 - - -# 展望与期待 - - -在阿里云的线下输出产品族内,我们会把混部的能力通过ACK Anywhere产品家族,以及CNStack(CloudNative Stack)产品家族,进行输出。整体解决方案结合OpenAnolis龙蜥操作系统内核,网络Qos技术等,输出给我们的客户。 - - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\351\276\231\350\234\245os\350\265\204\346\272\220\351\232\224\347\246\273\344\275\277\347\224\250\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\351\276\231\350\234\245os\350\265\204\346\272\220\351\232\224\347\246\273\344\275\277\347\224\250\347\256\200\344\273\213.md" deleted file mode 100644 index 82010981..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\351\276\231\350\234\245os\350\265\204\346\272\220\351\232\224\347\246\273\344\275\277\347\224\250\347\256\200\344\273\213.md" +++ /dev/null @@ -1,1080 +0,0 @@ - -# 背景 - - -为了给用户提供一份完整的alibaba cloud linux资源隔离使用指导说明手册,本文将从用户的角度出发,提供OS各个子系统中关于资源隔离详细的使用说明,并会详细描述各个隔离手段的使用背景,让用户更好的了解各个资源隔离手段在哪些场景使用,使用限制是什么。 - - -让用户最终能够简单的使用alibaba cloud linux资源隔离是本文的目的。 - - -# 目标人群 - - -本文的使用人员需要具备一定的关于cgroup的基础知识,对linux操作系统有初步的了解。本文适合那些想快速使用alibaba cloud kernel的人员,也适合想简单了解alibaba cloud kernel资源隔离能力的人员。 - - -# 背景知识 - - -如果你对linux的cgroup的使用有所了解,本段内容可以跳过,如果你对cgroup从未了解过,建议阅读下本背景知识,并在自己的测试机器上进行演练来加深了解。 - - -我们所有的资源隔离手段几乎都是基于linux的cgroup进行实现和优化,Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。而我们平时使用的容器,他的底层技术就是cgroup技术。 - - -在 Linux 中,Cgroups 给用户暴露出来的操作接口是文件系统,即它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下,我们可以用 mount 指令把它们展示出来,这条命令是: - - - -``` -[root@AliYun ~]# mount -t cgroup -cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd) -cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma) -cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset) -cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct) -cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids) -cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio) -cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory) -cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio) -cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event) -cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer) -cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb) -cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices) -``` - -可以看到,在 /sys/fs/cgroup 下面有很多诸如 cpuset、cpu、 memory 这样的子目录,也叫子系统。这些都是我这台机器当前可以被 Cgroups 进行限制的资源种类。而在子系统对应的资源种类下,你就可以看到该类资源具体可以被限制的方法。比如,对 CPU 子系统来说,我们就可以看到如下几个配置文件,这些配置文件就是我们这边所谓的对外配置接口,可以通过手动的方式进行资源使用的配置: - - - -``` -[root@AliYun cpu]# ls -assist cpuacct.usage_all cpu.cfs_period_us -cgroup.clone_children cpuacct.usage_percpu cpu.cfs_quota_us -cgroup.procs cpuacct.usage_percpu_sys cpu.identity -cgroup.sane_behavior cpuacct.usage_percpu_user cpu.shares -cpuacct.block_latency cpuacct.usage_sys cpu.stat -cpuacct.cgroup_wait_latency cpuacct.usage_user notify_on_release -cpuacct.ioblock_latency cpuacct.wait_latency release_agent -cpuacct.proc_stat cpu.bvt_warp_ns tasks -cpuacct.stat cpu.cfs_burst_us -cpuacct.usage cpu.cfs_init_buffer_us -``` - -我们这边就以容器的cpu规格的配置进行举例,这里主要涉及cfs\_period 和 cfs\_quota 两个关键词。这两个参数需要组合使用,可以用来限制进程在长度为 cfs\_period 的一段时间内,只能被分配到总量为 cfs\_quota 的 CPU 时间。 - - -而这样的配置文件又如何使用呢? - - -你需要在对应的子系统下面创建一个目录,比如,我们现在进入 /sys/fs/cgroup/cpu 目录下: - - - -``` -[root@AliYun cpu]# mkdir test -[root@AliYun cpu]# cd test -[root@AliYun test]# ls -cgroup.clone_children cpuacct.usage_percpu cpu.cfs_period_us -cgroup.procs cpuacct.usage_percpu_sys cpu.cfs_quota_us -cpuacct.block_latency cpuacct.usage_percpu_user cpu.identity -cpuacct.cgroup_wait_latency cpuacct.usage_sys cpu.shares -cpuacct.ioblock_latency cpuacct.usage_user cpu.stat -cpuacct.proc_stat cpuacct.wait_latency notify_on_release -cpuacct.stat cpu.bvt_warp_ns tasks -cpuacct.usage cpu.cfs_burst_us -cpuacct.usage_all cpu.cfs_init_buffer_us -``` - -这个目录就称为一个“控制组”。你会发现,操作系统会在你新创建的 test 目录下,自动生成该子系统对应的资源限制文件。 - - -现在,我们在后台执行这样一条脚本: - - - -``` -[root@AliYun test]# while : ; do : ; done & -[1] 24227 -``` - -显然,它执行了一个死循环,可以把计算机的 CPU 吃到 100%,根据它的输出,我们可以看到这个脚本在后台运行的进程号(PID)是 24227。 - - -这样,我们可以用 top 指令来确认一下 CPU已经被打满: - - -![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_0.png) - - -而此时,我们可以通过查看 test 目录下的文件,看到 test 控制组里的 CPU quota 还没有任何限制(即:-1),CPU period 则是默认的 100 ms(100000 us): - - - -``` -[root@AliYun test]# cat cpu.cfs_quota_us --1 -[root@AliYun test]# cat cpu.cfs_period_us -100000 -``` - -接下来,我们可以通过修改这些文件的内容来设置限制。比如,向 test 组里的 cfs\_quota 文件写入 20 ms(20000 us): - - - -``` -[root@AliYun test]# echo 20000 > cpu.cfs_quota_us -[root@AliYun test]# cat cpu.cfs_quota_us -20000 -``` - -结合前面的介绍,你应该能明白这个操作的含义,它意味着在每 100 ms 的时间里,被该控制组限制的进程只能使用 20 ms 的 CPU 时间,也就是说这个进程只能使用到 20% 的 CPU 带宽。 - - -接下来,我们把被限制的进程的 PID 写入 test 组里的 tasks 文件,上面的设置就会对该进程生效了: - - - -``` -[root@AliYun test]# echo 24227 > tasks -``` - -![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_1.png) - - -可以看到,计算机的 CPU 使用率立刻降到了 20%. - - -除 CPU 子系统外,Cgroups 的每一个子系统都有其独有的资源限制能力,比如: - - -+ blkio,为块设备设定I/O 限制,一般用于磁盘等设备; -+ cpuset,为进程分配单独的 CPU 核和对应的内存节点; -+ memory,为进程设定内存使用的限制。 - - -Linux Cgroups 的设计还是比较易用的,简单粗暴地理解呢,它就是一个子系统目录加上一组资源限制文件的组合。而对于 Docker 等 Linux 容器项目来说,它们只需要在每个子系统下面,为每个容器创建一个控制组(即创建一个新目录),然后在启动容器进程之后,把这个进程的 PID 填写到对应控制组的 tasks 文件中就可以了。 - - -# 特别提醒 - - -Alinux内核完全兼容对应的centos的原生内核,所以这意味着所有centos内核中自带的资源隔离方法在Alinux中都有,阿里云在各个资源维度有针对云原生场景下的各种需要进行资源隔离的场景做了额外的优化,这部分的优化内容并不能方向从centos中找到,属于阿里云的核心资源隔离能力,详细使用细节可以参见各个资源的指导手册。 - - -# 内存资源隔离使用指导 - - -![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_2.png) - - -* 频繁的全局kswapd可能造成在线容器的page cache被频繁回收,造成IO颠簸,影响性能。对应的解决办法详见本文对应的章节:memcg 内存被回收保护水线 -* 目前混部环境中,经常会发生离线在短时间内分配超过20GB的内存,突破主机的min水线,影响宿主机上的所有容器。主要表现为:宿主机load抖动,业务延迟增加等问题。对应的解决办法详见本文对应的章节:memcg 全局最低水位线 -* 当在线容器的内存使用达到上限,再申请使用内存时当前的进程上下文中就会进行直接内存回收的动作,这无疑会影响当前进程的执行效率,引起性能问题。对应的解决办法详见本文对应的章节:容器内存异步回收 -* 当global OOM发生时,在选择那个task被杀的时候,最理想状态是去选择低优的离线容器的进程进行kill。这样能最大程度的保障在线容器的QoS。对应的解决办法详见本文对应的章节:memcg OOM 优先级 -* 我们在反复重建容器或者删除容器以后,由于cgroup中一些引用信息没有清理干净,可能会产生类似僵尸进程一样的僵尸(zombie)memcg。大量的zombie memcgs数目堆积,会产生各种并发症,曾经引发多起严重的线上故障,例如memory.stat访问慢,内存回收遍历大量memcg,长尾调度时延等。对应的解决办法详见本文对应的章节:回收 zombie memcgs -* 当我们想提高low和high水线去控制全局kswapd回收行为的时候,就必须采用一个很大的min水线,这样就会造成很大的内存浪费(因为min水线以下的内存平时用不到)。而low-min之间的差值(即1/4 min)太小,就会很容易触及min水线,进入内存同步回收流程,造成重要业务的RT毛刺,表现为整机load高(由于D状态增多)。对应的解决办法详见本文对应的章节:整机内存水线优化 - - -## 容器内存异步回收 - - -### 需求来源 - - -在原生的内核系统中,当容器的内存使用量达到他的使用上限时,此时再申请使用内存时,在当前的进程上下文中就会进行直接内存回收的动作,这无疑会影响当前进程的执行效率,引起性能问题。那我们是否有方法当容器的内存达到一定水线的时候让其提前进行内存的异步回收,这样就有比较大的概率避免容器内的进程在申请使用内存时由于内存使用达到上限而进入直接内存回收。 - - -我们知道在内核中有一个kswapd的后台内核线程,用来当系统的内存使用量达到一定水位以后来进行异步的内存回收,但是这里有一种情况,比如当前高优的业务容器的内存使用已经达到一个比较高的情况,但是宿主机的总体的空闲内存还有很多,这样内核的kswapd的线程就不会被唤醒进行内存回收,这样这些内存使用压力大的高优容器的内存就没有机会被回收,所以这是个比较大的矛盾,由于目前原生内核中是没有memory cgroup级别的内存异步回收机制,也就是说容器的内存回收严重依赖宿主机层面的kswapd的回收或者只能依靠自己的同步回收,这会严重的影响一些高优容器的业务由于内存回收不及时引入的性能问题。 - - -基于以上背景,操作系统团队开发了一个类似宿主机层面的kswapd的基于memcg的异步回收策略,用于按照用户需求提前进行容器级别的内存回收机制,做到提前内存释压。 - - -### 功能简介 - - -这里我们将介绍基于容器的异步内存回收的过程,这里有两个关键的水位线,如下图所示,memory.limit\_in\_bytes是容器的内存规格,即容器最大能使用的内存量,这不是我们本次的主角。跟容器内存异步回收相关的有两个指标:memory.wmark\_high和memory.wmark\_low。其中high水位线用来指示何时开启容器的内存异步回收线程,换句话说当容器的内存使用量达到high水位线时内核会自动唤醒对应的kworker线程用于针对该容器的内存异步回收。那回收到什么程度会结束此次的异步回收呢,答案是当回收线程回收到memory.wmark\_low水位线时,此时回收线程就会停止回收。 - - -![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_3.png) - - -具体的异步回收过程可以通过下面这幅图进行描述: - - -![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_4.png) - - -### 使用说明 - - - - -| | | -| --- | --- | -| 接口 | 简介 | -| memory.wmark\_ratio | 该接口用于设置是否启用memcg后台异步回收功能,以及设置异步回收功能开始工作的memcg内存水位线。单位是相对于memcg limit的百分之几。取值范围:0~100* 默认值为0,该值也表示禁用memcg后台异步回收功能。 -* 取值为非0时,表示开启memcg后台异步回收功能并设置对应的水位线。 - | -| memory.wmark\_high | 只读接口,说明如下:* 当memcg内存使用超过该接口的值时,后台异步回收功能启动。 -* 该接口的值由**(memory.limit\_in\_bytes \* memory.wmark\_ratio / 100)**计算获得。 -* memcg后台异步回收功能被禁用时,memory.wmark\_high默认为一个极大值,从而达到永不触发后台异步回收功能的目的。 -* memcg根组目录下不存在该接口文件。 - | -| memory.wmark\_low | 只读接口,说明如下:* 当memcg内存使用低于该接口的值时,后台异步回收结束。 -* 该接口的值由**memory.wmark\_high - memory.limit\_in\_bytes \* memory.wmark\_scale\_factor / 10000**计算得出。 -* memcg根组目录下不存在该接口文件。 - | - - -### 注意事项 - - -请注意,这里并不是内存回收的越多越好,比如一下章节将要讲到的,page cache有助于提高业务进程的性能,如果我们把memory.wmark\_high和memory.wmark\_low的水位设置的过低,这样可能会因为page cache被回收的太多而引起业务进程性能抖动的问题。 - - -建议配置值:90%以上,经验值可以配置为95% - - -memory.wmark\_scale\_factor和memory.wmark\_ratio继承规则:创建时,继承父组的值。 - - -需求实现:Alinux2及以上版本。 - - -## memcg 内存被回收保护水线 - - -### 需求来源 - - -我们先从一个简单的案例说起,总所周知,page cache可以提升我们的业务应用的性能,减少IO的直接操作,加速文件的读写速度,page cache它处于内核层,并且由内核直接管理分配,并在系统内存紧张的时候会开始回收page cache释放内存。我们刚有提到page cache可以提升业务的性能,如果当业务对应的page cache被回收以后,下次再次访问对应的业务数据时可能就会引起性能抖动问题,所以当内核开始回收的时候我们该高优回收哪些业务容器的page cache,是否需要为某些容器保留部分的page cache不被回收,这样能保证这些容器的服务质量,其实这也是我们业务的需求,我们如何保障高优业务的服务质量,比如当在离线业务容器混部的时候,如何保障page cache在回收的时候先回收离线容器的,如何保障为高优业务容器保留对应的page cache,使其能有较大概率再次访问到cache数据。所以操作系统团队基于此背景从cgroup v2中backport了关于memcg qos相关特性代码,memcg qos就是用来告知系统在回收page cache的时候如何做到按需回收。 - - -### 功能简介 - - -正常情况下,当出现系统内存紧张的时候,内核会在每个memcg中(业务容器使用的内存)回收内存,默认情况下内核是不区分对待各个容器的内存的,都是按照正常流程进行回收,高优容器的内存和离线容器的内存有同样的概率被回收掉,为了使内核在回收内存时能区分对待:高优的容器少回收内存或者说允许其保留一部分的内存不被回收,尽可能的去回收低优和离线容器的内存。这里我们引入了memcg qos的三个接口用来控制这个动作: - - - - -| | | -| --- | --- | -| 接口 | 简介 | -| memory.high | 当 memory cgroup 内进程的内存使用量超过了该值后就会立即触发memcg reclaim进行直接的内存回收。 | -| memory.low | 当容器内进程的内存使用量在这个水线以下时,内核会 Best-effort memory protection,也就是说在内核进行内存回收的时候就会先去回收不属于该 memory cgroup 的 Page Cache,等到其他容器的 Page Cache 被回收掉后如果回收的内存还不够,再来回收这些 Page Cache。 | -| memory.min | 当容器内进程的内存使用量低于该值时,在系统进行内存回收的时候即使其他容器内的 Page Cache 都被回收完了也不会去回收这些 Page Cache,你可以理解为这个水线下的内存是禁止被回收的。 | - - -  - - -我们这边通过下面这幅图来举例说明这个过程: - - -![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_5.png) - - -我们假设整个系统只有3个业务容器,每个业务容器按照容器的高优程度,分别去设置cgroup下的min、low、high三个值,比如设置的值为上图所示,高优的容器的memory.min和low的水线设置的比其他两个容器的高,而将离线容器的min和low水线直接设置为0。这样当系统的内存紧张的时候发起内存回收时,内核会按照正常逻辑去回收那些内存使用量达到灰色部分的容器,即那些内存使用超过memory.low水线的容器,然后才会去回收那些内存使用量达到绿色部分的容器,然后那些内存使用量只有红色部分的容器是不会进行内存回收。这样我们就做到了先回收离线容器的内存(他的min和low的水线值为0),高优容器由于设置了min和low的水位线,如果内存使用量没有超过对应的水线,这部分内存是最后被回收或禁止回收,这就是我们想要的效果,也即"需求来源"的章节中描述的期望达成的状态。 - - -### 使用说明 - - -这边只需要按需配置memory.high、memory.low、memory.min三个值就行。其中memory.high这个只需要使用默认的值就行。 - - -如果是离线容器,或者说是非常低优的容器,我们这边可以直接将min和low这两个水线设置为0,如果是高优的业务容器,这边建议将min的值设置为15%\*memory.limit\_in\_bytes,low的值设置为30%\*memory.limit\_in\_bytes。 - - -### 注意事项 - - -1. memory.min的值不建议设置的太高,如果设置的太高,并且host上有很多类似的高优容器,这样内核在进行内存回收的时候,可能会因为太多禁止被回收的内存而导致回收不到足够的内存而间接的引发OOM. -2. 如果有内存超卖场景,并且超卖的内存比较多,并且高优的容器在host会部署的比较多,我们此时将高优容器的memory.min值尽量设置的偏小一点,因为这部分内存在整机内存回收的时候是不允许被回收的,如果超卖严重,并且host上过多的高优容器,导致最终很多内存都无法被回收,这样会引起OOM。 -3. 继承规则:默认值为0,不继承。 -4. 需求实现:Alinux2及以上版本。 - - -## memcg 全局最低水位线 - - -### 需求背景 - - -通常资源消耗型的离线任务可能会时常瞬间申请大量的内存,使得系统的空闲内存触及全局min水线,引发系统所有任务进入直接内存回收的慢速流程,时延敏感型的在线业务很容易发生性能抖动。此场景下,无论是全局kswapd后台回收还是memcg级别的后台回收机制,都是无能为力的。 - - -我们基于"内存消耗型的离线任务通常对时延不敏感"这样一个事实,设计了"memcg的全局min水线分级功能"来解决上述抖动难题。在标准upstream全局共享min水线的基础上,将离线任务的全局min水线上移让其提前进入直接内存回收,同时将时延敏感的在线任务的全局min水线下移,在一定程度上实现了离线任务和在线任务的min水线隔离。这样当离线任务瞬间大量内存申请的时候,会将离线任务抑制在其上移的min水线,避免了在线任务发生直接内存回收,随后当全局kswapd回收一定量的内存后,离线任务的短时间抑制得以解除。 - - -### 功能简介 - - -我们的核心思想就是通过为在离线容器设置不同标准的全局水位线来控制在离线容器申请内存的动作,这样能让离线容器的任务在申请内存时先与在线业务进入直接内存回收,用于解决离线容器瞬间申请大量内存引发的问题,如下图所示,在A的情况下,由于系统剩余的内存比较充裕,远大于BE wmark min的水位线,这种情况下,不管是在线还是离线容器的进程都不会进入内存直接回收的路径,属于快速内存分配的蜜月期,此时在离线容器的任务都能快速申请到内存。在B中情况下,此时可以假设由于离线容器瞬间申请了大量内存,导致系统的可用内存下降到了BE wmark min的水线,接下去离线任务继续申请和使用内存时就会进入direct reclaim路径并且被限速,但是此时在线容器的进程还是可以快速的申请到内存,这样就保障了我们在线容器业务的服务质量。如果此时系统内存继续下降,到了C情况,此时系统内存下降到了LS wmark min的水线,这个时候在线容器的进程才会进入direct reclaim进行直接内存回收,此时在线容器的服务质量才会受到影响。很明显,这种多标准的水位线可以为我们解决"需求背景"中描述的问题,防止离线容器由于瞬间申请大量内存而把系统内存耗尽而影响在线业务。 - - -![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_6.png) - - -  - - -对linux内存管理有一定基础的同学也可以查阅下面这幅图,他详细的记录了在离线容器混部过程中在多种水位线的作用下的一个走势图: - - -![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_7.png) - - -### 使用说明 - - -这里主要通过配置memory.wmark\_min\_adj这个接口来控制容器的全局水位线。 - - -该接口的含义为基于全局min水线所作出的调整(adj意思是adjustment)百分比,范围为[-25, 50],默认值为0。root group不存在该文件。具体地,正值代表了调整范围[0, WMARK\_MIN],负值代表了调整范围[WMARK\_MIN, WMARK\_LOW];其中WMARK\_MIN和WMARK\_LOW分别代表了全局min水线和low水线的值)。 - - -例如: - - - -``` --25 means memcg WMARK_MIN is "WMARK_MIN + (WMARK_MIN - 0) * (-25%)" - 50 means memcg WMARK_MIN is "WMARK_MIN + (WMARK_LOW - WMARK_MIN) * 50%" -``` - -负值代表min水线下移,代表的是对内存QoS要求高的memcg组(例如在线业务)。 - - -正值代表min水线上移,代表的是对内存QoS要求低的memcg组(例如离线业务),当其上移的min水线被触及后,会做throttle操作,throttle的时间与所消耗的低于其min水线之下的内存总量成线性比例关系,throttle的时间取值范围为[1ms, 1000ms]。 - - -### 注意事项 - - -负值代表min水线下移,代表的是对内存QoS要求高的memcg组(例如在线业务) - - -正值代表min水线上移,代表的是对内存QoS要求低的memcg组(例如离线业务) - - -memory.wmark\_min\_adj继承规则:创建时,继承父组的值。 - - -需求实现:Alinux2及以上版本。 - - -## 整机内存水线优化 - - -### 需求来源 - - -全局分配和回收采用的三个内存水线:min, low, high。大体上,当空闲内存低于low时会触发全局kswapd异步回收内存,当空闲内存大于high水位时停止回收。当空闲内存低于min时会触发direct reclaim。之前的内核采用” /proc/sys/vm/min\_free\_kbytes”(建议配置为系统总内存的1.5%左右)来控制这3个水位,计算公式如下: - - -low = min + 1/4 min - - -high = low + 1/4 min - - -上述只是简单地使用一个固定的比例划分这3个水线,这样会有一个严重的问题,当我们想提高low和high水线去控制全局kswapd回收行为的时候,就必须采用一个很大的min水线,这样就会造成很大的内存浪费(因为min水线以下的内存平时用不到)。而low-min之间的差值(即1/4 min)太小,就会很容易触及min水线,进入内存同步回收流程,造成重要业务的RT毛刺,表现为整机load高(由于D状态增多)。 - - -整机内存水线优化就是可以保证一个相对较小的min水线就可以得到一个大的low和high水线值,经测试在混部环境中的效果非常好,具体优如下: - - -引入一个额外的配置” /proc/sys/vm/watermark\_scale\_factor”(建议配置值300),表示采用整机总内存大小的一个比例值来放大low-min以及low-high之间的水线差,为异步kswapd赢得宝贵的时间,这样在空闲内存触及min水线之前,全局kswapd可以有相对较多的时间去做异步回收。 - - -### 功能简介 - - -通过如下图所示,在通过watermark\_scale\_factor来增加min和low之间的gap以后,当内存的水线下降到low以后,内核会提前进入kswapd进行后台内存回收,这样可以在内存下降到min之前为kswapd争取到足够的时间进行内存异步回收,降低系统进入direct reclaim的概率。 - - -![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_8.png) - - -### 使用说明 - - -通过按需配置/proc/sys/vm/watermark\_scale\_factor即可,使用比较简单。 - - -### 注意事项 - - -该配置是针对host的,并不是针对个别容器,也就是说在容器创建的时候无需配置该接口,如有需要可以在整机维度进行配置。 - - -需求实现:Alinux2及以上版本。 - - -## memcg OOM 优先级 - - -### 需求来源 - - -OOM分为两种: memcg OOM和global OOM。无论哪种OOM,在选择杀进程的时候,内核会有一个算法去选择victim,但通常是找一个oom score最大的进程杀。在真实的业务场景中,特别是内存超卖环境,当发生global OOM的时候,有理由去选择杀掉那些优先级比较低的离线业务,而保护高优先级在线业务;当发生离线memcg OOM的时候,有理由去选择杀掉那些优先级比较低的作业,而保高优先级离线作业。这就是"memcg OOM优先级"所解决的场景,目前的标准Linux内核并不具备这个能力。 - - -### 功能简介 - - -本组设置memory.use\_priority\_oom后,当本组发生OOM时,就会对其下的所有子组进行OOM优先级遍历。memory.oom.group被设置时,会杀掉其下(包括其子组)的所有可杀任务(设置-1000的oom\_score\_adj不会被杀)。 - - -例如,如下层级结构,使能了memory.use\_priority\_oom -                      root - - -                     /     \ - - -                   A        B - - -                 /   \     /   \ - - -               C     D   E     F - - -  - - -    memory.priority: - - -       A: 10, B: 8 - - -       C: 5, D: 6, E: 7, F: 8 - - -  - - -当发生global OOM时,从根组(root)开始按每个层级数据最小的原则遍历路径root->B->E,最终E被选出来作为被杀对象。 - - -### 使用说明 - - - - -| | | -| --- | --- | -| 接口 | 简介 | -| memory.use\_priority\_oom | 功能开关,默认为0表示不使能本功能;写1表示使能本功能。 -设置/sys/fs/cgroup/memory/memory.use\_priority\_oom会使能global OOM按优先级进行查杀。 | -| memory.priority | 设定memcg的OOM优先级,默认值为0, 允许的范围[0, 12],数值越大,优先级越高。优先级的生效范围为同级memcg之间。当发生OOM时,会顺着memcg的层次自上而下选择一个优先级数值最低的组杀,相同优先级的组则按照先后顺序。 | -| memory.oom.group | 通常,一个作业组是一个整体,其中的某个进程被杀会影响全局的业务工作,因此最好是按组杀。此接口可以实现按整个memcg组进行整体杀的功能。默认值为0,表示禁用整组杀;写1开启整组杀。 | - - -### 注意事项 - - -memory.use\_priority\_oom、memory.priority、memory.oom.group继承规则:不继承,默认值0。 - - -使用过程中主要风险来自存量的memcg和新创建的memcg由于优先级不匹配,可能出现误杀的情况。所以如果存在容器漂移或者容器新建的场景,需要评估当前已有容器的OOM 优先级以及新容器优先级。 - - -需求实现:Alinux2及以上版本。 - - -## 回收 zombie memcgs - - -### 需求来源 - - -当删除cgroup的目录后虽然用户态已经看不到它,但在内核中代表cgroup的结构体会一直存在直到所有对它的引用被释放。只要它依然存在,就会消耗相应的资源。只有当被删除的memory cgroup中的页都被回收掉,相应的引用都被释放,该memory cgroup才会彻底被删除,这可能会需要很长的时间,如果当中的一些页被活跃的使用,这些页可能永远不会被回收掉。另外,还有其他各种各样的问题,同样会导致删除的cgroup继续留在系统中。僵尸cgroup虽然不会导致严重的后果,但依然是个问题。每个僵尸cgroup都会占用200KB的内存,随着僵尸cgroup的增加相应的内存消耗也会增加。同时这些僵尸cgroup会增加遍历cgroup树的开销。曾经引发多起严重的线上故障,例如memory.stat访问慢,内存回收遍历大量memcg,长尾调度时延等。 - - -为了解决zombie memcgs数目并发症,Ali4000已经默认关闭了kmem,同时提供异步、同步接口用以清理残留的离线 memcg,这就是我们引入了memcg后台定制回收功能"zombie memcgs reaper"的原因。 - - -### 使用说明 - - -具体的memcg接口在/sys/kernel/mm/memcg\_reaper/中:reap, reap\_background, scan\_interval, pages\_scan, verbose - - - - -| | | -| --- | --- | -| 接口 | 简介 | -| reap | "One-shot trigger"模式,只回收一次,类似于/proc/sys/vm/drop\_caches接口,由用户主动单次触发。 -写1表示启动一次回收尝试,但并不保证回收完,需要用户自行决策是否进行多次写。 | -| reap\_background | "Background kthread reaper"模式,会在后台自动进行周期性回收,永久运行。推荐使用此模式。 -默认值为0,表示禁用此功能。设置1开启。 | -| scan\_interval | "Background kthread reaper"模式下,用于控制周期性回收的间隔,默认为5秒。 | -| pages\_scan | "Background kthread reaper"模式下,用于控制每个周期内回收的页面数,默认值为1310720(5GiB for 4KiB page)。scan\_interval和pages\_scan用于防止回收过猛,导致的IO压力。 | -| verbose | 调试开关,默认为0,表示关闭; 写1表示开启一些debug打印。 | - - -### 注意事项 - - -* 这个特性的前提是内核不开启memcg kmem的特性。可以通过修改cmdline的参数进行关闭该特性。 -* 可能会有一定的sys cpu损耗。 -* 别把回收周期和回收页面数设置的太激进,可能会导致io压力。 - - -# cpu资源隔离使用指导 - - -这里主要介绍:弹性cpu带宽控制技术,group identity,SMT expeller技术,llc技术。由于cpu share和cpuset为通用的内核资源隔离技术,这里不做使用说明介绍,有兴趣的同学可以参考网上相关资料。 - - -![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_9.png) - - -## CPU Burst-弹性CPU带宽控制技术 - - -### 需求来源 - - -我们的服务宗旨是让客户花最少的钱获得最好的服务质量,或者让单个容器在保证业务服务质量的同时尽量提高容器的cpu使用率,让用户在有限的资源下运行更多的任务,等于降低了用户的使用成本,但是在现实的场景中,在业务的视角可能会出现容器的cpu平均使用率并不高,但是业务的容器却时不时的会出现短时间内的throttle现象,由于容器被限流最终导致业务延迟等问题。比如如下图所示: - - -![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_10.png) - - -从图中可以看到在一个4核cpu规格的容器上,从一秒的时间周期去看容器的cpu使用率只有百分之60左右,远没有达到容器的使用规格,在业务方看来,他们买的4核规格的cpu服务,实际并没有真正使用4核,但是你们却把我限流了,这是不合理的,为了解决这个问题,目前业务的同学常用的只有如下两个选择: - - -* 提高容器的cpu规格,比如此处将cpu的规格提高到5核(设置cpu.cfs\_quota\_us为500000),但是这样势必会让业务方花费更多的金钱来购买cpu的资源,增加了业务方的使用成本,并不是最理想的方案。 -* 在保持容器规格不变的情况下,同比例提高period和quota的值,使周期内的quota变大,但是由于周期也同比例变大,这样可能会引入新的问题,一旦出现限流(throttle),需要等待下次被unthrottle的周期(period)变长,导致业务出现更大的延迟,很明显这也不是一个最好的办法。 - - -  - - -很明显以上两个解决方案都不是很好的改善业务同学的感受,关于业务同学的困扰我们能够理解,但是我们换一个视角去看这个问题,从100毫秒的时间跨度去看,在这100毫秒周期内,由于业务的突发处理,导致短时间内的cpu被打爆,超出容器规格,导致被限流,这从底层的技术人员的角度去看又是合理的。 - - -所以我们的需求就来自以上这些矛盾点,在保证业务容器不因突发的业务处理(burst)而被throttle,又能尽量提高容器的cpu使用率,让业务方感觉到“物超所值”。 - - -### 功能简介 - - -本feature的核心思想就是在本周期内没有用完的时间可以把这部分没用的runtime放到下一周期,这样有助于降低由于burst业务的突发运行带来的throttle的风险。 - - -这边通过场景演示来说明一下这个原理: - - -![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_11.png) - - -### 使用说明 - - -* 如果要使用此功能,首先要确保以下配置是否打开,默认是打开状态。 - - - -``` -[root@AliYun assist]# cat /proc/sys/kernel/sched_cfs_bw_burst_enabled -1 -``` - -* 需要在对应的group目录配置cpu.cfs\_burst\_us,这个值的意思是在period周期内最大允许burst的时间,默认情况下为0,即不开启此功能,此值的配置范围为[0, quota]。 -* 我们还可以通过查看cpu.stat的状态接口来查看当前group有没有出现过burst,如下打印信息中nr\_burst即为出现burst的总次数,burst\_time即为总共burst的时间,这里最好配合nr\_throttled(总的throttle次数)和throttled\_time(总的throttle的时间)。因为burst不一定会引发throttle,这也是我们想要达到的预期效果,如果有throttle的次数增加,可能是我们的cpu.cfs\_burst\_us值配置的不够大。如果burst\_time一直在累加,但是throttle并没有在累加,这说明我们的功能起到了很好的作用。 - - - -``` -[root@AliYun assist]# cat cpu.stat -nr_periods 114816 -nr_throttled 9 -throttled_time 512420200 -current_bw 5000000 -nr_burst 0 -burst_time 0 -``` - -### 注意事项 - - -* 当负载的平均CPU使用低于limit时不产生限流,满足细粒度的突发需求。但是不能在CPU资源不足的情况下使CPU更快运行。他解决的是burst的需求,并不是无中生有。 -* 我们可以通过cpu.stat的接口来获取本特性的收益值,可以观察burst\_time的值的大小,即是burst的总时间,原本这些时间是业务容器的throttle的时间。 -* burst值配置的越大,能带来的风险也越大,换句话说可能短时间内容器使用的cpu更多,可能会对其他容器产生cpu竞争压力。 - - -## Group Identity - - -### 需求来源 - - -为了满足业务方在资源隔离上的需求,在满足资源利用最大化的情况下,保证高优业务的服务质量不受影响,或将影响范围控制在一定范围,此时内核调度器需要赋予高优先级的任务更多的调度机会来最小化其调度延迟,并把低优先级任务对其带来的影响降到最低。 - - -为了满足以上需求,我们引入了Group Identity的概念,即每个cpu cgroup会有一个身份识别,按优先级由高到低排序依次为: - - -* ID\_HIGHCLASS:在线任务,对延迟敏感,可以抢占离线任务,但不能抢占其它的在线任务和普通系统任务; -* ID\_NORMAL:普通系统任务,如 sshd, systemd, init 等, 这是任务的默认分类; -* ID\_UNDERCLASS:离线任务,对延迟不敏感; - - -### 功能简介 - - -在被赋予不同的group identity时,底层内核会根据优先级的高低,可以最大程度降低由于离线业务引入的在线业务调度不及时的问题,增加高优先业务的cpu抢占时机等底层核心技术保障在线业务在cpu调度延迟上不受离线业务的影响。这些优先级的作用范围遵从cpu cgroup的资源管理概念,即相对于同一层的任务生效,对上不生效,对下生效,和同优先级任务之间的竞争基本服从CFS规则,但ID\_UNDERCLASS身份的任务没有最小保底运行时间的保障。具体如下: - - -* ID\_HIGHCLASS - - -高优先级的CFS任务,对低于其优先级的任务有更多的抢占机会。次高优先级CFS任务在调度时会有以下行为变化: - - -1. 被唤醒时,如果当前运行的是低优先级任务,可无条件进行抢占 -2. 被唤醒时,如果当前运行的是普通任务且自身的vruntime超前于它,可无视唤醒保底运行时间进行抢占 -3. 排队运行时,如果当前运行的是普通或者低优先级任务,且自身的vruntime超前于它,可无视保底运行时间进行抢占 - - -* ID\_NORMAL - - -普通的CFS任务,对低于其优先级的任务有更多的抢占机会,普通CFS任务在调度时会有以下行为变化: - - -1. 被唤醒时,如果当前运行的是低优先级任务,可无条件进行抢占 -2. 排队运行时,如果当前运行的是低优先级任务,且自身的vruntime超前于它,可无视保底运行时间进行抢占 - - -* ID\_UNDERCLASS - - -低优先级的CFS任务,次低优先级CFS任务在调度时会有以下行为变化: - - -1. 被唤醒时,vruntime会有默认1ms的惩罚时间,可通过sysctl\_sched\_bvt\_place\_epsilon进行配置 -2. 如果远端SMT上运行了SMT驱逐者任务,则无法被调度上CPU,等同于被踢出运行队列 - - -### 使用说明 - - -"Group Identity"通过CPU CGroup v1接口"cpu.bvt\_warp\_ns"配置: - - - - -| | | | -| --- | --- | --- | -| 值 | 含义 | 说明 | -| 0 | 该cgroup中任务为普通系统任务 | 默认优先级 | -| -1 | 该cgroup中的任务为低优先级任务 | 优先级最低 | -| 1 | 该cgroup中的任务为高优先级任务 | 优先级高 | -| 2 | 该cgroup中的任务为在线任务, 并具有SMT驱逐能力(见下文) | 优先级最高 | - - -#### 调度特性开关配置接口 - - -运行以下命令,您可以通过**sched\_features**接口查看到内核调度特性的默认配置。 - - -**cat** /sys/kernel/debug/sched\_features - - -具体说明如下: - - - - -| | | | -| --- | --- | --- | -| **调度特性** | **说明** | **默认值** | -| **ID\_IDLE\_AVG** | 该特性与**ID\_IDLE\_SAVER**身份标识配合,把**ID\_UNDERCLASS**任务的运行时间计入空闲时长,防止只有**ID\_UNDERCLASS**任务运行时仍保留空闲CPU(Idle CPU)的问题,避免资源浪费。 | **ID\_IDLE\_AVG**:表示特性为启用状态。 | -| **ID\_RESCUE\_EXPELLEE** | 该特性作用于负载均衡场景,如果任务无法找到可用的CPU资源,则正在进行驱逐**ID\_UNDERCLASS**任务的CPU会成为负载均衡的目标。用于帮助**ID\_UNDERCLASS**任务尽快摆脱被驱逐的状态。 | **ID\_RESCUE\_EXPELLEE**:表示特性为启用状态。 | -| **ID\_EXPELLEE\_NEVER\_HOT** | 该特性被启用后,正在被驱逐的任务在判断是否需要迁移至其他CPU时,不会因为热缓存的原因而造成拒绝迁移。用于帮助**ID\_UNDERCLASS**任务尽快摆脱被驱逐的状态。 | **NO\_ID\_EXPELLEE\_NEVER\_HOT**:表示特性为关闭状态。 | -| **ID\_LOOSE\_EXPEL** | 该特性被启用后,CPU不会在每次选择任务时更新驱逐状态,而是根据内核参数**sched\_expel\_update\_interval**设置的时间自动更新。该特性的开关仅影响CPU选择任务时的状态更新,不影响处理IPI中断的更新。 | **NO\_ID\_LOOSE\_EXPEL**:表示特性为关闭状态。 | -| **ID\_LAST\_HIGHCLASS\_STAY** | 该特性被启用后,CPU上最后一个运行的**ID\_HIGHCLASS**任务不会被迁移至其他CPU上。 | **ID\_LAST\_HIGHCLASS\_STAY**:表示特性为启用状态。 | -| **ID\_EXPELLER\_SHARE\_CORE** | 该特性开启时允许**ID\_SMT\_EXPELLER**的任务优先选择已经有**ID\_SMT\_EXPELLER**任务的物理核,该特性关闭时则不允许。 -该特性关闭时可以尽可能的把**ID\_SMT\_EXPELLER**的任务分散到各个物理核上,从而避免**ID\_SMT\_EXPELLER**任务之间的相互干扰。 | **ID\_EXPELLER\_SHARE\_CORE**:表示特性为启用状态。 | - - -#### 用于sysctl配置内核参数的接口 - - -Group Identity的部分功能的实现需要以内核参数的取值作为参考。相关内核参数的具体说明如下表: - - - - -| | | | | -| --- | --- | --- | --- | -| **内核参数** | **说明** | **单位** | **默认值** | -| **/proc/sys/kernel/sched\_expel\_update\_interval** | CPU在选择任务时,驱逐状态的自动更新时间间隔。仅在**ID\_LOOSE\_EXPEL**特性开启时生效。 | ms | 10 | -| **/proc/sys/kernel/sched\_expel\_idle\_balance\_delay** | CPU在驱逐状态下,**idle balance**的最小时间间隔。取值为-1时表示不允许进行**idle balance**。 -当CPU上均为**ID\_UNDERCLASS**任务且任务在被驱逐时,CPU的状态可以理解为空闲状态,在该状态下CPU会进行**idle balance**以提高负载均衡的效果,但会对**ID\_UNDERCLASS**任务造成损伤。通过设置**sched\_expel\_idle\_balance\_delay**参数可以缓解该问题。 | ms | -1 | -| **/proc/sys/kernel/sched\_idle\_saver\_wmark** | 设置CPU空闲时间的水位线。当**ID\_IDLE\_SAVER**任务被唤醒时,只会尝试找到高于该水位线的空闲CPU,不会尝试找到低于该水位线的空闲CPU。 | ns | 0 | - - -#### 信息输出说明 - - -在使用Group Identity功能期间,您可以运行以下命令,查看多维度的参数信息。 - - -**cat** /proc/sched\_debug - - -输出的参数说明如下: - - - - -| | | -| --- | --- | -| **参数** | **说明** | -| **nr\_high\_running** | 当前CPU上运行的**ID\_HIGHCLASS**任务数量。 | -| **nr\_under\_running** | 当前CPU上运行的**ID\_UNDERCLASS**任务数量。 | -| **nr\_expel\_immune** | 当前CPU上运行的非**ID\_UNDERCLASS**任务数量。 | -| **smt\_expeller** | 当前CPU是否有**ID\_SMT\_EXPELLER**任务在运行。参数值为1表示有;参数值为0表示无。 | -| **on\_expel** | 当前CPU的SMT对端是否有**ID\_SMT\_EXPELLER**任务在运行。参数值为1表示有;参数值为0表示无。 | -| **high\_exec\_sum** | 当前CPU上**ID\_HIGHCLASS**任务的累计运行时间。 | -| **under\_exec\_sum** | 当前CPU上**ID\_UNDERCLASS**任务的累计运行时间。 | -| **h\_nr\_expel\_immune** | 当前**cfs\_rq**上运行的非**ID\_UNDERCLASS**任务数量。 | -| **expel\_start** | CPU在驱逐任务的开始阶段,两个红黑树结构的最小虚拟运行时间的差距。 | -| **expel\_spread** | 由于CPU驱逐状态造成的两个红黑树结构最小虚拟运行时间的累计差距。 | -| **min\_under\_vruntime** | 低优先级红黑树结构的最小虚拟运行时间。 | - - -  - - -### 注意事项 - - -* 低优先级父组下的高优先级子组仍为低优先级,会被SMT驱逐者驱逐,不建议线上使用此种组合的配置。 -* 高优先级强调的是低延迟,而非高吞吐量,两者一般情况下是相互矛盾的,低延迟并不意味着高性能。 - - -## SMT expeller - - -### 需求来源 - - -超线程技术在一个物理核上模拟两个逻辑核,两个逻辑核具有各自独立的寄存器(eax、ebx、ecx、msr等等)和APIC,但会共享使用物理核的执行资源,包括执行引擎、L1/L2缓存、TLB和系统总线等等。这就意味着,如果一对HT的一个核上跑了在线任务,与此同时它对应的HT核上跑了一个离线任务,那么它们之间是会发生竞争的。为了尽可能减轻这种竞争的影响,我们想要让一个核上的在线任务执行的时候,它对应的HT上不再运行离线任务;或者当一个核上有离线任务运行的时候,而在线任务调度到了其对应的HT上时,离线任务会被驱赶走。这就是我们保证HT资源不被争抢的机制。 - - -### 功能简介 - - -当一个核上的在线任务执行的时候,它对应的HT上不再运行离线任务;或者当一个核上有离线任务运行的时候,而在线任务调度到了其对应的HT上时,离线任务会被驱赶走。这就是我们保证HT资源不被争抢的机制。 - - -### 使用说明 - - -"Group Identity"通过CPU CGroup v1接口"cpu.bvt\_warp\_ns"配置: - - - - -| | | | -| --- | --- | --- | -| 值 | 含义 | 说明 | -| 0 | 该cgroup中任务为普通系统任务 | 默认优先级 | -| -1 | 该cgroup中的任务为低优先级任务 | 优先级最低 | -| 1 | 该cgroup中的任务为高优先级任务 | 优先级高 | -| 2 | 该cgroup中的任务为在线任务, 并具有SMT驱逐能力(见下文) | 优先级最高 | - - -### 注意事项 - - -请参考group identity方案中的注意事项章节。 - - -# IO资源隔离使用指导 - - -![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_12.png) - - -## cgroup writeback throttle - - -### 需求来源 - - -block IO cgroup自合入内核之后,一直存在一个问题:只能对direct IO进行限流(buffer IO之后短期内执行fsync也可以限流),因为这些IO到达block throttle层时,当前进程就是真正发起IO的进程,根据进程可以获取到相应的cgroup从而正确记账,如果超过了用户设置的带宽/IOPS上限,则进行限制。对于那些buffer写,且最终由kworker线程下发的IO,block throttle层无法通过当前进程获取IO所属的cgroup,也就无法对这些IO进行限流。 - - -基于以上背景,目前在Cgroup V2版本中已经支持异步IO限流,但是在Cgroup V1中并不支持,由于目前在云原生环境下主要还是使用Cgroup V1版本,阿里云内核团队通过建立page<->memcg<->blkcg这三者的关系实现了在Cgroup V1中对IO异步限流的功能,限流的主要算法基本上和Cgroup V2保持一致。 - - -### 功能简介 - - -在Cgroup V1中实现了和Cgroup V2一样的IO异步限速的功能,可以解决由于IO在writeback过程中无法精准的进行IO限速的问题,可以在混部场景中对离线业务的IO进行限速,防止由于离线业务对IO的过度使用而影响在线业务。一旦配置限速writeback功能以后,不但可以限制异步IO,同时也可以限制direct IO。 - - -cgroup writeback功能需要memcg和blkcg协同工作,完成Buffered I/O的限速,但是内核接口cgroup v1的各个控制子系统间默认不协同工作。因此需要通过一定的规则把memcg和blkcg连接起来,规则为:通过任意一个memcg必须可以找到与之唯一对应的blkcg。即memcg和blkcg的映射关系可以是一对一或多对一,不可以是一对多或多对多。 - - -例如,存在进程A和B,对它们进行Buffered I/O限速,需要遵循以下约束: - - -* 如果A和B分属不同的memcg,它们可以映射到不同的blkcg,只需各自一一对应。例如:A属于memcg1,blkcg1;B属于memcg2,blkcg0。 -* 如果A和B分属不同的memcg,它们也可以映射到同一个blkcg。例如:A属于memcg1,B属于memcg2,A和B都属于blkcg2。 -* 如果A和B属于相同的memcg,那么它们只能映射到同一个blkcg。例如:A和B均属于memcg0,它们同时属于blkcg3。 - - -### 使用说明 - - -可以参考: - - -#### 第一步:确定当前内核是否支持writeback throttle的功能 - - -首先确认系统是否支持cgroup writeback的功能,通过读取内核文件/proc/cmdline,如果内核命令行参数中带有cgwb\_v1字段则不需要做以下三个步骤,否则需要进行如下三个步骤进行功能的开启: - - -* 通过命令grubby内添加cgwb\_v1字段开启该功能。本示例中内核版本为 4.19.36-12.al7.x86\_64,您在操作中需要更换为实际的内核版本,内核版本的查看命令为 uname -a: - - - -``` -grubby --update-kernel="/boot/vmlinuz-4.19.36-12.al7.x86_64" --args="cgwb_v1" -``` - -* 重启系统使功能生效 - - - -``` -reboot -``` - -* 使用以下命令读取内核文件/proc/cmdline,确认内核命令行参数中带有cgwb\_v1字段。此时,blkcg下的blkio.throttle.write\_bps\_device及blkio.throttle.write\_iops\_device接口能够对Buffered I/O进行限速。 - - - -``` -cat /proc/cmdline | grep cgwb_v1 -``` - -#### 第二步:建立blkcg和memcg映射关系 - - -这里我通过创建1个memcg的cgroup和1个blkcg的cgroup目录,通过建立两者之间的关系来说明使用方法: - - - -``` -#分别建立blkcg和memcg目录。 -sudo mkdir /sys/fs/cgroup/blkio/blkcg1 -sudo mkdir /sys/fs/cgroup/memory/memcg1 -#通过将业务进程PID attach到blkcg和memcg容器中,使blkcg和memcg因为attach了相同的pid而产生关联 -sudo bash -c "echo $$ > /sys/fs/cgroup/blkio/blkcg1/cgroup.procs" # $$为您的进程ID -sudo bash -c "echo $$ > /sys/fs/cgroup/memory/memcg1/cgroup.procs" # $$为您的进程ID -``` - -注意:实际的使用场景中可能需要通过runc或rund将对应业务同时attach到memcg和blkcg中去。 - - -#### 第三步:设置限流值 - - -通过lsblk命令可以获取对应磁盘的MAJ和MIN号,在限流中需要使用它们: - - - -``` -[root@iZbp14ah12fefuzd6rh5rkZ ~]# lsblk -NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT -vdb 253:16 0 100G 0 disk -vdc 253:32 0 100G 0 disk -vda 253:0 0 40G 0 disk -└─vda1 253:1 0 40G 0 part / -``` - -使用blkcg下的blkio.throttle.write\_bps\_device接口对Buffered I/O进行限速,这里当您的进程在写vdb盘的时候会被限流为10M: - - - -``` -# 通过设备号配置磁盘的回写限流bps为10 M -sudo bash -c "echo 253:16 10485760 > /sys/fs/cgroup/blkio/blkcg1/blkio.throttle.write_bps_device" -``` - -### 注意事项 - - -* 需要进行writeback限制的进程需要同时attach到memcg和blkcg,如果不attach,则记账到根组; -* 同一个memcg里的进程,不能属于不同的blkcg。如下图中css\_set1中的进程都被attach到memcg\_1和blkcg\_1,这些进程生成的脏页对应的回刷IO会被记账到blkcg\_1,memcg\_1和blkcg\_1属于一对一的关系;同理,css\_set2/css\_set3/css\_set4里的进程都分别被attach到memcg\_2/ memcg\_3/memcg\_4和blkcg\_2,这些进程生成的脏页对应的回刷IO被记账到blkcg\_2,memcg\_2/ memcg\_3/memcg\_4和blkcg\_2为多对一的关系,这些都是允许的。如果在此基础上,又来一组进程css\_set5,他们被attach到memcg\_4和blkcg\_1上,出现了memcg与blkcg一对多的关系,这就是不允许的,后续css\_set4和css\_set5里进程生成的脏页对应的回刷IO会被记账到根组。 -* 为了避免出现意外情况,建议您在启用cgroup writeback功能后,对进程进行Buffered I/O限速前,优先设置blkcg的cgroup.procs接口,向该接口写入一个进程ID来保证blkcg映射的唯一性。 -* 在实际运维中,可能出现进程移动到其它cgroup的情况。根据上述规则,如果进程在memcg之间移动,不会出现问题,但如果进程在blkcg之间移动,将会出现异常情况。为了避免产生异常,该功能的代码中定义了规则:一旦工作中的blkcg内的进程发生blkcg间的移动,则将映射关系直接指向root blkcg。由于一般情况是不在root blkcg设置限流阈值,所以当映射关系直接指向root blkcg时,限速功能会失效。 -* 如果是云盘,需要将rotation的参数置1 -* ![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_13.png) - - -## blk-iocost - - -### 需求来源 - - -正常情况下,为了避免一个IO饥饿型作业轻易耗尽整个系统IO资源,我们会设置每个cgroup的IO带宽上限,其最大缺点是即使设备空闲,配置上限的cgroup在其已发送IO超过上限时不能继续发送IO,引起存储资源浪费。 - - -基于以上需求,出现了一种IO控制器-IOCOST,该控制器是基于blkcg的权重来分配磁盘的资源,可以做到在满足业务IO QOS的前提下,尽最大程度利用磁盘的IO资源,一旦出现磁盘IO能力达到上限导致触及QOS设置的目标时,此时iocost控制器会通过权重来控制各个group的io使用,在此基础上,blk-iocost又拥有一定的自适应能力,尽可能的避免磁盘能力被浪费。 - - -### 功能简介 - - -由Tejun Heo开发的iocost控制器是基于权重比例来分配磁盘能力,每个cgroup根据设置的权重来获取磁盘时间,从而获得相应的带宽。在此基础上,blk-iocost又拥有一定的自适应能力,尽可能的避免磁盘能力被浪费。 - - -IO控制器如何根据权重分配每个cgroup所能使用的磁盘能力不太容易,这是由于不同类型IO请求实际所占用磁盘处理资源是不一样的,简单统计每cgroup的iops或者带宽是不充分的,因此io.weight控制器提出一个IO请求成本计算模型(cost model),该模型计算每个IO请求预计会占用的设备时间(device time),大体计算逻辑为:首先基于该IO请求是顺序还是随机,会赋值一个初始预计消耗设备时间,然后根据该请求的大小,以page为单位,计算出一个设备时间(IO请求越大,则相应的设备时间越大),然后将初始设备时间和根据请求大小算出的设备时间相加,就得到一个IO请求预计将消耗的总设备时间。控制器已经内置若干默认IO成本计算参数,但系统管理员也可以通过配置root cgroup中的io.weight.cost\_model来修改特定设备对应的IO成本计算参数,需要配置的参数有设备最大吞吐量,rand iops, sequential iops。 - - -当一个cgroup不发送请求时,它处于inactive状态,此时它的权重不会被考虑。一旦该cgroup需要发送IO,它就被激活,此时会计算在整棵层级树中的权重比例。以如下层级为例: - - -![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_14.png) - - -cgroup B不发送请求,那么A0和A1各占50%的比例。若B开始发送请求,B获得300/(100+300) 也就是 75%的比例,A0和A1各占12.5%。这些比例称为hweights(hierarchical weights),所有被激活的cgroup的hweights总和为1。 - - -### 接口说明 - - -可以参考: - - - - -| | | | -| --- | --- | --- | -| 接口 | 描述 | 配置说明 | -| cost.qos | 可读可写接口,接口文件只存在于blkcg根组。在cgroup v1中,该接口文件完整名称为blkio.cost.qos,在cgroup v2中,该接口文件完整名称为io.cost.qos。该接口主要实现blk-iocost功能以及基于延迟(latency)权重限制I/O服务质量(Qos)的速率。 -当实现blk-iocost功能之后,内核按延迟数值统计以下比例:超过读写延迟rlat|wlat的请求占所有请求的比例。当该比例超过读写延迟百分比rpct|wpct时,内核认为设备达到饱和状态,会降低往磁盘发送请求的速率。默认情况下,rlat|wlat的值为0,表示该功能未启用。 | 每行配置以设备的Major号和Minor号开头(格式为MAJ:MIN),后边衔接其他配置项,说明如下。* enable:是否开启blk-iocost controller,即开启blk-iocost功能。默认值0为关闭状态,修改值为1时开启功能。 -* ctrl:控制模式,可选值为auto或者user。使用auto时,内核自动探测设备类型并使用内置参数;使用user,则需要输入以下QoS控制参数。 -* rpct:读延迟百分比,取值范围为[0,100]。 -* rlat:读延迟,单位为us。 -* wpct:写延迟百分比,取值范围为[0,100]。 -* wlat:写延迟,单位为us。 -* min:最小速率调整比例,取值范围为[1,10000]。 -* max:最大速率调整比例,取值范围为[1,10000]。 - | -| cost.model | 可读可写接口,只存在于blkcg根组。在cgroup v1中,该接口文件完整名称为blkio.cost.model,在cgroup v2中,该接口文件完整名称为io.cost.model。该接口用于设置成本模型(cost model)。 | 每行配置以设备的Major号和Minor号开头(格式为MAJ:MIN),后边衔接其他配置项,说明如下。* ctrl:控制模式,可选值为auto或user,表示是否使用用户输入模型参数。 -* model:模型参数,当前只实现了一种模型linear。当模型参数为linear时,定义如下建模参数。 -+ [r|w]bps:最大顺序IO带宽。 -+ [r|w]seqiops:顺序 IOPS(Input/Output Operations Per Second)。 -+ [r|w]randiops:随机 IOPS(Input/Output Operations Per Second)。 - | -| cost.weight | 可读可写接口,只存在blkcg的子组中。在cgroup v1中,该接口文件完整名称为blkio.cost.weight,在cgroup v2中,该接口文件完整名称为io.cost.weight。该接口用于配置子组的权重,范围为[1,10000],默认值为100。该接口可以为每个设备配置权重,也可以修改该整个子组的默认权重。 | * 为接口设置权重值:表示修改blkcg的默认权重。 -* 为接口设置端口号和权重值MAJ:MIN :表示修改设备上的blkcg的权重。 - | - - -### 使用说明 - - -#### 第一步:为对应的磁盘生成相应的cost model数据 - - -在进行IO评测的时候需要获取iocost的model模型数据,iocost\_coed\_gen.py用来获取model数据,这个脚本可以使用内核源码中的tools/cgroup/iocost\_coef\_gen.py脚本来生成,或者从以下网址可以获取脚本的源码,这个脚本会通过直接读写磁盘来获取对应的磁盘模型数据,所以会破坏磁盘上的数据或文件系统,可以在磁盘被格式化前进行,只需要获取一次即可,比如我这边获取/dev/vdc盘的数据,可以用如下命令获取,最后一行输出的数据就是我们需要的数据 - - - -``` -[root@iZbp14ah12fefuzd6rh5rkZ ~]# python3 iocost_coed_gen.py --testdev /dev/vdc -Test target: vdc(253:32) -Temporarily disabling elevator and merges -Determining rbps... -Jobs: 1 (f=1): [R(1)][100.0%][r=128MiB/s,w=0KiB/s][r=1,w=0 IOPS][eta 00m:00s] -rbps=179879083, determining rseqiops... -Jobs: 1 (f=1): [R(1)][100.0%][r=26.5MiB/s,w=0KiB/s][r=6791,w=0 IOPS][eta 00m:00s] -rseqiops=6862, determining rrandiops... -Jobs: 1 (f=1): [r(1)][100.0%][r=26.6MiB/s,w=0KiB/s][r=6800,w=0 IOPS][eta 00m:00s] -rrandiops=6830, determining wbps... -Jobs: 1 (f=1): [W(1)][100.0%][r=0KiB/s,w=128MiB/s][r=0,w=1 IOPS][eta 00m:00s] -wbps=179882078, determining wseqiops... -Jobs: 1 (f=1): [W(1)][100.0%][r=0KiB/s,w=26.6MiB/s][r=0,w=6798 IOPS][eta 00m:00s] -wseqiops=6862, determining wrandiops... -Jobs: 1 (f=1): [w(1)][100.0%][r=0KiB/s,w=26.6MiB/s][r=0,w=6806 IOPS][eta 00m:00s] -wrandiops=6830 -Restoring elevator to none and nomerges to 0 - -253:32 rbps=179879083 rseqiops=6862 rrandiops=6830 wbps=179882078 wseqiops=6862 wrandiops=6830 -``` - -然后将最后一行的数据写入对应磁盘的cost model文件中,如下所示: - - - -``` -echo "253:32 rbps=179879083 rseqiops=6862 rrandiops=6830 wbps=179882078 wseqiops=6862 wrandiops=6830" > /sys/fs/cgroup/blkio/blkio.cost.model -``` - -注意:不需要在所有的机器上都执行这个操作,同样的磁盘的model数据是一样的,我们只需要获取一次即可,然后将对应的数据写入blkio root目录的blkio.cost.model接口文件即可。 - - -#### 第二步:配置磁盘的QOS,开启blk-iocost - - -这里假设使用cost.qos接口为设备253:32开启blk-iocost功能,并且当读写延迟rlat|wlat的请求有95%超过5 ms时,认为磁盘饱和。内核将进行磁盘发送请求速率的调整,调整区间为最低降至原速率的50%,最高升至原速率的150%: - - - -``` -echo "253:32 enable=1 ctrl=user rpct=95.00 rlat=5000 wpct=95.00 wlat=5000 min=50.00 max=150.00" > /sys/fs/cgroup/blkio/blkio.cost.qos -``` - -#### 第三步:为容器分配io权重 - - -这里可以根据业务容器不同的io的时延等级,给与设置不同的io权重,假设这里设置be blkcg的io权重为50,lc blkcg的io权重为1000: - - - -``` -echo "253:32 50" > /sys/fs/cgroup/blkio/blkcg_be/blkio.cost.weight -echo "253:32 50" > /sys/fs/cgroup/blkio/blkcg_lc/blkio.cost.weight -``` - -这样在IO资源使用饱和时,会根据blkcg的io权重进行io资源的分配。 - - -### 注意事项 - - -在ECS实例中使用blk-iocost功能启动**ctrl=auto**配置项时,如果对应的云盘为高效云盘、SSD云盘、ESSD云盘或NVMe SSD本地盘类型时,需要手动将对应磁盘的**rotational**属性设置为0: - - - -``` -#[$DISK_NAME]为磁盘名称 -echo 0 > /sys/block/[$DISK_NAME]/queue/rotational -``` - -另外切记不要使用分区的maj和min的值作为参数进行配置,需要使用硬盘的maj和min值进行配置。 - - -- Gitee From 07715b12f6779e3ee6cc976747f959b928dab85c Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Fri, 3 Jan 2025 16:20:31 +0800 Subject: [PATCH 054/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=958?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Release_Notes/ANCK_4.19_ReleaseNote.md" | 130 ++ .../Release_Notes/ANCK_5.10_ReleaseNote.md" | 117 ++ .../ab\347\256\200\344\273\213.md" | 3 + .../aghgb\347\256\200\344\273\213.md" | 3 + .../gb\347\256\200\344\273\213.md" | 3 + ...72\345\210\266\347\256\200\344\273\213.md" | 339 ++++++ .../\347\256\200\344\273\213.md" | 3 + .../\347\256\200\344\273\2132.md" | 3 + ...56\345\244\215\350\256\260\345\275\225.md" | 76 ++ ...71\347\233\256\347\256\200\344\273\213.md" | 4 + ...43\347\240\201\345\210\206\346\236\220.md" | 641 ++++++++++ ...trace_osnoise_\346\200\273\350\247\210.md" | 179 +++ ...43\347\240\201\345\210\206\346\236\220.md" | 641 ++++++++++ ...4\232_osnoise_\346\200\273\350\247\210.md" | 179 +++ ...43\347\240\201\345\210\206\346\236\220.md" | 558 +++++++++ ...43\347\240\201\345\210\206\346\236\220.md" | 210 ++++ ...43\347\240\201\345\210\206\346\236\220.md" | 558 +++++++++ ...43\347\240\201\345\210\206\346\236\220.md" | 210 ++++ ...57\346\214\201\350\241\245\344\270\201.md" | 197 +++ .../Pstore\346\200\273\350\247\210.md" | 366 ++++++ ...03\346\265\213\345\267\245\345\205\267.md" | 88 ++ ...71\347\233\256\347\256\200\344\273\213.md" | 2 + ...61\345\212\250\345\210\227\350\241\250.md" | 0 ...45\212\250spec\350\247\204\350\214\203.md" | 104 ++ ...21\350\200\205\346\214\207\345\215\227.md" | 185 +++ ...45\344\270\201\350\247\204\350\214\203.md" | 48 + ...13\350\257\225\347\224\263\350\257\267.md" | 6 + ...06\346\210\220\347\224\263\350\257\267.md" | 6 + ...5\225\350\277\233\345\205\245Anolis_OS.md" | 53 + ...71\347\233\256\347\256\200\344\273\213.md" | 14 + ...72\345\210\266\347\256\200\344\273\213.md" | 340 ++++++ ...72\347\272\277\346\216\250\350\215\220.md" | 182 +++ ...45\345\217\243\344\273\213\347\273\215.md" | 1028 ++++++++++++++++ ...00\346\234\257\346\226\271\346\241\210.md" | 444 +++++++ ...71\347\233\256\347\256\200\344\273\213.md" | 4 + .../ab\347\256\200\344\273\213.md" | 3 + ...72\345\210\266\347\256\200\344\273\213.md" | 339 ++++++ .../\347\256\200\344\273\2132.md" | 3 + ...13\350\257\225\346\212\245\345\221\212.md" | 449 +++++++ ...50\346\210\267\346\211\213\345\206\214.md" | 374 ++++++ ...50\347\203\255\345\215\207\347\272\247.md" | 223 ++++ ...346\272\220\351\232\224\347\246\273FAQ.md" | 0 ...00\346\234\257\344\273\213\347\273\215.md" | 169 +++ ...77\347\224\250\347\256\200\344\273\213.md" | 1080 +++++++++++++++++ 44 files changed, 9564 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/Release_Notes/ANCK_4.19_ReleaseNote.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/Release_Notes/ANCK_5.10_ReleaseNote.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270CVE\344\270\223\351\241\271/ANCK_CVE\344\277\256\345\244\215\350\256\260\345\275\225.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270CVE\344\270\223\351\241\271/\351\241\271\347\233\256\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace_osnoise_\344\273\243\347\240\201\345\210\206\346\236\220.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace_osnoise_\346\200\273\350\247\210.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace\357\274\232_osnoise_\344\273\243\347\240\201\345\210\206\346\236\220.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace\357\274\232_osnoise_\346\200\273\350\247\210.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257CONSOLE_\344\273\243\347\240\201\345\210\206\346\236\220.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257\357\274\232CONSOLE_\344\273\243\347\240\201\345\210\206\346\236\220.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257\357\274\232DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\244\232\345\220\216\347\253\257\346\224\257\346\214\201\350\241\245\344\270\201.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\346\200\273\350\247\210.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/\345\237\272\344\272\216pstore\347\232\204kdump\350\260\203\346\265\213\345\267\245\345\205\267.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/\351\241\271\347\233\256\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/Anolis_OS\346\224\257\346\214\201\347\232\204\351\251\261\345\212\250\345\210\227\350\241\250.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250spec\350\247\204\350\214\203.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250\350\241\245\344\270\201\350\247\204\350\214\203.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\345\246\202\344\275\225\346\217\220\344\272\244\347\241\254\344\273\266\345\205\274\345\256\271\346\200\247\346\265\213\350\257\225\347\224\263\350\257\267.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\345\246\202\344\275\225\346\217\220\344\272\244\347\254\254\344\270\211\346\226\271\351\251\261\345\212\250\351\233\206\346\210\220\347\224\263\350\257\267.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\347\254\254\344\270\211\346\226\271\351\251\261\345\212\250\345\246\202\344\275\225\350\277\233\345\205\245Anolis_OS.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\351\241\271\347\233\256\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK_ARM64_RAS\346\234\272\345\210\266\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK_boot_cmdline_\345\237\272\347\272\277\346\216\250\350\215\220.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK\345\206\205\346\240\270\345\212\237\350\203\275\344\270\216\346\216\245\345\217\243\344\273\213\347\273\215.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/datop\346\212\200\346\234\257\346\226\271\346\241\210.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/\351\241\271\347\233\256\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\347\241\254\350\265\204\346\272\220\351\232\224\347\246\273mpam\347\211\271\346\200\247\344\273\213\347\273\215/\351\276\231\350\234\245_ANCK_5.10_\345\200\232\345\244\251\345\271\263\345\217\260_MPAM_\346\265\213\350\257\225\346\212\245\345\221\212.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\347\241\254\350\265\204\346\272\220\351\232\224\347\246\273mpam\347\211\271\346\200\247\344\273\213\347\273\215/\351\276\231\350\234\245_ANCK_5.10_\345\200\232\345\244\251\345\271\263\345\217\260_MPAM_\347\224\250\346\210\267\346\211\213\345\206\214.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\260\203\345\272\246\345\231\250\347\203\255\345\215\207\347\272\247/Plugsched_\342\200\224\342\200\224_Linux_\345\206\205\346\240\270\350\260\203\345\272\246\345\231\250\347\203\255\345\215\207\347\272\247.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\350\265\204\346\272\220\351\232\224\347\246\273FAQ.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\351\276\231\350\234\245OS\350\265\204\346\272\220\351\232\224\347\246\273\346\212\200\346\234\257\344\273\213\347\273\215.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\351\276\231\350\234\245os\350\265\204\346\272\220\351\232\224\347\246\273\344\275\277\347\224\250\347\256\200\344\273\213.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/Release_Notes/ANCK_4.19_ReleaseNote.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/Release_Notes/ANCK_4.19_ReleaseNote.md" new file mode 100644 index 00000000..e7a11105 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/Release_Notes/ANCK_4.19_ReleaseNote.md" @@ -0,0 +1,130 @@ +# 4.19.91-26.y + + +## 4.19.91-26 + + +发布时间:2022-05-24 + + +发布链接: + + +* +* + + +内核更新: + + +* 版本更新至 4.19.91-26 +* 重要内核缺陷及安全漏洞(CVE)修复 +* 龙蜥自研混部资源隔离特性Group Identity增加支持 +* 龙蜥自研多租户容器网络 QoS 隔离特性增强 +* 龙蜥自研冷 slab 内存监测与回收特性支持 +* 龙蜥自研 UKFEF 特性支持 +* Megaraid\_sas 设备驱动支持 +* virtio-net 支持 XDP Socket +* 基于 EROFS 实现 RAFS v6 格式支持 +* livepatch 增加 static key 支持 +* SMR zoned 设备支持 +* ext4 delalloc buffer写性能优化 +* Kunit 测试框架支持 +* ARM 架构支持 kdump crashkernel 分配4G以上内存 +* ARM 架构 CMN PMU 特性支持 +* perf c2c 功能支持 + + +## 4.19.91-26.1 + + +发布时间:2022-08-02 + + +发布链接: + + +* [https://anas.openanolis.cn/errata/detail/ANSA-2022:0602](https://anas.openanolis.cn/errata/detail/ANSA-2022:0603) +* + + +内核更新: + + +* 修复CVE: CVE-2022-32250 + + +## 4.19.91-26.2 + + +发布时间:2022-08-26 + + +发布链接: + + +* +* + + +内核更新: + + +* 修复CVE: CVE-2022-2586 + + +## 4.19.91-26.3 + + +发布时间:2022-09-02 + + +发布链接: + + +* +* + + +内核更新: + + +* 修复CVE: CVE-2022-2978 + + +## 4.19.91-26.4 + + +发布时间:2022-09-16 + + +发布链接: + + +* +* + + +内核更新: + + +* 修复CVE: CVE-2022-2639 + + +## 4.19.91-26.5 + + +发布时间:2022-10-11 + + +发布链接: + + +* +* + + +内核更新: + + +* 修复CVE: CVE-2022-3176 diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/Release_Notes/ANCK_5.10_ReleaseNote.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/Release_Notes/ANCK_5.10_ReleaseNote.md" new file mode 100644 index 00000000..e5cb3fe2 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/Release_Notes/ANCK_5.10_ReleaseNote.md" @@ -0,0 +1,117 @@ +# 5.10.134-12.y + + +## 5.10.134-12 + + +发布时间: 2022-09-06 + + +发布链接: + + +内核更新: + + +* 内核升级到5.10.134 +* 重要的缺陷及安全漏洞修复 +* 支持倚天710处理器 +* 支持磐久M物理机 +* 优化在倚天平台上的基础性能 +* ARM64支持mpam特性 +* 增加AMD SEV热迁移能力的guest支持 +* ARM64 crashkernel支持预留4G以上内存 +* ARM64支持对kernel module的hotfix +* 支持ftrace osnoise tracer +* 支持 ext4 fast commit 特性,该特性对于 fsync 比较频繁的应用如 MySQL/PostgreSQL 数据库有比较明显的性能优化。相应的 e2fsprogs 版本更新至 1.46.0。 +* 支持网讯10GB网卡 + + +**龙蜥自研:** + + +* 支持datop监控NUMA跨node访问以及进程粒度内存冷热识别 +* 填充可执行二进制文件末尾2M未对齐部分,部分场景性能再提升2% +* 支持 XFS 16k 原子写特性,相比默认打开双写,有至多 50% 的性能提升,同时显著减少磁盘 IO。相应的 xfsprogs 和 mariadb 也更新至龙蜥 yum repo。相比硬件原子写方案,该方案至少有着以下优点: + + +a)基于 CoW 机制; + + +b)不依赖硬件; + + +c)无运行时 IO 链路配置依赖。 + + +另外,该优化效果可以与代码段大页特性叠加。 + + +使用手册: + + +* 支持 nydus + erofs over fscache 容器镜像加速。该特性由龙蜥社区贡献,于 5.19 合并到社区主线,并成为社区首个源生支持的容器镜像加速方案。相关技术博客: +* 支持 fd passthrough 和 fd attach 增强特性。其中 fd passthrough 能将常用场景的 IO 延迟降低到先前的 10%;fd attach 支持无损恢复 fuse 挂载点连接,提升生产环境的稳定性。 +* kidled支持匿名页、文件页以及slab的扫描。 +* 新增memory.use\_priority\_swap接口,支持按cgroup优先级进行内存swap。 +* SMC 新增 1-RTT、RDMA DIM 支持,优化 CQ 中断处理逻辑,数据路径 QPS 提升 40%。引入 SMC 自动化测试能力,修复数十个稳定性问题; + + +# 5.10.112-11.y + + +## 5.10.112-11 + + +发布时间: 2022-05-24 + + +内核更新: + + +* 内核升级到5.10.112 +* 重要的缺陷及安全漏洞修复 +* Hygon CSV2 机密虚拟机特性支持 +* 龙蜥自研代码多副本特性支持 +* 龙蜥自研代码大页功能增强 +* Guest OS 256 CPU 支持 +* 龙蜥自研Kfence增加内存越界 UAF等问题定位能力 +* SMC 多场景下吞吐、时延性能提升,建联速度提升,多个稳定性、兼容问题修复; +* Intel SPR 特性支持:AMX, vAMX, IPI虚拟化,Intel\_idle, TDX 等 +* AMD 特性支持:SEV-ES,ptdma,CPU frequency, k10temp, EDAC 等 +* 阿里倚天 710 特性支持:DDR PMU,PCIe PMU 驱动支持,CMN-700,RAS +* coresight 特性支持 +* ARM 架构特性支持: ARM SPE perf memory profiling/c2c, +* virtiofs: 支持文件级 DAX +* smmu event polling 支持 + + +## 5.10.112-11.1 + + +发布时间: 2022-07-15 + + +发布链接: + + +内核更新: + + +* 修复CVE: CVE-2022-34918 + + +## 5.10.112-11.2 + + +发布时间: 2022-08-05 + + +内核更新: + + +* 修复CVE:CVE-2022-32250 + + +  + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" new file mode 100644 index 00000000..2a362235 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" @@ -0,0 +1,339 @@ +# 1. RAS机制简介 + + +为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: + + +**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 + + +**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 + + +**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 + + +RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 + + +# 2. RAS机制错误处理流程 + + +RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 + + +RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_0.png) + + +# 3. RAS机制评测流程 + + +RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 + + +APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 + + +从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 + + +如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 + + + + +| | +| --- | +| 0 Processor Correctable +1 Processor Uncorrectable non-fatal +2 Processor Uncorrectable fatal | +| 3 Memory Correctable +4 Memory Uncorrectable non-fatal +5 Memory Uncorrectable fatal | +| 6 PCI Express Correctable +7 PCI Express Uncorrectable non-fatal +8 PCI Express Uncorrectable fatal | +| 9 Platform Correctable +10 Platform Uncorrectable non-fatal +11 Platform Uncorrectable fatal | + + +Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_1.png) + + +上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 + + +错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: + + +1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 + + +2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 + + +3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 + + +# 4. CPU及内存错误注入演示 + + +CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 + + +## 4.1 环境准备 + + +### 1. 安装EINJ模块 + + +使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html + + +此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 + + +### 2. 安装RAS测试工具 + + +直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git + + +### 3. 安装rasdaemon + + +先安装依赖包yum install sqlite perl-DBD-SQLite + + +使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git + + + +``` +autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make +make install +``` + +在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 + + + +``` + -d, --disable 禁用RAS事件并退出 + -e, --enable 使能RAS事件并退出 + -f, --foreground 前台运行 + -r, --record 通过sqlite3记录事件 +``` + +rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 + + +查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 + + +本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 + + +## 4.2 CPU错误注入 + + +本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 + + +使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 + + + +``` +./einj_mem_uc core_non_fatal +0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 +injecting ... +triggering ... +Manually take page offline +Test passed +``` + +使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 + + + + +| | | | | +| --- | --- | --- | --- | +| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | + + +可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=17(core), cnt=0xd +INFO: RAS reg: +INFO: fr = 10a9a2 +INFO: status = 44800007 +INFO: addr = 8007e0e95fffb7ff +INFO: misc0 = 4 +INFO: misc1 = 0 +RTC: 2000-01-06 09:32:09 + core[8] mm(17) return: 0 +--handler(17) end +[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error +[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 +[40858.436229] {42}[Hardware Error]: event severity: recoverable +[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 +[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable +[40858.454204] {42}[Hardware Error]: section_type: ARM processor error +[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 +[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 +[40858.475041] {42}[Hardware Error]: running state: 0x1 +[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 +[40858.487456] {42}[Hardware Error]: Error info structure 0: +[40858.493013] {42}[Hardware Error]: num errors: 1 +[40858.497702] {42}[Hardware Error]: error_type: 0, cache error +[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 +[40858.509857] {42}[Hardware Error]: transaction type: Instruction +[40858.516109] {42}[Hardware Error]: cache level: 2 +[40858.521058] {42}[Hardware Error]: the error has not been corrected +[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered +``` + +## 4.3 内存错误注入 + + +使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 + + + +``` +./einj_mem_uc single +0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 +injecting ... +triggering ... +SIGBUS: addr = 0xffffabcb3400 +page not present +Test passed +``` + +BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=0(exception), cnt=0xa +MM Mem RAS handle,Intr:0 +Ch = 25810000 + |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 + |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 + |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 + |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 + |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 + |-ECCUSYN0~2:1FF,0,76 + |-SBRCTL:1C01591B,SBRSTS:0 +RasData->ExceptionEl: 0, UeCnt:0x1 +RTC: 2000-01-06 09:27:58 +Get SystemAddrss through mAddrTransProtocol start +Get SystemAddrss through mAddrTransProtocol end +s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 +Locate error dimm, Socket:0, Channel:2 Dimm:0 + core[8] mm(0) return: 0 +--handler(0) end +[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) +[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 +[40606.668367] {41}[Hardware Error]: event severity: recoverable +[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 +[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable +[40606.686342] {41}[Hardware Error]: section_type: memory error +[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) +[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 +[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 +[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC +[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered +``` + +## 4.4 rasdaemon日志读取 + + +rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 + + + +``` +[root@localhost ras-tools]# ras-mc-ctl --errors +Memory controller events: +1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +``` + +# 5. Q&A + + +Q:RAS机制是否需要BIOS支持? + + +A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 + + + + + +Q: x86和ARM64的APEI是否一致? + + +A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 + + + + + +Q: RAS注入的错误是真实的错误吗? + + +A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 + + + + + +Q: rasdaemon日志查看是否有更易用的方法? + + +A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; + + +最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 + + + + + +Q: 可否使用mcelog? + + +A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 + + + + + +Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? + + +A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 + + + + + +Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? + + +A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270CVE\344\270\223\351\241\271/ANCK_CVE\344\277\256\345\244\215\350\256\260\345\275\225.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270CVE\344\270\223\351\241\271/ANCK_CVE\344\277\256\345\244\215\350\256\260\345\275\225.md" new file mode 100644 index 00000000..f07dbce6 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270CVE\344\270\223\351\241\271/ANCK_CVE\344\277\256\345\244\215\350\256\260\345\275\225.md" @@ -0,0 +1,76 @@ + +# 4.19 + + + + +| | | +| --- | --- | +| 发布版本 | changelog | +| 4.19.91-26.3 | CVE-2022-2978 | +| 4.19.91-26.2 | CVE-2022-2586 | +| 4.19.91-26.1 | CVE-2022-32250 | + + +# 5.10 + + + + +| | | +| --- | --- | +| 发布版本 | changelog | +| 5.10.112-11.2 | CVE-2022-32250 | +| 5.10.112-11.1 | CVE-2022-34918 | +| 5.10.134-12 | CVE-2021-33655 +CVE-2021-33656 +CVE-2022-0494 +CVE-2022-0500 +CVE-2022-1012 +CVE-2022-1184 +CVE-2022-1462 +CVE-2022-1652 +CVE-2022-1729 +CVE-2022-1734 +CVE-2022-1786 +CVE-2022-1789 +CVE-2022-1836 +CVE-2022-1966 +CVE-2022-1972 +CVE-2022-1974 +CVE-2022-1975 +CVE-2022-2078 +CVE-2022-21123 +CVE-2022-21125 +CVE-2022-21166 +CVE-2022-21499 +CVE-2022-21505 +CVE-2022-2153 +CVE-2022-2318 +CVE-2022-23816 +CVE-2022-2503 +CVE-2022-2586 +CVE-2022-2588 +CVE-2022-26365 +CVE-2022-2639 +CVE-2022-28893 +CVE-2022-29581 +CVE-2022-2959 +CVE-2022-2978 +CVE-2022-29900 +CVE-2022-29901 +CVE-2022-32250 +CVE-2022-32296 +CVE-2022-32981 +CVE-2022-33740 +CVE-2022-33741 +CVE-2022-33742 +CVE-2022-33743 +CVE-2022-33744 +CVE-2022-33981 +CVE-2022-34918 +CVE-2022-36123 +CVE-2022-36879 +CVE-2022-36946 | + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270CVE\344\270\223\351\241\271/\351\241\271\347\233\256\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270CVE\344\270\223\351\241\271/\351\241\271\347\233\256\347\256\200\344\273\213.md" new file mode 100644 index 00000000..7fe512a0 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270CVE\344\270\223\351\241\271/\351\241\271\347\233\256\347\256\200\344\273\213.md" @@ -0,0 +1,4 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace_osnoise_\344\273\243\347\240\201\345\210\206\346\236\220.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace_osnoise_\344\273\243\347\240\201\345\210\206\346\236\220.md" new file mode 100644 index 00000000..b66bf0b7 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace_osnoise_\344\273\243\347\240\201\345\210\206\346\236\220.md" @@ -0,0 +1,641 @@ +![](assets/Ftrace:_osnoise_代码分析/img_0.png) + + +前面一篇文章中,我们简要的osnoise的相关信息,本篇文章主要针对其源代码进行分析阐述。 + + + +# 一、数据结构: + + + +``` +/* + * NMI runtime info. + */ +struct osn_nmi { + u64 count; + u64 delta_start; +}; + +/* + * IRQ runtime info. + */ +struct osn_irq { + u64 count; + u64 arrival_time; + u64 delta_start; +}; + +#define IRQ_CONTEXT 0 +#define THREAD_CONTEXT 1 +/* + * sofirq runtime info. + */ +struct osn_softirq { + u64 count; + u64 arrival_time; + u64 delta_start; +}; + +/* + * thread runtime info. + */ +struct osn_thread { + u64 count; + u64 arrival_time; + u64 delta_start; +}; + +/* + * Runtime information: this structure saves the runtime information used by + * one sampling thread. + */ +struct osnoise_variables { + struct task_struct *kthread; + bool sampling; + pid_t pid; + struct osn_nmi nmi; + struct osn_irq irq; + struct osn_softirq softirq; + struct osn_thread thread; + local_t int_counter; +}; +``` + + +osnoise用来记录结果的主要数据结构为`struct osnoise_variables`其中: + + ++ `struct task_struct *kthread`:采样线程的tcb。 ++ `bool sampling`:采样开关 ++ `pit_t pid`:采样线程的pid ++ `struct osn_nmi nmi`:保存nmi噪声的相关信息 ++ `struct osn_irq irq`:保存irq噪声的相关信息 ++ `struct osn_softiq softirq`:保存softirq噪声的相关信息 ++ `struct osn_thread thread`:保存其他线程噪声的相关信息 ++ `local_t int_counter`:保存噪声的总次数 + + + +# 二、工作原理: + + +## 2.1 注册trace\_point + + +如第一篇,osnoise引入了一组trace\_point。通过这些trace\_point,开发人员可以获取噪声的详细信息。注册trace\_point的代码如下(以irq\_noise为例): + + + +``` +TRACE_EVENT(irq_noise, + + TP_PROTO(int vector, const char *desc, u64 start, u64 duration), + + TP_ARGS(vector, desc, start, duration), + + TP_STRUCT__entry( + __field( u64, start ) + __field( u64, duration) + __string( desc, desc ) + __field( int, vector ) + + ), + + TP_fast_assign( + __assign_str(desc, desc); + __entry->vector = vector; + __entry->start = start; + __entry->duration = duration; + ), + + TP_printk("%s:%d start %llu.%09u duration %llu ns", + __get_str(desc), + __entry->vector, + __print_ns_to_secs(__entry->start), + __print_ns_without_secs(__entry->start), + __entry->duration) +); +``` + + +关于trace\_point这里我们不做过多介绍,感兴趣的读者可以去内核文件`include/trace/events/osnoise.h`下查看相应源代码。 + + +## 2.2 注册osnoise tracer + + +这部分主要是涉及到osnoise的初始化过程,该过程主要就是将osnoise注册近ftrace中并且初始化相关的tracefs。注册的过程通过`register_tracer(&osnoise_tracer)`实现。 + + + +``` +static struct tracer osnoise_tracer __read_mostly = { + .name = "osnoise", + .init = osnoise_tracer_init, + .reset = osnoise_tracer_reset, + .start = osnoise_tracer_start, + .stop = osnoise_tracer_stop, + .print_header = print_osnoise_headers, + .allow_instances = true, +}; +``` + + +## 2.3 注册tracepoint钩子函数: + + +osnoise 统计信息的方式就是通过在相应的tracepoint中注册钩子函数。因此这部分即是osnoise的核心部分,本篇文章将重点分析该模块。 + + +osnoise首先会将各种事件的钩子函数插入对应的tracepoint中,这一动作由`osnoise_hook_events()`函数执行,将该函数裁剪后如下: + + + +``` +static int osnoise_hook_events(void) +{ + ... + retval = hook_irq_events(); + ... + retval = hook_softirq_events(); + ... + retval = hook_thread_events(); + ... +} +``` + + +该函数主要是针对irq、softirq、thread事件插入一些采样函数。 + + +### hook\_irq\_events + + +hook\_irq\_events()主要是实现对irq事件的统计。如下: + + + +``` +static int hook_irq_events(void) +{ + ... + ret = register_trace_irq_handler_entry(trace_irqentry_callback, NULL); + ... + ret = register_trace_irq_handler_exit(trace_irqexit_callback, NULL); + ... +} +``` + + +主要是在irq\_handler\_entry 和 irq\_handler\_exit处插入相应的处理函数。最终插入的处理函数为osnoise\_trace\_irq\_entry() 和 osnoise\_trace\_irq\_exit()。 + + + +``` +void osnoise_trace_irq_entry(int id) +{ + struct osnoise_variables *osn_var = this_cpu_osn_var(); + + if (!osn_var->sampling) + return; + + osn_var->irq.arrival_time = time_get(); + set_int_safe_time(osn_var, &osn_var->irq.delta_start); + osn_var->irq.count++; + + local_inc(&osn_var->int_counter); +} +void osnoise_trace_irq_exit(int id, const char *desc) +{ + struct osnoise_variables *osn_var = this_cpu_osn_var(); + int duration; + + if (!osn_var->sampling) + return; + + duration = get_int_safe_duration(osn_var, &osn_var->irq.delta_start); + trace_irq_noise(id, desc, osn_var->irq.arrival_time, duration); + osn_var->irq.arrival_time = 0; + cond_move_softirq_delta_start(osn_var, duration); + cond_move_thread_delta_start(osn_var, duration); +} +``` + + +在irq handler的入口处插入的函数为osnoise\_trace\_irq\_entry,分析该函数: + + ++ 在irq.arrival\_time中记录本次irq事件的开始时间。 ++ 在irq.delta\_start中记录本次irq事件的准确开始时间。 ++ irq噪声事件的次数+1。 ++ 噪声事件总体次数+1。 + + +在这里我们发现,除了在irq.arrival\_time中记录了一个irq开始时间之外,还通过set\_int\_safe\_time函数在 irq.delta\_start中都记录了一个开始时间。那么他们之间有什么区别呢?在这里我们先按下不表,后文会对其进行解释分析。 + + +在irq handler的出口处插入的函数为osnoise\_trace\_irq\_exit,该函数的主要作用: + + ++ 根据之前记录的osn\_var->irq.delta\_start计算出本次irq事件的持续时间。 ++ 调用trace\_irq\_noise将本次irq事件的**中断号,中断名称、开始时间、持续时间**放到ftrace的ringbuffer中。 ++ 清空osn\_var->irq.arrival\_time 表示此次irq事件结束。 + + +我们注意到在该函数的末尾处有cond\_move\_softirq\_delta\_start 以及 cond\_move\_thread\_delta\_start函数。其实形如此类的函数一共有三个: + + ++ cond\_move\_irq\_delta\_start ++ cond\_move\_softirq\_delta\_start ++ cond\_move\_thread\_delta\_start + + +函数的形式都是一样的,我们以 cond\_move\_softirq\_delta\_start()为例: + + + +``` +static inline void +cond_move_softirq_delta_start(struct osnoise_variables *osn_var, u64 duration) +{ + if (osn_var->softirq.delta_start) + osn_var->softirq.delta_start += duration; +} +``` + + ++ 这个函数会在osnoise\_trace\_irq\_exit、trace\_osnoise\_callback中调用,前者我们知道是irq事件退出时的钩子函数,而后者则是nmi事件的钩子函数。 ++ 可以看到该函数的主要功能是将softirq.delta\_start的开始时间推后一个duration。 + + +换句话说,这个函数是为了校准低优先级事件的开始时间。以下图为例: + + ++ 在t1时刻进入了softirq,此时记录**softirq.arrival\_time = t1**,**softirq.delta\_time = t1**。 ++ 然后在t2时刻,来了一个irq抢占了softirq,进入irq的执行函数。 ++ t3时刻离开irq执行完毕继续执行softirq。irq执行时间**duration = t3-t2**。同时调用cond\_move\_softirq\_delta\_start,更新softirq开始时间**softirq.delta\_start += duration;** ++ 在t4时刻softirq执行完毕退出。 + + +那么本次softirq的持续时间实际上应该是t4 - (t1 + duration) = t4 - **softirq.delta\_start。** + + +![](assets/Ftrace:_osnoise_代码分析/img_1.png) + +因此,需要高优先级的对低优先级的事件的时间进行校准。 + + ++ 对于nmi事件,需要调用 + + +- cond\_move\_irq\_delta\_start +- cond\_move\_softirq\_delta\_start +- cond\_move\_thread\_delta\_start + + ++ 对于irq事件,需要调用 + + +- cond\_move\_softirq\_delta\_start +- cond\_move\_thread\_delta\_start + + ++ 对于softirq事件,需要调用 + + +- cond\_move\_thread\_delta\_start + + +### hook\_softirq\_events + + +与irq的钩子函数一样,需要注册tracepoint softirq\_entry、softirq\_exit的钩子函数。最终注册的钩子函数如下: + + + +``` +static void trace_softirq_entry_callback(void *data, unsigned int vec_nr) +{ + struct osnoise_variables *osn_var = this_cpu_osn_var(); + + if (!osn_var->sampling) + return; + + osn_var->softirq.arrival_time = time_get(); + set_int_safe_time(osn_var, &osn_var->softirq.delta_start); + osn_var->softirq.count++; + + local_inc(&osn_var->int_counter); +} +static void trace_softirq_exit_callback(void *data, unsigned int vec_nr) +{ + struct osnoise_variables *osn_var = this_cpu_osn_var(); + int duration; + + if (!osn_var->sampling) + return; + + if (unlikely(timerlat_enabled())) + if (!timerlat_softirq_exit(osn_var)) + return; + + duration = get_int_safe_duration(osn_var, &osn_var->softirq.delta_start); + trace_softirq_noise(vec_nr, osn_var->softirq.arrival_time, duration); + cond_move_thread_delta_start(osn_var, duration); + osn_var->softirq.arrival_time = 0; +} +``` + + +可以发现对softirq的统计方式与对irq的统计方式一摸一样,在这里我们便不做详细分析,读者可以参考上面对hook\_irq\_events()的分析。 + + +### hook\_thread\_events + + +osnoise通过在tracepoint sched\_switch注册钩子函数,来统计thread noise。函数如下所示: + + + +``` +static void +trace_sched_switch_callback(void *data, bool preempt, + struct task_struct *p, + struct task_struct *n, + unsigned int prev_state) +{ + struct osnoise_variables *osn_var = this_cpu_osn_var(); + + if (p->pid != osn_var->pid) + thread_exit(osn_var, p); + + if (n->pid != osn_var->pid) + thread_entry(osn_var, n); +} +static void +thread_entry(struct osnoise_variables *osn_var, struct task_struct *t) +{ + if (!osn_var->sampling) + return; + /* + * The arrival time will be used in the report, but not to compute + * the execution time, so it is safe to get it unsafe. + */ + osn_var->thread.arrival_time = time_get(); + + set_int_safe_time(osn_var, &osn_var->thread.delta_start); + + osn_var->thread.count++; + local_inc(&osn_var->int_counter); +} +static void +thread_exit(struct osnoise_variables *osn_var, struct task_struct *t) +{ + int duration; + + if (!osn_var->sampling) + return; + + if (unlikely(timerlat_enabled())) + if (!timerlat_thread_exit(osn_var)) + return; + + duration = get_int_safe_duration(osn_var, &osn_var->thread.delta_start); + + trace_thread_noise(t, osn_var->thread.arrival_time, duration); + + osn_var->thread.arrival_time = 0; +} +``` + + +sched\_switch()为线程切换的核心函数,在该trace\_sched\_switch函数中的p表示前一个线程,n表示下一个要执行的线程,即从线程p切换到线程n。 + + +此时存在三种情况: + + ++ 从采样线程切换到其他线程 + + +- 执行thread\_entry()函数,标志一个噪声的进入 + + ++ 从其他线程切换到采样线程 + + +- 执行thread\_exit()函数,标志上一个噪声的结束 + + ++ 从其他线程切换到其他线程 + + +- 先执行thread\_exit()函数,标志上一个噪声的结束 +- 再执行thread\_entry()函数,标志下一个噪声的进入 + + +换句话说,该钩子函数会统计除了采样线程外其他所有线程执行的时间。其中thread\_entry()和thread\_exit()的具体实现与上面对irq事件统计的函数实现类似,此处不再过多赘述。 + + +### nmi\_events + + +对于NMI事件的统计比较特殊,在ftrace\_nmi\_enter和ftrace\_nmi\_exit中直接调用trace\_osnoise\_callback获取nmi noise,并且调用trace\_nmi\_noise将duration放到ftrace的ringbuffer中。 + + + +``` +static inline void ftrace_nmi_exit(void) +{ + ... + if (trace_osnoise_callback_enabled) + trace_osnoise_callback(false); + ... +} +static inline void ftrace_nmi_exit(void) +{ + ... + if (trace_osnoise_callback_enabled) + trace_osnoise_callback(false); + ... +} +void trace_osnoise_callback(bool enter) +{ + struct osnoise_variables *osn_var = this_cpu_osn_var(); + u64 duration; + + if (!osn_var->sampling) + return; + + /* + * Currently trace_clock_local() calls sched_clock() and the + * generic version is not NMI safe. + */ + if (!IS_ENABLED(CONFIG_GENERIC_SCHED_CLOCK)) { + if (enter) { + osn_var->nmi.delta_start = time_get(); + local_inc(&osn_var->int_counter); + } else { + duration = time_get() - osn_var->nmi.delta_start; + + trace_nmi_noise(osn_var->nmi.delta_start, duration); + + cond_move_irq_delta_start(osn_var, duration); + cond_move_softirq_delta_start(osn_var, duration); + cond_move_thread_delta_start(osn_var, duration); + } + } + + if (enter) + osn_var->nmi.count++; +} +``` + + +主要函数为trace\_osnoise\_callback(bool enter),该函数通过一个bool值来判断当前是进入nmi中断还是退出nmi中断,进而进行相应的处理,统计方法和其他事件统计方法一直。可以看到在NMI的钩子函数中,会调用到 + + ++ cond\_move\_irq\_delta\_start(osn\_var, duration); ++ cond\_move\_softirq\_delta\_start(osn\_var, duration); ++ cond\_move\_softirq\_delta\_start(osn\_var, duration); + + +这三个函数去校准其他低优先级事件的统计。与我们之前的分析一致。 + + +## 2.4 采样 + + +上面介绍了osnoise对各类事件采样的方法,接下来,我们分析一下osnoise的采样流程。osnoise开始采样的函数调用流程为osnoise\_tracer\_start->osnoise\_workload\_start->start\_per\_cpu\_kthreads->start\_kthread->osnoise\_main->run\_osnoise。 + + + +采样的核心函数为run\_osnoise,将代码裁剪后如下: + + + +``` +static int run_osnoise(void) +{ + ... + + threshold = tracing_thresh ? : 5000; + + osn_var->sampling = true; + + runtime = osnoise_data.sample_runtime * NSEC_PER_USEC; + + stop_in = osnoise_data.stop_tracing * NSEC_PER_USEC; + + start = time_get(); + + last_int_count = set_int_safe_time(osn_var, &last_sample); + + do { + + int_count = set_int_safe_time(osn_var, &sample); + + noise = time_sub(sample, last_sample); + + total = time_sub(sample, start); + + if (total < last_total) { + osnoise_taint("total overflow!"); + break; + } + + last_total = total; + + if (noise >= threshold) { + int interference = int_count - last_int_count; + + if (noise > max_noise) + max_noise = noise; + + if (!interference) + hw_count++; + + sum_noise += noise; + + trace_sample_threshold(last_sample, noise, interference); + + if (osnoise_data.stop_tracing) + if (noise > stop_in) + osnoise_stop_tracing(); + } + + last_sample = sample; + last_int_count = int_count; + + } while (total < runtime && !kthread_should_stop()); + + osn_var->sampling = false; + + ... +} +``` + + + +分析采样函数的主体逻辑流程图如下所示: + + +![](assets/Ftrace:_osnoise_代码分析/img_2.png) + + +即通过不断的轮询TSC寄存器,将每次轮询的间隙与预设的threshold进行对比,判断是否发生噪声,如果发生了噪声且噪声不是由其他可测量事件所造成的,就认为发生了硬件噪声。 + + +其中: + + +* threshold :两次轮询TSC寄存器时间之差,被认为是噪声的最小值,默认设为5us。 +* osn\_var->sampling:标志位,标志是否开启采样。 +* runtime:预设的本次采样时间。 +* start :记录本次采样开始的时间 +* last\_sample : 记录上次读取tsc寄存器的值 +* sample : 记录本次读取tsc寄存器的值 +* noise = time\_sub(sample, last\_sample) : 计算本次和上次轮询tsc寄存器的时间之差。 +* total :记录从采样开始到现在所经历的时间 +* 如果noise >= threshold,则视为发生了噪声,进行统计计算 + + ++ max\_noise: 记录最大的单个噪声值 ++ interference: 记录本次噪声内事件发生的次数,如果为0则代表是硬件噪声。 ++ hw\_count: 记录硬件噪声的次数,当interference为0时,增加。 + + +* 轮询tsc寄存器,直到total>=runtime,结束本次采样。 + + + +# 三、小结 + + +以上便是对osnoise的代码分析。osnoise就是站在一个普通进程的视角上,统计所有会打断他的事件,包含irq、softirq、nmi、thread、hw。 + + +对于前四种事件内核中都提供了相应的tracepoint,只需要注册相应的回掉函数到tracepoint中即可统计到相关的信息。而hw无法被直接统计测量,因此在osnoise中就通过不断的轮询tsc寄存器,将任意两次轮询的差值与threshold进行比较,如果大于threshold就认为发生了噪声,当发生噪声时如果其他四个事件都未发生就认为发生了硬件延迟。 + + +由于irq、softirq、nmi、thread都有相应的tracepoint可以供我们使用,在不考虑hw的情况下我们其实可以直接在用户态实现相关信息的采集。下篇文章我们会尝试在用户态,利用bcc通过动态插桩的方式来实现一个简单的osnoise背景噪声统计工具。 + + + + + + + + + + + + + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace_osnoise_\346\200\273\350\247\210.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace_osnoise_\346\200\273\350\247\210.md" new file mode 100644 index 00000000..782c9a33 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace_osnoise_\346\200\273\350\247\210.md" @@ -0,0 +1,179 @@ + + + +# Ftrace: osnoise 总览 + + + + + + + + +![](assets/Ftrace:_osnoise_总览/img_0.png) + + +## 一、osnoise是什么? + + + + +在linux系统中,一个普通线程在执行过程中会被各种各样的事件所干扰打断,如NMI、IRQ、SOFTIRQ、来自硬件的干扰以及来自其他线程的干扰。这些事件对于一个普通线程来说,就相当于噪声一样的存在。在Linux 5.14-rc1中,引入了一个新的tracer——osnoise tracer。osnoise从一个线程的视角出发,统计出所有对他有干扰的噪声,进而协助开发人员分析系统背景噪声情况。 + + +### 1.1 噪声分类 + + +在osnoise tracer中,将统计的噪声分为了以下五个大类: + + ++ IRQ:硬中断 ++ SOFTIRQ:软中断 ++ NMI:不可屏蔽中断 ++ HW:来自硬件的噪声。 ++ THREAD:来自其他线程的影响。 + + +其中,HW(hardware latency)表示某些底层硬件或者固件的行为引起的大型系统延迟。在Ftrace中,有一个名为hwlat\_detector的tracer,它的主要目的就是用来检测硬件噪声。osnoise的设计思想借鉴了hwlat\_detector。 + + +### 1.2 hwlat + + +hwlat\_detector的工作原理简单来说就是在一段时间内,关闭irq、softirq以及抢占,然后不断的去轮询TSC(Time Stamp Counter)寄存器的值。由于关闭了中断及抢占,任意两次读取之间的间隙都是由于硬件噪声或者来自其他不可屏蔽中断的噪声(NMI)。 + + +如图所示: + + +![](assets/Ftrace:_osnoise_总览/img_1.png) + + +在一段时间内,采样线程不断的去循环读取TSC寄存器,在一个循环内会连续读取两次TSC寄存器。假设本次循环读取的时间分别为t1、t2,上次循环读取的时间为last\_t1、last\_t2。则: + + ++ t1与t2的时间之差,last\_t1、last\_t2的时间之差,称为inner\_latency。 ++ t1与last\_t2的时间之差,称为outer\_latency。 ++ tracing\_thresh为预设的阀值,如果观察到任何超过阀值的延迟就认为发生了噪声事件。 ++ 在hwlat中,会不断的计算inner\_latency和outer\_latency。然后将其值与预设的tracing\_thresh值进行对比,如果大于tracing\_thresh,就认为发生了噪声事件。 ++ 在hwlat采样期间,会同时追踪nmi中断事件。因此,观察到的任何超过阀值的延迟如果不是nmi造成的,那么就认为是hardware latency。 + + +### 1.3 osnoise实现 + + +前面我们介绍了hwlat的实现。简而言之,hwlat关闭irq、softirq、抢占等事件,通过不断的轮询TSC寄存器以及追踪NMI中断来探测延迟事件,观察到的任何延迟都是由NMI或者硬件造成的。 + + +osnoise的实现思想和hwlat类似,不过osnoise不会关闭irq、softirq、抢占等事件,而是在采样的同时追踪各类事件。在irq\_handler\_entry、irq\_handler\_exit、softirq\_entry、softirq\_exit、sched\_switch、nmi\_enter、nmi\_exit处也插入相应的钩子函数。进而统计出各类事件发生的次数以及持续时间。如果观测到的任意延迟不是由以上时间造成的,那么就认为是硬件噪声。 + + +## 二、osnoise tracer + + +### 2.1 配置文件 + + +osnoise在`/sys/kernel/debug/tracing/` 目录下有一系列可配置文件, 含义如下: + + +* **osnoise/cpus:** osnoise采样的目标cpu,默认是所有cpu。 +* **osnoise/period\_us:** osnoise线程的周期。默认是1000000ms,即1s。 +* **osnoise/runtime\_us:** osnoise线程在一个周期内的采样时间。默认是1000000ms,即1s。 +* **osnoise/stop\_tracing\_us:** 当单个噪声的最大值超过这个阀值时,停止采样。默认为0,即关闭该选项。 +* **osnoise/stop\_tracing\_total\_us:** 当总计噪声超过这个阀值时,停止采样。默认为0,即关闭该选项。 +* **tracing\_thresh**: 两次轮询TSC寄存器时间之差,被认为是噪声的最小值,单位为us。当配置为0时,默认设为5us。 + + +### 2.2 使用方法 + + +1. 将osnoise写入的current\_tracer: + + +`echo osnoise > /sys/kernel/debug/tracing/current_tracer` + + +2. 打开traceing\_on: + + +`echo 1 > /sys/kernel/debug/tracing/tracing_on` + + +3. 查看trace结果: + + +`cat /sys/kernel/debug/tracing/trace` + + + + + +![](assets/Ftrace:_osnoise_总览/img_2.png) + + +这里显示的是系统整体采样的结果各个字段的含义如下: + + +* TASK-PID:采样线程的PID。 +* CPU:采样的CPU ID +* TIMESTAMP:时间戳 +* RUNTIME IN US:采样时间,单位us +* NOISE IN US:本次采样时间内的总计噪声时间,单位us。 +* %OF CPU AVAILABLE:在一个RUNTIME周期内,采样线程可以获得的cpu利用率。 +* HW、NMI、IRQ、SIRQ、THREAD:分别表示各类噪声事件发生的次数。 + + +## 三、osnoise trace\_point + + +### 3.1 trace\_point + + +osnoise除了提供tracer外,还提供了一组trace\_points,以协助开发人员对噪声进行进一步分析。可以在`/sys/kernel/debug/tracing/events/osnoise/`看到相关tracepoint: + + +* **sample\_threshold:** 追踪任何高于阀值的噪声事件。阀值即为上文提到的tracing\_thresh,默认为5us。 +* **nmi\_noise:** nmi噪声,包含其持续时间。 +* **irq\_noise:** irq噪声,包含其持续时间。 +* **softirq\_noise:** softirq噪声,包含其持续时间 +* **thread\_noise:** 其他线程噪声,包含其持续时间 + + +### 3.2 使用方法 + + +前面我们已经介绍了osnoise tracer的使用,它可以让我们直观的看到整个系统级别的各种噪声事件的总和。如果我们像看到每种噪声或者是说指定噪声类型的事件的详细信息,就需要用到osnoise提供的trace\_point。 + + +打开trace\_point总开关: + + +`echo 1 > /sys/kernel/debug/tracing/events/osnoise/enable` + + +查看trace日志: + + +`cat /sys/kernel/debug/tracing/trace` + + +输出如下所示: + + +![](assets/Ftrace:_osnoise_总览/img_3.png) + + + +日志中包含了所有噪声的详细信息,包括其名字,开始事件,持续时间等等。关于其输出的具体格式可以查看对应trace\_point文件夹下的format文件。 + + +trace\_ponit文件位置在`/sys/kernel/debug/tracing/events/osnoise/`下。 + + +除了总开关外,每个事件有自己单独的开关,在对应tracepoint目录下。如irq\_noise的开关为`/sys/kernel/debug/tracing/events/osnoise/irq_noise/enable`。用户可以根据自己的需求只追踪相应的事件,从而过滤掉其他不需要关注的信息。 + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace\357\274\232_osnoise_\344\273\243\347\240\201\345\210\206\346\236\220.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace\357\274\232_osnoise_\344\273\243\347\240\201\345\210\206\346\236\220.md" new file mode 100644 index 00000000..d8d8d5f7 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace\357\274\232_osnoise_\344\273\243\347\240\201\345\210\206\346\236\220.md" @@ -0,0 +1,641 @@ +![](assets/Ftrace:_osnoise_代码分析/img_0.png) + + +前面一篇文章中,我们简要的介绍了一下osnoise的相关信息,本篇文章主要针对其源代码进行分析阐述。 + + + +# 一、数据结构: + + + +``` +/* + * NMI runtime info. + */ +struct osn_nmi { + u64 count; + u64 delta_start; +}; + +/* + * IRQ runtime info. + */ +struct osn_irq { + u64 count; + u64 arrival_time; + u64 delta_start; +}; + +#define IRQ_CONTEXT 0 +#define THREAD_CONTEXT 1 +/* + * sofirq runtime info. + */ +struct osn_softirq { + u64 count; + u64 arrival_time; + u64 delta_start; +}; + +/* + * thread runtime info. + */ +struct osn_thread { + u64 count; + u64 arrival_time; + u64 delta_start; +}; + +/* + * Runtime information: this structure saves the runtime information used by + * one sampling thread. + */ +struct osnoise_variables { + struct task_struct *kthread; + bool sampling; + pid_t pid; + struct osn_nmi nmi; + struct osn_irq irq; + struct osn_softirq softirq; + struct osn_thread thread; + local_t int_counter; +}; +``` + + +osnoise用来记录结果的主要数据结构为`struct osnoise_variables`其中: + + ++ `struct task_struct *kthread`:采样线程的tcb。 ++ `bool sampling`:采样开关 ++ `pit_t pid`:采样线程的pid ++ `struct osn_nmi nmi`:保存nmi噪声的相关信息 ++ `struct osn_irq irq`:保存irq噪声的相关信息 ++ `struct osn_softiq softirq`:保存softirq噪声的相关信息 ++ `struct osn_thread thread`:保存其他线程噪声的相关信息 ++ `local_t int_counter`:保存噪声的总次数 + + + +# 二、工作原理: + + +## 2.1 注册trace\_point + + +如第一篇文章所述,osnoise引入了一组trace\_point。通过这些trace\_point,开发人员可以获取噪声的详细信息。注册trace\_point的代码如下(以irq\_noise为例): + + + +``` +TRACE_EVENT(irq_noise, + + TP_PROTO(int vector, const char *desc, u64 start, u64 duration), + + TP_ARGS(vector, desc, start, duration), + + TP_STRUCT__entry( + __field( u64, start ) + __field( u64, duration) + __string( desc, desc ) + __field( int, vector ) + + ), + + TP_fast_assign( + __assign_str(desc, desc); + __entry->vector = vector; + __entry->start = start; + __entry->duration = duration; + ), + + TP_printk("%s:%d start %llu.%09u duration %llu ns", + __get_str(desc), + __entry->vector, + __print_ns_to_secs(__entry->start), + __print_ns_without_secs(__entry->start), + __entry->duration) +); +``` + + +关于trace\_point这里我们不做过多介绍,感兴趣的读者可以去内核文件`include/trace/events/osnoise.h`下查看相应源代码。 + + +## 2.2 注册osnoise tracer + + +这部分主要是涉及到osnoise的初始化过程,该过程主要就是将osnoise注册近ftrace中并且初始化相关的tracefs。注册的过程通过`register_tracer(&osnoise_tracer)`实现。 + + + +``` +static struct tracer osnoise_tracer __read_mostly = { + .name = "osnoise", + .init = osnoise_tracer_init, + .reset = osnoise_tracer_reset, + .start = osnoise_tracer_start, + .stop = osnoise_tracer_stop, + .print_header = print_osnoise_headers, + .allow_instances = true, +}; +``` + + +## 2.3 注册tracepoint钩子函数: + + +osnoise 统计信息的方式就是通过在相应的tracepoint中注册钩子函数。因此这部分即是osnoise的核心部分,本篇文章将重点分析该模块。 + + +osnoise首先会将各种事件的钩子函数插入对应的tracepoint中,这一动作由`osnoise_hook_events()`函数执行,将该函数裁剪后如下: + + + +``` +static int osnoise_hook_events(void) +{ + ... + retval = hook_irq_events(); + ... + retval = hook_softirq_events(); + ... + retval = hook_thread_events(); + ... +} +``` + + +该函数主要是针对irq、softirq、thread事件插入一些采样函数。 + + +### hook\_irq\_events + + +hook\_irq\_events()主要是实现对irq事件的统计。如下: + + + +``` +static int hook_irq_events(void) +{ + ... + ret = register_trace_irq_handler_entry(trace_irqentry_callback, NULL); + ... + ret = register_trace_irq_handler_exit(trace_irqexit_callback, NULL); + ... +} +``` + + +主要是在irq\_handler\_entry 和 irq\_handler\_exit处插入相应的处理函数。最终插入的处理函数为osnoise\_trace\_irq\_entry() 和 osnoise\_trace\_irq\_exit()。 + + + +``` +void osnoise_trace_irq_entry(int id) +{ + struct osnoise_variables *osn_var = this_cpu_osn_var(); + + if (!osn_var->sampling) + return; + + osn_var->irq.arrival_time = time_get(); + set_int_safe_time(osn_var, &osn_var->irq.delta_start); + osn_var->irq.count++; + + local_inc(&osn_var->int_counter); +} +void osnoise_trace_irq_exit(int id, const char *desc) +{ + struct osnoise_variables *osn_var = this_cpu_osn_var(); + int duration; + + if (!osn_var->sampling) + return; + + duration = get_int_safe_duration(osn_var, &osn_var->irq.delta_start); + trace_irq_noise(id, desc, osn_var->irq.arrival_time, duration); + osn_var->irq.arrival_time = 0; + cond_move_softirq_delta_start(osn_var, duration); + cond_move_thread_delta_start(osn_var, duration); +} +``` + + +在irq handler的入口处插入的函数为osnoise\_trace\_irq\_entry,分析该函数: + + ++ 在irq.arrival\_time中记录本次irq事件的开始时间。 ++ 在irq.delta\_start中记录本次irq事件的准确开始时间。 ++ irq噪声事件的次数+1。 ++ 噪声事件总体次数+1。 + + +在这里我们发现,除了在irq.arrival\_time中记录了一个irq开始时间之外,还通过set\_int\_safe\_time函数在 irq.delta\_start中都记录了一个开始时间。那么他们之间有什么区别呢?在这里我们先按下不表,后文会对其进行解释分析。 + + +在irq handler的出口处插入的函数为osnoise\_trace\_irq\_exit,该函数的主要作用: + + ++ 根据之前记录的osn\_var->irq.delta\_start计算出本次irq事件的持续时间。 ++ 调用trace\_irq\_noise将本次irq事件的**中断号,中断名称、开始时间、持续时间**放到ftrace的ringbuffer中。 ++ 清空osn\_var->irq.arrival\_time 表示此次irq事件结束。 + + +我们注意到在该函数的末尾处有cond\_move\_softirq\_delta\_start 以及 cond\_move\_thread\_delta\_start函数。其实形如此类的函数一共有三个: + + ++ cond\_move\_irq\_delta\_start ++ cond\_move\_softirq\_delta\_start ++ cond\_move\_thread\_delta\_start + + +函数的形式都是一样的,我们以 cond\_move\_softirq\_delta\_start()为例: + + + +``` +static inline void +cond_move_softirq_delta_start(struct osnoise_variables *osn_var, u64 duration) +{ + if (osn_var->softirq.delta_start) + osn_var->softirq.delta_start += duration; +} +``` + + ++ 这个函数会在osnoise\_trace\_irq\_exit、trace\_osnoise\_callback中调用,前者我们知道是irq事件退出时的钩子函数,而后者则是nmi事件的钩子函数。 ++ 可以看到该函数的主要功能是将softirq.delta\_start的开始时间推后一个duration。 + + +换句话说,这个函数是为了校准低优先级事件的开始时间。以下图为例: + + ++ 在t1时刻进入了softirq,此时记录**softirq.arrival\_time = t1**,**softirq.delta\_time = t1**。 ++ 然后在t2时刻,来了一个irq抢占了softirq,进入irq的执行函数。 ++ t3时刻离开irq执行完毕继续执行softirq。irq执行时间**duration = t3-t2**。同时调用cond\_move\_softirq\_delta\_start,更新softirq开始时间**softirq.delta\_start += duration;** ++ 在t4时刻softirq执行完毕退出。 + + +那么本次softirq的持续时间实际上应该是t4 - (t1 + duration) = t4 - **softirq.delta\_start。** + + +![](assets/Ftrace:_osnoise_代码分析/img_1.png) + +因此,需要高优先级的对低优先级的事件的时间进行校准。 + + ++ 对于nmi事件,需要调用 + + +- cond\_move\_irq\_delta\_start +- cond\_move\_softirq\_delta\_start +- cond\_move\_thread\_delta\_start + + ++ 对于irq事件,需要调用 + + +- cond\_move\_softirq\_delta\_start +- cond\_move\_thread\_delta\_start + + ++ 对于softirq事件,需要调用 + + +- cond\_move\_thread\_delta\_start + + +### hook\_softirq\_events + + +与irq的钩子函数一样,需要注册tracepoint softirq\_entry、softirq\_exit的钩子函数。最终注册的钩子函数如下: + + + +``` +static void trace_softirq_entry_callback(void *data, unsigned int vec_nr) +{ + struct osnoise_variables *osn_var = this_cpu_osn_var(); + + if (!osn_var->sampling) + return; + + osn_var->softirq.arrival_time = time_get(); + set_int_safe_time(osn_var, &osn_var->softirq.delta_start); + osn_var->softirq.count++; + + local_inc(&osn_var->int_counter); +} +static void trace_softirq_exit_callback(void *data, unsigned int vec_nr) +{ + struct osnoise_variables *osn_var = this_cpu_osn_var(); + int duration; + + if (!osn_var->sampling) + return; + + if (unlikely(timerlat_enabled())) + if (!timerlat_softirq_exit(osn_var)) + return; + + duration = get_int_safe_duration(osn_var, &osn_var->softirq.delta_start); + trace_softirq_noise(vec_nr, osn_var->softirq.arrival_time, duration); + cond_move_thread_delta_start(osn_var, duration); + osn_var->softirq.arrival_time = 0; +} +``` + + +可以发现对softirq的统计方式与对irq的统计方式一摸一样,在这里我们便不做详细分析,读者可以参考上面对hook\_irq\_events()的分析。 + + +### hook\_thread\_events + + +osnoise通过在tracepoint sched\_switch注册钩子函数,来统计thread noise。函数如下所示: + + + +``` +static void +trace_sched_switch_callback(void *data, bool preempt, + struct task_struct *p, + struct task_struct *n, + unsigned int prev_state) +{ + struct osnoise_variables *osn_var = this_cpu_osn_var(); + + if (p->pid != osn_var->pid) + thread_exit(osn_var, p); + + if (n->pid != osn_var->pid) + thread_entry(osn_var, n); +} +static void +thread_entry(struct osnoise_variables *osn_var, struct task_struct *t) +{ + if (!osn_var->sampling) + return; + /* + * The arrival time will be used in the report, but not to compute + * the execution time, so it is safe to get it unsafe. + */ + osn_var->thread.arrival_time = time_get(); + + set_int_safe_time(osn_var, &osn_var->thread.delta_start); + + osn_var->thread.count++; + local_inc(&osn_var->int_counter); +} +static void +thread_exit(struct osnoise_variables *osn_var, struct task_struct *t) +{ + int duration; + + if (!osn_var->sampling) + return; + + if (unlikely(timerlat_enabled())) + if (!timerlat_thread_exit(osn_var)) + return; + + duration = get_int_safe_duration(osn_var, &osn_var->thread.delta_start); + + trace_thread_noise(t, osn_var->thread.arrival_time, duration); + + osn_var->thread.arrival_time = 0; +} +``` + + +sched\_switch()为线程切换的核心函数,在该trace\_sched\_switch函数中的p表示前一个线程,n表示下一个要执行的线程,即从线程p切换到线程n。 + + +此时存在三种情况: + + ++ 从采样线程切换到其他线程 + + +- 执行thread\_entry()函数,标志一个噪声的进入 + + ++ 从其他线程切换到采样线程 + + +- 执行thread\_exit()函数,标志上一个噪声的结束 + + ++ 从其他线程切换到其他线程 + + +- 先执行thread\_exit()函数,标志上一个噪声的结束 +- 再执行thread\_entry()函数,标志下一个噪声的进入 + + +换句话说,该钩子函数会统计除了采样线程外其他所有线程执行的时间。其中thread\_entry()和thread\_exit()的具体实现与上面对irq事件统计的函数实现类似,此处不再过多赘述。 + + +### nmi\_events + + +对于NMI事件的统计比较特殊,在ftrace\_nmi\_enter和ftrace\_nmi\_exit中直接调用trace\_osnoise\_callback获取nmi noise,并且调用trace\_nmi\_noise将duration放到ftrace的ringbuffer中。 + + + +``` +static inline void ftrace_nmi_exit(void) +{ + ... + if (trace_osnoise_callback_enabled) + trace_osnoise_callback(false); + ... +} +static inline void ftrace_nmi_exit(void) +{ + ... + if (trace_osnoise_callback_enabled) + trace_osnoise_callback(false); + ... +} +void trace_osnoise_callback(bool enter) +{ + struct osnoise_variables *osn_var = this_cpu_osn_var(); + u64 duration; + + if (!osn_var->sampling) + return; + + /* + * Currently trace_clock_local() calls sched_clock() and the + * generic version is not NMI safe. + */ + if (!IS_ENABLED(CONFIG_GENERIC_SCHED_CLOCK)) { + if (enter) { + osn_var->nmi.delta_start = time_get(); + local_inc(&osn_var->int_counter); + } else { + duration = time_get() - osn_var->nmi.delta_start; + + trace_nmi_noise(osn_var->nmi.delta_start, duration); + + cond_move_irq_delta_start(osn_var, duration); + cond_move_softirq_delta_start(osn_var, duration); + cond_move_thread_delta_start(osn_var, duration); + } + } + + if (enter) + osn_var->nmi.count++; +} +``` + + +主要函数为trace\_osnoise\_callback(bool enter),该函数通过一个bool值来判断当前是进入nmi中断还是退出nmi中断,进而进行相应的处理,统计方法和其他事件统计方法一直。可以看到在NMI的钩子函数中,会调用到 + + ++ cond\_move\_irq\_delta\_start(osn\_var, duration); ++ cond\_move\_softirq\_delta\_start(osn\_var, duration); ++ cond\_move\_softirq\_delta\_start(osn\_var, duration); + + +这三个函数去校准其他低优先级事件的统计。与我们之前的分析一致。 + + +## 2.4 采样 + + +上面介绍了osnoise对各类事件采样的方法,接下来,我们分析一下osnoise的采样流程。osnoise开始采样的函数调用流程为osnoise\_tracer\_start->osnoise\_workload\_start->start\_per\_cpu\_kthreads->start\_kthread->osnoise\_main->run\_osnoise。 + + + +采样的核心函数为run\_osnoise,将代码裁剪后如下: + + + +``` +static int run_osnoise(void) +{ + ... + + threshold = tracing_thresh ? : 5000; + + osn_var->sampling = true; + + runtime = osnoise_data.sample_runtime * NSEC_PER_USEC; + + stop_in = osnoise_data.stop_tracing * NSEC_PER_USEC; + + start = time_get(); + + last_int_count = set_int_safe_time(osn_var, &last_sample); + + do { + + int_count = set_int_safe_time(osn_var, &sample); + + noise = time_sub(sample, last_sample); + + total = time_sub(sample, start); + + if (total < last_total) { + osnoise_taint("total overflow!"); + break; + } + + last_total = total; + + if (noise >= threshold) { + int interference = int_count - last_int_count; + + if (noise > max_noise) + max_noise = noise; + + if (!interference) + hw_count++; + + sum_noise += noise; + + trace_sample_threshold(last_sample, noise, interference); + + if (osnoise_data.stop_tracing) + if (noise > stop_in) + osnoise_stop_tracing(); + } + + last_sample = sample; + last_int_count = int_count; + + } while (total < runtime && !kthread_should_stop()); + + osn_var->sampling = false; + + ... +} +``` + + + +分析采样函数的主体逻辑流程图如下所示: + + +![](assets/Ftrace:_osnoise_代码分析/img_2.png) + + +即通过不断的轮询TSC寄存器,将每次轮询的间隙与预设的threshold进行对比,判断是否发生噪声,如果发生了噪声且噪声不是由其他可测量事件所造成的,就认为发生了硬件噪声。 + + +其中: + + +* threshold :两次轮询TSC寄存器时间之差,被认为是噪声的最小值,默认设为5us。 +* osn\_var->sampling:标志位,标志是否开启采样。 +* runtime:预设的本次采样时间。 +* start :记录本次采样开始的时间 +* last\_sample : 记录上次读取tsc寄存器的值 +* sample : 记录本次读取tsc寄存器的值 +* noise = time\_sub(sample, last\_sample) : 计算本次和上次轮询tsc寄存器的时间之差。 +* total :记录从采样开始到现在所经历的时间 +* 如果noise >= threshold,则视为发生了噪声,进行统计计算 + + ++ max\_noise: 记录最大的单个噪声值 ++ interference: 记录本次噪声内事件发生的次数,如果为0则代表是硬件噪声。 ++ hw\_count: 记录硬件噪声的次数,当interference为0时,增加。 + + +* 轮询tsc寄存器,直到total>=runtime,结束本次采样。 + + + +# 三、小结 + + +以上便是对osnoise的代码分析。osnoise就是站在一个普通进程的视角上,统计所有会打断他的事件,包含irq、softirq、nmi、thread、hw。 + + +对于前四种事件内核中都提供了相应的tracepoint,只需要注册相应的回掉函数到tracepoint中即可统计到相关的信息。而hw无法被直接统计测量,因此在osnoise中就通过不断的轮询tsc寄存器,将任意两次轮询的差值与threshold进行比较,如果大于threshold就认为发生了噪声,当发生噪声时如果其他四个事件都未发生就认为发生了硬件延迟。 + + +由于irq、softirq、nmi、thread都有相应的tracepoint可以供我们使用,在不考虑hw的情况下我们其实可以直接在用户态实现相关信息的采集。下篇文章我们会尝试在用户态,利用bcc通过动态插桩的方式来实现一个简单的osnoise背景噪声统计工具。 + + + + + + + + + + + + + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace\357\274\232_osnoise_\346\200\273\350\247\210.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace\357\274\232_osnoise_\346\200\273\350\247\210.md" new file mode 100644 index 00000000..782c9a33 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Ftrace\357\274\232_osnoise_\346\200\273\350\247\210.md" @@ -0,0 +1,179 @@ + + + +# Ftrace: osnoise 总览 + + + + + + + + +![](assets/Ftrace:_osnoise_总览/img_0.png) + + +## 一、osnoise是什么? + + + + +在linux系统中,一个普通线程在执行过程中会被各种各样的事件所干扰打断,如NMI、IRQ、SOFTIRQ、来自硬件的干扰以及来自其他线程的干扰。这些事件对于一个普通线程来说,就相当于噪声一样的存在。在Linux 5.14-rc1中,引入了一个新的tracer——osnoise tracer。osnoise从一个线程的视角出发,统计出所有对他有干扰的噪声,进而协助开发人员分析系统背景噪声情况。 + + +### 1.1 噪声分类 + + +在osnoise tracer中,将统计的噪声分为了以下五个大类: + + ++ IRQ:硬中断 ++ SOFTIRQ:软中断 ++ NMI:不可屏蔽中断 ++ HW:来自硬件的噪声。 ++ THREAD:来自其他线程的影响。 + + +其中,HW(hardware latency)表示某些底层硬件或者固件的行为引起的大型系统延迟。在Ftrace中,有一个名为hwlat\_detector的tracer,它的主要目的就是用来检测硬件噪声。osnoise的设计思想借鉴了hwlat\_detector。 + + +### 1.2 hwlat + + +hwlat\_detector的工作原理简单来说就是在一段时间内,关闭irq、softirq以及抢占,然后不断的去轮询TSC(Time Stamp Counter)寄存器的值。由于关闭了中断及抢占,任意两次读取之间的间隙都是由于硬件噪声或者来自其他不可屏蔽中断的噪声(NMI)。 + + +如图所示: + + +![](assets/Ftrace:_osnoise_总览/img_1.png) + + +在一段时间内,采样线程不断的去循环读取TSC寄存器,在一个循环内会连续读取两次TSC寄存器。假设本次循环读取的时间分别为t1、t2,上次循环读取的时间为last\_t1、last\_t2。则: + + ++ t1与t2的时间之差,last\_t1、last\_t2的时间之差,称为inner\_latency。 ++ t1与last\_t2的时间之差,称为outer\_latency。 ++ tracing\_thresh为预设的阀值,如果观察到任何超过阀值的延迟就认为发生了噪声事件。 ++ 在hwlat中,会不断的计算inner\_latency和outer\_latency。然后将其值与预设的tracing\_thresh值进行对比,如果大于tracing\_thresh,就认为发生了噪声事件。 ++ 在hwlat采样期间,会同时追踪nmi中断事件。因此,观察到的任何超过阀值的延迟如果不是nmi造成的,那么就认为是hardware latency。 + + +### 1.3 osnoise实现 + + +前面我们介绍了hwlat的实现。简而言之,hwlat关闭irq、softirq、抢占等事件,通过不断的轮询TSC寄存器以及追踪NMI中断来探测延迟事件,观察到的任何延迟都是由NMI或者硬件造成的。 + + +osnoise的实现思想和hwlat类似,不过osnoise不会关闭irq、softirq、抢占等事件,而是在采样的同时追踪各类事件。在irq\_handler\_entry、irq\_handler\_exit、softirq\_entry、softirq\_exit、sched\_switch、nmi\_enter、nmi\_exit处也插入相应的钩子函数。进而统计出各类事件发生的次数以及持续时间。如果观测到的任意延迟不是由以上时间造成的,那么就认为是硬件噪声。 + + +## 二、osnoise tracer + + +### 2.1 配置文件 + + +osnoise在`/sys/kernel/debug/tracing/` 目录下有一系列可配置文件, 含义如下: + + +* **osnoise/cpus:** osnoise采样的目标cpu,默认是所有cpu。 +* **osnoise/period\_us:** osnoise线程的周期。默认是1000000ms,即1s。 +* **osnoise/runtime\_us:** osnoise线程在一个周期内的采样时间。默认是1000000ms,即1s。 +* **osnoise/stop\_tracing\_us:** 当单个噪声的最大值超过这个阀值时,停止采样。默认为0,即关闭该选项。 +* **osnoise/stop\_tracing\_total\_us:** 当总计噪声超过这个阀值时,停止采样。默认为0,即关闭该选项。 +* **tracing\_thresh**: 两次轮询TSC寄存器时间之差,被认为是噪声的最小值,单位为us。当配置为0时,默认设为5us。 + + +### 2.2 使用方法 + + +1. 将osnoise写入的current\_tracer: + + +`echo osnoise > /sys/kernel/debug/tracing/current_tracer` + + +2. 打开traceing\_on: + + +`echo 1 > /sys/kernel/debug/tracing/tracing_on` + + +3. 查看trace结果: + + +`cat /sys/kernel/debug/tracing/trace` + + + + + +![](assets/Ftrace:_osnoise_总览/img_2.png) + + +这里显示的是系统整体采样的结果各个字段的含义如下: + + +* TASK-PID:采样线程的PID。 +* CPU:采样的CPU ID +* TIMESTAMP:时间戳 +* RUNTIME IN US:采样时间,单位us +* NOISE IN US:本次采样时间内的总计噪声时间,单位us。 +* %OF CPU AVAILABLE:在一个RUNTIME周期内,采样线程可以获得的cpu利用率。 +* HW、NMI、IRQ、SIRQ、THREAD:分别表示各类噪声事件发生的次数。 + + +## 三、osnoise trace\_point + + +### 3.1 trace\_point + + +osnoise除了提供tracer外,还提供了一组trace\_points,以协助开发人员对噪声进行进一步分析。可以在`/sys/kernel/debug/tracing/events/osnoise/`看到相关tracepoint: + + +* **sample\_threshold:** 追踪任何高于阀值的噪声事件。阀值即为上文提到的tracing\_thresh,默认为5us。 +* **nmi\_noise:** nmi噪声,包含其持续时间。 +* **irq\_noise:** irq噪声,包含其持续时间。 +* **softirq\_noise:** softirq噪声,包含其持续时间 +* **thread\_noise:** 其他线程噪声,包含其持续时间 + + +### 3.2 使用方法 + + +前面我们已经介绍了osnoise tracer的使用,它可以让我们直观的看到整个系统级别的各种噪声事件的总和。如果我们像看到每种噪声或者是说指定噪声类型的事件的详细信息,就需要用到osnoise提供的trace\_point。 + + +打开trace\_point总开关: + + +`echo 1 > /sys/kernel/debug/tracing/events/osnoise/enable` + + +查看trace日志: + + +`cat /sys/kernel/debug/tracing/trace` + + +输出如下所示: + + +![](assets/Ftrace:_osnoise_总览/img_3.png) + + + +日志中包含了所有噪声的详细信息,包括其名字,开始事件,持续时间等等。关于其输出的具体格式可以查看对应trace\_point文件夹下的format文件。 + + +trace\_ponit文件位置在`/sys/kernel/debug/tracing/events/osnoise/`下。 + + +除了总开关外,每个事件有自己单独的开关,在对应tracepoint目录下。如irq\_noise的开关为`/sys/kernel/debug/tracing/events/osnoise/irq_noise/enable`。用户可以根据自己的需求只追踪相应的事件,从而过滤掉其他不需要关注的信息。 + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257CONSOLE_\344\273\243\347\240\201\345\210\206\346\236\220.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257CONSOLE_\344\273\243\347\240\201\345\210\206\346\236\220.md" new file mode 100644 index 00000000..41ecbb17 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257CONSOLE_\344\273\243\347\240\201\345\210\206\346\236\220.md" @@ -0,0 +1,558 @@ +![](assets/Pstore前端:CONSOLE_代码分析/img_0.png) + + +作者:新绎 + + + +# 写在前面 + + +pstore中提供了多种前端来实现捕获各种系统信息来加以调试。这篇文章中,我们会对pstore其中之一的前端`PSTORE\_CONSOLE`进行分析,从原理上分析pstore如何获取kernel printk的信息。 + + +# pstore console注册 + + +`pstore console`前端注册函数在`fs/pstore/platform.c`中被定义,通过后端初始化过程中被调用并注册,从而能够在系统执行`prink`时获取输出信息,并通过`write`方法将`prink`的输出写入到相应的后端当中。 + + + +``` +static void pstore_console_write(struct console *con, const char *s, unsigned c) +{ + struct pstore_record record; + + if (!c) + return; + + pstore_record_init(&record, psinfo); + record.type = PSTORE_TYPE_CONSOLE; + + record.buf = (char *)s; + record.size = c; + psinfo->write(&record); +} + +static struct console pstore_console = { + .write = pstore_console_write, + .index = -1, +}; + +static void pstore_register_console(void) +{ + /* Show which backend is going to get console writes. */ + strscpy(pstore_console.name, psinfo->name, + sizeof(pstore_console.name)); + /* + * Always initialize flags here since prior unregister_console() + * calls may have changed settings (specifically CON_ENABLED). + */ + pstore_console.flags = CON_PRINTBUFFER | CON_ENABLED | CON_ANYTIME; + register_console(&pstore_console); +} +``` + + +其中,pstore\_console的flag开启了3个选项:`CON\_PRINTBUFFER`,`CON\_ENABLED`和`CON\_ANYTIME`。 + + +`CON\_PRINTBUFFER`:只有开启了才会接受prink的输出 + + +`CON\_ENABLED`:console使能,如果没有开启这个flag需要手动使能(在cmdline中定义) + + +`CON\_ANYTIME`:可以在cpu离线时进行调用 + + + +``` +//console.h +/* + * The interface for a console, or any other device that wants to capture + * console messages (printer driver?) + * + * If a console driver is marked CON_BOOT then it will be auto-unregistered + * when the first real console is registered. This is for early-printk drivers. + */ + +#define CON_PRINTBUFFER (1) +#define CON_CONSDEV (2) /* Last on the command line */ +#define CON_ENABLED (4) +#define CON_BOOT (8) +#define CON_ANYTIME (16) /* Safe to call when cpu is offline */ +#define CON_BRL (32) /* Used for a braille device */ +#define CON_EXTENDED (64) /* Use the extended output format a la /dev/kmsg */ + +struct console { + char name[16]; + void (*write)(struct console *, const char *, unsigned); + int (*read)(struct console *, char *, unsigned); + struct tty_driver *(*device)(struct console *, int *); + void (*unblank)(void); + int (*setup)(struct console *, char *); + int (*match)(struct console *, char *name, int idx, char *options); + short flags; + short index; + int cflag; + void *data; + struct console *next; +}; +``` + + +# printk总览 + + +![](assets/Pstore前端:CONSOLE_代码分析/img_1.png) + + + +# printk向console输出过程分析 + + +pstore中注册好console之后,console会被动地获取printk的输出,接下来我们分析printk是对console进行输出。 + + +## cmdline解析 + + +如果console的flag中定义了`CON\_ENABLED`,那么console会默认使能。如果没有定义,则需要在cmdline中手动使能。 + + +`kernel/printk.c`中将`'console='`的解析函数`console\_setup`注册到`obs\_kernel\_param`,在kernel启动过程中会遍历所有`obs\_kernel\_param`,接着会调用`console\_setup`来解析。 + + +我们通过在cmdline中定义`console=xxx`则能够被`console\_setup`所解析并使能相应的console。 + + + +参数是`'console='`的值字符串,如“ttyS0,115200”,`console\_setup`对`console=`参数值做解析,以ttyS0,115200为例,`buf=“ttyS”`,`idx=0`,`options="115200"`,`brl\_options=NULL`。 + + + +``` +//printk.c 解析cmdline +/* + * Set up a console. Called via do_early_param() in init/main.c + * for each "console=" parameter in the boot command line. + */ +static int __init console_setup(char *str) +{ + char buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for "ttyS" */ + char *s, *options, *brl_options = NULL; + int idx; + + if (_braille_console_setup(&str, &brl_options)) + return 1; + + /* + * Decode str into name, index, options. + */ + if (str[0] >= '0' && str[0] <= '9') { + strcpy(buf, "ttyS"); + strncpy(buf + 4, str, sizeof(buf) - 5); + } else { + strncpy(buf, str, sizeof(buf) - 1); + } + buf[sizeof(buf) - 1] = 0; + options = strchr(str, ','); + if (options) + *(options++) = 0; +#ifdef __sparc__ + if (!strcmp(str, "ttya")) + strcpy(buf, "ttyS0"); + if (!strcmp(str, "ttyb")) + strcpy(buf, "ttyS1"); +#endif + for (s = buf; *s; s++) + if (isdigit(*s) || *s == ',') + break; + idx = simple_strtoul(s, NULL, 10); + *s = 0; + + __add_preferred_console(buf, idx, options, brl_options); + console_set_on_cmdline = 1; + return 1; +} +__setup("console=", console_setup); +``` + + +`console\_setup`最后调用`\_\_add\_preferred\_console`: + + +kernel利用结构体数组`console\_cmdline[8]`,最多可支持8个cmdline传入的console参数。 + + +`\_\_add\_preferred\_console`将name,idx,options保存到数组下一个成员`console\_cmdline`结构体中,如果数组中已有重名,则不添加,并置`selected\_console`为最新添加的`console\_cmdline`的下标。 + + + +**一个例子:** + + +如cmdline中有“console=ttyS0,115200 console=ttyS1,9600” + + +则在`console\_cmdline[8]`数组中`console\_cmdline[0]`代表ttyS0,`console\_cmdline[1]`代表ttyS1,而`preferred\_console=1`。 + + + +``` +//printk.c __add_preferred_console +static int __add_preferred_console(char *name, int idx, char *options, + char *brl_options) +{ + struct console_cmdline *c; + int i; + + /* + * See if this tty is not yet registered, and + * if we have a slot free. + */ + for (i = 0, c = console_cmdline; + i < MAX_CMDLINECONSOLES && c->name[0]; + i++, c++) { + if (strcmp(c->name, name) == 0 && c->index == idx) { + if (!brl_options) + preferred_console = i; + return 0; + } + } + if (i == MAX_CMDLINECONSOLES) + return -E2BIG; + if (!brl_options) + preferred_console = i; + strlcpy(c->name, name, sizeof(c->name)); + c->options = options; + braille_set_options(c, brl_options); + + c->index = idx; + return 0; +} +``` + + +## printk console选择 + + +printk内容会一直存在log\_buf中,log\_buf满了之后则会从头在开始存,覆盖掉原来的数据。 + + +log\_buf的大小由kernel `menuconfig`中的`CONFIG\_LOG\_BUF\_SHIFT`配置。 + + +根据printk的实现原理,printk最后调用`console\_unlock`实现log\_buf数据刷出到设备。 + + +kernel下每次printk打印,首先存log\_buf,然后遍历console\_drivers,找到合适console(如果有`execlusive\_console`,则往`execlusive\_console`写,如果没有,则为所有使能的console),刷出log。 + + +**默认情况下**`**execlusive\_console=NULL**`,所以printk默认是向所有enable的console写 + + +只有一种情况是指定`execlusive\_console`,就是在console注册时 + + + +``` +//printk.c call_console_drivers +/* + * Call the console drivers, asking them to write out + * log_buf[start] to log_buf[end - 1]. + * The console_lock must be held. + */ +static void call_console_drivers(const char *ext_text, size_t ext_len, + const char *text, size_t len) +{ + struct console *con; + + trace_console_rcuidle(text, len); + + if (!console_drivers) + return; + + for_each_console(con) { + if (exclusive_console && con != exclusive_console) + continue; + if (!(con->flags & CON_ENABLED)) + continue; + if (!con->write) + continue; + if (!cpu_online(smp_processor_id()) && + !(con->flags & CON_ANYTIME)) + continue; + if (con->flags & CON_EXTENDED) + con->write(con, ext_text, ext_len); + else + con->write(con, text, len); + } +} +``` + + +## printk console注册 + + +注意:linux提供了early console机制(通过`CONFIG\_EARLY\_PRINTK`进行使能),用于实现为设备注册console之前的早期log的输出,对应console也称为boot console,简称bcon。这个console在kernel启动的早期阶段就会被注册,主要通过输出设备(比如串口设备)的简单的write方法直接进行数据打印。而这个write方法也就是平台实现。这时候作为输出的串口设备是基于bootloader中已经初始化完成的。 + + + +1. 如果注册的是bootconsole(kernel早期启动打印),需要检查console\_drivers中没有real console,也就是说bootconsole必须是第一个注册的console。 +2. 检查new console是否是cmdline指定的console,如果是,则使能(`CON\_ENABLE`)并初始化该console +3. 如果该new console没有使能,退出 +4. 如果new console为bootconsole,则newcon不需要输出register之前的log(`newcon->flags &= ~CON\_PRINTBUFFER`),因为如果bootconsole和new console是同一个设备则会之前的log就输出2次 +5. 把new console加入`console\_drivers`链表,对于置位`CON\_CONSDEV`的console,放在链表首 +6. 加锁 +7. 如果new console置位`CON\_PRINTBUFFER`,则将log全部刷出(暂时修改printk输出的指定唯一`exclusive\_console`为new console,保证将之前的log只输出到new console) +8. 解锁(console\_unlock()会重新把`exclusive\_console`设置为NULL) +9. 如果有bootconsole并且不是作为real console继续使用,则unregister bootconsole(从`console\_drivers`中删掉) + +``` +//printk.c register_console +/* + * The console driver calls this routine during kernel initialization + * to register the console printing procedure with printk() and to + * print any messages that were printed by the kernel before the + * console driver was initialized. + * + * This can happen pretty early during the boot process (because of + * early_printk) - sometimes before setup_arch() completes - be careful + * of what kernel features are used - they may not be initialised yet. + * + * There are two types of consoles - bootconsoles (early_printk) and + * "real" consoles (everything which is not a bootconsole) which are + * handled differently. + * - Any number of bootconsoles can be registered at any time. + * - As soon as a "real" console is registered, all bootconsoles + * will be unregistered automatically. + * - Once a "real" console is registered, any attempt to register a + * bootconsoles will be rejected + */ +void register_console(struct console *newcon) +{ + int i; + unsigned long flags; + struct console *bcon = NULL; + struct console_cmdline *c; + static bool has_preferred; + + if (console_drivers) + for_each_console(bcon) + if (WARN(bcon == newcon, + "console '%s%d' already registered\n", + bcon->name, bcon->index)) + return; + + /* + * before we register a new CON_BOOT console, make sure we don't + * already have a valid console + */ + if (console_drivers && newcon->flags & CON_BOOT) { + /* find the last or real console */ + for_each_console(bcon) { + if (!(bcon->flags & CON_BOOT)) { + pr_info("Too late to register bootconsole %s%d\n", + newcon->name, newcon->index); + return; + } + } + } + + if (console_drivers && console_drivers->flags & CON_BOOT) + bcon = console_drivers; + + if (!has_preferred || bcon || !console_drivers) + has_preferred = preferred_console >= 0; + + /* + * See if we want to use this console driver. If we + * didn't select a console we take the first one + * that registers here. + */ + if (!has_preferred) { + if (newcon->index < 0) + newcon->index = 0; + if (newcon->setup == NULL || + newcon->setup(newcon, NULL) == 0) { + newcon->flags |= CON_ENABLED; + if (newcon->device) { + newcon->flags |= CON_CONSDEV; + has_preferred = true; + } + } + } + + /* + * See if this console matches one we selected on + * the command line. + */ + for (i = 0, c = console_cmdline; + i < MAX_CMDLINECONSOLES && c->name[0]; + i++, c++) { + if (!newcon->match || + newcon->match(newcon, c->name, c->index, c->options) != 0) { + /* default matching */ + BUILD_BUG_ON(sizeof(c->name) != sizeof(newcon->name)); + if (strcmp(c->name, newcon->name) != 0) + continue; + if (newcon->index >= 0 && + newcon->index != c->index) + continue; + if (newcon->index < 0) + newcon->index = c->index; + + if (_braille_register_console(newcon, c)) + return; + + if (newcon->setup && + newcon->setup(newcon, c->options) != 0) + break; + } + + newcon->flags |= CON_ENABLED; + if (i == preferred_console) { + newcon->flags |= CON_CONSDEV; + has_preferred = true; + } + break; + } + + if (!(newcon->flags & CON_ENABLED)) + return; + + /* + * If we have a bootconsole, and are switching to a real console, + * don't print everything out again, since when the boot console, and + * the real console are the same physical device, it's annoying to + * see the beginning boot messages twice + */ + if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV)) + newcon->flags &= ~CON_PRINTBUFFER; + + /* + * Put this console in the list - keep the + * preferred driver at the head of the list. + */ + console_lock(); + if ((newcon->flags & CON_CONSDEV) || console_drivers == NULL) { + newcon->next = console_drivers; + console_drivers = newcon; + if (newcon->next) + newcon->next->flags &= ~CON_CONSDEV; + } else { + newcon->next = console_drivers->next; + console_drivers->next = newcon; + } + + if (newcon->flags & CON_EXTENDED) + if (!nr_ext_console_drivers++) + pr_info("printk: continuation disabled due to ext consoles, expect more fragments in /dev/kmsg\n"); + + if (newcon->flags & CON_PRINTBUFFER) { + /* + * console_unlock(); will print out the buffered messages + * for us. + */ + logbuf_lock_irqsave(flags); + console_seq = syslog_seq; + console_idx = syslog_idx; + /* + * We're about to replay the log buffer. Only do this to the + * just-registered console to avoid excessive message spam to + * the already-registered consoles. + * + * Set exclusive_console with disabled interrupts to reduce + * race window with eventual console_flush_on_panic() that + * ignores console_lock. + */ + exclusive_console = newcon; + exclusive_console_stop_seq = console_seq; + logbuf_unlock_irqrestore(flags); + } + console_unlock(); + console_sysfs_notify(); + + /* + * By unregistering the bootconsoles after we enable the real console + * we get the "console xxx enabled" message on all the consoles - + * boot consoles, real consoles, etc - this is to ensure that end + * users know there might be something in the kernel's log buffer that + * went to the bootconsole (that they do not see on the real console) + */ + pr_info("%sconsole [%s%d] enabled\n", + (newcon->flags & CON_BOOT) ? "boot" : "" , + newcon->name, newcon->index); + if (bcon && + ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV) && + !keep_bootcon) { + /* We need to iterate through all boot consoles, to make + * sure we print everything out, before we unregister them. + */ + for_each_console(bcon) + if (bcon->flags & CON_BOOT) + unregister_console(bcon); + } +} + +EXPORT_SYMBOL(register_console); +``` + + +## printk打印级别 + + +printk可以根据设置的日志级别来确定这个语句最后是否能够打印出来。 + + +查看此文件:`cat /proc/sys/kernel/printk` + + +该文件有四个数字值,它们根据日志记录消息的重要性,定义将其发送到何处。 + + + + 1. 控制台日志级别:优先级高于该值的消息将被打印至控制台 + 2. 默认的消息日志级别:将用该优先级来打印没有优先级的消息 + 3. 最低的控制台日志级别:控制台日志级别可被设置的最小值(最高优先级) + 4. 默认的控制台日志级别:控制台日志级别的缺省值 + +内核中共提供了八种不同的日志级别,在 `linux/kernel.h` 中有相应的宏对应。 + + + +``` +#define KERN_EMERG "<0>" /* systemis unusable */ +#define KERN_ALERT "<1>" /* actionmust be taken immediately */ +#define KERN_CRIT "<2>" /*critical conditions */ +#define KERN_ERR "<3>" /* errorconditions */ +#define KERN_WARNING "<4>" /* warning conditions */ +#define KERN_NOTICE "<5>" /* normalbut significant */ +#define KERN_INFO "<6>" /*informational */ +#define KERN_DEBUG "<7>" /*debug-level messages */ +``` + + +**可以通过在cmdline中加入“loglevel=X”的语句,来调整日志输入级别。**其中X就是我们想要设置的console\_loglevel的值。 + + +# 总结 + + +pstore实现console前端的方式很简单:通过注册一个console并且使能即可实现。 + + +默认情况下,printk会对所有使能的console进行输出,将log\_buf中的数据写入到使能的console当中。 + + +当对pstore的console进行输出时,会触发pstore console的write,将数据写入到相应后端。 + + + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" new file mode 100644 index 00000000..d00e1b42 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" @@ -0,0 +1,210 @@ +![](assets/Pstore前端:DMESG_代码分析/img_0.png) + + +作者:新绎 + + + +## 写在前面 + + +pstore中提供了多种前端来实现捕获各种系统信息从而加以调试。这篇文章中,我们会对pstore其中之一的前端PSTORE\_DMESG进行分析,从原理上分析pstore如何获取当内核发生panic时kmsg信息。 + + +## Pstore注册kmsg\_dumper + + +kmsg\_dumper结构体有两个重要成员:回调函数`dump()`以及相应的`kmsg_dump_reason`。通过对`dump()`进行实现,我们就可以将相应的log信息保存到我们希望保存的地方,并且可以通过`kmsg_dump_reason`来对需要保存的信息进行筛选。 + + + +``` +//kmsg_dump.h +/** +* struct kmsg_dumper - kernel crash message dumper structure +* @list: Entry in the dumper list (private) +* @dump: Call into dumping code which will retrieve the data with +* through the record iterator +* @max_reason: filter for highest reason number that should be dumped +* @registered: Flag that specifies if this is already registered +*/ +struct kmsg_dumper { + struct list_head list; + void (*dump)(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason); + enum kmsg_dump_reason max_reason; + bool active; + bool registered; + + /* private state of the kmsg iterator */ + u32 cur_idx; + u32 next_idx; + u64 cur_seq; + u64 next_seq; +}; + +/* + * Keep this list arranged in rough order of priority. Anything listed after + * KMSG_DUMP_OOPS will not be logged by default unless printk.always_kmsg_dump + * is passed to the kernel. + */ +enum kmsg_dump_reason { + KMSG_DUMP_UNDEF, + KMSG_DUMP_PANIC, + KMSG_DUMP_OOPS, + KMSG_DUMP_EMERG, + KMSG_DUMP_RESTART, + KMSG_DUMP_HALT, + KMSG_DUMP_POWEROFF, +}; +``` + + +我们可以看到,目前有7种定义的`kmsg\_dump\_reason`,而pstore则关心在系统出现panic时的log信息。在pstore的实现中,pstore通过`pstore\_cannot\_block\_path()`函数对相应的信息进行过滤。 + + + +``` +//pstore_cannot_block_path() +/* + * Should pstore_dump() wait for a concurrent pstore_dump()? If + * not, the current pstore_dump() will report a failure to dump + * and return. + */ +static bool pstore_cannot_block_path(enum kmsg_dump_reason reason) +{ + /* In NMI path, pstore shouldn't block regardless of reason. */ + if (in_nmi()) + return true; + + switch (reason) { + /* In panic case, other cpus are stopped by smp_send_stop(). */ + case KMSG_DUMP_PANIC: + /* Emergency restart shouldn't be blocked. */ + case KMSG_DUMP_EMERG: + return true; + default: + return false; + } +} +``` + + +其中dmesg前端的主要工作就是为其实现一个`dump()`函数,该函数将从log buffer中读取log信息,然后将其封装为recored之后写入对应的后端设备,其主要定义如下: + + + +``` +//pstore_dump() +static struct kmsg_dumper pstore_dumper = { + .dump = pstore_dump, +} + +static void pstore_dump(struct kmsg_dumper *dumper, + enum kmsg_dump_reason reason) +{ + … + while (total < kmsg_bytes) { + … + pstore_record_init(&record, psinfo); + … + header_size = snprintf(dst, dst_size, "%s#%d Part%u\n", why, + oopscount, part); + dst_size -= header_size; + + if (!kmsg_dump_get_buffer(&iter, true, dst + header_size, + dst_size, &dump_size)) + break; + + if (big_oops_buf) { + zipped_len = pstore_compress(dst, psinfo->buf, + header_size + dump_size, + psinfo->bufsize); + … + } else { + record.size = header_size + dump_size; + } + + ret = psinfo->write(&record); + … + } + … +} + +``` + + +## kmsg\_dump实现 + + +printk实现了一个`kmsg\_dump()`函数,用于方便其它模块dump内核的log buffer,当内核发生oops、panic或重启等事件时,都会调用该函数dump log信息。其代码实现如下: + + + +``` +void kmsg_dump(enum kmsg_dump_reason reason) +{ + … + list_for_each_entry_rcu(dumper, &dump_list, list) { + enum kmsg_dump_reason max_reason = dumper->max_reason; + + if (max_reason == KMSG_DUMP_UNDEF) { + max_reason = always_kmsg_dump ? KMSG_DUMP_MAX : + KMSG_DUMP_OOPS; + } + if (reason > max_reason) + continue; + + dumper->dump(dumper, reason); + } + rcu_read_unlock(); +} +``` + + +使用`kmsg\_dump()`之前要先使用`kmsg\_dump\_register()`来注册一个dumper,用于实际的log写操作。 + + +我们先来看看`kmsg\_dump\_register`的定义,只定义了一个dump\_list,将系统中所有注册的dump都挂在同一个list下,这就说明系统可以注册多个dumper。 + + + +``` +int kmsg_dump_register(struct kmsg_dumper *dumper) +{ + … + if (!dumper->registered) { + dumper->registered = 1; + list_add_tail_rcu(&dumper->list, &dump_list); + err = 0; + } + … +} +``` + + +## 总结 + + +pstore dmesg主要工作流程如下: + + +(1)初始化一个record结构体 + + +(2)先向其写入pstore头信息,如dmesg reason、oops发生次数等 + + +(3)从log buffer中读取一行log信息 + + +(4)若需要压缩信息,则执行压缩操作 + + +(5)调用后端的写函数,将record写入相应的后端设备 + + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257\357\274\232CONSOLE_\344\273\243\347\240\201\345\210\206\346\236\220.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257\357\274\232CONSOLE_\344\273\243\347\240\201\345\210\206\346\236\220.md" new file mode 100644 index 00000000..41ecbb17 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257\357\274\232CONSOLE_\344\273\243\347\240\201\345\210\206\346\236\220.md" @@ -0,0 +1,558 @@ +![](assets/Pstore前端:CONSOLE_代码分析/img_0.png) + + +作者:新绎 + + + +# 写在前面 + + +pstore中提供了多种前端来实现捕获各种系统信息来加以调试。这篇文章中,我们会对pstore其中之一的前端`PSTORE\_CONSOLE`进行分析,从原理上分析pstore如何获取kernel printk的信息。 + + +# pstore console注册 + + +`pstore console`前端注册函数在`fs/pstore/platform.c`中被定义,通过后端初始化过程中被调用并注册,从而能够在系统执行`prink`时获取输出信息,并通过`write`方法将`prink`的输出写入到相应的后端当中。 + + + +``` +static void pstore_console_write(struct console *con, const char *s, unsigned c) +{ + struct pstore_record record; + + if (!c) + return; + + pstore_record_init(&record, psinfo); + record.type = PSTORE_TYPE_CONSOLE; + + record.buf = (char *)s; + record.size = c; + psinfo->write(&record); +} + +static struct console pstore_console = { + .write = pstore_console_write, + .index = -1, +}; + +static void pstore_register_console(void) +{ + /* Show which backend is going to get console writes. */ + strscpy(pstore_console.name, psinfo->name, + sizeof(pstore_console.name)); + /* + * Always initialize flags here since prior unregister_console() + * calls may have changed settings (specifically CON_ENABLED). + */ + pstore_console.flags = CON_PRINTBUFFER | CON_ENABLED | CON_ANYTIME; + register_console(&pstore_console); +} +``` + + +其中,pstore\_console的flag开启了3个选项:`CON\_PRINTBUFFER`,`CON\_ENABLED`和`CON\_ANYTIME`。 + + +`CON\_PRINTBUFFER`:只有开启了才会接受prink的输出 + + +`CON\_ENABLED`:console使能,如果没有开启这个flag需要手动使能(在cmdline中定义) + + +`CON\_ANYTIME`:可以在cpu离线时进行调用 + + + +``` +//console.h +/* + * The interface for a console, or any other device that wants to capture + * console messages (printer driver?) + * + * If a console driver is marked CON_BOOT then it will be auto-unregistered + * when the first real console is registered. This is for early-printk drivers. + */ + +#define CON_PRINTBUFFER (1) +#define CON_CONSDEV (2) /* Last on the command line */ +#define CON_ENABLED (4) +#define CON_BOOT (8) +#define CON_ANYTIME (16) /* Safe to call when cpu is offline */ +#define CON_BRL (32) /* Used for a braille device */ +#define CON_EXTENDED (64) /* Use the extended output format a la /dev/kmsg */ + +struct console { + char name[16]; + void (*write)(struct console *, const char *, unsigned); + int (*read)(struct console *, char *, unsigned); + struct tty_driver *(*device)(struct console *, int *); + void (*unblank)(void); + int (*setup)(struct console *, char *); + int (*match)(struct console *, char *name, int idx, char *options); + short flags; + short index; + int cflag; + void *data; + struct console *next; +}; +``` + + +# printk总览 + + +![](assets/Pstore前端:CONSOLE_代码分析/img_1.png) + + + +# printk向console输出过程分析 + + +pstore中注册好console之后,console会被动地获取printk的输出,接下来我们分析printk是对console进行输出。 + + +## cmdline解析 + + +如果console的flag中定义了`CON\_ENABLED`,那么console会默认使能。如果没有定义,则需要在cmdline中手动使能。 + + +`kernel/printk.c`中将`'console='`的解析函数`console\_setup`注册到`obs\_kernel\_param`,在kernel启动过程中会遍历所有`obs\_kernel\_param`,接着会调用`console\_setup`来解析。 + + +我们通过在cmdline中定义`console=xxx`则能够被`console\_setup`所解析并使能相应的console。 + + + +参数是`'console='`的值字符串,如“ttyS0,115200”,`console\_setup`对`console=`参数值做解析,以ttyS0,115200为例,`buf=“ttyS”`,`idx=0`,`options="115200"`,`brl\_options=NULL`。 + + + +``` +//printk.c 解析cmdline +/* + * Set up a console. Called via do_early_param() in init/main.c + * for each "console=" parameter in the boot command line. + */ +static int __init console_setup(char *str) +{ + char buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for "ttyS" */ + char *s, *options, *brl_options = NULL; + int idx; + + if (_braille_console_setup(&str, &brl_options)) + return 1; + + /* + * Decode str into name, index, options. + */ + if (str[0] >= '0' && str[0] <= '9') { + strcpy(buf, "ttyS"); + strncpy(buf + 4, str, sizeof(buf) - 5); + } else { + strncpy(buf, str, sizeof(buf) - 1); + } + buf[sizeof(buf) - 1] = 0; + options = strchr(str, ','); + if (options) + *(options++) = 0; +#ifdef __sparc__ + if (!strcmp(str, "ttya")) + strcpy(buf, "ttyS0"); + if (!strcmp(str, "ttyb")) + strcpy(buf, "ttyS1"); +#endif + for (s = buf; *s; s++) + if (isdigit(*s) || *s == ',') + break; + idx = simple_strtoul(s, NULL, 10); + *s = 0; + + __add_preferred_console(buf, idx, options, brl_options); + console_set_on_cmdline = 1; + return 1; +} +__setup("console=", console_setup); +``` + + +`console\_setup`最后调用`\_\_add\_preferred\_console`: + + +kernel利用结构体数组`console\_cmdline[8]`,最多可支持8个cmdline传入的console参数。 + + +`\_\_add\_preferred\_console`将name,idx,options保存到数组下一个成员`console\_cmdline`结构体中,如果数组中已有重名,则不添加,并置`selected\_console`为最新添加的`console\_cmdline`的下标。 + + + +**一个例子:** + + +如cmdline中有“console=ttyS0,115200 console=ttyS1,9600” + + +则在`console\_cmdline[8]`数组中`console\_cmdline[0]`代表ttyS0,`console\_cmdline[1]`代表ttyS1,而`preferred\_console=1`。 + + + +``` +//printk.c __add_preferred_console +static int __add_preferred_console(char *name, int idx, char *options, + char *brl_options) +{ + struct console_cmdline *c; + int i; + + /* + * See if this tty is not yet registered, and + * if we have a slot free. + */ + for (i = 0, c = console_cmdline; + i < MAX_CMDLINECONSOLES && c->name[0]; + i++, c++) { + if (strcmp(c->name, name) == 0 && c->index == idx) { + if (!brl_options) + preferred_console = i; + return 0; + } + } + if (i == MAX_CMDLINECONSOLES) + return -E2BIG; + if (!brl_options) + preferred_console = i; + strlcpy(c->name, name, sizeof(c->name)); + c->options = options; + braille_set_options(c, brl_options); + + c->index = idx; + return 0; +} +``` + + +## printk console选择 + + +printk内容会一直存在log\_buf中,log\_buf满了之后则会从头在开始存,覆盖掉原来的数据。 + + +log\_buf的大小由kernel `menuconfig`中的`CONFIG\_LOG\_BUF\_SHIFT`配置。 + + +根据printk的实现原理,printk最后调用`console\_unlock`实现log\_buf数据刷出到设备。 + + +kernel下每次printk打印,首先存log\_buf,然后遍历console\_drivers,找到合适console(如果有`execlusive\_console`,则往`execlusive\_console`写,如果没有,则为所有使能的console),刷出log。 + + +**默认情况下**`**execlusive\_console=NULL**`,所以printk默认是向所有enable的console写 + + +只有一种情况是指定`execlusive\_console`,就是在console注册时 + + + +``` +//printk.c call_console_drivers +/* + * Call the console drivers, asking them to write out + * log_buf[start] to log_buf[end - 1]. + * The console_lock must be held. + */ +static void call_console_drivers(const char *ext_text, size_t ext_len, + const char *text, size_t len) +{ + struct console *con; + + trace_console_rcuidle(text, len); + + if (!console_drivers) + return; + + for_each_console(con) { + if (exclusive_console && con != exclusive_console) + continue; + if (!(con->flags & CON_ENABLED)) + continue; + if (!con->write) + continue; + if (!cpu_online(smp_processor_id()) && + !(con->flags & CON_ANYTIME)) + continue; + if (con->flags & CON_EXTENDED) + con->write(con, ext_text, ext_len); + else + con->write(con, text, len); + } +} +``` + + +## printk console注册 + + +注意:linux提供了early console机制(通过`CONFIG\_EARLY\_PRINTK`进行使能),用于实现为设备注册console之前的早期log的输出,对应console也称为boot console,简称bcon。这个console在kernel启动的早期阶段就会被注册,主要通过输出设备(比如串口设备)的简单的write方法直接进行数据打印。而这个write方法也就是平台实现。这时候作为输出的串口设备是基于bootloader中已经初始化完成的。 + + + +1. 如果注册的是bootconsole(kernel早期启动打印),需要检查console\_drivers中没有real console,也就是说bootconsole必须是第一个注册的console。 +2. 检查new console是否是cmdline指定的console,如果是,则使能(`CON\_ENABLE`)并初始化该console +3. 如果该new console没有使能,退出 +4. 如果new console为bootconsole,则newcon不需要输出register之前的log(`newcon->flags &= ~CON\_PRINTBUFFER`),因为如果bootconsole和new console是同一个设备则会之前的log就输出2次 +5. 把new console加入`console\_drivers`链表,对于置位`CON\_CONSDEV`的console,放在链表首 +6. 加锁 +7. 如果new console置位`CON\_PRINTBUFFER`,则将log全部刷出(暂时修改printk输出的指定唯一`exclusive\_console`为new console,保证将之前的log只输出到new console) +8. 解锁(console\_unlock()会重新把`exclusive\_console`设置为NULL) +9. 如果有bootconsole并且不是作为real console继续使用,则unregister bootconsole(从`console\_drivers`中删掉) + +``` +//printk.c register_console +/* + * The console driver calls this routine during kernel initialization + * to register the console printing procedure with printk() and to + * print any messages that were printed by the kernel before the + * console driver was initialized. + * + * This can happen pretty early during the boot process (because of + * early_printk) - sometimes before setup_arch() completes - be careful + * of what kernel features are used - they may not be initialised yet. + * + * There are two types of consoles - bootconsoles (early_printk) and + * "real" consoles (everything which is not a bootconsole) which are + * handled differently. + * - Any number of bootconsoles can be registered at any time. + * - As soon as a "real" console is registered, all bootconsoles + * will be unregistered automatically. + * - Once a "real" console is registered, any attempt to register a + * bootconsoles will be rejected + */ +void register_console(struct console *newcon) +{ + int i; + unsigned long flags; + struct console *bcon = NULL; + struct console_cmdline *c; + static bool has_preferred; + + if (console_drivers) + for_each_console(bcon) + if (WARN(bcon == newcon, + "console '%s%d' already registered\n", + bcon->name, bcon->index)) + return; + + /* + * before we register a new CON_BOOT console, make sure we don't + * already have a valid console + */ + if (console_drivers && newcon->flags & CON_BOOT) { + /* find the last or real console */ + for_each_console(bcon) { + if (!(bcon->flags & CON_BOOT)) { + pr_info("Too late to register bootconsole %s%d\n", + newcon->name, newcon->index); + return; + } + } + } + + if (console_drivers && console_drivers->flags & CON_BOOT) + bcon = console_drivers; + + if (!has_preferred || bcon || !console_drivers) + has_preferred = preferred_console >= 0; + + /* + * See if we want to use this console driver. If we + * didn't select a console we take the first one + * that registers here. + */ + if (!has_preferred) { + if (newcon->index < 0) + newcon->index = 0; + if (newcon->setup == NULL || + newcon->setup(newcon, NULL) == 0) { + newcon->flags |= CON_ENABLED; + if (newcon->device) { + newcon->flags |= CON_CONSDEV; + has_preferred = true; + } + } + } + + /* + * See if this console matches one we selected on + * the command line. + */ + for (i = 0, c = console_cmdline; + i < MAX_CMDLINECONSOLES && c->name[0]; + i++, c++) { + if (!newcon->match || + newcon->match(newcon, c->name, c->index, c->options) != 0) { + /* default matching */ + BUILD_BUG_ON(sizeof(c->name) != sizeof(newcon->name)); + if (strcmp(c->name, newcon->name) != 0) + continue; + if (newcon->index >= 0 && + newcon->index != c->index) + continue; + if (newcon->index < 0) + newcon->index = c->index; + + if (_braille_register_console(newcon, c)) + return; + + if (newcon->setup && + newcon->setup(newcon, c->options) != 0) + break; + } + + newcon->flags |= CON_ENABLED; + if (i == preferred_console) { + newcon->flags |= CON_CONSDEV; + has_preferred = true; + } + break; + } + + if (!(newcon->flags & CON_ENABLED)) + return; + + /* + * If we have a bootconsole, and are switching to a real console, + * don't print everything out again, since when the boot console, and + * the real console are the same physical device, it's annoying to + * see the beginning boot messages twice + */ + if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV)) + newcon->flags &= ~CON_PRINTBUFFER; + + /* + * Put this console in the list - keep the + * preferred driver at the head of the list. + */ + console_lock(); + if ((newcon->flags & CON_CONSDEV) || console_drivers == NULL) { + newcon->next = console_drivers; + console_drivers = newcon; + if (newcon->next) + newcon->next->flags &= ~CON_CONSDEV; + } else { + newcon->next = console_drivers->next; + console_drivers->next = newcon; + } + + if (newcon->flags & CON_EXTENDED) + if (!nr_ext_console_drivers++) + pr_info("printk: continuation disabled due to ext consoles, expect more fragments in /dev/kmsg\n"); + + if (newcon->flags & CON_PRINTBUFFER) { + /* + * console_unlock(); will print out the buffered messages + * for us. + */ + logbuf_lock_irqsave(flags); + console_seq = syslog_seq; + console_idx = syslog_idx; + /* + * We're about to replay the log buffer. Only do this to the + * just-registered console to avoid excessive message spam to + * the already-registered consoles. + * + * Set exclusive_console with disabled interrupts to reduce + * race window with eventual console_flush_on_panic() that + * ignores console_lock. + */ + exclusive_console = newcon; + exclusive_console_stop_seq = console_seq; + logbuf_unlock_irqrestore(flags); + } + console_unlock(); + console_sysfs_notify(); + + /* + * By unregistering the bootconsoles after we enable the real console + * we get the "console xxx enabled" message on all the consoles - + * boot consoles, real consoles, etc - this is to ensure that end + * users know there might be something in the kernel's log buffer that + * went to the bootconsole (that they do not see on the real console) + */ + pr_info("%sconsole [%s%d] enabled\n", + (newcon->flags & CON_BOOT) ? "boot" : "" , + newcon->name, newcon->index); + if (bcon && + ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV) && + !keep_bootcon) { + /* We need to iterate through all boot consoles, to make + * sure we print everything out, before we unregister them. + */ + for_each_console(bcon) + if (bcon->flags & CON_BOOT) + unregister_console(bcon); + } +} + +EXPORT_SYMBOL(register_console); +``` + + +## printk打印级别 + + +printk可以根据设置的日志级别来确定这个语句最后是否能够打印出来。 + + +查看此文件:`cat /proc/sys/kernel/printk` + + +该文件有四个数字值,它们根据日志记录消息的重要性,定义将其发送到何处。 + + + + 1. 控制台日志级别:优先级高于该值的消息将被打印至控制台 + 2. 默认的消息日志级别:将用该优先级来打印没有优先级的消息 + 3. 最低的控制台日志级别:控制台日志级别可被设置的最小值(最高优先级) + 4. 默认的控制台日志级别:控制台日志级别的缺省值 + +内核中共提供了八种不同的日志级别,在 `linux/kernel.h` 中有相应的宏对应。 + + + +``` +#define KERN_EMERG "<0>" /* systemis unusable */ +#define KERN_ALERT "<1>" /* actionmust be taken immediately */ +#define KERN_CRIT "<2>" /*critical conditions */ +#define KERN_ERR "<3>" /* errorconditions */ +#define KERN_WARNING "<4>" /* warning conditions */ +#define KERN_NOTICE "<5>" /* normalbut significant */ +#define KERN_INFO "<6>" /*informational */ +#define KERN_DEBUG "<7>" /*debug-level messages */ +``` + + +**可以通过在cmdline中加入“loglevel=X”的语句,来调整日志输入级别。**其中X就是我们想要设置的console\_loglevel的值。 + + +# 总结 + + +pstore实现console前端的方式很简单:通过注册一个console并且使能即可实现。 + + +默认情况下,printk会对所有使能的console进行输出,将log\_buf中的数据写入到使能的console当中。 + + +当对pstore的console进行输出时,会触发pstore console的write,将数据写入到相应后端。 + + + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257\357\274\232DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257\357\274\232DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" new file mode 100644 index 00000000..d00e1b42 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\211\215\347\253\257\357\274\232DMESG_\344\273\243\347\240\201\345\210\206\346\236\220.md" @@ -0,0 +1,210 @@ +![](assets/Pstore前端:DMESG_代码分析/img_0.png) + + +作者:新绎 + + + +## 写在前面 + + +pstore中提供了多种前端来实现捕获各种系统信息从而加以调试。这篇文章中,我们会对pstore其中之一的前端PSTORE\_DMESG进行分析,从原理上分析pstore如何获取当内核发生panic时kmsg信息。 + + +## Pstore注册kmsg\_dumper + + +kmsg\_dumper结构体有两个重要成员:回调函数`dump()`以及相应的`kmsg_dump_reason`。通过对`dump()`进行实现,我们就可以将相应的log信息保存到我们希望保存的地方,并且可以通过`kmsg_dump_reason`来对需要保存的信息进行筛选。 + + + +``` +//kmsg_dump.h +/** +* struct kmsg_dumper - kernel crash message dumper structure +* @list: Entry in the dumper list (private) +* @dump: Call into dumping code which will retrieve the data with +* through the record iterator +* @max_reason: filter for highest reason number that should be dumped +* @registered: Flag that specifies if this is already registered +*/ +struct kmsg_dumper { + struct list_head list; + void (*dump)(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason); + enum kmsg_dump_reason max_reason; + bool active; + bool registered; + + /* private state of the kmsg iterator */ + u32 cur_idx; + u32 next_idx; + u64 cur_seq; + u64 next_seq; +}; + +/* + * Keep this list arranged in rough order of priority. Anything listed after + * KMSG_DUMP_OOPS will not be logged by default unless printk.always_kmsg_dump + * is passed to the kernel. + */ +enum kmsg_dump_reason { + KMSG_DUMP_UNDEF, + KMSG_DUMP_PANIC, + KMSG_DUMP_OOPS, + KMSG_DUMP_EMERG, + KMSG_DUMP_RESTART, + KMSG_DUMP_HALT, + KMSG_DUMP_POWEROFF, +}; +``` + + +我们可以看到,目前有7种定义的`kmsg\_dump\_reason`,而pstore则关心在系统出现panic时的log信息。在pstore的实现中,pstore通过`pstore\_cannot\_block\_path()`函数对相应的信息进行过滤。 + + + +``` +//pstore_cannot_block_path() +/* + * Should pstore_dump() wait for a concurrent pstore_dump()? If + * not, the current pstore_dump() will report a failure to dump + * and return. + */ +static bool pstore_cannot_block_path(enum kmsg_dump_reason reason) +{ + /* In NMI path, pstore shouldn't block regardless of reason. */ + if (in_nmi()) + return true; + + switch (reason) { + /* In panic case, other cpus are stopped by smp_send_stop(). */ + case KMSG_DUMP_PANIC: + /* Emergency restart shouldn't be blocked. */ + case KMSG_DUMP_EMERG: + return true; + default: + return false; + } +} +``` + + +其中dmesg前端的主要工作就是为其实现一个`dump()`函数,该函数将从log buffer中读取log信息,然后将其封装为recored之后写入对应的后端设备,其主要定义如下: + + + +``` +//pstore_dump() +static struct kmsg_dumper pstore_dumper = { + .dump = pstore_dump, +} + +static void pstore_dump(struct kmsg_dumper *dumper, + enum kmsg_dump_reason reason) +{ + … + while (total < kmsg_bytes) { + … + pstore_record_init(&record, psinfo); + … + header_size = snprintf(dst, dst_size, "%s#%d Part%u\n", why, + oopscount, part); + dst_size -= header_size; + + if (!kmsg_dump_get_buffer(&iter, true, dst + header_size, + dst_size, &dump_size)) + break; + + if (big_oops_buf) { + zipped_len = pstore_compress(dst, psinfo->buf, + header_size + dump_size, + psinfo->bufsize); + … + } else { + record.size = header_size + dump_size; + } + + ret = psinfo->write(&record); + … + } + … +} + +``` + + +## kmsg\_dump实现 + + +printk实现了一个`kmsg\_dump()`函数,用于方便其它模块dump内核的log buffer,当内核发生oops、panic或重启等事件时,都会调用该函数dump log信息。其代码实现如下: + + + +``` +void kmsg_dump(enum kmsg_dump_reason reason) +{ + … + list_for_each_entry_rcu(dumper, &dump_list, list) { + enum kmsg_dump_reason max_reason = dumper->max_reason; + + if (max_reason == KMSG_DUMP_UNDEF) { + max_reason = always_kmsg_dump ? KMSG_DUMP_MAX : + KMSG_DUMP_OOPS; + } + if (reason > max_reason) + continue; + + dumper->dump(dumper, reason); + } + rcu_read_unlock(); +} +``` + + +使用`kmsg\_dump()`之前要先使用`kmsg\_dump\_register()`来注册一个dumper,用于实际的log写操作。 + + +我们先来看看`kmsg\_dump\_register`的定义,只定义了一个dump\_list,将系统中所有注册的dump都挂在同一个list下,这就说明系统可以注册多个dumper。 + + + +``` +int kmsg_dump_register(struct kmsg_dumper *dumper) +{ + … + if (!dumper->registered) { + dumper->registered = 1; + list_add_tail_rcu(&dumper->list, &dump_list); + err = 0; + } + … +} +``` + + +## 总结 + + +pstore dmesg主要工作流程如下: + + +(1)初始化一个record结构体 + + +(2)先向其写入pstore头信息,如dmesg reason、oops发生次数等 + + +(3)从log buffer中读取一行log信息 + + +(4)若需要压缩信息,则执行压缩操作 + + +(5)调用后端的写函数,将record写入相应的后端设备 + + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\244\232\345\220\216\347\253\257\346\224\257\346\214\201\350\241\245\344\270\201.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\244\232\345\220\216\347\253\257\346\224\257\346\214\201\350\241\245\344\270\201.md" new file mode 100644 index 00000000..ae0745cb --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\345\244\232\345\220\216\347\253\257\346\224\257\346\214\201\350\241\245\344\270\201.md" @@ -0,0 +1,197 @@ + +![](assets/Pstore多后端支持补丁/img_0.png) + + +作者:新绎 + + +## 写在前面 + + +目前,pstore一次只支持打开一个后端。 如果一个新的后端想稍后注册, pstore将拒绝这个请求并返回一个错误。这个设计迫使我们关闭现有后端以使用新后端。 + + +内核支持某些类型的后端,例如ramoops和blk。在实际使用当中,我们还可以自行实现多种类型的后端。不同的后端根据不同的场景或业务进行信息收集。因此,他们需要同时工作,以满足各种需求。 + + +## 原始实现 + + +具体来说,由于全局变量`psinfo`的存在, pstore只接受第一个注册后端。如果一个新的后端想稍后注册, pstore将拒绝这个请求并返回一个错误。 + + + +``` +int pstore_register(struct pstore_info *psi) +{ + if (backend && strcmp(backend, psi->name)) { + pr_warn("ignoring unexpected backend '%s'\n", psi->name); + return -EPERM; + } + + /* Sanity check flags. */ + if (!psi->flags) { + pr_warn("backend '%s' must support at least one frontend\n", + psi->name); + return -EINVAL; + } + + /* Check for required functions. */ + if (!psi->read || !psi->write) { + pr_warn("backend '%s' must implement read() and write()\n", + psi->name); + return -EINVAL; + } + + mutex_lock(&psinfo_lock); + if (psinfo) { + pr_warn("backend '%s' already loaded: ignoring '%s'\n", + psinfo->name, psi->name); + mutex_unlock(&psinfo_lock); + return -EBUSY; + } + ... +} +``` + + +psinfo作为后端信息的存储结构体,一个psinfo只能保存一个后端。 + + + +``` +struct pstore_info { + struct module *owner; + const char *name; + + spinlock_t buf_lock; + char *buf; + size_t bufsize; + + struct mutex read_mutex; + + int flags; + int max_reason; + void *data; + + int (*open)(struct pstore_info *psi); + int (*close)(struct pstore_info *psi); + ssize_t (*read)(struct pstore_record *record); + int (*write)(struct pstore_record *record); + int (*write_user)(struct pstore_record *record, + const char __user *buf); + int (*erase)(struct pstore_record *record); +}; +``` + + +## 多后端实现 + + +### 修改全局变量 + + +在原始`fs/pstore/internal.h`中定义了全局变量`psinfo` + + +`extern struct pstore\_info \*psinfo;` + + +psinfo为后端信息的存储结构体,一个psinfo只能保存一个后端 + + +修改后: + + +`extern struct pstore\_backends \*psback;` + + +`psback`保存了所有使能`psinfo`的双向链表头节点。 + + +启动`psback`以及双向链表的定义如下: + + + +``` +struct pstore_info_list { + struct pstore_info *psi; + struct list_head list; + int index; +}; + +/** + * struct pstore_backends - management of pstore backends + * @list_entry: entry of pstore backend driver information list + * @front_cnt: count of each enabled frontend + * @flag: bitmap of enabled pstore backend + * @fs_ready: whether the pstore filesystem is ready + * + */ + +struct pstore_backends { + struct list_head list_entry; + int front_cnt[PSTORE_TYPE_MAX]; + u16 flag; + bool fs_ready; +}; +``` + + +### 前端复用 + + +为了防止每注册一个后端就要注册相应的前端造成过多开销,我们选择对已经注册好的前端进行复用。如果当多个后端同时使能了同一前端,那么这个前端将会把自己收集的信息多写到这几个后端当中。 + + +![image.png](../../../assets/内核调测/Pstore多后端支持补丁/img_1.png) + + + +代码实现: + + + +``` +static void pstore_dump(struct kmsg_dumper *dumper, + enum kmsg_dump_reason reason) +{ + struct pstore_info_list *entry; + + rcu_read_lock(); + list_for_each_entry_rcu(entry, &psback->list_entry, list) + if (entry->psi->flags & PSTORE_FLAGS_DMESG) + pstore_do_dump(dumper, reason, entry->psi, entry->index); + rcu_read_unlock(); +} +``` + + +通过rcu锁以及对双向链表遍历的方式,前端可以线程安全地获取所有使能的后端,并且根据后端的使能情况执行写操作。 + + +### 让文件系统更直观 + + +由于多后端的存在,不同后端的输出文件将显得格外混乱,所以通过文件夹对不同后端进行分类的想法是自然而然产生的。 + + +通过修改`inode.c`,在`sys/fs/pstore`下建立相应后端的子文件夹,实现文件归类 + + +![](../../../assets/内核调测/Pstore多后端支持补丁/img_2.png) + + + +## 总结 + + +多后端支持的引入让pstore的使用更加灵活,可以根据不同后端功能以及业务场景同时使能多个后端,实现互不干扰,和谐共存。 + + + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\346\200\273\350\247\210.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\346\200\273\350\247\210.md" new file mode 100644 index 00000000..fa9fdd8e --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/Pstore\346\200\273\350\247\210.md" @@ -0,0 +1,366 @@ +![](assets/Pstore总览/img_0.png) + + +作者:新绎 + + +## pstore概述 + + +### 定义 + + +pstore文件系统,是Persistent Storage的缩写,最早设计的目的是在内核Panic/Oops时能自动转存内核日志(log\_buf)到持久化内存(Persistent Ram),在Panic重启后,把转存的日志以文件形式呈现到用户空间以分析内核崩溃问题。随着版本的不断演进,pstore开始支持console,ftrace等一系列信息获取,提供多方位的日志抓捕功能,来帮助维护人员快速定位问题。 + + +### 对比kdump + + +kdump作为一个重量级的问题分析工具,在发生panic时通过kexec加载crash kernel,该kernel会收集内存所有信息到dump core文件中予以保存。kdump的方案适用于服务器这种有大量资源的设备,功能也非常强大,但对嵌入式设备非常不友好。而pstore是个轻量级的内核崩溃日志转存的方案,虽然不能保存所有完整的寄存器等信息,但是不需要大量的内存空间进行部署,功能简洁轻量,在移动端和嵌入式设备的调试中被广泛地使用。 + + +  + + + +## pstore配置方法 + + +### config选项(基于kernel version 5.10) + + +pstore的各个模块需要在内核编译时通过config进行使能。 + + + +pstore的各个模块需要在内核编译时通过config进行使能。 + + + + +| | | +| --- | --- | +| `CONFIG_PSTORE` | pstore文件系统使能 | + + +* 前端 + + + + +| | | +| --- | --- | +| `CONFIG_PSTORE_PMSG` | 用户空间信息,/dev/pmsg0 | +| `CONFIG_PSTORE_CONSOLE` | 控制台输出,所有内核信息 | +| `CONFIG_PSTORE_FTRACE` | 函数调用序列, ftrace 信息 | + + +* 后端 + + + + +| | | +| --- | --- | +| `CONFIG_PSTORE_RAM` | 持久化内存(重启后不会丢失数据的内存) | +| `CONFIG_PSTORE_ZONE` | 实现存储空间的分配和管理 | +| `CONFIG_PSTORE_BLK` | 所有可写的块设备 | + + +* 压缩算法(**只针对DMESG前端数据**) + + + + +| | | +| --- | --- | +| `CONFIG_PSTORE_COMPRESS` | 压缩算法使能 | +| `CONFIG_PSTORE_DEFLATE_COMPRESS` | 默认压缩算法(deflate) | +| `CONFIG_PSTORE_LZO_COMPRESS` | LZO压缩 | +| `CONFIG_PSTORE_LZ4_COMPRESS` | LZ4压缩 | +| `CONFIG_PSTORE_LZ4HC_COMPRESS` | LZHC(high compression)压缩 | +| `CONFIG_PSTORE_842_COMPRESS` | 842压缩 | +| `CONFIG_PSTORE_ZSTD_COMPRESS` | zstd压缩 | + + +#### RAM后端(ramoops)配置方式 + + + +**cmdline方式** + + +example: + + +`ramoops.mem_address=0x800000 ramoops.mem_size=0x10000 ramoops.console_size=0x4000` + + +提供选项: + + +`mem_address`,`mem_size`,`mem_type`,`record_size`,`console_size`,`pmsg_size` + + +`max_reason`,`ramoops_ecc`,`dump_oops` + + +**Platform Data方式** + + + +``` +#include + [...] + + static struct ramoops_platform_data ramoops_data = { + .mem_size = <...>, + .mem_address = <...>, + .mem_type = <...>, + .record_size = <...>, + .max_reason = <...>, + .ecc = <...>, + }; + + static struct platform_device ramoops_dev = { + .name = "ramoops", + .dev = { + .platform_data = &ramoops_data, + }, + }; + + [... inside a function ...] + int ret; + + ret = platform_device_register(&ramoops_dev); + if (ret) { + printk(KERN_ERR "unable to register platform device\n"); + return ret; + } + +``` + +**设备树方式** + + + +``Documentation/devicetree/bindings/reserved-memory/ramoops.yaml``. + + + +``` + For example:: + + reserved-memory { + #address-cells = <2>; + #size-cells = <2>; + ranges; + + ramoops@8f000000 { + compatible = "ramoops"; + reg = <0 0x8f000000 0 0x100000>; + record-size = <0x4000>; + console-size = <0x4000>; + }; + }; +``` + +#### BLK后端配置方式 + + +**cmdline方式** + + +example: + + +`pstore_blk.blkdev=/dev/mmcblk0p7 pstore_blk.kmsg_size=64 best_effort=y` + + +提供选项: + + +`blkdev`,`kmsg_size`,`pmsg_size`,`console_size`,`ftrace_size`,`max_reason` + + +  + + +**Kconfig方式** + + +在编译时设置config + + +`CONFIG_PSTORE_BLK_BLKDEV` + + +`CONFIG_PSTORE_BLK_KMSG_SIZE` + + +`CONFIG_PSTORE_BLK_MAX_REASON` + + +`CONFIG_PSTORE_BLK_PMSG_SIZE` + + +`CONFIG_PSTORE_BLK_CONSOLE_SIZE` + + +`CONFIG_PSTORE_BLK_FTRACE_SIZE` + + +### 配置查看 + + +检查 pstore 配置成功与否。 +`cat /sys/module/pstore/parameters/*` + + +![](../../../assets/内核调测/Pstore总览/img_1.png) + + + +如图配置,backend = ramoops,compress = deflate,update\_ms = -1 + + +检查相关预留 size 是否配置成功(这里以ramoops后端为例) +`ls /sys/module/ramoops/parameters` +`cat /sys/module/ramoops/parameters/*` + + +![](../../../assets/内核调测/Pstore总览/img_2.png) + + +## pstore使用 + + +pstore使用十分简单,只要我们使能成功,并且检查各项配置都正确,那么pstore已经可以正常工作了。 + + +我们可以通过手动触发crash来查看pstore捕获的日志。 + + +`echo c > /proc/sysrq-trigger` + + +在重启之后,我们可以在`/sys/fs/pstore/*` 看到加载的 pstore 数据 + + +`ls /sys/fs/pstore/` + + +![](../../../assets/内核调测/Pstore总览/img_3.png) + + +## pstore框架梳理 + + +这里后端以ramoops为例,kernel version = 5.10 + + +**【右键-在新标签页中打开图片】[查看原图](https://oss.openanolis.cn/fragment/uqbmggfmkvyziugluctq)** + + +![](../../../assets/内核调测/Pstore总览/img_4.png) + + + +### pstore初始化 + + +pstore的初始化分为两步,首先是pstore前端和后端的初始化,接着是pstore文件系统的初始化 + + +pstore前后端:`postcore_initcall(ramoops_init);` + + +pstore文件系统:`late_initcall(pstore_init);` + + +![](../../../assets/内核调测/Pstore总览/img_5.png) + + +通过查看相关模块初始化定义,我们发现pstore前后端位于`postcore_initcall`(优先级2)被初始化,而pstore文件系统则在`late_initcall`(优先级7)才会被初始化 + + +#### pstore前后端初始化 + + +**主要函数** + + +fs/pstore/ram.c: + + +`static int __init ramoops_init(void)` + + +`static int ramoops_probe(struct platform_device *pdev)` + + +fs/pstore/platform.c: + + +`int pstore_register(struct pstore_info *psi)` + + +**流程** + + +1、解析并初始化前后端各种配置参数 + + +2、根据参数为每一个使能的前端申请持久化内存空间 + + +3、检测到内存中已经存在合法数据:开辟临时内存空间old\_log,将数据写入到old\_log,并刷新持久化内存 + + +4、根据flag以此判断是否注册前端,如果使能则对前端进行注册 + + +#### pstore文件系统初始化 + + +**主要函数** + + +fs/pstore/inode.c: + + +`pstore_init_fs()` + + +`register_filesystem(&pstore_fs_type);` + + +**流程** + + +1、选择压缩函数 + + +2、文件系统初始化,读取old\_log数据并在/sys/fs/pstore下挂载 + + +  + + +### pstore写入数据 + + +pstore根据前端的不同,各个前端会分别调用pstore后端的写方法向自己的空间写入数据。 + + +具体各个前端的工作模式将会在“Pstore:前端”各章节文档介绍。 + + + + + + + +  + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/\345\237\272\344\272\216pstore\347\232\204kdump\350\260\203\346\265\213\345\267\245\345\205\267.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/\345\237\272\344\272\216pstore\347\232\204kdump\350\260\203\346\265\213\345\267\245\345\205\267.md" new file mode 100644 index 00000000..4236a696 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/\345\237\272\344\272\216pstore\347\232\204kdump\350\260\203\346\265\213\345\267\245\345\205\267.md" @@ -0,0 +1,88 @@ +## 简介 + + +基于pstore的kdump调测工具是一个用于收集并存储crash kernel启动并执行vmcore转储过程中串口打印信息的工具,为kdump提供新的feature。 +方便对crash kernel启动并执行dump过程中所遇到的问题进行定位,能够覆盖crash kernel启动的绝大部分时间点。 +目前支持内核态以及用户态信息的全收集。 + + +仓库链接: + + +\*目前对于内核pstore的改动已完成,正在进行用户态kdumpctl的整合 + + +## 背景 + + +目前kdump服务在使用过程中难免会遇到各种问题,导致vmcore无法正常生成。而在各种使用环境和因素的情况下,可能存在问题定位没有串口可用或者需要较高权限和复杂的流程来申请CN串口,那么我们需要一个机制来对crash kernel的打印信息进行转储,方便我们后续进行查看。 + + +当前新版的kdump支持在vmcore转储过程中对crash kernel的dmesg顺带进行保存,如下图所示: + + +![](assets/基于pstore的kdump调测工具/img_0.png) + + +但是,这样的dmesg信息存储需要在crash kernel成功进入用户态并执行相应的脚本进行实现,如果crash kernel在内核态启动的过程中出现panic,亦或是kdump相关脚本没有正常工作,那么dmesg将无法进行保存。所以目前的crash kernel的dmesg保存机制能覆盖问题的点比较少,我们需要一个能够cover更多问题的调测工具。 + + +## 原理 + + +### pstore相关原理及修改 + + +pstore相关介绍和对应的补丁修改参见: + + +[Pstore总览 - OpenAnolis 龙蜥操作系统开源社区](https://openanolis.cn/sig/Cloud-Kernel/doc/623611346526568454) + + +[Pstore多后端支持补丁](https://openanolis.cn/sig/Cloud-Kernel/doc/646804783491448879) + + +当前的pstore的内核态与用户态的log存储逻辑如下: + + +![](assets/基于pstore的kdump调测工具/img_1.png) + + +对于用户态信息,pmsg只会接受用户对其的输入信息,而不会主动获取。而可以产生用户态输出的程序和服务有许多,包括各种service以及dump相关脚本,如果想采用这样一个方案进行用户态信息的收集,我们需要对用户态的输出进行重定向到pmsg。这样的操作有两个比较大的问题: + + +1、重定向后原有的串口将不显示输出 + + +2、如果想cover所有用户态输出,需要在用户态进行大量的修改 + + +所以,我们希望从根源上高效地解决问题。我们注意到所以用户态向串口输出都会走tty驱动,那么我们可以实现一个新的pstore前端,该前端在tty驱动前有一个hook点,我们可以直接获取到用户态向tty驱动的输出,从而获取相关的log信息。 + + +![](assets/基于pstore的kdump调测工具/img_2.png) + + +## 工具流程 + + +基于pstore的kdump调测工具主要工作在crash kernel中,在crash kernel中配置好pstore后端ramoops相应的参数(内存地址,预留空间大小等),在crash kernel启动过程中会使能pstore并且获取内核态以及用户态的信息,实时输出到ramoops配置好的持久化内存当中。 + + +由于机器重启不会掉电(正常情况下),当我们重回第一个kernel的之后,我们对那块内存进行解析,就可以获取crash kernel相应的log输出。 + + +![](assets/基于pstore的kdump调测工具/img_3.png) + + +## 使用 + + +我们对工具进行了包装,与kdump进行融合,pstore相关的配置将由相应的脚本自动实现,使用者无需进行配置。在正常使用过程中,我们将工具包装进了kdumpctl命令。 + + +只需要在crash kernel执行过后输入kdumpctl showdebug,就可以很方便地对crash kernel的log输出进行查看。 + + +![](assets/基于pstore的kdump调测工具/img_4.png) + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/\351\241\271\347\233\256\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/\351\241\271\347\233\256\347\256\200\344\273\213.md" new file mode 100644 index 00000000..8f8b3d07 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\350\260\203\346\265\213/\351\241\271\347\233\256\347\256\200\344\273\213.md" @@ -0,0 +1,2 @@ +致力于各种内核调测技术的研发和产品化,包括但不限于kdump/pvdump, pstore, ftrace, 各种probes, perf/pmu, ebpf等技术。 + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/Anolis_OS\346\224\257\346\214\201\347\232\204\351\251\261\345\212\250\345\210\227\350\241\250.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/Anolis_OS\346\224\257\346\214\201\347\232\204\351\251\261\345\212\250\345\210\227\350\241\250.md" new file mode 100644 index 00000000..e69de29b diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250spec\350\247\204\350\214\203.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250spec\350\247\204\350\214\203.md" new file mode 100644 index 00000000..540c85ff --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250spec\350\247\204\350\214\203.md" @@ -0,0 +1,104 @@ +### spec文件命名 + + +驱动名、仓库名保持一致,因此spec文件的命名方式为「驱动名.spec」。 + + +### spec内容规范 + + +下面提供了spec文件的通用模板,在合入驱动时需根据实际的驱动修改pkg等字段,需修改的字段如下: + + +1)「pkg」,需修改成驱动名。 + + +2)「Summary」,需修改为该驱动的描述。 + + +3)「License」,需按照实际的license修改。 + + +4)「URL」,可修改为驱动官网链接。 + + +5)「%description」,需修改成该驱动的描述。 + + +6)「%build」,需根据实际的编译方式修改。 + + +7)「%install」,需根据实际的安装路径修改。 + + + +``` +%global pkg ast +%global pkgversion 1.0 +%global kernel kernel version +%define anolis_release 1 + +Name: kmod-%{pkg} +Version: %(echo %{kernel} | sed -E 's/-/~/g; s/\.(el|al|alios)[0-9]+$//g') +Release: %{pkgversion}.%{anolis_release}%{?dist} +Summary: ASPEED Graphics DRM Driver +License: LBPLv2+ and MIT +URL: https://www.aspeedtech.com/support_driver/ +Patch0: source-git.patch + +# 安装依赖, 和内核版本对应 +Requires: kernel = %{kernel} +Requires(post): kmod +Requires(post): dracut + +# 构建依赖, 和内核版本对应 +BuildRequires: kernel-devel = %{kernel} +BuildRequires: kernel-headers = %{kernel} +BuildRequires: elfutils-libelf-devel +BuildRequires: gcc +BuildRequires: kernel-rpm-macros +BuildRequires: kmod +BuildRequires: make +BuildRequires: redhat-rpm-config +BuildRequires: xz + +%description +RPM Package for ASPEED Graphics DRM Driver + +%prep +%autosetup -p1 -c -T + +%build +pushd src +%{__make} -C /usr/src/kernels/%{kernel}.%{_arch} %{?_smp_mflags} M=$PWD modules +popd + +%install +mkdir -p %{buildroot}/lib/modules/%{kernel}.%{_arch}/extra/drivers/gpu/drm/ast +%{__install} -D -t %{buildroot}/lib/modules/%{kernel}.%{_arch}/extra/drivers/gpu/drm/ast src/ast.ko + +# Make .ko objects temporarily executable for automatic stripping +find %{buildroot}/lib/modules -type f -name \*.ko -exec chmod u+x \{\} \+ + +# Generate depmod.conf +%{__install} -d %{buildroot}/%{_sysconfdir}/depmod.d/ +for kmod in $(find %{buildroot}/lib/modules/%{kernel}.%{_arch}/extra -type f -name \*.ko -printf "%%P\n" | sort) +do + echo "override $(basename $kmod .ko) * extra/$(dirname $kmod)" >> %{buildroot}/%{_sysconfdir}/depmod.d/%{pkg}.conf +done + +%clean +%{__rm} -rf %{buildroot} + +%post +depmod -a %{kernel}.%{_arch} +dracut -v -f /boot/initramfs-%{kernel}.%{_arch}.img %{kernel}.%{_arch} + +%files +%defattr(644,root,root,755) +%license licenses +/lib/modules/%{kernel}.%{_arch} +%config(noreplace) %{_sysconfdir}/depmod.d/%{pkg}.conf + +%changelog +``` diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227.md" new file mode 100644 index 00000000..f8053a0c --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227.md" @@ -0,0 +1,185 @@ +### 简介 + + +龙蜥社区采用Out-of-tree(OOT)的方式管理部分第三方驱动,这部分驱动的版本可以在已发布的内核版本的基础上迭代小版本。一个驱动对应着两个仓库,一个source tree仓库用于管理源码,一个rpm tree仓库用于管理编译打包RPM包。 + + +#### 代码管理 + + +Source tree仓库的代码组织形式为「src目录」+ 「licenses目录」+ 「spec文件」,「src目录」用于存放驱动源码,「licenses目录」用于存放license,「spec文件」用于编译打包RPM包。 + + +#### 版本管理 + + +当前[Cloud Kernel](https://gitee.com/anolis/cloud-kernel)有devel-4.19和devel-5.10两个分支对应两个版本,因此source tree仓库也分有devel-4.19和devel-5.10两个分支用于分别适配Cloud Kernel的两个版本。 + + +**Cloud Kernel发布版本:** + + +当Cloud Kernel发布版本时会基于OOT驱动source tree仓库的devel-xxx分支拉取release分支,例如要发布4.19.91-27版本,拉取的分支为release-4.19.91-27,然后构建系统将代码和spec文件传到rpm tree仓库编译出包,打包的RPM包会随着Cloud Kernel的版本一起发布。 + + +**OOT单独迭代小版本:** + + +当Cloud Kernel的下一个版本还未发布时,OOT驱动可以单独在已经发布的大版本的基础上迭代小版本,例如在4.19.91-27的版本基础上发布4.19.91-27-1版本。 + + +### 如何向OOT合入新的驱动 + + +下文将以ast为实际例子进行流程说明。 + + +#### 创建source tree仓库和rpm tree仓库 + + +Maintainer会为驱动创建source tree仓库和rpm tree仓库,然后**将创建好的仓库地址同步到bugzilla**,仓库地址例如:https://gitee.com/anolis/ast 和 https://gitee.com/src-anolis-sig/ast。 + + +#### 注册账号/登录 + + +参与龙蜥OOT开发,需要先注册龙蜥社区及 Gitee 平台账号,并将两个账号关联。 +步骤如下: + + +* [注册龙蜥社区账号](https://gitee.com/link?target=https%3A%2F%2Fpassport.openanolis.cn%2Fregister)(已有账号的略过此步); +* [注册 Gitee 账号](https://gitee.com/signup)(已有账号的略过此步); +* 关联两个账号:因涉及下节提到的 CLA 签署,需要将两个账号关联,直接登录龙蜥社区在【账号设置】 -> 【安全设置】里可以操作绑定 Gitee 账号。 + + +          ![](../../../assets/内核驱动/OOT驱动开发者指南/img_0.png) + + +签署CLA +向龙蜥OOT贡献代码,必须先签署 CLA。 可以登录龙蜥社区后, 打开[CLA页面](https://openanolis.cn/pact/contributor) 进行 CLA 签署。 + + +注意: + + +* 以人个名义贡献的,可签署个人 CLA; +* 以公司名义贡献的,需要签署公司 CLA; +* 详情请咨询贵公司相关法务。 + + +#### fork代码仓库 + + +1、将maintainer创建好的source tree仓库fork到自己的账户,龙蜥采用PR(Pull Request)的方式合并源码。 + + + ![](../../../assets/内核驱动/OOT驱动开发者指南/img_1.png) + + +2、将fork到个人账号的source tree仓库clone到本地的开发环境。 + + +![](../../../assets/内核驱动/OOT驱动开发者指南/img_2.png) + + +#### 补丁制作 + + +1、根据[OOT驱动补丁规范](https://openanolis.cn/sig/Cloud-Kernel/doc/695239829190715269),并且按照「src目录」+ 「licenses目录」+「spec文件」的格式(「src目录」存放源码,「licenses目录」用于存放license,spec文件为编译RPM包所需的文件)制作补丁,spec文件的命名和格式需按照[OOT驱动spec规范](https://openanolis.cn/sig/Cloud-Kernel/doc/684402508139285258??preview=null)上传。 + + +2、将commit push到个人账号下的source tree仓库。 + + +#### 提交PR(Pull Request) + + +1、登录gitee,进入个人账户下的仓库页面。 + + +![](../../../assets/内核驱动/OOT驱动开发者指南/img_3.png) + + +2、在「Pull Request栏」点击「新建Pull Request」,创建PR。 + + +![](../../../assets/内核驱动/OOT驱动开发者指南/img_4.png) + + +3、填写PR信息: + + +* 选择目标仓库为被fork的source tree仓库。 +* 选择正确的**源及目标分支**。 +* 选择合适的评审人即maintainer,maintainer会将他的账号同步到bugzilla或者钉钉群。 +* 「标题」和「说明」请参考[PR(Pull Request)规范](https://openanolis.cn/sig/Cloud-Kernel/doc/607605992881480196)填写。 + + +![](../../../assets/内核驱动/OOT驱动开发者指南/img_5.png) + + +4、当您提交完PR后,会有机器人自动帮您进行代码审核验证。 + + +* 代码**检测通过**,会有如下提示: + + +![](../../../assets/内核驱动/OOT驱动开发者指南/img_6.png) + + +* 代码**检测未通过**: + + 请自行修改代码后,使用**git push --force**重新push至个人仓库下。 + + 在pr链接下评论 **/retest** 重新触发代码检测。 + + 若因为某些特殊原因导致无法通过检测,可联系maintainer回复**/skip-test**跳过检测。详见:[龙蜥内核代码门禁系统](https://openanolis.cn/sig/SIG-Infra/doc/594387296754325258)。 + + +![](../../../assets/内核驱动/OOT驱动开发者指南/img_7.png) + + +5、评审人(maintainer)回复通过并附上签名。 + + +![](../../../assets/内核驱动/OOT驱动开发者指南/img_8.png) + + +6、依次将PR链接和评审人签名添加到相应 commit log 末尾处,并且使用git push --force 提交更新。 + + +注意:PR链接放在评审人签名前面 + + +格式: + + +Link: https://gitee.com/anolis/cloud-kernel/pulls/xxx Reviewed-by: xxx <邮箱> + + +![](../../../assets/内核驱动/OOT驱动开发者指南/img_9.png) + + +让最后10个 commit 都加上PR链接Link: https://gitee.com/anolis/cloud-kernel/pulls/xxx 以及评审人签名Reviewed-by: Linus Torvalds 的命令: + + +git filter-branch -f --msg-filter ' cat && echo "Link: https://gitee.com/anolis/cloud-kernel/pulls/xxx" && echo "Reviewed-by: Linus Torvalds "' HEAD~10..HEAD + + +  + + +7、在PR下评论 **/check-sig**提交签名及PR链接检查命令。 + + +![](../../../assets/内核驱动/OOT驱动开发者指南/img_10.png) + + +8、联系maintainer评论**/merge** 即可进入代码合入流程。 + + +![](../../../assets/内核驱动/OOT驱动开发者指南/img_11.png) + + +9、(可选)最后还需指定一人作为source tree仓库的maintainer,社区maintainer会为该maintainer添加仓库权限,新maintainer负责后续source tree仓库的维护。 + + +  + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250\350\241\245\344\270\201\350\247\204\350\214\203.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250\350\241\245\344\270\201\350\247\204\350\214\203.md" new file mode 100644 index 00000000..8522a7f0 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/OOT\351\251\261\345\212\250\350\241\245\344\270\201\350\247\204\350\214\203.md" @@ -0,0 +1,48 @@ +将代码合入OOT驱动仓库时,请根据如下规范制作补丁。 + + +注意:**所有补丁内容均不能出现中文** + + +## 范例 + + + +``` +sched/fair: Fix wrong cpu selecting from isolated domain + +ANBZ: #1468 + +#commit body ...... + +Signed-off-by: Andrew Morton +Link: https://gitee.com/anolis/cloud-kernel/pulls/xxx +Reviewed-by: Linus Torvalds +``` + +## 范例细则 + + +* 补丁标题/subject:保持原标题不变。 +* 补丁日志/commit log + + 第一行 + - 附上对应问题的bugzilla ID号。如果还没有bugzilla ID,需要前往[bugzilla](https://bugzilla.openanolis.cn/)提交问题。 + * 格式:**ANBZ +冒号+空格+#+bugzilla ID** + * 范例:**ANBZ: #42** + * "ANBZ" 即是 "Anolis bugzilla" + + 第二行 + - 空行。 + + 第三行及其之后 + - 具体的commit 内容。 +* 补丁签名/SOB + + 保留原补丁的完整签名,在其后追加合入人的签名 + - 格式:**Signed-off-by: <名字> <邮箱地址>** + - 范例:Signed-off-by: Andrew Morton +* PR链接(初次提交不需要,评审通过后再追加至commit log尾部) + + 在回合人签名后面追加PR链接 + - 格式:**Link: ** + - 范例:Link: +* Reviewed-by(初次提交不需要,评审通过后再追加至commit log尾部) + + 在PR链接后追加评审人签名 + - 格式:**Reviewed-by: <名字> <邮箱地址>** + - 范例:Reviewed-by: Linus Torvalds diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\345\246\202\344\275\225\346\217\220\344\272\244\347\241\254\344\273\266\345\205\274\345\256\271\346\200\247\346\265\213\350\257\225\347\224\263\350\257\267.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\345\246\202\344\275\225\346\217\220\344\272\244\347\241\254\344\273\266\345\205\274\345\256\271\346\200\247\346\265\213\350\257\225\347\224\263\350\257\267.md" new file mode 100644 index 00000000..0ba118fa --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\345\246\202\344\275\225\346\217\220\344\272\244\347\241\254\344\273\266\345\205\274\345\256\271\346\200\247\346\265\213\350\257\225\347\224\263\350\257\267.md" @@ -0,0 +1,6 @@ +请按照硬件兼容测试申请流程: https://openanolis.cn/sig/HCT/doc/423293128473364249 , + +下载安装ancert,ancert快速开始手册:https://openanolis.cn/sig/HCT/doc/515463617816101039 + +针对第三方驱动设备执行硬件兼容性测试,审核通过之后,同步测试结果到bugzilla。 + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\345\246\202\344\275\225\346\217\220\344\272\244\347\254\254\344\270\211\346\226\271\351\251\261\345\212\250\351\233\206\346\210\220\347\224\263\350\257\267.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\345\246\202\344\275\225\346\217\220\344\272\244\347\254\254\344\270\211\346\226\271\351\251\261\345\212\250\351\233\206\346\210\220\347\224\263\350\257\267.md" new file mode 100644 index 00000000..a4041592 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\345\246\202\344\275\225\346\217\220\344\272\244\347\254\254\344\270\211\346\226\271\351\251\261\345\212\250\351\233\206\346\210\220\347\224\263\350\257\267.md" @@ -0,0 +1,6 @@ +如果您有意向往Anolis OS中集成您的第三方驱动,请首先提一个龙蜥社区bugzilla用于跟踪合入流程。 + +具体操作步骤详见"[向CloudKernel报告BUG](https://openanolis.cn/sig/Cloud-Kernel/doc/607601736106142822)",其中「Component」选择「drivers」以保证社区能够第一时间看到。 + +![](https://oss.openanolis.cn/sig/barzdgeglncfymauwenf) + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\347\254\254\344\270\211\346\226\271\351\251\261\345\212\250\345\246\202\344\275\225\350\277\233\345\205\245Anolis_OS.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\347\254\254\344\270\211\346\226\271\351\251\261\345\212\250\345\246\202\344\275\225\350\277\233\345\205\245Anolis_OS.md" new file mode 100644 index 00000000..50466a9d --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\347\254\254\344\270\211\346\226\271\351\251\261\345\212\250\345\246\202\344\275\225\350\277\233\345\205\245Anolis_OS.md" @@ -0,0 +1,53 @@ +### 第三方驱动集成形式(Intree 或 Out-of-tree) + + +第三方驱动分为两种集成形式:第一种是集成到[Cloud Kernel](https://gitee.com/anolis/cloud-kernel)里面,与内核版本同步迭代,称为intree;第二种是采用单独的仓库管理,可以在大版本的基础上快速迭代小版本,称为out-of-tree(OOT)。 + + +两种集成形式的判定原则为: + + +* 使用较广泛的驱动,在其他主流OS intree支持,则Anolis OS也优先考虑intree支持。 +* 综合厂商意愿和多方意见决定是否intree。 +* 如果第三方驱动与Anolis内核中的相关代码有冲突,则选择out-of-tree。 +* 如果第三方驱动处于开发活跃期,版本节奏与Anolis OS不匹配,则选择out-of-tree。 + + +### 第三方驱动集成流程 + + +1、第三方厂商提交第三方驱动集成申请,具体操作请点击 [如何提交第三方驱动集成申请](https://openanolis.cn/sig/Cloud-Kernel/doc/658176089664054811) 。 + + +2、如果是外设驱动相关,第三方厂商还需要提交硬件兼容性测试申请,具体操作请点击 [如何硬件兼容性测试申请](https://openanolis.cn/sig/Cloud-Kernel/doc/658195172967044331) 。 + + +3、强烈建议你加入 [Cloud Kernel SIG](https://openanolis.cn/sig/Cloud-Kernel) 钉钉交流群,可用群号「**35675176」**或扫 [这里](https://openanolis.cn/sig/Cloud-Kernel) 末尾的二维码入群,入群后请查看群公告。 + + +  + + +通过bugzilla或钉钉群决策出来该第三方驱动是intree还是out-of-tree后,分别走不同的合入流程: + + +#### Intree流程 + + +1、第三方厂商提PR(Pull Request)将驱动合入到Anolis kernel中, 具体操作请点击 [内核开发者指南](https://openanolis.cn/sig/Cloud-Kernel/doc/657676881630727957) 。 + + +2、根据上述指南完成提交后,第三方厂商更新信息关闭bugzilla。 + + +#### Out-of-tree流程 + + +社区maintainer会创建source tree仓库和rpm tree仓库,将仓库信息同步至bugzilla中。 + + +1、第三方厂商提交PR(Pull Request)将源码 + spec文件合入到source tree仓库,具体操作请点击 [OOT驱动开发者指南](https://openanolis.cn/sig/Cloud-Kernel/doc/660356858711892913?preview=null) 。 + + +2、根据上述指南完成提交后,第三方厂商更新信息关闭bugzilla。 + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\351\241\271\347\233\256\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\351\241\271\347\233\256\347\256\200\344\273\213.md" new file mode 100644 index 00000000..98854f24 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\206\205\346\240\270\351\251\261\345\212\250/\351\241\271\347\233\256\347\256\200\344\273\213.md" @@ -0,0 +1,14 @@ +本项目致力于维护Anolis OS各个版本的第三方驱动,例如适配支持最新的硬件型号,但不限于硬件外设驱动。 + + +  + + +相关文档: + + +#### [第三方驱动如何进入Anolis OS](https://openanolis.cn/sig/Cloud-Kernel/doc/657632139127603555?preview=) + + +#### [Anolis OS支持的驱动列表](https://openanolis.cn/sig/Cloud-Kernel/doc/657632317528069334?preview=) + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK_ARM64_RAS\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK_ARM64_RAS\346\234\272\345\210\266\347\256\200\344\273\213.md" new file mode 100644 index 00000000..c3c53de1 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK_ARM64_RAS\346\234\272\345\210\266\347\256\200\344\273\213.md" @@ -0,0 +1,340 @@ +# 1. RAS机制简介 + + +为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: + + +**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。  + + +**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 + + +**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 + + +RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 + + +# 2. RAS机制错误处理流程 + + +RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 + + +RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_0.png) + + +# 3. RAS机制评测流程 + + +RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 + + +APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 + + +从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 + + +如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 + + + + +| | +| --- | +| 0 Processor Correctable +1 Processor Uncorrectable non-fatal +2 Processor Uncorrectable fatal | +| 3 Memory Correctable +4 Memory Uncorrectable non-fatal +5 Memory Uncorrectable fatal | +| 6 PCI Express Correctable +7 PCI Express Uncorrectable non-fatal +8 PCI Express Uncorrectable fatal | +| 9 Platform Correctable +10 Platform Uncorrectable non-fatal +11 Platform Uncorrectable fatal | + + +Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_1.png) + + +上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 + + +错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: + + +1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 + + +2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 + + +3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 + + +# 4. CPU及内存错误注入演示 + + +CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 + + +##  4.1 环境准备 + + +### 1. 安装EINJ模块 + + +使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html + + +此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 + + +### 2. 安装RAS测试工具 + + +直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git + + +### 3. 安装rasdaemon + + +先安装依赖包yum install sqlite perl-DBD-SQLite + + +使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git + + + +``` +autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make +make install +``` + +在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 + + + +``` + -d, --disable 禁用RAS事件并退出 + -e, --enable 使能RAS事件并退出 + -f, --foreground 前台运行 + -r, --record 通过sqlite3记录事件 +``` + +rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 + + +查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 + + +本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 + + +## 4.2 CPU错误注入 + + +本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 + + +使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 + + + +``` +./einj_mem_uc core_non_fatal +0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 +injecting ... +triggering ... +Manually take page offline +Test passed +``` + +使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 + + + + +| | | | | +| --- | --- | --- | --- | +| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined.  | + + +可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=17(core), cnt=0xd +INFO: RAS reg: +INFO: fr = 10a9a2 +INFO: status = 44800007 +INFO: addr = 8007e0e95fffb7ff +INFO: misc0 = 4 +INFO: misc1 = 0 +RTC: 2000-01-06 09:32:09 + core[8] mm(17) return: 0 +--handler(17) end +[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error +[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 +[40858.436229] {42}[Hardware Error]: event severity: recoverable +[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 +[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable +[40858.454204] {42}[Hardware Error]: section_type: ARM processor error +[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 +[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 +[40858.475041] {42}[Hardware Error]: running state: 0x1 +[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 +[40858.487456] {42}[Hardware Error]: Error info structure 0: +[40858.493013] {42}[Hardware Error]: num errors: 1 +[40858.497702] {42}[Hardware Error]: error_type: 0, cache error +[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 +[40858.509857] {42}[Hardware Error]: transaction type: Instruction +[40858.516109] {42}[Hardware Error]: cache level: 2 +[40858.521058] {42}[Hardware Error]: the error has not been corrected +[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered +``` + +## 4.3 内存错误注入 + + +使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 + + + +``` +./einj_mem_uc single +0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 +injecting ... +triggering ... +SIGBUS: addr = 0xffffabcb3400 +page not present +Test passed +``` + +BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=0(exception), cnt=0xa +MM Mem RAS handle,Intr:0 +Ch = 25810000 + |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 + |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 + |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 + |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 + |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 + |-ECCUSYN0~2:1FF,0,76 + |-SBRCTL:1C01591B,SBRSTS:0 +RasData->ExceptionEl: 0, UeCnt:0x1 +RTC: 2000-01-06 09:27:58 +Get SystemAddrss through mAddrTransProtocol start +Get SystemAddrss through mAddrTransProtocol end +s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 +Locate error dimm, Socket:0, Channel:2 Dimm:0 + core[8] mm(0) return: 0 +--handler(0) end +[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) +[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 +[40606.668367] {41}[Hardware Error]: event severity: recoverable +[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 +[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable +[40606.686342] {41}[Hardware Error]: section_type: memory error +[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) +[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 +[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 +[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC +[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered +``` + +## 4.4 rasdaemon日志读取 + + +rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 + + + +``` +[root@localhost ras-tools]# ras-mc-ctl --errors +Memory controller events: +1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +``` + +# 5. Q&A + + +Q:RAS机制是否需要BIOS支持? + + +A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 + + +  + + +Q: x86和ARM64的APEI是否一致? + + +A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 + + +  + + +Q: RAS注入的错误是真实的错误吗? + + +A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 + + +  + + +Q: rasdaemon日志查看是否有更易用的方法? + + +A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; + + + 最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 + + +  + + +Q: 可否使用mcelog? + + +A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 + + +  + + +Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? + + +A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 + + +  + + +Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? + + +A:需要检查是否是rasdaemon某些选项未开启。 + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK_boot_cmdline_\345\237\272\347\272\277\346\216\250\350\215\220.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK_boot_cmdline_\345\237\272\347\272\277\346\216\250\350\215\220.md" new file mode 100644 index 00000000..2afffe55 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK_boot_cmdline_\345\237\272\347\272\277\346\216\250\350\215\220.md" @@ -0,0 +1,182 @@ +## cgroup.memory=nokmem + + +### kmem 是什么 + + +kmem 是cgroup 的一个扩展,全称CONFIG\_MEMCG\_KMEM + + +内核内存:专用于Linux内核系统服务使用,是不可swap的,因而这部分内存非常宝贵的。但现实中存在很多针对内核内存资源的攻击,如不断地fork新进程从而耗尽系统资源,即所谓的“fork bomb”。 + + +为了防止这种攻击,社区中提议通过linux内核限制cgroup中的kmem容量,从而限制恶意进程的行为,即kernel memory accounting机制。 + + +内核内存统计对所有内存控制组默认使能,在启动时传递cgroup.memory=nokmem参数可以禁用该功能,在禁用后,内核内存就不会被统计。 + + +### 带来的性能影响 + + +#### 相关代码 + + +通过解析cmdline,是否传入nokmem会控制cgroup\_memory\_nokmem的值。 + + + +``` +static int __init cgroup_memory(char *s) +{ + char *token; + + while ((token = strsep(&s, ",")) != NULL) { + if (!*token) + continue; + if (!strcmp(token, "nosocket")) + cgroup_memory_nosocket = true; + if (!strcmp(token, "nokmem")) + cgroup_memory_nokmem = true; + } + return 0; +} +__setup("cgroup.memory=", cgroup_memory); +``` + +cgroup\_memory\_nokmem涉及到的相关函数如下: + + +each slab object pointer to an memcg respectively when kmem account enable, slab page can be used by root mem\_cgroup and children memcg. slab object age is recorded in slab\_age of page when kmem account disable. Otherwise, an special obj\_cgroups pointer will store the value. + + +int kidled\_alloc\_slab\_age(struct page \*page, struct kmem\_cache \*s, gfp\_t flags) + + +static unsigned short \*kidled\_get\_slab\_age\_array(void \*object) + + +static int memcg\_online\_kmem(struct mem\_cgroup \*memcg) + + +意味着使能该参数后,会在slab管理的page分配和释放流程上增加额外的处理逻辑,下面通过实际对比测试来直观的感受一下对应的开销。 + + +#### 数据测试 + + +通过lmbench对cgroup.memory=nokmem是否使能进行内存测试(5次取平均): + + + + +| | | | +| --- | --- | --- | +| 测试环境 | 开启cgroup\_memory\_nokmem | Communication bandwidths (Pipe,越大越好) | +| an8-4.19, memory cgroup 500M | 是 | 4234 | +| 否 | 3705 | +| an8-5.10, memory cgroup 500M | 是 | 4125 | +| 否 | 3659 | + + +### 其他问题 + + +#### kmem.slabinfo造成cpu使用率异常 + + +该问题只存在于4.19内核,5.10内核实现逻辑改变无此问题,参见mm/slab\_common.c + + +通过CONFIG\_SLAB或CONFIG\_SLUB\_DEBUG会使能kmem.slabinfo,目前anolis默认开启CONFIG\_SLUB\_DEBUG  + + + +``` +#if defined(CONFIG_SLAB) || defined(CONFIG_SLUB_DEBUG) + { + .name = "kmem.slabinfo", + .seq_start = memcg_slab_start, + .seq_next = memcg_slab_next, + .seq_stop = memcg_slab_stop, + .seq_show = memcg_slab_show, + }, +#endif +``` + +slabinfo通过链表的方式进行组织,意味着访问的时间复杂度为O(n),通过读取相应cgroup下的memory.kmem.slabinfo,可以查看相应的slabinfo信息。 + + + +``` +void *memcg_slab_start(struct seq_file *m, loff_t *pos) +{ + struct mem_cgroup *memcg = mem_cgroup_from_css(seq_css(m)); + + mutex_lock(&slab_mutex); + return seq_list_start(&memcg->kmem_caches, *pos); +} + +void *memcg_slab_next(struct seq_file *m, void *p, loff_t *pos) +{ + struct mem_cgroup *memcg = mem_cgroup_from_css(seq_css(m)); + + return seq_list_next(p, &memcg->kmem_caches, pos); +} + +void memcg_slab_stop(struct seq_file *m, void *p) +{ + mutex_unlock(&slab_mutex); +} + +int memcg_slab_show(struct seq_file *m, void *p) +{ + struct kmem_cache *s = list_entry(p, struct kmem_cache, + memcg_params.kmem_caches_node); + struct mem_cgroup *memcg = mem_cgroup_from_css(seq_css(m)); + + if (p == memcg->kmem_caches.next) + print_slabinfo_header(m); + cache_show(s, m); + return 0; +} +``` + +通过特定操作cgroup,可以让memory cgroup产生泄漏,复现方法如下: + + +通过不断创建新的memory cgroup,执行文件操作,并删除memory cgroup,我们可以看到,/sys/fs/cgroup/memory中的cgroup并没有增加,而/proc/cgroup显示存在大量的memory cgroup。 + + + +``` +for ((i=0;i<100000;++i)); do + mkdir -p /sys/fs/cgroup/memory/test/test$i + echo $$ > /sys/fs/cgroup/memory/test/test$i/tasks + mkdir -p /tmp/test/ + echo 'date' > /tmp/test/test$i + echo $$ > /sys/fs/cgroup/memory/test/tasks + rmdir /sys/fs/cgroup/memory/test/test$i +done +``` + +脚本执行前: + + +![](assets/ANCK_boot_cmdline_基线推荐/img_0.png) + + +脚本执行后: + + +![](assets/ANCK_boot_cmdline_基线推荐/img_1.png) + + +但是在执行脚本后,查看/sys/fs/cgroup/memory,并不存在对应数量的memory cgroup,产生泄漏。这样,大量的memory cgroup会造成访问slabinfo链表的执行时间大量增加,造成不必要的cpu访问开销。 + + +### 结论 + + +基于性能测试以及存在的潜在问题,存量的版本建议通过 boot cmdline cgroup.memory=nokmem 来关闭 kmem ,并保证用户习惯的兼容性。 + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK\345\206\205\346\240\270\345\212\237\350\203\275\344\270\216\346\216\245\345\217\243\344\273\213\347\273\215.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK\345\206\205\346\240\270\345\212\237\350\203\275\344\270\216\346\216\245\345\217\243\344\273\213\347\273\215.md" new file mode 100644 index 00000000..5e0b9291 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/ANCK\345\206\205\346\240\270\345\212\237\350\203\275\344\270\216\346\216\245\345\217\243\344\273\213\347\273\215.md" @@ -0,0 +1,1028 @@ +本文介绍龙蜥内核已支持的内核功能与接口。 + + +# Group Identity + + +Group Identity功能可以对每一个CPU cgroup设置身份标识,以区分cgroup中的任务优先级。Group Identity核心是双红黑树设计,在CFS(Completely Fair Scheduler)调度队列的单红黑树基础上,新增了一颗低优先级的红黑树,用于存放低优先级任务。系统内核在调度包含具有身份标识的任务时,会根据不同的优先级做相应处理。 + + +在业务的混合部署(延迟敏感型和计算型任务混合部署在同一台实例)场景中,Linux内核调度器需要为高优先级任务赋予更多的调度机会以最小化调度延迟,并需要把低优先级任务对内核调度带来的影响降到最低。 + + +基于该场景,ANCK提供了Group Identity功能,为CPU cgroup新增了配置调度优先级的接口,且不同优先级的任务具有以下特点: +* 高优先级任务的唤醒延迟最小化。 +* 低优先级任务不对高优先级任务造成性能影响。主要体现在: + + 低优先级任务的唤醒不会对高优先级任务造成性能影响。 + + 低优先级任务不会通过共享硬件unit而对高优先级任务造成性能影响。 + + + + +| | | +| --- | --- | +| 接口 | 说明 | +| `cpu.identity` | 默认取值为0,表示身份标识为`ID_NORMAL`。 +该接口是一个位段,一共有5个比特位,该接口各个比特位的取值说明如下: +* 空值:表示身份标识为`ID_NORMAL`。 +* 比特位0:表示身份标识为`ID_UNDERCLASS`。 +* 比特位1:表示身份标识为`ID_HIGHCLASS`。 +* 比特位2:表示身份标识为`ID_SMT_EXPELLER`。 +* 比特位3:表示身份标识为`ID_IDLE_SAVER`。 +* 比特位4:表示身份标识为`ID_IDLE_SEEKER`。 + + + +例如,如果设置一个cgroup的身份标识为`ID_HIGHCLASS`和`ID_IDLE_SEEKER`,那么将比特位1和4置为1,其他比特位置为0,得到的二进制表示为:10010,转化为十进制为:18,则执行`echo 18 > /sys/fs/cgroup/cpu/$cg/cpu.identity`即可完成写入。 | +| `cpu.bvt_warp_ns` | 默认取值为0,表示身份标识为`ID_NORMAL`。该接口的取值说明如下: +* 2:表示同时具有身份标识`ID_SMT_EXPELLER`、`ID_IDLE_SEEKER`、`ID_HIGHCLASS`,对应的identity值为22。 +* 1:表示同时具有身份标识`ID_HIGHCLASS`、`ID_IDLE_SEEKER`,对应的identity值为18。 +* 0:表示身份标识为`ID_NORMAL`,对应的identity值为0。 +* -1:表示同时具有身份标识`ID_UNDERCLASS`、`ID_IDLE_SAVER`,对应的identity值为9。 +* -2:表示同时具有身份标识`ID_UNDERCLASS`、`ID_IDLE_SAVER`,对应的identity值为9。 + | + + +  + + +# 在cgroup v1接口开启CPU Burst功能 + + + +在容器服务中,容器允许使用的CPU资源被内核的CFS Bandwidth Controller(带宽控制器)限流。当您在cgroup v1接口开启CPU Burst功能后,CPU Burst功能允许容器突发使用限流之外的CPU资源。该功能既可以保证容器运行的服务质量,又不降低容器部署密度。 +  + + + + +CPU Burst功能允许突发使用的CPU资源依赖于日常的资源积累。比如,容器在日常运行中使用的CPU资源未超过CPU限流,则空余的CPU资源将会被积累。后续当容器运行需要大量CPU资源时,将通过CPU Burst功能突发使用CPU资源,这部分突发使用的资源来源于已积累的资源。以休假体系作为类比: + + +假如您每年休假时间为4天(CPU限流),未休的假期可以存放起来后续使用,但存放上限为4天(CPU Burst)。当您第一年、第二年各只休了1天的假期,那么没有休息的6天假期可以存放起来。当第三年的时候,理论上您可以休息共计10天的假期,但因为有存放上限(CPU Burst),则实际可以休息至多8天的假期。 + + +## 开启CPU Burst功能 + + +1. 检查cgroup v1接口中的CPU Burst功能的全局开关是否已打开。 + + +  + +``` +cat /proc/sys/kernel/sched_cfs_bw_burst_enabled +``` + + + +返回结果说明: + + * 如果返回结果为`1`,则表示CPU Burst功能的全局开关已打开。 + +   + **说明** 默认情况下,cgroup v1接口中的CPU Burst功能的全局开关为打开状态。 + * 如果返回结果不为`1`,则表示CPU Burst功能的全局开关已关闭。您可以运行以下命令打开全局开关: + +   + + ``` + echo 1 > /proc/sys/kernel/sched_cfs_bw_burst_enabled + ``` +2. 在具体的子cgroup中开启CPU Burst功能。 +默认情况下,cgroup v1接口中的CPU Burst功能在各个子cgroup中均未开启。具体的开启方式如下: + 1. 进入子cgroup路径下,检查CFS Bandwidth Controller限流是否处于生效状态。 + + +   + + ``` + cd /sys/fs/cgroup/cpu/子cgroup目录名称/ + cat cpu.cfs_period_us + cat cpu.cfs_quota_us + ``` + + + + 如果`cpu.cfs_quota_us`对应的返回结果为正整数,则表示CFS Bandwidth Controller限流处于生效状态,进而在启用CPU Burst功能后,容器才可以获得超出CPU限流的CPU资源。 + 2. 检查当前默认的CPU Burst设置。 + + +   + + ``` + cat cpu.cfs_burst_us + ``` + + + + 返回结果的默认值为`0`,表示CPU Burst功能未开启。 + 3. 设置`cpu.cfs_burst_us`的值以开启CPU Burst功能。 + 您可以设置一个适用的正整数启用CPU Burst功能,且这个正整数表示子cgroup突发额外使用的CPU资源的上限。本文通过以下示例场景,介绍如何开启CPU Burst功能。 + + 1. 配置CFS Bandwidth Controller带宽控制器默认的`cpu.cfs_quota_us`与`cpu.cfs_period_us`。 + 以下配置,将CPU资源的使用周期(`cpu.cfs_period_us`)设置为100ms,每个周期中的CPU限流(`cpu.cfs_quota_us`)设置为400ms,则子cgroup将会持续获得4个CPU资源(`cpu.cfs_quota_us`/`cpu.cfs_period_us`)。 + +   + + ``` + echo 400000 > cpu.cfs_quota_us + echo 100000 > cpu.cfs_period_us + ``` + 2. 配置`cpu.cfs_burst_us`以开启CPU Burst功能。 + 以下配置,将CPU Burst的值设置为600ms,表示开启了CPU Burst功能,且允许子cgroup可以突发额外使用最多6个CPU资源(`cpu.cfs_burst_us`/`cpu.cfs_period_us`)。 + +   + + ``` + echo 600000 > cpu.cfs_burst_us + ``` + + +## 查询CPU Burst的统计数据 + + +1. 进入待查询数据的子cgroup路径下。 + + +  + +``` +cd /sys/fs/cgroup/cpu/子cgroup目录名称/ +``` +2. 查看统计数据。 + + +  + +``` +cat cpu.stat +``` + + +返回结果中,主要的信息说明如下: + + * `nr_burst`数据:当前子cgroup触发CPU Burst的次数。 + * `burst_time`数据:当前子cgroup突发使用CPU资源的时间。 + + + + + +  + +# 在cgroup v1接口开启PSI功能 + + + +PSI(Pressure Stall Information)是一个可以监控CPU、内存及IO性能异常的内核功能。有关PSI功能的详细信息,您可以通过内核文档`Documentation/accounting/psi.txt`了解。 + +## 为cgroup v1接口开启PSI功能 + + +默认情况下cgroup v1接口的PSI功能为关闭状态。按照以下步骤开启PSI功能。 + + +1. 运行`grubby`命令,修改启动参数。 +参数`args`中默认为`"psi=1"`,表示cgroup v2启用PSI功能。将参数修改为`"psi=1 psi_v1=1"`,表示为cgroup v1接口开启PSI功能。 本示例中内核版本为`4.19.81-17.an7.x86_64`,您在操作中需要更换为实际的内核版本,内核版本的查看命令为`uname -a`。 + +  + +``` +sudo grubby --update-kernel="/boot/vmlinuz-4.19.81-17.an7.x86_64" --args="psi=1 psi_v1=1" +``` +2. 重启系统使该功能生效。 + + +  + +``` +sudo reboot +``` + + +## 确认cgroup v1接口的PSI功能已启用 + + +系统重启后,您可以执行命令,确认内核`/proc/cmdline`中已启用cgroup v1接口的PSI功能。 + +  + +``` +cat /proc/cmdline | grep "psi=1 psi_v1=1" +``` + + + +## 查询CPU、内存及IO的监控数据 + + +当您开启cgroup v1接口的PSI功能时,CPU、内存及IO的PSI监控数据均会输出到cpuacct控制器下,您可以通过以下命令查看详细的监控数据。 + +  + +``` +cat /sys/fs/cgroup/cpuacct/cpu.pressure +cat /sys/fs/cgroup/cpuacct/memory.pressure +cat /sys/fs/cgroup/cpuacct/io.pressure +``` + + + + + + + + +# Memcg后台异步回收 + + + + +在社区内核系统中,系统分配内存并在相应memcg中的统计达到memcg设定的内存上限时,会触发memcg级别的直接内存回收。直接内存回收是发生在内存分配上下文的同步回收,因此会影响当前进程的性能。 + + +为了解决这个问题,ANCK增加了memcg粒度的后台异步回收功能。该功能的实现不同于全局kswapd内核线程的实现,并没有创建对应的memcg kswapd内核线程,而是采用了workqueue机制来实现,并在cgroup v1和cgroup v2两个接口中,均新增了4个memcg控制接口。 + + +注意事项: +* 当前memcg的内存分配,可能会递归触发父组的后台异步回收。 +* 触发memcg后台异步回收时,会从当前被触发的memcg开始,自上而下做层级回收。 +* 当memory.high接口被配置,并且memory.high的值比memory.limit\_in\_bytes接口的值小的时候,接口memory.wmark\_high和memory.wmark\_low水位线的计算将基于memory.high而不是memory.limit\_in\_bytes。 + + + + +| 接口 | 说明 | +| --- | --- | +| memory.wmark\_ratio | 该接口用于设置是否启用memcg后台异步回收功能,以及设置异步回收功能开始工作的memcg内存水位线。单位是相对于memcg limit的百分之几。取值范围:0~100 +* 默认值为0,该值也表示禁用memcg后台异步回收功能。 +* 取值为非0时,表示开启memcg后台异步回收功能并设置对应的水位线。 + | +| memory.wmark\_high | 只读接口,说明如下: +* 当memcg内存使用超过该接口的值时,后台异步回收功能启动。 +* 该接口的值由`(memory.limit_in_bytes * memory.wmark_ratio / 100)`计算获得。 +* memcg后台异步回收功能被禁用时,memory.wmark\_high默认为一个极大值,从而达到永不触发后台异步回收功能的目的。 +* memcg根组目录下不存在该接口文件。 + | +| memory.wmark\_low | 只读接口,说明如下: +* 当memcg内存使用低于该接口的值时,后台异步回收结束。 +* 该接口的值由`memory.wmark_high - memory.limit_in_bytes * memory.wmark_scale_factor / 10000`计算得出。 +* memcg根组目录下不存在该接口文件。 + | +| memory.wmark\_scale\_factor | 该接口用于控制memory.wmark\_high和memory.wmark\_low之间的间隔。单位是相对于memcg limit的万分之几。取值范围:1~1000 +* 该接口在创建时,会继承父组的值(该值为50),该值也是默认值,即memcg limit的千分之五。 +* memcg根组目录不存在该接口文件。 + | + + + + + +# Memcg全局最低水位线分级 + + + + +在Linux内核中,全局内存回收对系统性能影响很大。当时延敏感型业务和资源消耗型任务共同部署时,资源消耗型任务时常会瞬间申请大量的内存,使得系统的空闲内存触及全局最低水位线(global wmark\_min),引发系统所有任务进入直接内存回收的慢速路径,引发时延敏感型业务的性能抖动。在此场景下,无论是全局kswapd后台回收还是memcg后台回收,都将无法处理该问题。 + + +基于上述场景下的问题,ANCK新增了memcg全局最低水位线分级功能。在global wmark\_min的基础上,将资源消耗型任务的global wmark\_min上移,使其提前进入直接内存回收。将时延敏感型业务的global wmark\_min下移,使其尽量避免直接内存回收。这样当资源消耗型任务瞬间申请大量内存的时候,会通过上移的global wmark\_min将其短时间抑制,避免时延敏感型业务发生直接内存回收。等待全局kswapd回收一定量的内存后,再解除资源消耗型任务的短时间抑制。 + + + + + +## 功能接口说明 + + +实现memcg全局最低水位线分级功能的接口为memory.wmark\_min\_adj。该接口的值,表示基于全局最低水位线(global wmark\_min)所作出的调整(adjustment)百分比。取值范围:-25 ~ 50,取值范围说明如下: +* 该接口创建时,继承父组的值(值为0),即默认值为0。 +* 取值范围中的负值是基于调整范围`[0, WMARK_MIN]`的百分比,其中`WMARK_MIN`表示global wmark\_min的值,例如: + +  + +``` +memory.wmark_min_adj=-25, memcg WMARK_MIN is "WMARK_MIN + (WMARK_MIN - 0) * (-25%)" +``` + + + +  +**说明** 负值也表示global wmark\_min下移,即提高时延敏感型业务的内存子系统服务质量(memcg QoS)。 +* 取值范围中的正值是基于调整范围`[WMARK_MIN, WMARK_LOW]`的百分比,其中`WMARK_MIN`和`WMARK_LOW`分别表示global wmark\_min和global wmark\_low的值,例如: + +  + +``` +memory.wmark_min_adj=50, memcg WMARK_MIN is "WMARK_MIN + (WMARK_LOW - WMARK_MIN) * 50%" +``` + + + +  +**说明** 正值也表示global wmark\_min上移,即降低资源消耗型任务的内存子系统服务质量(memcg QoS)。 +* 当偏移后的global wmark\_min被触发后,会执行抑制操作,抑制操作的时间和超出的内存使用为线性比例关系。抑制时间的取值范围:1ms ~ 1000ms。 + + + +  +**说明** memcg根组目录下不存在该接口文件。 + + +## 接口注意事项 + + +在多层级目录的memcg中,有一个`effective memory.wmark_min_adj`的概念,即最终生效的memory.wmark\_min\_adj值。具体规则是在memcg层级路径上遍历取最大值(中间节点的默认值0除外)。例如,有以下层级关系示例。 + +  + +``` + root + / \ + A D + / \ + B C + / \ + E F +``` + + +则各层级设置的接口值与最终生效的接口值,对应关系如下所示。 + + + | 层级 | 各层级设置的接口值 | 最终生效的接口值 | +| --- | --- | --- | +| A | -10 | -10 | +| B | -25 | -10 | +| C | 0 | 0 | +| D | 50 | 50 | +| E | -25 | -10 | +| F | 50 | 50 | + + + +  +**说明** +* 运行命令`cat /sys/fs/cgroup/memory//memory.wmark_min_adj`输出的值为最终生效的值,其中变量``是memcg的根路径。 +* 本功能建议配合较高的全局最低水位线(global wmark\_min)来使用,例如将global wmark\_min值设置为2 GB或更高,您可以通过/proc/sys/vm/min\_free\_kbytes进行设置。 + + + + + +## 功能配置示例 + + +示例一:为时延敏感型业务所在memcg配置全局最低水位线分级。 + + +1. 运行命令`mkdir /sys/fs/cgroup/memory/test-lc`创建测试文件。 +2. 运行命令`echo -25 > /sys/fs/cgroup/memory/test-lc/memory.wmark_min_adj`向接口写入值`-25`,提高时延敏感型业务的memcg QoS。 + + +示例二:为资源消耗型任务所在memcg配置全局最低水位线分级。 + + +1. 运行命令`mkdir /sys/fs/cgroup/memory/test-be`创建测试文件。 +2. 运行命令`echo 25 > /sys/fs/cgroup/memory/test-be/memory.wmark_min_adj`向接口写入值`25`,降低资源消耗型任务的memcg QoS。 + + + + + + +# Memcg OOM优先级策略功能 + + + + +在现有内核系统中,内存紧张情况下内核会遍历cgroup,选择耗用内存较多的cgroup进行内存回收,甚至在回收失败的情况下直接OOM,并停止当前cgroup下的所有任务。这对于当前cgroup包含的核心业务来说,会造成很大的影响。为此我们希望这类包含核心业务的cgroup占有的内存不被回收,或者cgroup下的任务在OOM中可以存活下来,以便让内核去选择其他的cgroup进行内存回收或者OOM。 + + +为了解决这个问题,ANCK增加了memcg OOM优先级配置功能。该功能在进行OOM操作时,会首先判定cgroup的优先级,选择低优先级的cgroup进行OOM操作。 + + +## memcg OOM优先级接口功能说明 + + + + + | 接口 | 说明 | +| --- | --- | +| `memory.use_priority_oom` | 该接口用于设置是否启用memcg OOM优先级策略功能,取值为0或者1。该接口不会继承,默认值为0。 +* 取值为0时,表示禁用memcg OOM优先级策略功能。 +* 取值为1时,表示开启memcgOOM优先级策略功能。 + | +| `memory.priority` | 该接口提供13个级别的memcg优先级以支持不同重要程度的业务。取值范围为0~12,数值越大表示优先级越高。该接口不会继承,默认值为0。 +* 实现一定程度的内存QoS,此处需要说明的优先级值非全局变量,只能在同父cgroup下的兄弟节点进行比较。 +* 对于优先级相等的兄弟节点来说,会按照组的内存使用量来排序选择内存使用最大的进行OOM操作。 + | + + +## 接口配置示例 + + +按如下所示创建6个cgroup子节点A、 B、 C、 D、 E、 F,开启`memory.use_priority_oom`接口,并通过`memory.priority`接口设置OOM的优先级。 + +  + +``` + root + / \ + A B + / \ / \ + C D E F +``` + + +则各层级设置的接口值,对应关系如下所示: +* A:10 +* B:8 +* C:5 +* D:6 +* E:7 +* F:8 + + + +当在root中进行OOM操作时,它首先迭代查找它的两个子节点A和B,由于B的优先级值低于A,所以会选择B节点作为下一个迭代cgroup继续进行迭代,最终会在子节点E上进行OOM操作,因为它的优先级比其他的兄弟节点低。 + + +  + + +# THP reclaim功能 + + + + + + + +Linux操作系统的内存采用分页管理模式,其中的THP(Transparent Huge Page)是指内核中2 MiB或1 GiB大小的大页面(普通的小页面大小为4 KiB),一般被称为透明大页。基于应用程序使用到的内存范围越来越大,地址转换产生的开销变得不可忽视。因此,当服务器上的应用程序申请内存时,内核会根据进程的实际情况动态分配透明大页,透明大页可以减少TLB(Translation Lookaside Buffer) Miss的出现概率,从而提升应用程序的性能。 + + +THP在带来性能提升的同时,也产生了一定副作用,即可能产生Memory bloating(内存膨胀)问题。该问题产生的原因说明:透明大页申请释放的粒度为2 MiB(即512个小页面),相较于小页面,透明大页更容易产生内存碎片,进而导致内核分配的内存容量大于实际需要的内存容量。 + + +Memory bloating可能引发OOM(Out Of Memory)。例如,一个应用程序实际需要使用2个小页面,即8 KiB内存,但是内核分配了1个透明大页。此时,除去应用程序实际需要的内存(2个小页面),透明大页剩下的内存(510个小页面)大小均为0。最终可能会因RSS(Resident Set Size)内存用量增加而导致OOM。 + + +为解决THP可能引发的内存问题。ANCK增加了memcg粒度的THP reclaim功能。在内核回收内存时,该功能会把透明大页拆分为小页面,并将其中的全零页面(zero subpage)回收,从而避免内存的快速膨胀引发OOM。但您需要注意,由于THP reclaim功能会将透明大页拆分为小页面,所以相较于2 MiB大小的透明大页,THP reclaim功能会在一定程度上造成内存性能的回退。 + + +## 接口说明 + + +实现THP reclaim功能的接口说明,如下表所述: + + + | 接口 | 说明 | +| --- | --- | +| `memory.thp_reclaim` | 开启或关闭THP reclaim功能。支持以下配置项: +* reclaim:开启THP reclaim功能。 +* swap:预留配置项,目前暂无实际功能。 +* disable:关闭THP reclaim功能。 + + +THP reclaim功能默认为关闭状态,即接口默认值为disable。 | +| `memory.thp_reclaim_stat` | 查看THP reclaim功能当前的状态。接口内的参数说明如下: +* queue\_length:当前被THP reclaim管理的透明大页数量。 +* split\_hugepage:累计拆分的透明大页数量。 +* reclaim\_subpage:累计回收的全零页面(zero subpage)数量。 + + +该接口的参数值按照NUMA node的顺序(node0、node1)从左到右排列。 | +| `memory.thp_reclaim_ctrl` | 控制THP reclaim功能的触发机制。目前支持以下配置项: +* threshold:默认值为16。表示当透明大页中的全零页面(zero subpage)数量超过该值时,会触发THP reclaim功能。 +* reclaim:用于主动触发THP reclaim功能。 + | +| `/sys/kernel/mm/transparent_hugepage/reclaim` | THP reclaim功能的全局配置接口。支持以下配置项: +* memcg:该接口的默认配置项。表示每个memory cgroup按照各自的配置开启或关闭THP reclaim,即以每个memory cgroup中的`memory.thp_reclaim`接口配置为准。 +* reclaim:强制开启所有memory cgroup的THP reclaim功能。 +* swap:预留配置项,目前暂无实际功能。 +* disable:强制关闭所有memory cgroup的THP reclaim功能。 + | + + + +## 接口配置的操作说明 + + +本示例操作中,将创建一个名为test的memory cgroup,以test为例介绍THP reclaim接口的操作说明。 + + +1. 运行以下命令,创建一个名为test的memory cgroup。 + + +  + +``` +mkdir /sys/fs/cgroup/memory/test/ +``` +2. 运行以下命令,开启test的THP reclaim功能。 + + +  + +``` +echo reclaim > /sys/fs/cgroup/memory/test/memory.thp_reclaim +``` +3. 运行以下命令,确认test的THP reclaim功能成功开启。 + + +  + +``` +cat /sys/fs/cgroup/memory/test/memory.thp_reclaim +``` + + + +返回结果如下图所示,被`[]`包裹的配置项为生效配置项,`[reclaim]`表示test的THP reclaim功能已开启。![开启THP功能](../../../assets/基础能力和版本演进/ANCK内核功能与接口介绍/img_0.png) +4. 运行以下命令,通过THP reclaim功能的全局配置接口强制开启THP reclaim功能。 + + +  + +``` +echo reclaim > /sys/kernel/mm/transparent_hugepage/reclaim +``` + + +如果您想强制关闭THP reclaim功能,可运行以下命令: + +  + +``` +echo disable > /sys/kernel/mm/transparent_hugepage/reclaim +``` + + + +  +**说明** THP reclaim功能的全局配置接口`/sys/kernel/mm/transparent_hugepage/reclaim`在设置为强制开启(`reclaim`)或强制关闭(`disable`)时,接口生效的优先级会高于各个memory cgroup中的`memory.thp_reclaim`接口,但不会影响各个memory cgroup中`memory.thp_reclaim`接口的配置。 +5. 运行以下命令,配置test的`memory.thp_reclaim_ctrl`接口的`threshold`配置项。 + + +  + +``` +echo "threshold 32" > /sys/fs/cgroup/memory/test/memory.thp_reclaim_ctrl +``` + + + +此时,如果透明大页中的全零页面数量超过32,则会触发THP reclaim的全零页面回收功能。 +6. 主动触发THP reclaim的全零页面回收功能。 +主动触发后,THP reclaim会把所有超过`threshold`配置的全零页面回收。配置项`reclaim`存在以下配置方式: + +  +**说明** 该配置项的调用方式为同步调用,并且为只写配置项,即您只能向`memory.thp_reclaim_ctrl`接口写入`reclaim`以主动触发THP reclaim的全零页面回收功能,但不能通过cat命令查看到`reclaim`配置项。 + + + * 运行以下命令,会主动触发当前memory cgroup的THP reclaim的全零页面回收功能。 + +   + + ``` + echo "reclaim 1" > /sys/fs/cgroup/memory/test/memory.thp_reclaim_ctrl + ``` + * 运行以下命令,会主动递归触发当前memory cgroup以及该cgroup下所有子cgroup的THP reclaim的全零页面回收功能。 + +   + + ``` + echo "reclaim 2" > /sys/fs/cgroup/memory/test/memory.thp_reclaim_ctrl + ``` + + + 除了通过`reclaim`主动触发THP reclaim的全零页面回收功能。THP reclaim还会伴随内存回收而触发: + + 内存出现OOM时,会触发THP reclaim的全零页面回收功能。 + + 当memory cgroup触发memory后台异步回收时,会触发THP reclaim的全零页面回收功能。关于memory后台异步回收的更多信息,请参见"Memcg后台异步回收"。 +7. 运行以下命令,查看test的THP reclaim功能状态。 + + +  + +``` +cat /sys/fs/cgroup/memory/test/memory.thp_reclaim_stat +``` + + + +返回结果示例如下: + +  + +``` +queue_length 14 +split_hugepage 523 +reclaim_subpage 256207 +``` + + +## C语言代码测试样例 + + +本章节基于C语言提供了进程申请透明大页的代码测试样例。您可以通过以下测试样例,查看到THP reclaim功能在开启与关闭时的区别。 + + +1. 运行以下命令,为内存使用量限制接口`memory.limit_in_bytes`设置1 GiB的限制。 + + +  + +``` +echo 1G > /sys/fs/cgroup/memory/test/memory.limit_in_bytes +``` + + + +设置后,您可以运行以下命令查看`memory.limit_in_bytes`接口的值。 + +  + +``` +cat /sys/fs/cgroup/memory/test/memory.limit_in_bytes +``` + + +查看结果如下图所示:![异步回收机制](../../../assets/基础能力和版本演进/ANCK内核功能与接口介绍/img_1.png) +2. 运行以下命令,关闭memcg后台异步回收功能。 +关于memory后台异步回收的更多信息,请参见"Memcg后台异步回收"。 + +  + +``` +echo 0 > /sys/fs/cgroup/memory/test/memory.wmark_ratio +``` +3. 分别在开启或关闭THP reclaim功能的前提下,运行以下C语言代码进行测试,并查看测试结果。 + + +  + +``` +// 申请1 G内存(即512个透明大页),其中10个透明大页包含部分全零页面。 +#define HUGEPAGE_SIZE 4096 * 512 +int main() +{ + int i, thp = 512; + char *addr; + posix_memalign((void **)&addr, HUGEPAGE_SIZE, HUGEPAGE_SIZE * thp); + + for (i = 0; i < 10; i++) { + memset(addr, 0xc, HUGEPAGE_SIZE >> 1); + addr += HUGEPAGE_SIZE; + } + + for (; i < thp; i++) { + memset(addr, 0xc, HUGEPAGE_SIZE); + addr += HUGEPAGE_SIZE; + } + + pause(); + return 0; +} +``` + + + +测试结果根据THP reclaim功能的开启状态有所不同: + + * 在THP reclaim功能关闭时,进程申请最后一个透明大页会发生OOM。 + * 在THP reclaim功能开启时,进程申请透明大页过程中,THP reclaim会把前序申请的透明大页拆分为小页,并回收其中的全零页面,最终不会发生OOM。 + + + + + +  + +# 启用cgroup writeback功能 + + + + + +## 背景信息 + + + +控制群组(control group)简称为cgroup,分为v1和v2两个版本。本文介绍如何启用cgroup v1的cgroup writeback功能,并对进程进行Buffered I/O限速。 + + +## 使用限制 + + +在启用cgroup writeback功能之后,您可以先确认内存子系统(memcg)和IO子系统(blkcg)的映射关系是否符合下文所述的规则,再对进程进行Buffered I/O限速。 + + +cgroup writeback功能需要memcg和blkcg协同工作,完成Buffered I/O的限速,但是内核接口cgroup v1的各个控制子系统间默认不协同工作。因此需要通过一定的规则把memcg和blkcg连接起来,规则为:通过任意一个memcg必须可以找到与之唯一对应的blkcg。即memcg和blkcg的映射关系可以是一对一或多对一,不可以是一对多或多对多。 + + +例如,存在进程A和B,对它们进行Buffered I/O限速,需要遵循以下约束。 +* 如果A和B分属不同的memcg,它们可以映射到不同的blkcg,只需各自一一对应。例如:A属于`memcg1`,`blkcg1`;B属于`memcg2`,`blkcg0`。 +* 如果A和B分属不同的memcg,它们也可以映射到同一个blkcg。例如:A属于`memcg1`,B属于`memcg2`,A和B都属于`blkcg2`。 +* 如果A和B属于相同的memcg,那么它们只能映射到同一个blkcg。例如:A和B均属于`memcg0`,它们同时属于`blkcg3`。 + + +为了避免出现意外情况,建议您在启用cgroup writeback功能后,对进程进行Buffered I/O限速前,优先设置blkcg的`cgroup.procs`接口,向该接口写入一个进程ID来保证blkcg映射的唯一性。同时您也可以通过工具查看memcg和blkcg的映射关系,详情请参见确认memcg和blkcg的映射关系。 +  +在实际运维中,可能出现进程移动到其它cgroup的情况。根据上述规则,如果进程在memcg之间移动,不会出现问题,但如果进程在blkcg之间移动,将会出现异常情况。为了避免产生异常,该功能的代码中定义了规则:一旦工作中的blkcg内的进程发生blkcg间的移动,则将映射关系直接指向root blkcg。由于一般情况是不在root blkcg设置限流阈值,所以当映射关系直接指向root blkcg时,限速功能会失效。 + +  +**注意** 内核代码虽定义了规则避免出现意外,但您需要在实际操作中尽量避免将进程在blkcg间移动。 + + +## 开启cgroup writeback功能 + + +cgroup v1接口中的cgroup writeback功能默认是关闭的,按照以下步骤开启该功能。 + + +1. 通过命令`grubby`内添加`cgwb_v1`字段开启该功能。 +本示例中内核版本为`4.19.36-12.an7.x86_64`,您在操作中需要更换为实际的内核版本,内核版本的查看命令为`uname -a`。 + +  + +``` +sudo grubby --update-kernel="/boot/vmlinuz-4.19.36-12.an7.x86_64" --args="cgwb_v1" +``` +2. 重启系统使功能生效。 + + +  + +``` +sudo reboot +``` +3. 使用以下命令读取内核文件`/proc/cmdline`,确认内核命令行参数中带有`cgwb_v1`字段。此时,blkcg下的`blkio.throttle.write_bps_device`及`blkio.throttle.write_iops_device`接口能够对Buffered I/O进行限速。 + + +  + +``` +cat /proc/cmdline | grep cgwb_v1 +``` + + +## 确认memcg和blkcg的映射关系 + + +当您对进程进行Buffered I/O限速之前,您可以使用以下任意一种方式诊断memcg和blkcg的映射关系是否为一对一或多对一。 + + +* 查看memcg与blkcg映射关系。 + +  + +``` +sudo cat /sys/kernel/debug/bdi/bdi_wb_link +``` + + +返回结果示例如下,该示例表示memcg和blkcg符合一对一的映射规则。 + +  + +``` +memory <---> blkio +memcg1: 35 <---> blkcg1: 48 +``` +* 使用ftrace内核监测工具。 + 1. 开启ftrace工具。 + +   + + ``` + sudo bash -c "echo 1 > /sys/kernel/debug/tracing/events/writeback/insert_memcg_blkcg_link/enable" + ``` + 2. 查看信息输出接口。 + +   + + ``` + sudo cat /sys/kernel/debug/tracing/trace_pipe + ``` + + + 输出内容示例如下,其中`memcg_ino=35 blkcg_ino=48`表示memcg和blkcg符合一对一的映射规则。 + +   + + ``` + <...>-1537 [006] .... 99.511327: insert_memcg_blkcg_link: memcg_ino=35 blkcg_ino=48 old_blkcg_ino=0 + ``` + + +## 验证cgroup writeback是否生效 + + +本示例将模拟出两个产生I/O的进程,用于验证cgroup writeback功能是否有效。 + + + +  +**说明** +* 由于`dd`命令的反馈速度较快,结果使用`iostat`命令查看。 +* 由于`dd`命令为顺序写入,顺序IO回刷时,会生成1 MB数据再回刷,因此设置阈值时,`blkio.throttle.write_bps_device`不得小于1 MB(1048576)。如果设置值小于1 MB,可能会引发IO hang。 + + + + +1. 模拟出两个产生I/O的进程,并按照限制条件优先设置blkcg的`cgroup.procs`接口。 + + +  + +``` +sudo mkdir /sys/fs/cgroup/blkio/blkcg1 +sudo mkdir /sys/fs/cgroup/memory/memcg1 +sudo bash -c "echo $$ > /sys/fs/cgroup/blkio/blkcg1/cgroup.procs" # $$为您的进程ID +sudo bash -c "echo $$ > /sys/fs/cgroup/memory/memcg1/cgroup.procs" # $$为您的进程ID +``` +2. 使用blkcg下的`blkio.throttle.write_bps_device`接口对Buffered I/O进行限速。 + + +  + +``` +sudo bash -c "echo 254:48 10485760 > /sys/fs/cgroup/blkio/blkcg1/blkio.throttle.write_bps_device" # 通过设备号配置磁盘的回写限流bps为10 M +``` +3. 使用不带参数`oflag=sync`的`dd`命令产生缓存异步I/O。 + + +  + +``` +sudo dd if=/dev/zero of=/mnt/vdd/testfile bs=4k count=10000 +``` +4. 使用iostat工具查询结果。查看输出列`wMB/s`,如果被限制到10 MB/s,则表示cgroup writeback功能已生效。 + + +  + +``` +iostat -xdm 1 vdd +``` + + + + + + +# 增强容器资源可见性 + + + + + + + +标准Linux的容器资源视图功能接口默认状态下是未启动的,当您在启动该功能后,如果在容器中使用top、free等命令,让容器读取以下接口的数据时,将直接获取容器资源信息,而不是获取容器所在的宿主机(即ECS实例)资源信息。 +* /proc/cpuinfo +* /proc/meminfo +* /sys/devices/system/cpu/online + + + +## 接口说明 + + + + + | 接口 | 说明 | +| --- | --- | +| /proc/sys/kernel/rich\_container\_enable | 该接口控制容器资源视图功能是否开启。取值范围: +* 0:关闭容器资源视图功能。 +* 1:开启容器资源视图功能。 + + +默认值:0 | +| /proc/sys/kernel/rich\_container\_source | 该接口控制cgroup接口的数据源。取值范围: +* 0:使用指针current所在的cgroup接口作为数据源。 +* 1:使用child reaper(即当前PID Namespace的1号进程)所在的cgroup作为数据源。 + + +默认值:0 | +| /proc/sys/kernel/rich\_container\_cpuinfo\_source | 该接口控制/proc/cpuinfo接口以及/sys/devices/system/cpu/online接口显示的CPU数量。取值范围: +* 0:使用Kubernetes的Request和Limit数据的比值(`Request/Limit`),即`quota`与`period`的比值(`quota/period`)。 +* 1:使用cpuset.cpus接口中的CPU数据源。 +* 2:使用`cpu.shares` 值除以 `/proc/sys/kernel/rich_container_cpuinfo_sharesbase`值的向上取整后的数据(原始数据如果包含小数,则整数位加1后,只取整数作为最终数据,例如:原始数据为1.1,则最终数据为2)。最终数据最多不超过实际在线CPU的数量。 + + +默认值:0 | +| /proc/sys/kernel/rich\_container\_cpuinfo\_sharesbase | 当/proc/sys/kernel/rich\_container\_cpuinfo\_source接口的取值为2时,需要使用该接口作为计算公式的一部分获取最终数据。取值范围:大于等于2的整数值。 +默认值:1024 | + + +## 接口使用示例 + + +本示例中,已在一台Linux实例中部署Docker,并创建了一个内存大小为1 GB的容器。 + + +* 如果您未开启容器资源视图功能,即/proc/sys/kernel/rich\_container\_enable接口的值为0。当您在容器中运行free -m命令时,查看到的资源信息如下图所示,该信息为容器所在的宿主机(Linux实例)资源信息。![free](../../../assets/基础能力和版本演进/ANCK内核功能与接口介绍/img_2.png) +* 如果您在宿主机(Linux实例)中运行命令echo 1 > /proc/sys/kernel/rich\_container\_enable开启了容器资源视图功能,当您在容器中运行free -m命令时,查看到的资源信息如下图所示,该信息为容器资源信息。![free](../../../assets/基础能力和版本演进/ANCK内核功能与接口介绍/img_3.png) + + +## 特殊场景说明 + + +一般情况下,开启容器资源视图功能后,使用相关接口的默认值即可满足常规需求,但您需要注意以下特殊场景的接口配置: + + +对于非共享PID Namespace的Pod,其中的每一个容器都是独立的PID Namespace,如果使用systemd启动某个特权容器,容器的进程号为1号,则采集监控数据的任务可能位于容器的某个子cgroup中,而不是根cgroup。 + + +例如,当您通过SSH登录容器并运行cat /proc/cpuinfo命令后: +* 如果/proc/sys/kernel/rich\_container\_source取值为默认值0,则指针current实际是位于容器的sshd.service所创建的子cgroup中,此时查看的结果为错误数据。 +* 如果您运行echo 1 > /proc/sys/kernel/rich\_container\_source命令,使用child reaper(即当前PID Namespace的1号进程)所在的cgroup作为数据源,即可查看到正确的数据。 + + + + + + + +# 修改TCP TIME-WAIT超时时间 + + + + +在Linux的内核中,TCP/IP协议的TIME-WAIT状态持续60秒且无法修改。但在某些场景下,例如TCP负载过高时,适当调小该值有助于提升网络性能。ANCK新增内核接口用于修改TCP TIME-WAIT超时时间,本文主要介绍该接口的使用方法。 + + + +## 背景信息 + + + +TCP/IP协议的TIME-WAIT状态是指应用关闭用于通信的套接口(socket)之后,TCP/IP协议栈保持socket处于打开状态。该状态默认持续60秒,用来保证完成服务器和客户端的数据传输。当处于TIME-WAIT状态的连接数过多时,可能会影响到网络性能。因此ANCK提供了可修改TIME-WAIT超时时间的接口,用于在特定场景提高网络性能。例如,高并发业务场景。该接口的取值范围为[1, 600],单位为秒。如果不修改该接口,TIME-WAIT超时时间的默认值保持60秒不变。 + + +## 注意事项 + + +将TCP TIME-WAIT超时时间修改为小于60秒与TCP/IP协议quiet time概念相违背,可能导致您的系统将旧数据当做新数据接收,或者复制的新数据当做旧数据拒绝。因此请在网络专家建议下调整。了解TCP/IP协议quiet time的相关概念,请参见[IETF RFC 793标准](https://tools.ietf.org/html/rfc793)。 + + +## 配置方法 + + +您可以通过以下两种方式修改TIME-WAIT超时时间,其中参数[$TIME\_VALUE]为您修改的TIME-WAIT超时时间。 + + +* 通过`sysctl`命令修改TIME-WAIT超时时间。 + +  + +``` +sysctl -w "net.ipv4.tcp_tw_timeout=[$TIME_VALUE]" +``` +* 以root权限使用`echo`命令,将值修改到`/proc/sys/net/ipv4/tcp_tw_timeout`接口中。 + +  + +``` +echo [$TIME_VALUE] > /proc/sys/net/ipv4/tcp_tw_timeout +``` + + +例如,在Nginx配置7层代理等存在大量短连接的场景下,阿里云推荐您将TIME-WAIT超时时间修改为5s。运行以下任一命令修改超时时间: + +  +**说明** 服务器中是否存在大量短连接,您可以运行`netstat -ant | grep TIME_WAIT | wc -l`命令进行判断。 + + +  + +``` +sysctl -w "net.ipv4.tcp_tw_timeout=5" +``` + + + +  + +``` +echo 5 > /proc/sys/net/ipv4/tcp_tw_timeout +``` + + + + + + + + + + + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/datop\346\212\200\346\234\257\346\226\271\346\241\210.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/datop\346\212\200\346\234\257\346\226\271\346\241\210.md" new file mode 100644 index 00000000..f3563b40 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/datop\346\212\200\346\234\257\346\226\271\346\241\210.md" @@ -0,0 +1,444 @@ + +# 概述 + + +在本文中,我们基于社区DAMON设计用于跟踪实时内存热点数据的工具DATOP, 采用划分内存区域采样的方式,并自适应区域构建技术来获取极低的开销损耗,在此基础上,还增加了numa 仿真功能,用于收集任务跨numa访存情况,为了评估其准确性和低开销能力,我们选取和测试了多个benchmark,并与基线进行比较, 结果表明:**DATOP工具运行时开销非常小(保持在不到4%左右),此外开销不受负载大小的影响,仍然保持出色的监控质量,通过多方面测试,我们得出结论:DATOP工具在识别冷热内存以及跨numa访存方面具备优秀的表现能力。** + + +# 背景:云计算大规模复杂场景下内存面临的挑战 + + +云计算领域场景下,海量用户数据的增长,对计算机软件和硬件设计都带来了巨大的挑战,尤其是内存设备如DRAM的速率提升并没有跟上这种高速增长趋势,在数据中心中,海量数据的处理,常常让服务器饱受内存不足之苦。 + + +为克服低内存容量,混合内存使用如DRAM搭配PMEM成为未来数据中心的主流方案,但是如何快速识别热点数据并让其准确保持在DRAM中运行是影响性能的关键因素,这就要求系统具备快速识别热点数据的能力,并能动态跟踪捕获热点数据的变化,让其处于高性能的DRAM中,但是不幸的是,现有工具为达到一定的准确度,通常会耗费大量的时间,并引入额外的overhead,造成性能回退。 + + +此外服务器硬件架构的快速迭代,cpu核数越来越多,numa节点也越来越多,例如amd服务器numa node数目达到8个,arm服务器飞腾s2500 numa节点达到16个,跨numa节点访存带来的性能影响日益突出,如何低开销高效的识别出跨numa热点数据,并优化之,对于提升系统服务质量,有着重要的意义。 + + +# datop:轻量级靶向热点内存扫描工具 + + +## 热点扫描原理及策略 + + +在内存领域,对内存进行优化其实依靠预测内存的行为而做的决策,但是能够高效准确的预测内存的走势,其实是非常困难的,此外内存的策略优化对于用户来说,是不透明的,因此现有内存领域的各种策略机制,在实际生产环境中,并未取得很好的效果,也正是基于这些原因,社区推出了一种新的内存调控机制DAMON(Data Access Monitor),它试图让向用户展示内存的动作行为,让用户可根据这些行为相应的调整内存管理策略。 + + +### 三大chunks + + +服务器现有硬件能支持非常巨大的地址空间,内存容量动不动达到几个T的大小,工作负载耗用内存几个G也是很普遍的事,随机毫无规律的划分地址空间可肯定是不可取的,并且在实际使用中,只有小部分区域被实际映射到内存并被访问,DAMON通过分析和论证,先将地址分为三大chunks,这三个chunks区域之间的空隙是给定地址空间中两个最大的未映射区域。 + + +**图1:** + + +![](assets/datop技术方案/img_0.png) + + +在大多数情况下,两个最大的未映射区域是堆与最上层mmap() ed区域之间的空隙,以及最下层mmap() ed区域与堆栈之间的空隙, 因为这些间隙在通常的地址空间中是非常大的,排除这些就足够了,所以针对一个工作负载而言,DAMON只需要监控一下这些区域就足够了, 此外,随着工作负载的运行,映射区域发生变化,例如部分最大ummaped区域易主,所以damon设置了一个update周期,去周期性检测这些三大chunks的有效性,重新查找有效的三大chunks,并和现有监测得区域进行对比,删减或者增加。 + + +### region拆分与合并 + + +在获取三大chunks后,damon会按照设定规则,去将这三个chuns划分为不均等的若干分regions, 如下图2所示: + + +**图2:** + + +![](assets/datop技术方案/img_1.png) + + +这些regions后面会随着热点频率去动态调整,进行拆分或者合并操作,其算法原理大致如下: + + +**拆分原则:** + + +1. 大于等于2倍 DAMON\_MIN\_REGION才能拆分; +2. 才分region的size不能小于DAMON\_MIN\_REGION; +3. region可以拆分为3个,当regions个数大于max\_nr\_regions的2/3后,降低拆分个数,由3变2; +4. region个数必须保持在min\_nr\_regions和max\_nr\_regions范围内; + + +**合并原则:** + + +1. 两合并的regions必须收尾地址相等; +2. 两者热点统计值之差必须小于设定阈值范围内; + + +### region采样与热点统计 + + +“trace page access bit”技术作为跟踪热点内存通用那就的技术手段,被业界广泛使用,但是该技术有一个固有的缺陷,那就是随着工作负载耗用内存增加,自身带来的开销和跟踪质量都会变糟,而damon通过region划分, 再结合空间采样方式良好的解决了该缺陷:假设一个region中,所有page都有相同的访问模式,这样的话,只需要监控一个page就够了。这样一来,在每个region里面,会随机选择一个page,在bitmap中把它对应的“accessed(访问过)”bit先清零,然后时不时地检查一下,如果这个page被访问过了,那么就算作这个region都被访问过了,它不是监视所有的页面,而是只监视reigon里面随机抽取的一个页面,该页面在某个采样时刻代表着这个region, 并将该值记录下来, 随着采样的不断进行,该region的热点就被统计下来了。 + + + +``` +void check_access(region ∗ r) { + if (!r−>sampled_page) + goto next ; + if (accessed(r−>sampled_page) ) + r−>nr_accesses++; + next: + r−>sampled_page = rand_page(r->sampled_page); + clear_accessed(r−>sampled_page); +} +``` + +上述伪代码只是介绍其采样和统计实现方法,其更复杂的逻辑处理关系,例如region合并和拆分后nr\_access的值处理,以及nr\_access周期性清零等本文不再介绍,有兴趣的读者可以依据damon实现源码自行分析。 + + +### numa仿真实现 + + +社区damon能有有效的识别工作负载内存的冷热情况,但是对于工作负载内存跨numa访存这块,是无法做出判断的, 然而在实际业务中,跨numa访问造成的性能衰退问题真实存在,尤其是现今服务硬件多numa架构numa数目越来越多,正式基于以上原因,我们丰富了damon kernel部分代码,增加了内存numa访存情况。 + + +和热点统计一样,numa仿真不会统计region中所有page的跨numa访问情况,而是利用damon空间采样方式,将damon获取的page在clear了access bit后,将其设置为pte none. + + + +``` +void check_numa(region ∗ r) { + if (!r−>sampled_page) + goto next ; + if (local_numa_node(r−>sampled_page) ) + r−>nr_local++; + else + r->nr_remote++; + next: + r−>sampled_page = rand_page(r->sampled_page); + set_page_none(r−>sampled_page); +} +``` + +同样该部分伪代码只是介绍其numa基本实现,在实际中我们需要考虑pte处于swap,和page属于大页的情况,此外在pte设置为none后,会造成再次访问该page时发生page\_fault和tlb miss的情况,我们测试发现,在某些频繁访问某块内存的工作负载中,造成一定的性能损耗,所以在实际使用中,我们增加了numa仿真开关,需要的时候去开启该功能。 + + +### 小结 + + +基于上述几小节对damon以及numa仿真在kernel部分的实现机制的介绍,让我们对datop工具的实现原理有了清楚的认识,datop包括内核态部分和用户态部分,用户态可以通过perf调用功能,将内核态通过trace统计的热点信息捕获,并排序显示出来,详细调用流程入下图3显示。 + + +**图3:** + + +![](../../../assets/基础能力和版本演进/datop技术方案/img_2.png) + + +在用户态,DATOP通过trace\_event、damon dbgfs、以及numa switch接口和内核进行交互: + + +**蓝色**绘制线部分:该部分是和用户态显示的核心, 通过内核kdamond线程将采样统计的相关值传递给trace接口, 用户态通过trace\_event方式获取region区域热点信息,包括区域大小,access统计,进程信息以及跨numa统计等,最终通过窗口向用户展示。 + + +**黑色**绘制线部分:该部分用于控制内核态线程kdamond的相关行为,通过damon dbfs接口,用于设置采样频率,更新周期,region个数划分,监控进程配置,kdamond线程的开启和关闭等。 + + +**绿色**绘制线部分用于设定numa仿真功能的开启和关闭,此功能针对支持多numa的场景。 + + +**红色**绘制线部分是热点工具的核心执行单元,用户态通过dbgfs接口开启监控后,kdamond线程被创建, 首先会查找被监控进程的三大chunks, 找到后,按照damon dbgfs接口设定的region个数方范围,对其进行拆分,此后按照设定好的采样频率进入周期性循环工作,直到被监控进程停止运行或用户操作dbgfs接口,停止监控,在周期性循环中,会对region热点进行随机采样并统计,此外还判定用户是否开启numa仿真功能,若开启还会对region跨numa情况进行统计,处理完成后,会更新采样结果,并通过trace event传递给用户,以上操作完成后,会依据kdamond线程运行时间,并在指定周期内,通过热点统计值对region进行拆分和合并操作,此外在更长的周期到来后,还会从新检查chunks的准确性,并按多加少减原则,修改region,以此保证热点内存跟踪的实时性和准确性。 + + +至此DATOP技术实现原理介绍完毕,后面会进入介绍使用和数据测试方面的介绍。 + + +## 使用 + + +在龙蜥社区 5.10版本内核支持damon代码以及自研的numa仿真部分代码,结合开源的用户态工具datop: 工具就可以运行起来了,datop工具支持单、多进程以及cgroup粒度内存热点监控以及跨numa访存监控 两种方式,详细使用可以参考源码readme部分。 + + +**注:**cgroup粒度监控功能会在近期开源。 + + +## DATOP工具对部分关联性能指标影响说明 + + +为评估了DATOP工具在使用中对系统造成的影响,此处采用lmbench作为作为被监控进程进行了测试。 + + + + +| | | | +| --- | --- | --- | +| 测试情况 | 虚拟机 32vCPU 4 node | 物理机 96cpu 4node | +|   | 被监控进程个数 | 未开numa仿真 +和base对比 | 开numa仿真功能 | base对比 | 未开numa仿真 | base对比 | 开numa仿真 | base对比 | +|   +用户态overhead | 1 | 最高0.4%, | 稳定后0.1%不到 | 最高0.4% | 稳定后0.1%不到 | 最高0.2% | 稳定后不到0.1% | 0.2% | 稳定后不到0.1% | +| 4 | 最高0.7% | 0.2% | 最高0.8% | 稳定后0.2% | 最高0.2% | 稳定后不到0.1% | 最高0.3 | 稳定后不到0.1% | +|   +kernel overhead | 1 | 最高2% | 0.1% | 2.3% | 0.2% | 最高0.4% | 稳定后不到0.1% | 最高0.6% | 稳定后不到0.1% | +| 4 | 最高2.5% | 0.2% | 2.8% | 0.2% | 最高0.6% | 稳定后不到0.1 | 最高0.7% | 稳定后不到0.2% | + + +以上测试可能会存在一定的误差的,测试目主要是为了充分验证热点工具内核态代码引入,对内核以及应用程序的影响,通过测试,可以看出datop工具以及kernel部分,造成系统整机cpu使用率增加不超过1%。 + + +## 关于numa仿真测试统计正确性验证说明 + + +### 测试方法一 + + +构造一个执行程序,并创建两个线程a和b,这两个线程将会共享代码段部分代码,进行反复性读测试 + + +在测试前,将线程1和程序绑定在同一个numa节点,将线程2绑定在不同numa节点。 + + +在测试前先通过/proc/pid/smaps确认下代码段映射地址,如下图4所示。 + + +**图4:** + + +![](../../../assets/基础能力和版本演进/datop技术方案/img_3.png) + + +通过perf工具在不通时刻抓取numa仿真统计相关值,如下所示: + + + +``` +kdamond.0 target_id=18446462601994805632 nr_regions=10 400000-402000: 12 5243 0 +kdamond.0 target_id=18446462601994805376 nr_regions=10 400000-402000: 8 0 5427 +... +kdamond.0 target_id=18446462601994805632 nr_regions=10 400000-402000: 9 7669 0 +kdamond.0 target_id=18446462601994805376 nr_regions=10 400000-402000: 7 0 7913 +``` + +从测试来看,虚拟地址0x400000-0x402000为属于代码段, 两线程共享该部分内存,通过perf采样统计可以看出, 本地线程1访问这块地址次数为5243次, 远端线程访问次数为5427次,隔一段时间后第二次统计本地线程1为7669,远端线程为7913,基本一致,说明numa仿真功能统计正确。 + + +### 测试方法二 + + +构造一个应用程序,申请1G左右大小的空间MSIZE,通过设置numa\_alloc等版本操作,将MSIZE绑定在node0和node1, 通过交叉访问,统计其跨numa的情况。 + + +下图是datop工具显示程序跨numa的情况,按照预定设置,两者访问占比50%,结果满足预期。 + + + +``` + INDEX TYPE START END SIZE(KiB) ACCESS AGE LOCAL REMOTE + 1 rw-p ffff49a34000 ffff515aa000 126424 2 0 50.02% 49.98% + 2 rw-p ffff4a636000 ffff52662000 131248 1 0 50.01% 49.99% + 3 rw-p ffff4f31d000 ffff52cb3000 58968 1 1 49.98% 50.02% + 4 rw-p ffff5704f000 ffff586f9000 23208 1 1 49.77% 50.23% + 5 rw-p ffff5b5a5000 ffff5cbd1000 22704 1 1 49.78% 50.22% + 6 rw-p ffff5cbd1000 ffff5ff58000 52764 2 0 49.71% 50.29% + 7 rw-p ffff5ff58000 ffff64ca4000 79152 1 0 49.71% 50.29% +``` + +同样采用numastat正是下该程序node访问情况,如下图所示: + + + +``` +Per-node process memory usage (in MBs) for PID 111676 (lt-numademo) + Node 0 Node 1 Node 2 + --------------- --------------- --------------- +Huge 0.00 0.00 0.00 +Heap 0.02 0.00 0.00 +Stack 0.01 0.00 0.00 +Private 565.24 564.00 0.00 +---------------- --------------- --------------- --------------- +Total 565.27 564.00 0.00 +``` + +从测试结果来看,node0和node1这块两者各自占比50%左右,复合预期,说明numa仿真统计这块正确性没有问题。 + + +## benchmark测试结果 + + +此处我们选取了几款常用的benchmark作为其测试,评估datop监控对其测试结果造成的影响。 + + +### unixbench + + +选取unixbench中fstime和context1两者耗用内存较多的作为测试参考。 + + + + +| | | | +| --- | --- | --- | +|   | 虚拟机 | 物理机 | +| 测试类 | 关numa仿真 | 开numa仿真 | 关numa仿真 | 开numa仿真 | +|   +  +fstime | 1573.6 | 1589.4 | 1955.6 | 1960.0 | +| 1591.4 | 1574.2 | 1966.1 | 1960.7 | +| 1575.6 | 1592.3 | 1963.5 | 1977.4 | +|   +  +context1 | 475.4 | 473.3 | 556.5 | 557.4 | +| 471.2 | 472.1 | 555.3 | 560.0 | +| 473.4 | 474.6 | 557.6 | 558.2 | + + +从以上测试数据来看,将unixbench作为被监控对象,在开和不开numa仿真功能下,不会造成其性能衰退。 + + +### stream + + +stream通常用于内存带宽测试,会按照多种形式频繁访问内存,正好基于这一特性验证datop工具对其影响。 + + +测试指令:numactl -m 0 -C 5 ./stream + + + + +| | | | +| --- | --- | --- | +| | 虚拟机 | 物理机 | +| 测试项 | 关numa仿真 | 开numa仿真 | 关numa仿真 | 开numa仿真 | +|   +Copy | 1499.4 | 1487.2 | 1678.0 | 1673.1 | +| 1495.5 | 1493.5 | 1674.3 | 1665.5 | +| 1473.0 | 1479.1 | 1675.2 | 1680.7 | +|   +Scale | 1459.1 | 1483.9 | 1585.9 | 1588.5 | +| 1490.9 | 1451.3 | 1590.0 | 1597.3 | +| 1475.1 | 1472.1 | 1588.8 | 1595.6 | +|   +Add | 1960.3 | 1937.0 | 1983.7 | 1974.6 | +| 1962.2 | 1955.6 | 1991.9 | 1991.4 | +| 1957.3 | 1944.9 | 1992.3 | 1996.2 | +|   +Triad | 1867.8 | 1860.2 | 1976.6 | 2017.5 | +| 1862.5 | 1873.1 | 2035.0 | 2025.3 | +| 1852.1 | 1859.5 | 2011.9 | 1997.0 | + + +从以上测试数据来看,将stream作为被监控对象,在开和不开numa仿真功能下,不会造成其性能衰退。 + + +### mbw + + +测试指令:numactl -m 0 -C 5 ./mbw + + + + +| | | | +| --- | --- | --- | +|   | 虚拟机 | 物理机 | +| 测试项 | 关numa仿真 | 开numa仿真 | 关numa仿真 | 开numa仿真 | +|   +MEMCPY +MiB/s | 2714.146 | 2627.115 | 2645.083 | 2621.095 | +| 2713.336 | 2634.099 | 2643.614 | 2616.979 | +| 2718.278 | 2625.363 | 2646.133 | 2629.780 | +|   +DUMB +MiB/s | 1019.456 | 1019.602 | 751.405 | 745.045 | +| 1018.745 | 1018.746 | 768.279 | 763.038 | +| 1018.080 | 1020.929 | 773.796 | 746.797 | +|   +MCBLOCK +MiB/s | 5139.354 | 5151.532 | 2668.374 | 2649.498 | +| 5155.516 | 5150.471 | 2666.596 | 2650.973 | +| 5148.191 | 5149.887 | 2667.449 | 2645.573 | + + +通过测试发现mbw: + + +在虚拟机测试时memcopy项时候存在3%左右性能衰退,其他测试项未见明显差异。 + + +在物理机测试时,三类测试项都存稍微的性能衰退, 其中MEMCPY衰退不到1%,DUMB衰退2.6%,MCBLOCK不到1%。 + + +  + + +### 小结 + + +在对比mbw和stream测试时,有个较为奇怪的问题了,steam测试copy并没有发生性能衰退,而mbw发生了3%的性能衰退,笔者通过分析其各自源码发现,发现stream copy测试过程中,每一次copy大小是小于4K的,而stream memcopy测试过程中每一次copy远大于4K,一个页的大小,这就导致stream memcpoy测试过程中会应为numa仿真设置pte表为空被命中的概率相比stream copy要大的多, 会造成更多的page fault问题,通过perf抓取分析也正好论证了这一点,所以mbw memcopy出现了性能衰退。 + + +这也充分说明,针对频繁访问一次超过4K大小的内存区域的应用程序,datop工具会造成一定的性能衰退影响,这也是numa仿真设置开关的原因,可根据实际情况按需打开。 + + +# 热点数据扫描试用 + + +我们可以对那些**内存访问密集模型进行简单的测试,获取到较稳定的热点**。例如redis get操作(测试命令:redis-benchmark -r 20000000 -n 20000000 -t get -d 1024 -c 32 -P 8)。 + + +**图5:** + + +![](../../../assets/基础能力和版本演进/datop技术方案/img_4.png) + + +图5中INDEX:表示region索引,TYPE表示region的虚拟地址类型,START表示region的起始地址,END表示reigon结束地址,SIZE表示region大小为多少,单位KiB, ACCESS表示热点程度,值越大表示越热,AGE表示热点波动情况,值越大表示冷热状态稳定,波动小,LOCAL表示这段region区域本地numa访问占比,REMOTE表示远端numa访问占比。 + + +图5是按采集的ACCESS进行排序获取的热点较高的14个regions。目前测试,可以确定在一段时间内这些regions的统计基本稳定,并且存在大量的匿名页热点, 此外通过刻意numa本地绑定测试,也正确的统计numa访存情况。 + + +  + + +另外,我们以mysql为例,验证下跨代码端部分存在跨numa的情况。 + + +**图6:** + + +![](../../../assets/基础能力和版本演进/datop技术方案/img_5.png) + + +上图6的热点监控命令为:datop -p 168368 -r 100,400。mysql中的热点显示与redis有些不同,存在大量属于"r-xp"的热点,并且存在跨numa访问的情况,我们之前测试中同样发现mysql的代码段热点高于匿名页,所以针对不同的场景,需要具体分析热点以及跨numa的内存段属性,然后做相应的优化措施。 + + +以上的测试数据表明:**该热点工具可以用于反映进程代码段、匿名段的相对热点,以及跨numa访存情况,用于判断进程使用大页,页迁移,冷内存回收等方面提供测试量化手段,进而达到有针对性优化的目的。** + + +# 参考 + + + + + +[Memory-management optimization with DAMON](https://lwn.net/Articles/812707/) + + +[Using DAMON for proactive reclaim](https://lwn.net/Articles/863753/) + + +[DAMON Extended To Offer Physical Memory Address Space Monitoring](https://www.phoronix.com/scan.php?page=news_item&px=DAMON-Physical-Monitoring) + + +[Proactively reclaiming idle memory](https://lwn.net/Articles/787611/) + + +[Intel® Optane™ Memory](https://www.intel.com/content/www/us/en/products/details/memory-storage/optane-memory.html) + + +[damon用户态工具damo](https://github.com/awslabs/damo) + + +  + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/\351\241\271\347\233\256\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/\351\241\271\347\233\256\347\256\200\344\273\213.md" new file mode 100644 index 00000000..2c784154 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\237\272\347\241\200\350\203\275\345\212\233\345\222\214\347\211\210\346\234\254\346\274\224\350\277\233/\351\241\271\347\233\256\347\256\200\344\273\213.md" @@ -0,0 +1,4 @@ +本项目聚焦于: +- 龙蜥内核的基础能力建设,包括基础功能、兼容性、稳定性和性能,建立相关基线。 +- 跟踪行业和upstream发展动态,负责下一代龙蜥内核版本演进。 + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" new file mode 100644 index 00000000..2a362235 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" @@ -0,0 +1,339 @@ +# 1. RAS机制简介 + + +为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: + + +**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 + + +**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 + + +**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 + + +RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 + + +# 2. RAS机制错误处理流程 + + +RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 + + +RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_0.png) + + +# 3. RAS机制评测流程 + + +RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 + + +APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 + + +从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 + + +如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 + + + + +| | +| --- | +| 0 Processor Correctable +1 Processor Uncorrectable non-fatal +2 Processor Uncorrectable fatal | +| 3 Memory Correctable +4 Memory Uncorrectable non-fatal +5 Memory Uncorrectable fatal | +| 6 PCI Express Correctable +7 PCI Express Uncorrectable non-fatal +8 PCI Express Uncorrectable fatal | +| 9 Platform Correctable +10 Platform Uncorrectable non-fatal +11 Platform Uncorrectable fatal | + + +Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_1.png) + + +上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 + + +错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: + + +1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 + + +2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 + + +3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 + + +# 4. CPU及内存错误注入演示 + + +CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 + + +## 4.1 环境准备 + + +### 1. 安装EINJ模块 + + +使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html + + +此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 + + +### 2. 安装RAS测试工具 + + +直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git + + +### 3. 安装rasdaemon + + +先安装依赖包yum install sqlite perl-DBD-SQLite + + +使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git + + + +``` +autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make +make install +``` + +在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 + + + +``` + -d, --disable 禁用RAS事件并退出 + -e, --enable 使能RAS事件并退出 + -f, --foreground 前台运行 + -r, --record 通过sqlite3记录事件 +``` + +rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 + + +查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 + + +本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 + + +## 4.2 CPU错误注入 + + +本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 + + +使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 + + + +``` +./einj_mem_uc core_non_fatal +0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 +injecting ... +triggering ... +Manually take page offline +Test passed +``` + +使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 + + + + +| | | | | +| --- | --- | --- | --- | +| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | + + +可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=17(core), cnt=0xd +INFO: RAS reg: +INFO: fr = 10a9a2 +INFO: status = 44800007 +INFO: addr = 8007e0e95fffb7ff +INFO: misc0 = 4 +INFO: misc1 = 0 +RTC: 2000-01-06 09:32:09 + core[8] mm(17) return: 0 +--handler(17) end +[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error +[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 +[40858.436229] {42}[Hardware Error]: event severity: recoverable +[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 +[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable +[40858.454204] {42}[Hardware Error]: section_type: ARM processor error +[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 +[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 +[40858.475041] {42}[Hardware Error]: running state: 0x1 +[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 +[40858.487456] {42}[Hardware Error]: Error info structure 0: +[40858.493013] {42}[Hardware Error]: num errors: 1 +[40858.497702] {42}[Hardware Error]: error_type: 0, cache error +[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 +[40858.509857] {42}[Hardware Error]: transaction type: Instruction +[40858.516109] {42}[Hardware Error]: cache level: 2 +[40858.521058] {42}[Hardware Error]: the error has not been corrected +[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered +``` + +## 4.3 内存错误注入 + + +使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 + + + +``` +./einj_mem_uc single +0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 +injecting ... +triggering ... +SIGBUS: addr = 0xffffabcb3400 +page not present +Test passed +``` + +BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=0(exception), cnt=0xa +MM Mem RAS handle,Intr:0 +Ch = 25810000 + |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 + |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 + |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 + |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 + |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 + |-ECCUSYN0~2:1FF,0,76 + |-SBRCTL:1C01591B,SBRSTS:0 +RasData->ExceptionEl: 0, UeCnt:0x1 +RTC: 2000-01-06 09:27:58 +Get SystemAddrss through mAddrTransProtocol start +Get SystemAddrss through mAddrTransProtocol end +s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 +Locate error dimm, Socket:0, Channel:2 Dimm:0 + core[8] mm(0) return: 0 +--handler(0) end +[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) +[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 +[40606.668367] {41}[Hardware Error]: event severity: recoverable +[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 +[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable +[40606.686342] {41}[Hardware Error]: section_type: memory error +[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) +[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 +[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 +[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC +[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered +``` + +## 4.4 rasdaemon日志读取 + + +rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 + + + +``` +[root@localhost ras-tools]# ras-mc-ctl --errors +Memory controller events: +1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +``` + +# 5. Q&A + + +Q:RAS机制是否需要BIOS支持? + + +A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 + + + + + +Q: x86和ARM64的APEI是否一致? + + +A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 + + + + + +Q: RAS注入的错误是真实的错误吗? + + +A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 + + + + + +Q: rasdaemon日志查看是否有更易用的方法? + + +A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; + + +最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 + + + + + +Q: 可否使用mcelog? + + +A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 + + + + + +Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? + + +A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 + + + + + +Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? + + +A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\347\241\254\350\265\204\346\272\220\351\232\224\347\246\273mpam\347\211\271\346\200\247\344\273\213\347\273\215/\351\276\231\350\234\245_ANCK_5.10_\345\200\232\345\244\251\345\271\263\345\217\260_MPAM_\346\265\213\350\257\225\346\212\245\345\221\212.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\347\241\254\350\265\204\346\272\220\351\232\224\347\246\273mpam\347\211\271\346\200\247\344\273\213\347\273\215/\351\276\231\350\234\245_ANCK_5.10_\345\200\232\345\244\251\345\271\263\345\217\260_MPAM_\346\265\213\350\257\225\346\212\245\345\221\212.md" new file mode 100644 index 00000000..4ff5c36d --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\347\241\254\350\265\204\346\272\220\351\232\224\347\246\273mpam\347\211\271\346\200\247\344\273\213\347\273\215/\351\276\231\350\234\245_ANCK_5.10_\345\200\232\345\244\251\345\271\263\345\217\260_MPAM_\346\265\213\350\257\225\346\212\245\345\221\212.md" @@ -0,0 +1,449 @@ +from arm-sig: + + +# 一、测试总结 + + +针对龙蜥 OS MPAM 特性的整体测试情况如下: + + +* 经过对 MPAM 的功能性验证,目前 L3 cache 资源隔离和监控功能均正常,内存带宽隔离效果甚微,监控功能可用。 +* 测试用例覆盖 MPAM 接口读写测试、并发压力测试等多种类型,测试结果未发现问题。 +* 针对 MPAM ESR 中断,验证了 PARTID、PMG、monitor 相关异常能否触发中断、告知错误类型,中断监测功能正常可用。 + + +# 二、MPAM 功能验证 + + +## 2.1 cache 隔离功能验证 + + +### 2.1.1 不同配置对实际 cache 占有量的影响 + + +L3 cache 资源隔离以 ways 的方式进行配置。倚天机器共有 16 ways,测试对不同 ways 的隔离效果进行了验证。 + + + +``` +numactl -m 0 -C 16 memhog -r10000000 100000m > /mnt/log +``` + +程序和资源隔离 group 绑定分别采用了 pid 绑定(tasks)和 cpu 绑定(cpus)两种方式。通过 schemata 接口设置程序所能够使用的 ways 数目,通过 mon\_data/mon\_L3\_0\*/llc\_occupancy 接口读取程序的 L3 cache 占用。多次读取取平均值,并与理想的 cache ways 大小进行对比。 + + +测试结果显示,L3 cache 隔离功能**效果显著**,无论是通过 tasks 绑定还是 cpus 绑定,均可以得到与理想值相接近的隔离效果。 + + +![](assets/龙蜥_ANCK_5.10_倚天平台_MPAM_测试报告/img_0.png) + + +### 2.1.2 不同配置对 mem latency 的影响 + + +latency 作为一个重要的性能指标,在一些对时延敏感的场景来说,有很重要的参考作用,此处使用 lat\_mem\_rd 测试 cache 在不同的 ways 下,内存 latency 的分布情况,也从侧面验证 MPAM 对 cache 的隔离功能。 + + + +``` +#设置步长为512字节 +numactl -C 10 -m 0 ./lat_mem_rd -N 1 -P 1 145M 512 +``` + +测试结果显示,随着 cache way 数目的增加,加载相同内存的 latency 逐渐减小。 + + +![](assets/龙蜥_ANCK_5.10_倚天平台_MPAM_测试报告/img_1.png) + + +### 2.1.3 L3 cache 抗干扰测试 + + + +``` +# workload +numactl -m 1 -C 64-127 memhog -r10000000 100000m > /mnt/log +# distractor +numactl -m 1 -C 64-127 memhog -r10000000 100000m > /mnt/log +``` + +workload:保持 L3:1=fff0 配置无变化 + + +distractor: 测试 L3:1=,mask 值分别为 0-f(无干扰)、0010-fff0(有干扰) + + +测试结果显示: + + +在无干扰情况下,workload 的 L3 cache 占用量基本无变化; + + +随着干扰 way 数逐渐变多,workload 和 distractor 两者的 L3 cache占比逐渐趋同,总量不变。 + + +![](assets/龙蜥_ANCK_5.10_倚天平台_MPAM_测试报告/img_2.png) + + +### 2.1.4 模拟混部 L3 cache 隔离测试 + + +分别以 SPECjbb 2015 和 stress-ng 程序模拟在线环境和离线环境,对L3 cache隔离功能进行测试。两个环境均运行在 NUMA node 1 上。 + + +在前 40s 的时间内,两个程序共享 L3 cache 资源。在约 40s 后,开始隔离在线和离线L3 cache资源的使用,在离线任务 L3 cache 的配比分别为 0xffff 和 0xf。 + + +![](assets/龙蜥_ANCK_5.10_倚天平台_MPAM_测试报告/img_3.png) + + +通过实验结果可以看到,在 L3 cache 资源共享的情况下,离线资源对在线资源干扰和压制明显,L3 cache 竞争激烈,波动幅度很大;在对 L3 cache 资源进行隔离后,一方面离线得到了持续有效的压制,L3 cache 占有率大幅下降,另一方面在线性能提升明显,而且波动幅度变小。 + + +## 2.2 MB 隔离功能验证 + + +### 2.2.1 不同配置对内存带宽的影响 + + + +``` +gcc -O3 -fopenmp -DSTREAM_ARRAY_SIZE=100000000 -DNTIMES=1000 stream.c -o stream +# 单node测试 +numactl -m 1 -C 64-127 ./stream +# 单CPU测试 +numactl -m 1 -C 72 ./stream +``` + +MB 资源隔离以百分比的方式进行配置。测试以 5% 为粒度,通过设置 schemata 接口让内存带宽从 5% 逐次递增到 100%,通过读取 mon\_data/mon\_MB\_0\*/mbm\_local\_bytes 接口读取带宽值,最终取多次测量的平均值。 + + +通过测试结果可以发现,不同百分比下的测试MB带宽值和100%带宽下的MB带宽值基本相等,倚天机器的 MB 带宽隔离**效果甚微**。 + + +#### 单 node(64 CPU) MB 配置结果 + + + + +| | | | +| --- | --- | --- | +| **percent** | **stream测试值[Copy] (MB/s)** | **mbm\_local\_bytes接口值 (MB/s)** | +| 5 | 104808.5 | 104800.0 | +| 10 | 105028.3 | 105730.5 | +| 20 | 104459.3 | 104915.1 | +| 40 | 105077.6 | 105852.0 | +| 60 | 104980.6 | 105178.7 | +| 80 | 104924.8 | 105182.8 | +| 100 | 104828.1 | 105855.8 | + + +#### 单 CPU MB 配置结果 + + + + +| | | | +| --- | --- | --- | +| **percent** | **stream测试值[Copy] (MB/s)** | **mbm\_local\_bytes接口值 (MB/s)** | +| 5 | 25948.7 | 24147.7 | +| 10 | 25934.0 | 24433.1 | +| 20 | 25913.5 | 22771.2 | +| 40 | 25897.9 | 24559.4 | +| 60 | 25952.9 | 24079.7 | +| 80 | 25866.5 | 24246.4 | +| 100 | 25952.1 | 24171.9 | + + +# 三、MPAM稳定性测试 + + +## 3.1 resctrl mount/umount + + +**测试方法** + + +挂载 resctrl 文件系统,设置 schemata 资源隔离接口,随机写 cpus/cpus\_list、tasks 接口,读取mon\_data 资源监控接口,最后卸载 resctrl 文件系统。重复 1000000 次。 + + +**测试结果** + + +resctrl 文件系统相关接口仍可正常使用。 + + +## 3.2 接口写入测试 + + +### 3.2.1 schemata 写入 + + +**测试方法** + + +创建两个 group,生成随机 L3 cache mask 和 MB 内存带宽值,并分别写入两个 group 的 schemata 接口,之后读取 schemata 接口,验证当前值是否与写入值相同。重复测试 1000000 次。 + + +**测试结果** + + +schemata 均可正常写入。 + + +### 3.2.2 schemata 错误写入 + + +对 schemata 接口写入多种错误参数,验证 schemata 是否可以正确识别处理。 + + +验证的错误类型及验证结果如下: + + + + +| | | | +| --- | --- | --- | +| **错误写入示例** | **last\_cmd\_status输出** | **测试结果** | +| L3:0=10000 | Mask out of range | PASS | +| L3:2=ff;3=ff | Unknown domain | PASS | +| L3 | Missing ':' | PASS | +| L3: | Missing 'L3' value | PASS | +| L3:0 | Missing '=' or non-numeric domain | PASS | +| L30:0=fff | Unknown or unsupported resource name 'L30' | PASS | +| L3:0=fghi | Non-hex character in the mask fghi | PASS | +| L3:1=ff;1=f4 | Duplicate domain 1 | PASS | +| MB:0=150 | MB value 150 out of range 5-100 | PASS | +| MB:0=4 | MB value 4 out of range 5-100 | PASS | +| MB:0=FOO | Non-decimal digit in MB | PASS | +| MB | Missing ':' | PASS | +| MB:0 | Missing 'MB' value | PASS | +| MB:2=55 | Unknown domain | PASS | +| MB:1=23;1=56 | Duplicate domain 1 | PASS | +| L3:0=ff (with cdp) | Unknown or unsupported resource name 'L3' | PASS | + + +### 3.2.3 cpus/cpus\_list 写入 + + +测试方法 + + +随机写入 cpus/cpus\_list 接口 1000000 次,验证是否写入成功,并且 cpus 接口和 cpus\_list 接口的值是否相对应。 + + +测试结果 + + +cpus/cpus\_list 均可正常写入,并保持值的相等。 + + +### 3.2.4 cpus/cpus\_list 错误写入 + + + + +| | | | +| --- | --- | --- | +| **错误写入示例** | **last\_cmd\_status输出** | **测试结果** | +| echo 156 > cpus\_list | Can only assign online CPUs | PASS | +| echo 4096 > cpus\_list | Bad CPU list/mask | PASS | +| echo ffff > cpus\_list | Bad CPU list/mask | PASS | +| echo 3-12 > cpus | Bad CPU list/mask | PASS | + + +### 3.2.5 tasks 写入 + + +**测试方法** + + +创建 500 个进程,并将其 pid 写入 tasks 接口,验证进程对应 pid 是否存在。之后 kill 掉所有进程,验证其 pid 是否已从 tasks 文件中移除。重复 1000000 次。 + + +**测试结果** + + +tasks 接口均可正常写入和移除。 + + +### 3.2.6 tasks 错误写入 + + + + +| | | | +| --- | --- | --- | +| **错误示例** | **stderr** | **测试结果** | +| 将不存在pid写入tasks | echo: write error: No such process | PASS | +| echo hello > tasks | echo: write error: Invalid argument | PASS | + + +### 3.2.7 mode 写入 + + +mode 接口默认值为 shareable,当前MPAM接口暂不支持 mode 接口值的修改。 + + + + +| | | +| --- | --- | +| **Mode** | **支持情况** | +| shareable | 支持 | +| exclusive | 不支持 | +| pseudo-locksetup | 不支持 | +| pseudo-locked | 不支持 | + + +## 3.3 group mkdir/rmdir 测试 + + +### 3.3.1 max group 创建 + + +**测试方法** + + +以 info/\*/num\_closids 为基准,创建所能达到的最多 group。重复 1000000 次。 + + +**测试结果** + + +倚天 PARTID 数目为 64 个,因此除了 default group 外,最多能够创建 63 个 group。一般情况下均可达到最大值。但在部分 group 被使用过的情况下,由于其对应的 PARTID 在 L3 cache中占用量可能超过 /sys/fs/resctrl/info/L3\_MON/max\_threshold\_occupancy,从而导致该 PARTID 在一定时间内不可用。 + + +### 3.3.2 group 随机创建/删除 + + +**测试方法** + + +随机创建/删除 group 共计 2000\*(num\_closids-1),验证 group 分配和回收功能是否正常。 + + +**测试结果** + + +group 随机创建和删除,group 分配/回收接口仍可正常运作。 + + +### 3.3.3 mon\_group 创建/删除 + + +当前社区版本MPAM代码下 num\_rmids 均为 1,暂不支持 mon\_groups 目录下 mon group 的创建和删除。 + + +## 3.4 并发读写测试 + + +### 3.4.1 L3 cache 监控接口并发读取 + + +**测试方法** + + +创建 5 个 group,每个 group 中写入 10 个进程:memhog -r1000000000 1m > /mnt/log + + +同时 10 个进程并发读 mon\_data/L3\_MON/llc\_occupancy,持续时间 60 min。 + + +**测试结果** + + +测试过程中未出现resctrl接口崩溃或不可用问题。 + + +### 3.4.2 MB 监控接口并发读取 + + +**测试方法** + + +创建 5 个 group,每个 group 中写入 10 个进程:memhog -r1000000000 1m > /mnt/log + + +同时 10 个进程并发读 mon\_data/mon\_MB\_\*/mbm\_local\_bytes,持续时间 60 min。 + + +**测试结果** + + +测试过程中未出现 resctrl 接口崩溃或不可用问题。 + + +### 3.4.3 schemata 接口并发写入 + + +**测试方法** + + +创建 5 个 group,每个 group 中写入 10 个进程:memhog -r1000000000 1m > /mnt/log + + +同时 10 个进程并发随机写入 schemata,持续时间 60 min。 + + +**测试结果** + + +测试过程中未出现 resctrl 接口崩溃或不可用问题。 + + +### 3.4.4 cpus/cpus\_list 接口并发写入 + + +**测试方法** + + +创建 1 个 group,10 个进程并发写入随机 cpus/cpus\_list,持续时间 60 min。 + + +**测试结果** + + +测试过程未出现接口崩溃或不可用问题。 + + +### 3.4.5 tasks 接口并发写入 + + +**测试方法** + + +创建 1 个 group,10 个进程并发创建 300 个 task 并写入 tasks 接口。 + + +**测试结果** + + +测试过程未出现接口崩溃或不可用问题。 + + +# 四、MPAM 错误中断验证 + + +## 4.1 L3 cache 资源错误中断验证 + + + + +| | | | | +| --- | --- | --- | --- | +| 错误码 | 描述 | 结果 | 备注 | +| 0 | No error captured in MPAMF\_ESR | 无 | 非异常情况 | +| 1 | MPAMCFG\_PART\_SEL out of range | 可触发 |   | +| 2 | Request PARTID out of range | 可触发 |   | +| 3 | MSMON out of range PARTID/PMG | 可触发 |   | +| 4 | Request PMG out of range | 不可触发 | PMG>1时无法写入 | +| 5 | MSMON\_CFG\_MON\_SEL out of range | 可触发 |   | +| 6 | MPAMCFG\_INTPARTID out of range | 未测试 | 暂不支持PARTID narrowing | +| 7 | INTERNAL unexpected | 未测试 | 暂不支持PARTID narrowing | +| 8 | MPAMCFG\_PART\_SEL.RIS unimplemented | 不可触发 | RIS>1时无法写入 | +| 9 | MPAMCFG\_PART\_SEL.RIS no control | 不可触发 | RIS>1时无法写入 | +| 10 | MSMON\_CFG\_MON\_SEL.RIS unimplemented | 不可触发 | RIS>1时无法写入 | +| 11 | MSMON\_CFG\_MON\_SEL.RIS no monitor | 不可触发 | RIS>1时无法写入 | +| 12:18 | Reserved | + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\347\241\254\350\265\204\346\272\220\351\232\224\347\246\273mpam\347\211\271\346\200\247\344\273\213\347\273\215/\351\276\231\350\234\245_ANCK_5.10_\345\200\232\345\244\251\345\271\263\345\217\260_MPAM_\347\224\250\346\210\267\346\211\213\345\206\214.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\347\241\254\350\265\204\346\272\220\351\232\224\347\246\273mpam\347\211\271\346\200\247\344\273\213\347\273\215/\351\276\231\350\234\245_ANCK_5.10_\345\200\232\345\244\251\345\271\263\345\217\260_MPAM_\347\224\250\346\210\267\346\211\213\345\206\214.md" new file mode 100644 index 00000000..917ca23c --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\347\241\254\350\265\204\346\272\220\351\232\224\347\246\273mpam\347\211\271\346\200\247\344\273\213\347\273\215/\351\276\231\350\234\245_ANCK_5.10_\345\200\232\345\244\251\345\271\263\345\217\260_MPAM_\347\224\250\346\210\267\346\211\213\345\206\214.md" @@ -0,0 +1,374 @@ +from arm-sig: + + +# 一、引言 + + +MPAM(Memory System Resource Partitioning and Monitoring)是 ARM v8 引入的新特性,对标 x86 的 RDT 特性,可以实现对 Cache、内存带宽、SMMU 等资源的分配及监控功能。该特性可以从硬件层面减少不同工作负载之间的性能干扰,确保高优先级任务性能的稳定性,在虚拟化、混部等业务中取得了良好的效果。 + + +# 二、MPAM特性简介 + + +## 2.1 MPAM整体框架 + + +MPAM 特性的整体框架如图1所示。其中,MPAM 硬件上是通过 MSC(Memory System Component)实现的。MPAM 将提供资源管理功能组件称为 MSC,可以对资源请求进行处理。完整的系统模型中一般拥有多个 MSC,分别负责管理不同资源。MPAM 为资源访问请求添加了 PARTID 和 PMG 标识,MSC 可以对该标识进行区分处理,进而实现资源的隔离和监控功能。 + + +根据 MPAM 手册的介绍,除了基本的 Cache 和内存带宽资源隔离和监控外,MPAM 可以实现比 Intel RDT 更为丰富的资源隔离和监控特性,包括: + + +* 提供对 SMMU 资源的支持 +* 提供对 Cache 和内存带宽资源进行最大最小值限制 +* 提供基于优先级的资源隔离支持 + + +![](assets/龙蜥_ANCK_5.10_倚天平台_MPAM_用户手册/img_0.png) + + +MPAM 驱动作为核心部分,对下完成了 MPAM 硬件功能的访问和设置,包括 MPAM 资源的获取和初始化、MPAM 中断初始化以及对 MPAM 相关寄存器的读写,对上则与 resctrl fs 用户态接口层进行交互。 + + +resctrl fs 接口层以资源调配 group 为单位提供了资源隔离和监控的用户态接口,并通过 info 接口暴露 MPAM 硬件相关信息。此外,其底层还完成了 PARTID 和 PMG 的分配和回收。 + + +## 2.2 MPAM资源隔离特性 + + +MPAM 资源隔离特性的关键是由 MSC 组件维护的资源配置表。资源配置表中包含了不同 PARTID 和对应资源分配方案的映射。 + + +![](assets/龙蜥_ANCK_5.10_倚天平台_MPAM_用户手册/img_1.png) + + +对于每一次资源请求,该资源对应的 MSC 会通过请求中的 PARTID 查找自身的配置表,然后按照表中与该 PARTID 相对应的方案进行资源分配。这样,通过将不同业务应用或VM与不同PARTID相绑定,就可以达到资源隔离的目的。 + + +通过图2左侧部分可以看到,不同资源分配方案的表示方法是有所区别的,这与资源的拆分方式不同有关。Cache 资源使用了 Bit Map,每一bit表示了对应的 Cache way 是否能够被分配;内存带宽资源则使用了百分比,表示该方案能够分配的内存带宽比例。 + + +## 2.3 MPAM资源监控特性 + + +资源监控可以看做是 MPAM 在支持资源隔离功能后的附加功能。MPAM 除了拥有资源隔离组件外,还拥有一定数目的资源 monitor。资源 monitor 可以实现对特定标识的资源使用情况的监控。 + + +为了实现对使用同一个 PARTID 的不同 task 分别进行资源监控,MPAM引入了PMG(Performance Monitoring Group)的概念。资源监控接口通过选取对应的 PARTID 和 PMG,即可获取到对应的资源使用情况。 + + +![](assets/龙蜥_ANCK_5.10_倚天平台_MPAM_用户手册/img_2.png) + + +## 2.4 龙蜥 OS 对倚天 MPAM 特性的支持 + + +龙蜥 OS 5.10.134-12.al8 版本基于 resctrl 文件系统实现了对倚天芯片的 MPAM 特性的支持,同时保证了对 x86 RDT 特性和鲲鹏的 MPAM 特性的兼容。对应的代码仓库在 中。其中,MPAM 支持相关代码路径包括: + + +* drivers/platform/mpam —— MPAM 驱动代码 +* drivers/acpi/arm64 —— MPAM ACPI 解析代码 +* fs/resctrl —— 用户态接口实现代码 +* arch/x86/kernel/cpu/resctrl —— x86 RDT 特性架构相关代码 +* drivers/staging/kunpeng/mpam —— 鲲鹏 MPAM 特性相关代码 + + +目前,龙蜥 OS 针对倚天芯片提供了 L3 Cache 和内存带宽两种资源的资源隔离和监控接口。接口的主要特性如下: + + +* 提供最大 64 个 PARTID 支持 +* 提供 4 个 monitor 支持 +* 支持 per-numa 的 16 way L3 CAT(Cache Allocation Technology)特性 +* 支持 per-numa 的 16 way L3 CDP(Code and Data Prioritization)特性 +* 支持 per-numa 的 L3 Cache 资源监控特性 +* 支持 per-numa 的粒度为 5% 的 MBA(Memory Bandwidth Allocation)特性(受硬件限制,该特性目前效果较差) +* 支持 per-numa 的内存带宽资源监控特性 +* 支持 MPAM 寄存器错误中断检测 + + +对应测试文档在。 + + +# 三、MPAM的使用 + + +## 3.1 开启MPAM + + +1. 首先需要确保当前内核支持 MPAM 功能,需要设置`CONFIG_ARM64_MPAM`和`CONFIG_RESCTRL`; +2. 在 cmdline 或 grub.cfg 文件中添加`mpam=acpi`,使能 MPAM 功能; +3. 系统启动后,需要手动挂载 resctrl 文件系统到 /sys/fs/resctrl 目录。 + + + +``` +mount -t resctrl resctrl /sys/fs/resctrl +``` + +## 3.2 MPAM 用户态接口 + + +MPAM 的用户态接口复用了 Intel RDT 功能的 resctrl 文件系统。resctrl 文件系统的目录结构如下图。 + + +![](assets/龙蜥_ANCK_5.10_倚天平台_MPAM_用户手册/img_3.png) + + +### 3.2.1 资源调配 group + + +开启 MPAM 功能后,操作系统中的每个进程(线程)都会与 resctrl 文件系统中的一个资源调配 group 相绑定。每个资源调配 group 在 MPAM 中对应着一个 PARTID。在 /sys/fs/resctrl 下新创建的每个目录将分别对应一个新的资源调配 group,每个资源调配 group 中会自动添加以下文件和目录: + + + +``` +|-- cpus +|-- cpus_list +|-- id +|-- mode +|-- mon_data +|-- mon_groups +|-- schemata +|-- size +`-- tasks +``` + +其中各文件和目录的作用为: + + +**schemata**:表示该 group 对各个资源的分配方案,可读写。 + + +**mon\_data**:该目录中各个文件包含了对各个资源的监控值,只读。 + + +**cpus**:以 bitmask 的形式表示该 group 所控制的逻辑 CPU,可读写。 + + +**cpus\_list**: 与 cpus 含义一致,但以 range 的形式(如0-63)表示该 group 所控制的逻辑 CPU,可读写。 + + +**tasks**:表示该 group 所控制的 task pid,可读写。 + + +**id**:创建 group 时随机生成,用于唯一标识一个 group,只读。 + + +**mode**:表示当前 group 的分配方式,目前仅支持 shareable 方式。 + + +**mon\_groups**: 该目录用于创建仅用于监控功能的子 group,暂不可用。 + + +**size**:表示该 group 下各个资源所能使用的资源大小,只读。 + + +观察 /sys/fs/resctrl 目录可以发现,该目录自带了一个资源调配 group。这个 group 是作为 MPAM 开启后各 cpu 和 task 使用的默认 group 使用的。该 group 默认可以实现对各资源 100% 的占用。 + + +### 3.2.2 资源隔离与schemata文件 + + +使用资源隔离特性的关键是 schemata 文件,schemata 中包含了对该 group 的资源分配方案。其基本格式为如下: + + + +``` +MB:0= 100;1= 80 +L3:0=ffff;1=fff0 +``` + +其中, + + +* L3 cache 资源的分配以 bit mask 进行表示,`L3:0=ffff;1=fff0`表示所属该 group 的 cpu 和 task 可以分配到 NUMA 0 的 L3 cache 的完整 16 way,NUMA 1 的 L3 cache 的高 12 way。 +* 内存带宽资源的分配以百分比进行表示,`MB:0=100;1=80`表示所属该 group 的 cpu 和 task 可以分配到 NUMA 0 最多 100% 的内存带宽,NUMA 1 最多 80% 的内存带宽。 + + +### 3.2.3 资源监控与mon\_data目录 + + +mon\_data 目录下相关文件完成了 MPAM 的资源监控特性,倚天中 mon\_data 目录结构如下: + + + +``` +mon_data +|-- mon_L3_00 +| `-- llc_occupancy +|-- mon_L3_01 +| `-- llc_occupancy +|-- mon_MB_00 +| `-- mbm_local_bytes +`-- mon_MB_01 + `-- mbm_local_bytes +``` + +其中, + + +* L3 cache 资源监控对应着 mon\_L3\_ 目录,该目录下包含了对应 NUMA 节点下 L3 cache 资源的当前使用情况。目前该目录下只有 llc\_occupancy 一个文件,该文件以byte为单位显示了当前 group 各个 task 的 L3 cache 用量。 +* 内存带宽资源监控对应着 mon\_MB\_ 目录,该目录下包含了对应 NUMA 节点下内存带宽资源的当前使用情况。目前该目录下只有 mbm\_local\_bytes 一个文件,该文件以 byte/s 为单位显示了当前 group 各个 task 的内存带宽统计值。 + + +### 3.2.4 info目录 + + +/sys/fs/resctrl 目录下除了包含一个默认 group 所需要的相关文件和目录外,还有一个 info 目录。info 目录中包含了当前机器能够支持 MPAM 扩展中资源分配和监测功能的详细信息。目前倚天机器上该目录中有以下内容: + + + +``` +info/ +|-- L3 +| |-- bit_usage +| |-- cbm_mask +| |-- min_cbm_bits +| |-- num_closids +| `-- shareable_bits +|-- L3_MON +| |-- max_threshold_occupancy +| |-- mon_features +| `-- num_rmids +|-- MB +| |-- bandwidth_gran +| |-- delay_linear +| |-- min_bandwidth +| `-- num_closids +|-- MB_MON +| |-- mon_features +| `-- num_rmids +`-- last_cmd_status +``` + +* L3 目录包含了 L3 cache 资源隔离特性的相关信息,其中各文件及其含义为 + + ++ **bit\_usaged**:以 bitmask 的形式表示 L3 各 way 当前的使用情况,在倚天机器中,默认为`0=XXXXXXXXXXXXXXXX;1=XXXXXXXXXXXXXXXX`。 ++ **cbm\_mask**:对应着 L3 cache 资源可以设置的最大 bitmask,同时该 mask 也对应着 100% 的 cache 资源占用。 ++ **min\_cbm\_bit**:对 L3 cache 资源可以设置的最小 bit 数。 ++ **num\_closids**:L3 cache 资源所能够创建的最大 group 数目,该值包含了 resctrl 文件系统挂载后自带的默认group。 ++ **shareable\_bits**:以 bitmask 的形式表示 L3 cache 资源与其他实体(例如I/O)的共享情况。 + + +* L3\_MON 目录包含了 L3 cache 资源监控特性的相关信息,其中各文件及其含义为 + + ++ **max\_threshold\_occupancy**:资源监控 monitor 被释放之后可能无法立即使用,因为之前的 cache 占用会影响 monitor 结果的准确性。max\_threshold\_occupancy 用于配置可以真正释放 monitor 的 cache占用。 ++ **mon\_features**:显示 L3 cache 有哪些资源监控特性,与 mon\_data/mon\_L3\_xx 中文件相对应。 ++ **num\_rmids**:可用的 monitor 数目,倚天机器该值为 4。 + + +* MB 目录包含了内存带宽资源隔离特性相关信息,其中各文件及其含义为: + + ++ **bandwidth\_gran**:内存带宽设置的百分比粒度,倚天机器该值为 5。 ++ **delay\_linear**:与 Intel 机器中内存带宽资源隔离特性相关的值,倚天机器中默认为 true,即 1。 ++ **min\_bandwidth**:内存带宽百分比设置的最小值,与 bandwidth\_gran 相等,倚天机器中该值为 5。 ++ **num\_closids**:内存带宽资源所能够创建的最大 group,该数目包含了 resctrl 文件系统的默认 group。 + + +* MB\_MON 目录包含了内存带宽资源监控特性相关信息,其中各文件及其含义为: + + ++ **mon\_features**:显示内存带宽有哪些资源监控特性,与 mon\_data/mon\_MB\_xx 中文件相对应。 ++ **num\_rmids**:可用的 monitor 数目,倚天机器该值为 4。 + + +* **last\_cmd\_status**:文件中包含了相关指令所出现的问题,可以通过读取该指令获取 resctrl 文件系统中相关操作失败的原因。 + + +## 3.3 MPAM 使用示例 + + +### 3.3.1 配置两个资源调配 group + + + +``` +mount -t resctrl resctrl /sys/fs/resctrl +cd /sys/fs/resctrl +# 创建两个资源调配group p0和p1 +mkdir p0 p1 +# 令p0使用Node0的高12路L3 Cache,Node1的低12路L3 Cache +echo "L3:0=0xfff0;1=0x0fff" > /sys/fs/resctrl/p0/schemata +# 令p1使用Node0的低12路L3 Cache,Node1的高12路L3 Cache +echo "L3:0=0x0fff;1=0xfff0" > /sys/fs/resctrl/p1/schemata +# 限制p0和p1的MB上限不超过50% +echo "MB:0=50;1=50" > /sys/fs/resctrl/p0/schemata +echo "MB:0=50;1=50" > /sys/fs/resctrl/p1/schemata +# 读取两个文件 +cat /sys/fs/resctrl/p0/schemata +cat /sys/fs/resctrl/p1/schemata +``` + +此时 /sys/fs/resctrl/p0/schemata 和 /sys/fs/resctrl/p1/schemata 两个文件中的内容分别为: + + + +``` +MB:0=50;1=50 +L3:0=fff0;1=0fff +``` + + +``` +MB:0=50;1=50 +L3:0=0fff;1=fff0 +``` + +### 3.3.2 为指定进程/线程分配资源调配 group + + +以 3.3.1 中已创建的 p0 资源调配 group 为例,此处限制 pid 为 12345 的进程/线程使用 p0 资源调配 group 所限定的资源。需要注意的是,新创建的子进程将继承父进程的 PARTID 和 PMG 信息,但已创建的子进程将不受影响。 + + + +``` +# 将pid 12345加入p0资源调配group +echo 12345 > /sys/fs/resctrl/p0/tasks +``` + +之后,pid 为 12345 的进程/线程将自动从 /sys/fs/resctrl/tasks 移动到 /sys/fs/resctrl/p0/tasks 文件中。 + + +### 3.3.3 为指定cpu分配资源调配 group + + + +``` +# 将cpu 99、100、101移入p1资源调配group +echo "99-101" > /sys/fs/resctrl/p1/cpus_list +# 或者 +echo "38,00000000,00000000,00000000" > /sys/fs/resctrl/p1/cpus_list +``` + +之后,cpu 99-101 将从 /sys/fs/resctrl/cpus\_list 中移动到 /sys/fs/resctrl/p1/cpus\_list 中。 + + +### 3.3.4 读取 cache/内存带宽 的 monitor 值 + + +仍然以 3.3.1 中创建的 p0 资源调配group为例,要获取 p0 资源组各进程的资源占用值,通过 cat 即可得到实时监控结果。 + + + +``` +cat /sys/fs/resctrl/p0/mon_data/mon_L3_0*/llc_occupancy +cat /sys/fs/resctrl/p0/mon_data/mon_MB_0*/mbm_local_bytes +``` + +## 3.4 模拟混部L3 cache隔离 + + +混部是 MPAM 资源隔离的一个重要应用场景。此处分别以 SPECjbb 2015 和 stress-ng 程序分别模拟云环境上广泛使用的 java 类在线作业上和离线作业,对 MPAM 的 L3 cache 隔离功能进行验证。 + + +在前 40s 的时间内,两个程序共享L3 cache所有资源。在约 40s 后,开始隔离在线和离线L3 cache资源的使用,在离线任务 L3 cache 的配比分别为 0xffff 和 0xf。 + + +![](assets/龙蜥_ANCK_5.10_倚天平台_MPAM_用户手册/img_4.png) + + +通过实验结果可以看到,在 L3 cache 资源共享的情况下,离线资源对在线资源干扰明显,L3 cache 竞争激烈,波动幅度很大;在对 L3 cache 资源进行隔离后,一方面离线得到了持续有效的压制,L3 cache 占有率大幅下降,另一方面在线性能提升明显,平均 L3 cache 占用提升了约 78%,且波动幅度变小,L3 cache 占用更加稳定。 + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\260\203\345\272\246\345\231\250\347\203\255\345\215\207\347\272\247/Plugsched_\342\200\224\342\200\224_Linux_\345\206\205\346\240\270\350\260\203\345\272\246\345\231\250\347\203\255\345\215\207\347\272\247.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\260\203\345\272\246\345\231\250\347\203\255\345\215\207\347\272\247/Plugsched_\342\200\224\342\200\224_Linux_\345\206\205\346\240\270\350\260\203\345\272\246\345\231\250\347\203\255\345\215\207\347\272\247.md" new file mode 100644 index 00000000..897bbc10 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\260\203\345\272\246\345\231\250\347\203\255\345\215\207\347\272\247/Plugsched_\342\200\224\342\200\224_Linux_\345\206\205\346\240\270\350\260\203\345\272\246\345\231\250\347\203\255\345\215\207\347\272\247.md" @@ -0,0 +1,223 @@ +![](assets/Plugsched_——_Linux_内核调度器热升级/img_0.png) +文/龙蜥社区内核开发人员 陈善佩、吴一昊、邓二伟 + +# Plugsched 是什么 +Plugsched 是 Linux 内核调度器子系统热升级的 SDK, **它可以实现在不重启系统、应用的情况下动态替换调度器子系统,毫秒级 downtime** 。Plugsched 可以对生产环境中的内核调度特性动态地进行增、删、改,以满足不同场景或应用的需求,且支持回滚。 + +基于 plugsched 实现的调度器热升级,不修改现有内核代码,就能获得较好的可修改能力,天然支持线上的老内核版本。如果提前在内核调度器代码的关键数据结构中加入 Reserve 字段,可以额外获得修改数据结构的能力,进一步提升可修改能力。 + +Plugsched 开源链接:https://gitee.com/anolis/plugsched + + + +# Plugsched 可以解决什么问题 +那么 Plugsched 诞生的背景或者想要解决的问题是什么?我们认为有以下 4 点: + +* **应用场景不同,最佳调度策略不同:** 应用种类极大丰富,应用特征也是千变万化 (throughput-oriented workloads, us-scale latency critical workloads, soft real-time, and energy efficiency requirements),使得调度策略的优化比较复杂,不存在“一劳永逸”的策略。因此,允许用户定制调度器满足不同的场景是必要的。 +* **调度器迭代慢:** Linux 内核经过很多年的更新迭代,代码变得越来越繁重。调度器是内核最核心的子系统之一,它的结构复杂,与其它子系统紧密耦合,这使得开发和调试变得越发困难。此外,Linux 很少增加新的调度类,尤其是不太可能接受非通用或场景针对型的调度器,上游社区在调度领域发展缓慢。 +* **内核升级困难:** 调度器内嵌 (built-in)在内核中,上线调度器的优化或新特性需要升级内核版本。内核发布周期通常是数月之久,这将导致新的调度器无法及时应用在生产系统中。再者,要在集群范围升级新内核,涉及业务迁移和停机升级,对业务方来说代价昂贵。 +* **无法升级子系统。** kpatch 和 livepatch 是函数粒度的热升级方案,可修改能力较弱,不能实现复杂的逻辑改动; eBPF 技术在内核网络中广泛应用,但现在调度器还不支持 ebpf hook,将来即使支持,也只是实现局部策略的灵活修改,可修改能力同样较弱。 + +Plugsched 能将调度器子系统从内核中提取出来,以模块的形式对内核调度器进行热升级。通过对调度器模块的修改,能够针对不同业务定制化调度器,而且使用模块能够更敏捷的开发新特性和优化点,并且可以在不中断业务的情况下上线。 + +![](assets/Plugsched_——_Linux_内核调度器热升级/img_1.png) +图1 plugsched:业务不中断 + + + +**使用 plugsched 具有以下 6 大优势:** +* **与内核发布解耦:** 调度器版本与内核版本解耦,不同业务可以使用不同调度策略;建立持续运维能力,加速调度问题修复、策略优化落地;提升调度领域创新空间,加快调度器技术演进和迭代; +* **可修改能力强:** 可以实现复杂的调度特性和优化策略,能人之所不能; +* **维护简单:** 不修改内核代码,或少量修改内核代码,保持内核主线干净整洁;在内核代码 Tree 外独立维护非通用调度策略,采用 RPM 的形式发布和上线; +* **简单易用:** 容器化的 SDK 开发环境,一键生成 RPM,开发测试简洁高效; +* **向下兼容:** 支持老内核版本,使得存量业务也能及时享受新技术红利; +* **高效的性能:** 毫秒级 downtime,可忽略的 overhead。 + + + +# Plugsched 应用案例 +Plugsched 相比 kpatch 和 livepatch 可修改能力更强,热升级范围更广,plugsched 是子系统范围的热升级,而后者是函数级别的热升级。**对于 plugsched 而言,无论是 bugfix,还是性能优化,甚至是特性的增、删、改,都可胜任**。鉴于 plugsched 较强的可修改能力,它可应用到以下场景: + +* **快速开发、验证、上线新特性,稳定后放入内核主线;** +* **针对不同业务场景做定制优化,以 RPM 包的形式发布和维护非通用调度器特性;** +* **统一管理调度器热补丁,避免多个热补丁之间的冲突而引发故障。** + + + +**应用案例1:新增 Group Identity 调度特性** +Group Identity 是阿里云用于混部场景的调度特性,它基于 CFS 调度器增加了一颗存储低优先级任务的红黑树,而且会对每一个 cgroup 分配一个默认优先级,用户也可自行配置其优先级,当队列中存在高优先级任务时,低优先级任务会停止运行。我们利用 plugsched 对 anck 4.19 的一个老版本内核(没有该调度特性)进行调度器热升级,并将 Group Identity 调度特性移植到生成的调度器模块中,涉及 7 个文件,2500+ 行的修改量。 + +安装该调度器模块后,在系统中创建两个 cpu cgroup A 和 B,并绑定同一个 CPU,分别设置最高和最低优先级,然后各自创建一个 busy loop 任务。理论上,当 A 中有任务执行时,B 中的任务会停止运行。此时用 top 工具查看该 CPU 利用率,发现只有一个利用率是 100% 的 busy loop 任务,说明模块中的 Group Identity 特性已生效;而动态卸载该模块后,出现了两个各占 50% CPU 的 busy loop 任务,说明模块已经失效。 + + + +**应用案例2:与内核发布解耦及定制化调度器** +阿里云某客户使用的旧版本内核,由于该内核调度器对 load 的统计算法不合理,导致 CPU 利用率过高,虽然修复补丁已经合入内核主线,但是新内核版本还未发布,而且业务方也不打算更换内核,因为集群中部署了大量的业务,升级内核成本较高。 + +除此之外,客户的内核开发人员对其混部业务场景(Group Identity 调度特性)进行了针对性的优化,想将优化内容合入内核主线。但是,阿里云内核开发人员发现,该优化内容在其它场景中有性能回退,属于非通用优化,因此不允许将优化内容合入主线。 + +于是,客户的内核开发人员使用 plugsched 将优化修复内容全部移植到调度器模块中,最后规模部署。该案例可以体现出 plugsched 的与内核发布解耦、定制化调度器的优势。 + + + +# 如何使用 Plugsched +目前,plugsched 默认支持 Anolis OS 7.9 ANCK 系统发行版,其它系统需要[调整边界配置](./docs/Support-various-Linux-distros.md)。为了减轻搭建运行环境的复杂度,我们提供了的容器镜像和 Dockerfile,开发人员不需要自己去搭建开发环境。为了方便演示,这里购买了一台阿里云 ECS(64CPU + 128GB),并安装 Anolis OS 7.9 ANCK 系统发行版,我们将会对内核调度器进行热升级。 + +1. 登陆云服务器后,先安装一些必要的基础软件包: +```shell +# yum install anolis-repos -y +# yum install podman kernel-debuginfo-$(uname -r) kernel-devel-$(uname -r) --enablerepo=Plus-debuginfo --enablerepo=Plus -y +``` + +2. 创建临时工作目录,下载系统内核的 SRPM 包: +```shell +# mkdir /tmp/work +# uname -r +4.19.91-25.2.an7.x86_64 +# cd /tmp/work +# wget https://mirrors.openanolis.cn/anolis/7.9/Plus/source/Packages/kernel-4.19.91-25.2.an7.src.rpm +``` + +3. 启动并进入容器: +```shell +# podman run -itd --name=plugsched -v /tmp/work:/tmp/work -v /usr/src/kernels:/usr/src/kernels -v /usr/lib/debug/lib/modules:/usr/lib/debug/lib/modules docker.io/plugsched/plugsched-sdk +# podman exec -it plugsched bash +# cd /tmp/work +``` + +4. 提取 4.19.91-25.1.al7.x86_64 内核源码: +```shell +# plugsched-cli extract_src kernel-4.19.91-25.2.an7.src.rpm ./kernel +``` + +5. 进行边界划分与提取: +```shell +# plugsched-cli init 4.19.91-25.2.an7.x86_64 ./kernel ./scheduler +``` + +6. 提取后的调度器模块代码在 ./scheduler/kernel/sched/mod 中, 新增一个 sched\_feature 并打包生成 rpm 包: +```diff +diff --git a/scheduler/kernel/sched/mod/core.c b/scheduler/kernel/sched/mod/core.c +index 9f16b72..21262fd 100644 +--- a/scheduler/kernel/sched/mod/core.c ++++ b/scheduler/kernel/sched/mod/core.c +@@ -3234,6 +3234,9 @@ static void __sched notrace __schedule(bool preempt) + struct rq *rq; + int cpu; + ++ if (sched_feat(PLUGSCHED_TEST)) ++ printk_once("I am the new scheduler: __schedule\n"); ++ + cpu = smp_processor_id(); + rq = cpu_rq(cpu); + prev = rq->curr; +diff --git a/scheduler/kernel/sched/mod/features.h b/scheduler/kernel/sched/mod/features.h +index 4c40fac..8d1eafd 100644 +--- a/scheduler/kernel/sched/mod/features.h ++++ b/scheduler/kernel/sched/mod/features.h +@@ -1,4 +1,6 @@ + /* SPDX-License-Identifier: GPL-2.0 */ ++SCHED_FEAT(PLUGSCHED_TEST, false) ++ + /* + * Only give sleepers 50% of their service deficit. This allows + * them to run sooner, but does not allow tons of sleepers to +``` +```shell +# plugsched-cli build /tmp/work/scheduler +``` + +7. 将生成的 rpm 包拷贝到宿主机,退出容器,查看当前 sched\_features: +```text +# cp /usr/local/lib/plugsched/rpmbuild/RPMS/x86_64/scheduler-xxx-4.19.91-25.2.an7.yyy.x86_64.rpm /tmp/work +# exit +exit +# cat /sys/kernel/debug/sched_features +GENTLE_FAIR_SLEEPERS START_DEBIT NO_NEXT_BUDDY LAST_BUDDY CACHE_HOT_BUDDY WAKEUP_PREEMPTION NO_HRTICK NO_DOUBLE_TICK NONTASK_CAPACITY TTWU_QUEUE NO_SIS_AVG_CPU SIS_PROP NO_WARN_DOUBLE_CLOCK RT_PUSH_IPI RT_RUNTIME_SHARE NO_LB_MIN ATTACH_AGE_LOAD WA_IDLE WA_WEIGHT WA_BIAS NO_WA_STATIC_WEIGHT UTIL_EST ID_IDLE_AVG ID_RESCUE_EXPELLEE NO_ID_EXPELLEE_NEVER_HOT NO_ID_LOOSE_EXPEL ID_LAST_HIGHCLASS_STAY +``` + +8. 安装调度器包,且新增了一个 PLUGSCHED\_TEST sched\_feature(关闭状态): +```text +# rpm -ivh /tmp/work/scheduler-xxx-4.19.91-25.2.an7.yyy.x86_64.rpm +# lsmod | grep scheduler +scheduler 503808 1 +# dmesg | tail -n 10 +[ 2186.213916] cni-podman0: port 1(vethfe1a04fa) entered forwarding state +[ 6092.916180] Hi, scheduler mod is installing! +[ 6092.923037] scheduler: total initialization time is 6855921 ns +[ 6092.923038] scheduler module is loading +[ 6092.924136] scheduler load: current cpu number is 64 +[ 6092.924137] scheduler load: current thread number is 667 +[ 6092.924138] scheduler load: stop machine time is 249471 ns +[ 6092.924138] scheduler load: stop handler time is 160616 ns +[ 6092.924138] scheduler load: stack check time is 85916 ns +[ 6092.924139] scheduler load: all the time is 1097321 ns +# cat /sys/kernel/debug/sched_features +NO_PLUGSCHED_TEST GENTLE_FAIR_SLEEPERS START_DEBIT NO_NEXT_BUDDY LAST_BUDDY CACHE_HOT_BUDDY WAKEUP_PREEMPTION NO_HRTICK NO_DOUBLE_TICK NONTASK_CAPACITY TTWU_QUEUE NO_SIS_AVG_CPU SIS_PROP NO_WARN_DOUBLE_CLOCK RT_PUSH_IPI RT_RUNTIME_SHARE NO_LB_MIN ATTACH_AGE_LOAD WA_IDLE WA_WEIGHT WA_BIAS NO_WA_STATIC_WEIGHT UTIL_EST ID_IDLE_AVG ID_RESCUE_EXPELLEE NO_ID_EXPELLEE_NEVER_HOT NO_ID_LOOSE_EXPEL ID_LAST_HIGHCLASS_STAY +``` + +9. 打开新的 sched\_feature,“I am the new scheduler: \_\_schedule” 信息出现在 dmesg 日志中: +```text +# echo PLUGSCHED_TEST > /sys/kernel/debug/sched_features +# dmesg | tail -n 5 +[ 6092.924138] scheduler load: stop machine time is 249471 ns +[ 6092.924138] scheduler load: stop handler time is 160616 ns +[ 6092.924138] scheduler load: stack check time is 85916 ns +[ 6092.924139] scheduler load: all the time is 1097321 ns +[ 6512.539300] I am the new scheduler: __schedule +``` + +10. 卸载调度器包后,新的 sched\_feature 被删除: +```text +# rpm -e scheduler-xxx +# dmesg | tail -n 8 +[ 6717.794923] scheduler module is unloading +[ 6717.809110] scheduler unload: current cpu number is 64 +[ 6717.809111] scheduler unload: current thread number is 670 +[ 6717.809112] scheduler unload: stop machine time is 321757 ns +[ 6717.809112] scheduler unload: stop handler time is 142844 ns +[ 6717.809113] scheduler unload: stack check time is 74938 ns +[ 6717.809113] scheduler unload: all the time is 14185493 ns +[ 6717.810189] Bye, scheduler mod has be removed! +# +# cat /sys/kernel/debug/sched_features +GENTLE_FAIR_SLEEPERS START_DEBIT NO_NEXT_BUDDY LAST_BUDDY CACHE_HOT_BUDDY WAKEUP_PREEMPTION NO_HRTICK NO_DOUBLE_TICK NONTASK_CAPACITY TTWU_QUEUE NO_SIS_AVG_CPU SIS_PROP NO_WARN_DOUBLE_CLOCK RT_PUSH_IPI RT_RUNTIME_SHARE NO_LB_MIN ATTACH_AGE_LOAD WA_IDLE WA_WEIGHT WA_BIAS NO_WA_STATIC_WEIGHT UTIL_EST ID_IDLE_AVG ID_RESCUE_EXPELLEE NO_ID_EXPELLEE_NEVER_HOT NO_ID_LOOSE_EXPEL ID_LAST_HIGHCLASS_STAY +``` +**注意:不可以用“rmmod”命令直接卸载调度器模块,应使用“rpm 或 yum”标准命令卸载调度器包。** + + + +# Plugsched 实现原理 +**我们通过以上知道了 Plugsched 是什么、应用案例,那它实现原理是什么?** + +调度器子系统在内核中并非是一个独立的模块,而是内嵌在内核中,与内核其它部分紧密相连。 + +**Plugsched 采用“模块化”的思想**:它提供了边界划分程序,确定调度器子系统的边界,把调度器从内核代码中提取到独立的目录中,开发人员可对提取出的调度器代码进行修改,然后编译成新的调度器内核模块,动态替换内核中旧的调度器。对子系统进行边界划分和代码提取,需要处理函数和数据,而后生成一个独立的模块。 + +**对于函数而言**,调度器模块对外呈现了一些关键的函数,以这些函数为入口就可以进入模块中,我们称之为接口函数。通过替换内核中的这些接口函数,内核就可以绕过原有的执行逻辑进入新的调度器模块中执行,即可完成函数的升级。模块中的函数,除了接口函数外,还有内部函数,其它的则是外部函数。 + +**对于数据**,调度器模块默认使用并继承内核中原有的数据,对于调度器重要的数据,比如运行队列状态等,可以通过状态重建技术自动重新初始化,这类数据属于私有数据,而其它则是共享数据。为了灵活性,plugsched 允许用户手动设置私有数据,手动设置的私有数据会在模块中保留定义,但需要对它们进行初始化。对于结构体而言,plugsched 将只被调度器访问的结构体成员分类为内部成员,其它为非内部成员。调度器模块允许修改内部成员的语义,禁止修改非内部成员的语义。如果结构体所有成员都是内部成员,则调度器模块允许修改整个结构体。但是,建议优先使用结构体中的保留字段,而不是修改现有成员。 + + + +# Plugsched 设计方案 +Plugsched 主要包含两大部分,第一部分是调度器模块边界划分与代码提取部分,第二部分是调度器模块热升级部分,这两部分是整个方案的核心。其整体设计方案如下: + +![](assets/Plugsched_——_Linux_内核调度器热升级/img_2.png) +图2 plugsched 整体架构 + + + +首先进行的是调度器模块边界划分和代码提取流程,由于调度器本身并不是模块,因此需要明确调度器的边界才能将它模块化。边界划分程序会根据边界配置信息(主要包含代码文件、接口函数等信息)从内核源代码中将调度器模块的代码提取到指定目录,然后开发人员可在此基础上进行调度器模块的开发,最后编译生成调度器 RPM 包,并可安装在对应内核版本的系统中。安装后会替换掉内核中原有的调度器,安装过程会经历以下几个关键过程: + +* **符号重定位**:解析模块对部分内核符号的访问; +* **栈安全检查**:类似于 kpatch,函数替换前必须进行栈安全检查,否则会出现宕机的风险。plugsched 对栈安全检查进行了并行和二分优化,提升了栈安全检查的效率,降低了停机时间; +* **接口函数替换**:用模块中的接口函数动态替换内核中的函数; +* **调度器状态重建**:采用通用方案自动同步新旧调度器的状态,极大的简化数据状态的一致性维护工作。 + + + +# 总结 +Plugsched 使得调度器从内核中解放出来,开发人员可以对调度器进行专项定制,而不局限于内核通用调度器;内核维护也变得更加轻松,因为开发人员只需要关注通用调度器的开发与迭代,定制化调度器可通过 RPM 包的形式进行发布;内核调度器代码也会变得简洁,无需再被各个场景的优化混淆起来。 + +未来,plugsched 会支持新版本内核和其它平台,持续对其易用性进行优化,并提供更多的应用案例。最后,欢迎更多的开发者能参与到 plugsched 中。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\350\265\204\346\272\220\351\232\224\347\246\273FAQ.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\350\265\204\346\272\220\351\232\224\347\246\273FAQ.md" new file mode 100644 index 00000000..e69de29b diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\351\276\231\350\234\245OS\350\265\204\346\272\220\351\232\224\347\246\273\346\212\200\346\234\257\344\273\213\347\273\215.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\351\276\231\350\234\245OS\350\265\204\346\272\220\351\232\224\347\246\273\346\212\200\346\234\257\344\273\213\347\273\215.md" new file mode 100644 index 00000000..4a59a079 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\351\276\231\350\234\245OS\350\265\204\346\272\220\351\232\224\347\246\273\346\212\200\346\234\257\344\273\213\347\273\215.md" @@ -0,0 +1,169 @@ + +# 背景介绍 + + + 2014年,阿里开始了第一次探索混部,经过七年磨练,这把资源利用率大幅提升的利剑正式开始商用。通过从计算资源、内存资源、存储资源、网络资源等全链路的隔离以及毫秒级的自适应调度能力,阿里可以在双十一的流量下进行全时混部,通过智能化的决策与运维能力,支撑着内部百万级的Pod混部,不管是CPU与GPU资源,普通容器与安全容器,包括国产化环境各种异构基础设施,都能实现高效混部,这让阿里核心电商业务生产集群成本下降了50%以上,同时核心业务受到的干扰小于5%。在商用化对外线下输出的版本里面,我们将完全基于云原生社区标准,以插件化的方式无缝的安装在k8s集群为输出形态交付客户。其中核心的OS层隔离能力,已经发布到支持多架构的开源、中立、开放的Linux操作系统发行版-龙蜥(Anolis OS)中。 + + +# 混部和资源隔离之间的关系:**资源隔离是混部的基石** + + +混部就是将不同类型的业务在同一台机器上混合部署起来,让它们共享机器上的CPU、内存、IO等资源,目的就是最大限度地提高资源利用率,从而降低采购和运营等成本。混部通常是将不同优先级的任务混合在一起,例如高优先的实时任务(对时延敏感,资源消耗低;称为在线)和低优先级批处理任务(对时延不敏感,资源消耗高;称为离线),当高优先级业务需要资源时,低优先级任务需要立即归还,并且低优先级任务的运行不能对高优先级任务造成明显干扰。 + + +为了满足混部的需求,在单机维度的内核资源隔离技术是最为关键的一项技术,龙蜥云内核在资源隔离的技术上深耕多年,并且在行业中处于领先地位,这些内核资源隔离技术主要涉及内核中的调度、内存和IO这三大子系统,并且在各个子系统领域根据云原生的混部场景进行了深入的改造和优化,关键优化包括但不限于:cpu group identity技术,SMT expeller技术,基于cgroup的内存异步回收技术等。其中cpu group identity已经申请对应的专利,有独立的知识产权。这些关键的技术使客户有能力在云原生混部场景中根据业务特点给出最优解决方案,可有效提高用户的资源使用率并最终降低用户资源的使用成本,非常适用于容器云混部场景,同时也是大规模化混合部署方案所强依赖的关键技术。 + + +下图是资源隔离能力在整个混部方案中的位置:![](../../../assets/社区研发项目/资源隔离与混部/龙蜥OS资源隔离技术介绍/img_0.png) + + +# 为什么需要资源隔离:**资源隔离会遇到哪些拦路虎** + + +假设我们现在有一台服务器,上面运行了高优的在线业务,以及离线任务也在上面运行运行。在线任务对响应时间 (Response Time, RT) 的需求是很明确的,要求尽可能低的RT,故被称之为延迟敏感型(Latency-Sensitive, LS) 负载;离线任务永远是有多少资源吃多少资源的,故此类负载被称之为 Best Effort (BE),如果我们对在线和离线任务不加干涉,那么离线任务很有可能会频繁、长期占用各种资源,从而让在线任务没有机会调度,或者调度不及时,或者获取不到带宽等等,从而出现在线业务RT急剧升高的情况。所以在这种场景下我们一定需要必要的手段来对在线和离线容器进行资源使用上的隔离,来确保在线高优容器在使用资源时可以及时的获取,最终能够在提升整体资源使用率的情况下保障高优容器的QoS。 + + +我们这边通过一个例子,说明一下在线和离线混着跑的时候,可能出现的情况: + + +* 首先最有可能发生在离线竞争的,可能是CPU,因为CPU调度是核心,在线和离线任务可能分别会调度到一个核上,相互抢执行时间; +* 当然任务也可能会分别跑到相互对应的一对HT上,相互竞争指令发射带宽和其他流水线资源; +* 接下来CPU的各级缓存必然是会被消耗掉的,而缓存资源是有限的,所以这里涉及到了缓存资源划分的问题; +* 再接下来,假设我们已经完美解决了各级缓存的资源划分,后面还是有问题。首先是内存是CPU缓存的下一级,内存本身也类似,会发生争抢,对于在线和离线任务分别来说都是需要像CPU缓存一样进行资源划分的; +* 另外当CPU最后一级缓存(Last Level Cache, LLC)没有命中的时候,内存的带宽(我们称之为运行时容量,以有别于内存大小划分这种静态容量)会变高,所以内存和CPU缓存之间的资源消耗,是相互影响的; +* 然后我们假设CPU和内存资源都没问题,对于本机来说现在隔离已经做得很好了,但是在线高优的业务和离线任务的运行过程中都是和网络有密切的关系,那么很容易理解,网络也可能是需要隔离的; +* 最后,线上部分机型对IO的使用可能会发生抢占,我们需要有效的IO隔离策略。 + + +以上就是一个很简单的资源隔离流程的思路,可以看到每一环都有可能会出现干扰或者竞争。 + + +# 隔离技术方案介绍:**独有的隔离技术方案,各显神通** + + +内核资源隔离技术主要涉及内核中的调度、内存和 IO 这三大子系统,这些技术基于 Linux CGroup V1 提供资源的基本隔离划分以及 QoS 保障,适用于容器云场景,同时也是大规模化混合部署方案所强依赖的关键技 术。 + + +除了基本的 CPU、内存和 IO 资源隔离技术外,龙蜥内核还实现有资源隔离视图、资源监控指标 SLI (ServiceLevelIndicator) 以及资源竞争分析工具等,提供一整套集监控、告警、运维、诊断等整套的资源隔 离和混部解决方案,如下图所示 + + +![](../../../assets/社区研发项目/资源隔离与混部/龙蜥OS资源隔离技术介绍/img_1.png) + + +## 弹性容器场景的调度器优化 + + +如何保证计算服务质量的同时尽可能提高计算资源利用率,是容器调度的经典问题。随着 CPU 利用率不断 提升,CPU 带宽控制器暴露出弹性不足的问题日趋严重,面对容器的短时间 CPU 突发需求,带宽控制器需要对容器的 CPU 使用进行限流,避免影响负载延迟和吞吐。 + + +Anolis OS 中的 CPU Burst 技术是一种弹性容器带宽控制技术,在满足平均 CPU 使用率低于一定限制的条件下,CPU Burst 允许短时间的 CPU 突发使用,实现服务质量提升和容器负载加速。 + + +在容器场景中使用 CPU Burst 之后,测试容器的服务质量显著提升,如下图所示,在实测中可以发现使用该特性技术以后,RT长尾问题几乎消失。 + + +![](../../../assets/社区研发项目/资源隔离与混部/龙蜥OS资源隔离技术介绍/img_2.png) + + +## Group Identity 技术 + + +为了满足业务方在cpu资源隔离上的需求,在满足cpu资源利用最大化的情况下,保证高优业务的服务质量不受影响,或将影响范围控制在一定范围,此时内核调度器需要赋予高优先级的任务更多的调度机会来最小化其调度延迟,并把低优先级任务对其带来的影响降到最低,这是行业中通用的需求。 + + +为了满足以上需求,我们引入了Group Identity的概念,即每个cpu cgroup会有一个身份识别,以CPU CGroup组为单位实现调度特殊优先级,提升高优先级组的及时抢占能力确保了高优先级任务的性能,适用于在线和离线混跑的业务场景。当在离线混部时,可以最大程度降低由于离线业务引入的在线业务调度不及时的问题,增加高优先业务的cpu抢占时机等底层等核心技术保障在线业务在cpu调度延迟上不受离线业务的影响。 + + +## SMT expeller + + +在某些线上业务场景中,使用超线程的情况下的 QPS 比未使用超线程时下降明显,并且相应 RT 也增加了 不少。根本原因跟超线程的物理性质有关,超线程技术在一个物理核上模拟两个逻辑核,两个逻辑核具有各自独立的寄存器(eax、ebx、ecx、msr等等)和APIC,但会共享使用物理核的执行资源,包括执行引擎、L1/L2缓存、TLB和系统总线等等。这就意味着,如果一对HT的一个核上跑了在线任务,与此同时它对应的HT核上跑了一个离线任务,那么它们之间是会发生竞争的。这就是我们需要解决的问题。 + + +为了尽可能减轻这种竞争的影响,我们想要让一个核上的在线任务执行的时候,它对应的HT上不再运行离线任务;或者当一个核上有离线任务运行的时候,而在线任务调度到了其对应的HT上时,离线任务会被驱赶走。听起来离线混得很惨对不对,但是这就是我们保证HT资源不被争抢的机制。 + + +SMT expeller 特性是基于 Group Identity 框架进一步实现了超线程(HT)隔离调度,保障高优先级业务不会受到来自 HT 的低优先级任务干扰。通过 Group Identity 框架进一步实现的超线程调度隔离,可以很好的保障高优先级业务不会受到来自对应HT上的低优先级任务的干扰。 + + +## 处理器硬件资源管理技术 + + +龙蜥内核支持 Intel®Resource Director Technology(Intel®RDT),它是一种处理器支持的硬件资源 管理技术。包括监控 Cache 资源的 Cache Monitoring Technology (CMT) ,监控内存带宽的 Memory Bandwidth Monitoring (MBM),负责 Cache 资源分配的 Cache Allocation Technology(CAT) 和监 控内存带宽的 Memory Bandwidth Allocation(MBA)。 + + +其中,CAT 使得 LLC(Last Level Cache)变成了一种支持 QualityofService(QoS) 的资源。在 混部环境里面,如果没有 LLC 的隔离,离线应用不停的读写数据导致大量的 LLC 占用,会导致在线的 LLC 被 不断污染,影响数据访问甚至硬件中断延迟升高、性能下降。 + + +MBA 用于内存带宽分配。对于内存带宽敏感的业务来说,内存带宽比 LLC 控制更能影响性能和时延。在 混部环境里面,离线通常是资源消耗型的,特别是一些 AI 类型的作业对内存带宽资源的消耗非常大,内存占用 带宽一旦达到瓶颈,可能使得在线业务的性能和时延成倍的下降,并表现出 CPU 水位上升。龙蜥内核目前已经 全面支持多种处理器的资源隔离功能。 + + +## Memcg 后台回收 + + +在原生的内核系统中,当容器的内存使用量达到他的使用上限时,此时再申请使用内存时,在当前的进程上下文中就会进行直接内存回收的动作,这无疑会影响当前进程的执行效率,引起性能问题。那我们是否有方法当容器的内存达到一定水线的时候让其提前进行内存的异步回收,这样就有比较大的概率避免容器内的进程在申请使用内存时由于内存使用达到上限而进入直接内存回收。 + + +我们知道在内核中有一个kswapd的后台内核线程,用来当系统的内存使用量达到一定水位以后来进行异步的内存回收,但是这里有一种情况,比如当前高优的业务容器的内存使用已经达到一个比较高的情况,但是宿主机的总体的空闲内存还有很多,这样内核的kswapd的线程就不会被唤醒进行内存回收,这样这些内存使用压力大的高优容器的内存就没有机会被回收,所以这是个比较大的矛盾,由于目前原生内核中是没有memory cgroup级别的内存异步回收机制,也就是说容器的内存回收严重依赖宿主机层面的kswapd的回收或者只能依靠自己的同步回收,这会严重的影响一些高优容器的业务由于内存回收不及时引入的性能问题。 + + +基于以上背景,anolis os提供了一个类似宿主机层面的kswapd的基于memcg的异步回收策略,用于按照用户需求提前进行容器级别的内存回收机制,做到提前内存释压。 + + +具体的异步回收过程可以通过下面这幅图进行描述: + + +![](../../../assets/社区研发项目/资源隔离与混部/龙蜥OS资源隔离技术介绍/img_3.png) + + +## Memcg 全局水位线分级 + + +通常资源消耗型的离线任务可能会时常瞬间申请大量的内存,使得系统的空闲内存触及全局min水线,引发系统所有任务进入直接内存回收的慢速流程,时延敏感型的在线业务很容易发生性能抖动。此场景下,无论是全局kswapd后台回收还是memcg级别的后台回收机制,都是无能为力的。 + + +我们基于"内存消耗型的离线任务通常对时延不敏感"这样一个事实,设计了"memcg的全局min水线分级功能"来解决上述抖动难题。在标准upstream全局共享min水线的基础上,将离线任务的全局min水线上移让其提前进入直接内存回收,同时将时延敏感的在线任务的全局min水线下移,在一定程度上实现了离线任务和在线任务的min水线隔离。这样当离线任务瞬间大量内存申请的时候,会将离线任务抑制在其上移的min水线,避免了在线任务发生直接内存回收,随后当全局kswapd回收一定量的内存后,离线任务的短时间抑制得以解除。 + + +我们的核心思想就是通过为在离线容器设置不同标准的全局水位线来控制在离线容器申请内存的动作,这样能让离线容器的任务在申请内存时先与在线业务进入直接内存回收,用于解决离线容器瞬间申请大量内存引发的问题。 + + +对linux内存管理有一定基础的同学也可以查阅下面这幅图,他详细的记录了在离线容器混部过程中在多种水位线的作用下的一个走势图: + + +![](../../../assets/社区研发项目/资源隔离与混部/龙蜥OS资源隔离技术介绍/img_4.png) + + +## memcg OOM 优先级 + + +在真实的业务场景中,特别是内存超卖环境,当发生global OOM的时候,有理由去选择杀掉那些优先级比较低的离线业务,而保护高优先级在线业务;当发生离线memcg OOM的时候,有理由去选择杀掉那些优先级比较低的作业,而保高优先级离线作业。这其实是云原生场景中一个比较通用的需求,但是目前的标准Linux内核并不具备这个能力,在选择杀进程的时候,内核会有一个算法去选择victim,但通常是找一个oom score最大的进程杀,这个被杀的进程有可能是在线高优业务进程,这并不是我们想看到的。 + + +基于以上原因,anolis os提供了一个memcg OOM优先级的特性,通过该特性我们可以保障在系统由于内存紧张而发生OOM时通过选择低优的业务进程进行kill,从而避免高优业务进程被杀的可能,可以大幅降低由于在线业务进程退出而给客户业务带来的影响。 + + +## CGroupV1 Writeback 限流 + + +block IO cgroup自合入内核之后,一直存在一个问题:只能对direct IO进行限流(buffer IO之后短期内执行fsync也可以限流),因为这些IO到达block throttle层时,当前进程就是真正发起IO的进程,根据进程可以获取到相应的cgroup从而正确记账,如果超过了用户设置的带宽/IOPS上限,则进行限制。对于那些buffer写,且最终由kworker线程下发的IO,block throttle层无法通过当前进程获取IO所属的cgroup,也就无法对这些IO进行限流。 + + +基于以上背景,目前在Cgroup V2版本中已经支持异步IO限流,但是在Cgroup V1中并不支持,由于目前在云原生环境下主要还是使用Cgroup V1版本,阿里云内核团队通过建立page<->memcg<->blkcg这三者的关系实现了在Cgroup V1中对IO异步限流的功能,限流的主要算法基本上和Cgroup V2保持一致。 + + +## blk-iocost 权重控制 + + +正常情况下,为了避免一个IO饥饿型作业轻易耗尽整个系统IO资源,我们会设置每个cgroup的IO带宽上限,其最大缺点是即使设备空闲,配置上限的cgroup在其已发送IO超过上限时不能继续发送IO,引起存储资源浪费。 + + +基于以上需求,出现了一种IO控制器-IOCOST,该控制器是基于blkcg的权重来分配磁盘的资源,可以做到在满足业务IO QOS的前提下,尽最大程度利用磁盘的IO资源,一旦出现磁盘IO能力达到上限导致触及QOS设置的目标时,此时iocost控制器会通过权重来控制各个group的io使用,在此基础上,blk-iocost又拥有一定的自适应能力,尽可能的避免磁盘能力被浪费。 + + +# 展望与期待 + + +在阿里云的线下输出产品族内,我们会把混部的能力通过ACK Anywhere产品家族,以及CNStack(CloudNative Stack)产品家族,进行输出。整体解决方案结合OpenAnolis龙蜥操作系统内核,网络Qos技术等,输出给我们的客户。 + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\351\276\231\350\234\245os\350\265\204\346\272\220\351\232\224\347\246\273\344\275\277\347\224\250\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\351\276\231\350\234\245os\350\265\204\346\272\220\351\232\224\347\246\273\344\275\277\347\224\250\347\256\200\344\273\213.md" new file mode 100644 index 00000000..82010981 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\350\265\204\346\272\220\351\232\224\347\246\273\344\270\216\346\267\267\351\203\250/\351\276\231\350\234\245os\350\265\204\346\272\220\351\232\224\347\246\273\344\275\277\347\224\250\347\256\200\344\273\213.md" @@ -0,0 +1,1080 @@ + +# 背景 + + +为了给用户提供一份完整的alibaba cloud linux资源隔离使用指导说明手册,本文将从用户的角度出发,提供OS各个子系统中关于资源隔离详细的使用说明,并会详细描述各个隔离手段的使用背景,让用户更好的了解各个资源隔离手段在哪些场景使用,使用限制是什么。 + + +让用户最终能够简单的使用alibaba cloud linux资源隔离是本文的目的。 + + +# 目标人群 + + +本文的使用人员需要具备一定的关于cgroup的基础知识,对linux操作系统有初步的了解。本文适合那些想快速使用alibaba cloud kernel的人员,也适合想简单了解alibaba cloud kernel资源隔离能力的人员。 + + +# 背景知识 + + +如果你对linux的cgroup的使用有所了解,本段内容可以跳过,如果你对cgroup从未了解过,建议阅读下本背景知识,并在自己的测试机器上进行演练来加深了解。 + + +我们所有的资源隔离手段几乎都是基于linux的cgroup进行实现和优化,Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。而我们平时使用的容器,他的底层技术就是cgroup技术。 + + +在 Linux 中,Cgroups 给用户暴露出来的操作接口是文件系统,即它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下,我们可以用 mount 指令把它们展示出来,这条命令是: + + + +``` +[root@AliYun ~]# mount -t cgroup +cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd) +cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma) +cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset) +cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct) +cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids) +cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio) +cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory) +cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio) +cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event) +cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer) +cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb) +cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices) +``` + +可以看到,在 /sys/fs/cgroup 下面有很多诸如 cpuset、cpu、 memory 这样的子目录,也叫子系统。这些都是我这台机器当前可以被 Cgroups 进行限制的资源种类。而在子系统对应的资源种类下,你就可以看到该类资源具体可以被限制的方法。比如,对 CPU 子系统来说,我们就可以看到如下几个配置文件,这些配置文件就是我们这边所谓的对外配置接口,可以通过手动的方式进行资源使用的配置: + + + +``` +[root@AliYun cpu]# ls +assist cpuacct.usage_all cpu.cfs_period_us +cgroup.clone_children cpuacct.usage_percpu cpu.cfs_quota_us +cgroup.procs cpuacct.usage_percpu_sys cpu.identity +cgroup.sane_behavior cpuacct.usage_percpu_user cpu.shares +cpuacct.block_latency cpuacct.usage_sys cpu.stat +cpuacct.cgroup_wait_latency cpuacct.usage_user notify_on_release +cpuacct.ioblock_latency cpuacct.wait_latency release_agent +cpuacct.proc_stat cpu.bvt_warp_ns tasks +cpuacct.stat cpu.cfs_burst_us +cpuacct.usage cpu.cfs_init_buffer_us +``` + +我们这边就以容器的cpu规格的配置进行举例,这里主要涉及cfs\_period 和 cfs\_quota 两个关键词。这两个参数需要组合使用,可以用来限制进程在长度为 cfs\_period 的一段时间内,只能被分配到总量为 cfs\_quota 的 CPU 时间。 + + +而这样的配置文件又如何使用呢? + + +你需要在对应的子系统下面创建一个目录,比如,我们现在进入 /sys/fs/cgroup/cpu 目录下: + + + +``` +[root@AliYun cpu]# mkdir test +[root@AliYun cpu]# cd test +[root@AliYun test]# ls +cgroup.clone_children cpuacct.usage_percpu cpu.cfs_period_us +cgroup.procs cpuacct.usage_percpu_sys cpu.cfs_quota_us +cpuacct.block_latency cpuacct.usage_percpu_user cpu.identity +cpuacct.cgroup_wait_latency cpuacct.usage_sys cpu.shares +cpuacct.ioblock_latency cpuacct.usage_user cpu.stat +cpuacct.proc_stat cpuacct.wait_latency notify_on_release +cpuacct.stat cpu.bvt_warp_ns tasks +cpuacct.usage cpu.cfs_burst_us +cpuacct.usage_all cpu.cfs_init_buffer_us +``` + +这个目录就称为一个“控制组”。你会发现,操作系统会在你新创建的 test 目录下,自动生成该子系统对应的资源限制文件。 + + +现在,我们在后台执行这样一条脚本: + + + +``` +[root@AliYun test]# while : ; do : ; done & +[1] 24227 +``` + +显然,它执行了一个死循环,可以把计算机的 CPU 吃到 100%,根据它的输出,我们可以看到这个脚本在后台运行的进程号(PID)是 24227。 + + +这样,我们可以用 top 指令来确认一下 CPU已经被打满: + + +![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_0.png) + + +而此时,我们可以通过查看 test 目录下的文件,看到 test 控制组里的 CPU quota 还没有任何限制(即:-1),CPU period 则是默认的 100 ms(100000 us): + + + +``` +[root@AliYun test]# cat cpu.cfs_quota_us +-1 +[root@AliYun test]# cat cpu.cfs_period_us +100000 +``` + +接下来,我们可以通过修改这些文件的内容来设置限制。比如,向 test 组里的 cfs\_quota 文件写入 20 ms(20000 us): + + + +``` +[root@AliYun test]# echo 20000 > cpu.cfs_quota_us +[root@AliYun test]# cat cpu.cfs_quota_us +20000 +``` + +结合前面的介绍,你应该能明白这个操作的含义,它意味着在每 100 ms 的时间里,被该控制组限制的进程只能使用 20 ms 的 CPU 时间,也就是说这个进程只能使用到 20% 的 CPU 带宽。 + + +接下来,我们把被限制的进程的 PID 写入 test 组里的 tasks 文件,上面的设置就会对该进程生效了: + + + +``` +[root@AliYun test]# echo 24227 > tasks +``` + +![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_1.png) + + +可以看到,计算机的 CPU 使用率立刻降到了 20%. + + +除 CPU 子系统外,Cgroups 的每一个子系统都有其独有的资源限制能力,比如: + + ++ blkio,为块设备设定I/O 限制,一般用于磁盘等设备; ++ cpuset,为进程分配单独的 CPU 核和对应的内存节点; ++ memory,为进程设定内存使用的限制。 + + +Linux Cgroups 的设计还是比较易用的,简单粗暴地理解呢,它就是一个子系统目录加上一组资源限制文件的组合。而对于 Docker 等 Linux 容器项目来说,它们只需要在每个子系统下面,为每个容器创建一个控制组(即创建一个新目录),然后在启动容器进程之后,把这个进程的 PID 填写到对应控制组的 tasks 文件中就可以了。 + + +# 特别提醒 + + +Alinux内核完全兼容对应的centos的原生内核,所以这意味着所有centos内核中自带的资源隔离方法在Alinux中都有,阿里云在各个资源维度有针对云原生场景下的各种需要进行资源隔离的场景做了额外的优化,这部分的优化内容并不能方向从centos中找到,属于阿里云的核心资源隔离能力,详细使用细节可以参见各个资源的指导手册。 + + +# 内存资源隔离使用指导 + + +![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_2.png) + + +* 频繁的全局kswapd可能造成在线容器的page cache被频繁回收,造成IO颠簸,影响性能。对应的解决办法详见本文对应的章节:memcg 内存被回收保护水线 +* 目前混部环境中,经常会发生离线在短时间内分配超过20GB的内存,突破主机的min水线,影响宿主机上的所有容器。主要表现为:宿主机load抖动,业务延迟增加等问题。对应的解决办法详见本文对应的章节:memcg 全局最低水位线 +* 当在线容器的内存使用达到上限,再申请使用内存时当前的进程上下文中就会进行直接内存回收的动作,这无疑会影响当前进程的执行效率,引起性能问题。对应的解决办法详见本文对应的章节:容器内存异步回收 +* 当global OOM发生时,在选择那个task被杀的时候,最理想状态是去选择低优的离线容器的进程进行kill。这样能最大程度的保障在线容器的QoS。对应的解决办法详见本文对应的章节:memcg OOM 优先级 +* 我们在反复重建容器或者删除容器以后,由于cgroup中一些引用信息没有清理干净,可能会产生类似僵尸进程一样的僵尸(zombie)memcg。大量的zombie memcgs数目堆积,会产生各种并发症,曾经引发多起严重的线上故障,例如memory.stat访问慢,内存回收遍历大量memcg,长尾调度时延等。对应的解决办法详见本文对应的章节:回收 zombie memcgs +* 当我们想提高low和high水线去控制全局kswapd回收行为的时候,就必须采用一个很大的min水线,这样就会造成很大的内存浪费(因为min水线以下的内存平时用不到)。而low-min之间的差值(即1/4 min)太小,就会很容易触及min水线,进入内存同步回收流程,造成重要业务的RT毛刺,表现为整机load高(由于D状态增多)。对应的解决办法详见本文对应的章节:整机内存水线优化 + + +## 容器内存异步回收 + + +### 需求来源 + + +在原生的内核系统中,当容器的内存使用量达到他的使用上限时,此时再申请使用内存时,在当前的进程上下文中就会进行直接内存回收的动作,这无疑会影响当前进程的执行效率,引起性能问题。那我们是否有方法当容器的内存达到一定水线的时候让其提前进行内存的异步回收,这样就有比较大的概率避免容器内的进程在申请使用内存时由于内存使用达到上限而进入直接内存回收。 + + +我们知道在内核中有一个kswapd的后台内核线程,用来当系统的内存使用量达到一定水位以后来进行异步的内存回收,但是这里有一种情况,比如当前高优的业务容器的内存使用已经达到一个比较高的情况,但是宿主机的总体的空闲内存还有很多,这样内核的kswapd的线程就不会被唤醒进行内存回收,这样这些内存使用压力大的高优容器的内存就没有机会被回收,所以这是个比较大的矛盾,由于目前原生内核中是没有memory cgroup级别的内存异步回收机制,也就是说容器的内存回收严重依赖宿主机层面的kswapd的回收或者只能依靠自己的同步回收,这会严重的影响一些高优容器的业务由于内存回收不及时引入的性能问题。 + + +基于以上背景,操作系统团队开发了一个类似宿主机层面的kswapd的基于memcg的异步回收策略,用于按照用户需求提前进行容器级别的内存回收机制,做到提前内存释压。 + + +### 功能简介 + + +这里我们将介绍基于容器的异步内存回收的过程,这里有两个关键的水位线,如下图所示,memory.limit\_in\_bytes是容器的内存规格,即容器最大能使用的内存量,这不是我们本次的主角。跟容器内存异步回收相关的有两个指标:memory.wmark\_high和memory.wmark\_low。其中high水位线用来指示何时开启容器的内存异步回收线程,换句话说当容器的内存使用量达到high水位线时内核会自动唤醒对应的kworker线程用于针对该容器的内存异步回收。那回收到什么程度会结束此次的异步回收呢,答案是当回收线程回收到memory.wmark\_low水位线时,此时回收线程就会停止回收。 + + +![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_3.png) + + +具体的异步回收过程可以通过下面这幅图进行描述: + + +![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_4.png) + + +### 使用说明 + + + + +| | | +| --- | --- | +| 接口 | 简介 | +| memory.wmark\_ratio | 该接口用于设置是否启用memcg后台异步回收功能,以及设置异步回收功能开始工作的memcg内存水位线。单位是相对于memcg limit的百分之几。取值范围:0~100* 默认值为0,该值也表示禁用memcg后台异步回收功能。 +* 取值为非0时,表示开启memcg后台异步回收功能并设置对应的水位线。 + | +| memory.wmark\_high | 只读接口,说明如下:* 当memcg内存使用超过该接口的值时,后台异步回收功能启动。 +* 该接口的值由**(memory.limit\_in\_bytes \* memory.wmark\_ratio / 100)**计算获得。 +* memcg后台异步回收功能被禁用时,memory.wmark\_high默认为一个极大值,从而达到永不触发后台异步回收功能的目的。 +* memcg根组目录下不存在该接口文件。 + | +| memory.wmark\_low | 只读接口,说明如下:* 当memcg内存使用低于该接口的值时,后台异步回收结束。 +* 该接口的值由**memory.wmark\_high - memory.limit\_in\_bytes \* memory.wmark\_scale\_factor / 10000**计算得出。 +* memcg根组目录下不存在该接口文件。 + | + + +### 注意事项 + + +请注意,这里并不是内存回收的越多越好,比如一下章节将要讲到的,page cache有助于提高业务进程的性能,如果我们把memory.wmark\_high和memory.wmark\_low的水位设置的过低,这样可能会因为page cache被回收的太多而引起业务进程性能抖动的问题。 + + +建议配置值:90%以上,经验值可以配置为95% + + +memory.wmark\_scale\_factor和memory.wmark\_ratio继承规则:创建时,继承父组的值。 + + +需求实现:Alinux2及以上版本。 + + +## memcg 内存被回收保护水线 + + +### 需求来源 + + +我们先从一个简单的案例说起,总所周知,page cache可以提升我们的业务应用的性能,减少IO的直接操作,加速文件的读写速度,page cache它处于内核层,并且由内核直接管理分配,并在系统内存紧张的时候会开始回收page cache释放内存。我们刚有提到page cache可以提升业务的性能,如果当业务对应的page cache被回收以后,下次再次访问对应的业务数据时可能就会引起性能抖动问题,所以当内核开始回收的时候我们该高优回收哪些业务容器的page cache,是否需要为某些容器保留部分的page cache不被回收,这样能保证这些容器的服务质量,其实这也是我们业务的需求,我们如何保障高优业务的服务质量,比如当在离线业务容器混部的时候,如何保障page cache在回收的时候先回收离线容器的,如何保障为高优业务容器保留对应的page cache,使其能有较大概率再次访问到cache数据。所以操作系统团队基于此背景从cgroup v2中backport了关于memcg qos相关特性代码,memcg qos就是用来告知系统在回收page cache的时候如何做到按需回收。 + + +### 功能简介 + + +正常情况下,当出现系统内存紧张的时候,内核会在每个memcg中(业务容器使用的内存)回收内存,默认情况下内核是不区分对待各个容器的内存的,都是按照正常流程进行回收,高优容器的内存和离线容器的内存有同样的概率被回收掉,为了使内核在回收内存时能区分对待:高优的容器少回收内存或者说允许其保留一部分的内存不被回收,尽可能的去回收低优和离线容器的内存。这里我们引入了memcg qos的三个接口用来控制这个动作: + + + + +| | | +| --- | --- | +| 接口 | 简介 | +| memory.high | 当 memory cgroup 内进程的内存使用量超过了该值后就会立即触发memcg reclaim进行直接的内存回收。 | +| memory.low | 当容器内进程的内存使用量在这个水线以下时,内核会 Best-effort memory protection,也就是说在内核进行内存回收的时候就会先去回收不属于该 memory cgroup 的 Page Cache,等到其他容器的 Page Cache 被回收掉后如果回收的内存还不够,再来回收这些 Page Cache。 | +| memory.min | 当容器内进程的内存使用量低于该值时,在系统进行内存回收的时候即使其他容器内的 Page Cache 都被回收完了也不会去回收这些 Page Cache,你可以理解为这个水线下的内存是禁止被回收的。 | + + +  + + +我们这边通过下面这幅图来举例说明这个过程: + + +![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_5.png) + + +我们假设整个系统只有3个业务容器,每个业务容器按照容器的高优程度,分别去设置cgroup下的min、low、high三个值,比如设置的值为上图所示,高优的容器的memory.min和low的水线设置的比其他两个容器的高,而将离线容器的min和low水线直接设置为0。这样当系统的内存紧张的时候发起内存回收时,内核会按照正常逻辑去回收那些内存使用量达到灰色部分的容器,即那些内存使用超过memory.low水线的容器,然后才会去回收那些内存使用量达到绿色部分的容器,然后那些内存使用量只有红色部分的容器是不会进行内存回收。这样我们就做到了先回收离线容器的内存(他的min和low的水线值为0),高优容器由于设置了min和low的水位线,如果内存使用量没有超过对应的水线,这部分内存是最后被回收或禁止回收,这就是我们想要的效果,也即"需求来源"的章节中描述的期望达成的状态。 + + +### 使用说明 + + +这边只需要按需配置memory.high、memory.low、memory.min三个值就行。其中memory.high这个只需要使用默认的值就行。 + + +如果是离线容器,或者说是非常低优的容器,我们这边可以直接将min和low这两个水线设置为0,如果是高优的业务容器,这边建议将min的值设置为15%\*memory.limit\_in\_bytes,low的值设置为30%\*memory.limit\_in\_bytes。 + + +### 注意事项 + + +1. memory.min的值不建议设置的太高,如果设置的太高,并且host上有很多类似的高优容器,这样内核在进行内存回收的时候,可能会因为太多禁止被回收的内存而导致回收不到足够的内存而间接的引发OOM. +2. 如果有内存超卖场景,并且超卖的内存比较多,并且高优的容器在host会部署的比较多,我们此时将高优容器的memory.min值尽量设置的偏小一点,因为这部分内存在整机内存回收的时候是不允许被回收的,如果超卖严重,并且host上过多的高优容器,导致最终很多内存都无法被回收,这样会引起OOM。 +3. 继承规则:默认值为0,不继承。 +4. 需求实现:Alinux2及以上版本。 + + +## memcg 全局最低水位线 + + +### 需求背景 + + +通常资源消耗型的离线任务可能会时常瞬间申请大量的内存,使得系统的空闲内存触及全局min水线,引发系统所有任务进入直接内存回收的慢速流程,时延敏感型的在线业务很容易发生性能抖动。此场景下,无论是全局kswapd后台回收还是memcg级别的后台回收机制,都是无能为力的。 + + +我们基于"内存消耗型的离线任务通常对时延不敏感"这样一个事实,设计了"memcg的全局min水线分级功能"来解决上述抖动难题。在标准upstream全局共享min水线的基础上,将离线任务的全局min水线上移让其提前进入直接内存回收,同时将时延敏感的在线任务的全局min水线下移,在一定程度上实现了离线任务和在线任务的min水线隔离。这样当离线任务瞬间大量内存申请的时候,会将离线任务抑制在其上移的min水线,避免了在线任务发生直接内存回收,随后当全局kswapd回收一定量的内存后,离线任务的短时间抑制得以解除。 + + +### 功能简介 + + +我们的核心思想就是通过为在离线容器设置不同标准的全局水位线来控制在离线容器申请内存的动作,这样能让离线容器的任务在申请内存时先与在线业务进入直接内存回收,用于解决离线容器瞬间申请大量内存引发的问题,如下图所示,在A的情况下,由于系统剩余的内存比较充裕,远大于BE wmark min的水位线,这种情况下,不管是在线还是离线容器的进程都不会进入内存直接回收的路径,属于快速内存分配的蜜月期,此时在离线容器的任务都能快速申请到内存。在B中情况下,此时可以假设由于离线容器瞬间申请了大量内存,导致系统的可用内存下降到了BE wmark min的水线,接下去离线任务继续申请和使用内存时就会进入direct reclaim路径并且被限速,但是此时在线容器的进程还是可以快速的申请到内存,这样就保障了我们在线容器业务的服务质量。如果此时系统内存继续下降,到了C情况,此时系统内存下降到了LS wmark min的水线,这个时候在线容器的进程才会进入direct reclaim进行直接内存回收,此时在线容器的服务质量才会受到影响。很明显,这种多标准的水位线可以为我们解决"需求背景"中描述的问题,防止离线容器由于瞬间申请大量内存而把系统内存耗尽而影响在线业务。 + + +![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_6.png) + + +  + + +对linux内存管理有一定基础的同学也可以查阅下面这幅图,他详细的记录了在离线容器混部过程中在多种水位线的作用下的一个走势图: + + +![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_7.png) + + +### 使用说明 + + +这里主要通过配置memory.wmark\_min\_adj这个接口来控制容器的全局水位线。 + + +该接口的含义为基于全局min水线所作出的调整(adj意思是adjustment)百分比,范围为[-25, 50],默认值为0。root group不存在该文件。具体地,正值代表了调整范围[0, WMARK\_MIN],负值代表了调整范围[WMARK\_MIN, WMARK\_LOW];其中WMARK\_MIN和WMARK\_LOW分别代表了全局min水线和low水线的值)。 + + +例如: + + + +``` +-25 means memcg WMARK_MIN is "WMARK_MIN + (WMARK_MIN - 0) * (-25%)" + 50 means memcg WMARK_MIN is "WMARK_MIN + (WMARK_LOW - WMARK_MIN) * 50%" +``` + +负值代表min水线下移,代表的是对内存QoS要求高的memcg组(例如在线业务)。 + + +正值代表min水线上移,代表的是对内存QoS要求低的memcg组(例如离线业务),当其上移的min水线被触及后,会做throttle操作,throttle的时间与所消耗的低于其min水线之下的内存总量成线性比例关系,throttle的时间取值范围为[1ms, 1000ms]。 + + +### 注意事项 + + +负值代表min水线下移,代表的是对内存QoS要求高的memcg组(例如在线业务) + + +正值代表min水线上移,代表的是对内存QoS要求低的memcg组(例如离线业务) + + +memory.wmark\_min\_adj继承规则:创建时,继承父组的值。 + + +需求实现:Alinux2及以上版本。 + + +## 整机内存水线优化 + + +### 需求来源 + + +全局分配和回收采用的三个内存水线:min, low, high。大体上,当空闲内存低于low时会触发全局kswapd异步回收内存,当空闲内存大于high水位时停止回收。当空闲内存低于min时会触发direct reclaim。之前的内核采用” /proc/sys/vm/min\_free\_kbytes”(建议配置为系统总内存的1.5%左右)来控制这3个水位,计算公式如下: + + +low = min + 1/4 min + + +high = low + 1/4 min + + +上述只是简单地使用一个固定的比例划分这3个水线,这样会有一个严重的问题,当我们想提高low和high水线去控制全局kswapd回收行为的时候,就必须采用一个很大的min水线,这样就会造成很大的内存浪费(因为min水线以下的内存平时用不到)。而low-min之间的差值(即1/4 min)太小,就会很容易触及min水线,进入内存同步回收流程,造成重要业务的RT毛刺,表现为整机load高(由于D状态增多)。 + + +整机内存水线优化就是可以保证一个相对较小的min水线就可以得到一个大的low和high水线值,经测试在混部环境中的效果非常好,具体优如下: + + +引入一个额外的配置” /proc/sys/vm/watermark\_scale\_factor”(建议配置值300),表示采用整机总内存大小的一个比例值来放大low-min以及low-high之间的水线差,为异步kswapd赢得宝贵的时间,这样在空闲内存触及min水线之前,全局kswapd可以有相对较多的时间去做异步回收。 + + +### 功能简介 + + +通过如下图所示,在通过watermark\_scale\_factor来增加min和low之间的gap以后,当内存的水线下降到low以后,内核会提前进入kswapd进行后台内存回收,这样可以在内存下降到min之前为kswapd争取到足够的时间进行内存异步回收,降低系统进入direct reclaim的概率。 + + +![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_8.png) + + +### 使用说明 + + +通过按需配置/proc/sys/vm/watermark\_scale\_factor即可,使用比较简单。 + + +### 注意事项 + + +该配置是针对host的,并不是针对个别容器,也就是说在容器创建的时候无需配置该接口,如有需要可以在整机维度进行配置。 + + +需求实现:Alinux2及以上版本。 + + +## memcg OOM 优先级 + + +### 需求来源 + + +OOM分为两种: memcg OOM和global OOM。无论哪种OOM,在选择杀进程的时候,内核会有一个算法去选择victim,但通常是找一个oom score最大的进程杀。在真实的业务场景中,特别是内存超卖环境,当发生global OOM的时候,有理由去选择杀掉那些优先级比较低的离线业务,而保护高优先级在线业务;当发生离线memcg OOM的时候,有理由去选择杀掉那些优先级比较低的作业,而保高优先级离线作业。这就是"memcg OOM优先级"所解决的场景,目前的标准Linux内核并不具备这个能力。 + + +### 功能简介 + + +本组设置memory.use\_priority\_oom后,当本组发生OOM时,就会对其下的所有子组进行OOM优先级遍历。memory.oom.group被设置时,会杀掉其下(包括其子组)的所有可杀任务(设置-1000的oom\_score\_adj不会被杀)。 + + +例如,如下层级结构,使能了memory.use\_priority\_oom +                      root + + +                     /     \ + + +                   A        B + + +                 /   \     /   \ + + +               C     D   E     F + + +  + + +    memory.priority: + + +       A: 10, B: 8 + + +       C: 5, D: 6, E: 7, F: 8 + + +  + + +当发生global OOM时,从根组(root)开始按每个层级数据最小的原则遍历路径root->B->E,最终E被选出来作为被杀对象。 + + +### 使用说明 + + + + +| | | +| --- | --- | +| 接口 | 简介 | +| memory.use\_priority\_oom | 功能开关,默认为0表示不使能本功能;写1表示使能本功能。 +设置/sys/fs/cgroup/memory/memory.use\_priority\_oom会使能global OOM按优先级进行查杀。 | +| memory.priority | 设定memcg的OOM优先级,默认值为0, 允许的范围[0, 12],数值越大,优先级越高。优先级的生效范围为同级memcg之间。当发生OOM时,会顺着memcg的层次自上而下选择一个优先级数值最低的组杀,相同优先级的组则按照先后顺序。 | +| memory.oom.group | 通常,一个作业组是一个整体,其中的某个进程被杀会影响全局的业务工作,因此最好是按组杀。此接口可以实现按整个memcg组进行整体杀的功能。默认值为0,表示禁用整组杀;写1开启整组杀。 | + + +### 注意事项 + + +memory.use\_priority\_oom、memory.priority、memory.oom.group继承规则:不继承,默认值0。 + + +使用过程中主要风险来自存量的memcg和新创建的memcg由于优先级不匹配,可能出现误杀的情况。所以如果存在容器漂移或者容器新建的场景,需要评估当前已有容器的OOM 优先级以及新容器优先级。 + + +需求实现:Alinux2及以上版本。 + + +## 回收 zombie memcgs + + +### 需求来源 + + +当删除cgroup的目录后虽然用户态已经看不到它,但在内核中代表cgroup的结构体会一直存在直到所有对它的引用被释放。只要它依然存在,就会消耗相应的资源。只有当被删除的memory cgroup中的页都被回收掉,相应的引用都被释放,该memory cgroup才会彻底被删除,这可能会需要很长的时间,如果当中的一些页被活跃的使用,这些页可能永远不会被回收掉。另外,还有其他各种各样的问题,同样会导致删除的cgroup继续留在系统中。僵尸cgroup虽然不会导致严重的后果,但依然是个问题。每个僵尸cgroup都会占用200KB的内存,随着僵尸cgroup的增加相应的内存消耗也会增加。同时这些僵尸cgroup会增加遍历cgroup树的开销。曾经引发多起严重的线上故障,例如memory.stat访问慢,内存回收遍历大量memcg,长尾调度时延等。 + + +为了解决zombie memcgs数目并发症,Ali4000已经默认关闭了kmem,同时提供异步、同步接口用以清理残留的离线 memcg,这就是我们引入了memcg后台定制回收功能"zombie memcgs reaper"的原因。 + + +### 使用说明 + + +具体的memcg接口在/sys/kernel/mm/memcg\_reaper/中:reap, reap\_background, scan\_interval, pages\_scan, verbose + + + + +| | | +| --- | --- | +| 接口 | 简介 | +| reap | "One-shot trigger"模式,只回收一次,类似于/proc/sys/vm/drop\_caches接口,由用户主动单次触发。 +写1表示启动一次回收尝试,但并不保证回收完,需要用户自行决策是否进行多次写。 | +| reap\_background | "Background kthread reaper"模式,会在后台自动进行周期性回收,永久运行。推荐使用此模式。 +默认值为0,表示禁用此功能。设置1开启。 | +| scan\_interval | "Background kthread reaper"模式下,用于控制周期性回收的间隔,默认为5秒。 | +| pages\_scan | "Background kthread reaper"模式下,用于控制每个周期内回收的页面数,默认值为1310720(5GiB for 4KiB page)。scan\_interval和pages\_scan用于防止回收过猛,导致的IO压力。 | +| verbose | 调试开关,默认为0,表示关闭; 写1表示开启一些debug打印。 | + + +### 注意事项 + + +* 这个特性的前提是内核不开启memcg kmem的特性。可以通过修改cmdline的参数进行关闭该特性。 +* 可能会有一定的sys cpu损耗。 +* 别把回收周期和回收页面数设置的太激进,可能会导致io压力。 + + +# cpu资源隔离使用指导 + + +这里主要介绍:弹性cpu带宽控制技术,group identity,SMT expeller技术,llc技术。由于cpu share和cpuset为通用的内核资源隔离技术,这里不做使用说明介绍,有兴趣的同学可以参考网上相关资料。 + + +![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_9.png) + + +## CPU Burst-弹性CPU带宽控制技术 + + +### 需求来源 + + +我们的服务宗旨是让客户花最少的钱获得最好的服务质量,或者让单个容器在保证业务服务质量的同时尽量提高容器的cpu使用率,让用户在有限的资源下运行更多的任务,等于降低了用户的使用成本,但是在现实的场景中,在业务的视角可能会出现容器的cpu平均使用率并不高,但是业务的容器却时不时的会出现短时间内的throttle现象,由于容器被限流最终导致业务延迟等问题。比如如下图所示: + + +![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_10.png) + + +从图中可以看到在一个4核cpu规格的容器上,从一秒的时间周期去看容器的cpu使用率只有百分之60左右,远没有达到容器的使用规格,在业务方看来,他们买的4核规格的cpu服务,实际并没有真正使用4核,但是你们却把我限流了,这是不合理的,为了解决这个问题,目前业务的同学常用的只有如下两个选择: + + +* 提高容器的cpu规格,比如此处将cpu的规格提高到5核(设置cpu.cfs\_quota\_us为500000),但是这样势必会让业务方花费更多的金钱来购买cpu的资源,增加了业务方的使用成本,并不是最理想的方案。 +* 在保持容器规格不变的情况下,同比例提高period和quota的值,使周期内的quota变大,但是由于周期也同比例变大,这样可能会引入新的问题,一旦出现限流(throttle),需要等待下次被unthrottle的周期(period)变长,导致业务出现更大的延迟,很明显这也不是一个最好的办法。 + + +  + + +很明显以上两个解决方案都不是很好的改善业务同学的感受,关于业务同学的困扰我们能够理解,但是我们换一个视角去看这个问题,从100毫秒的时间跨度去看,在这100毫秒周期内,由于业务的突发处理,导致短时间内的cpu被打爆,超出容器规格,导致被限流,这从底层的技术人员的角度去看又是合理的。 + + +所以我们的需求就来自以上这些矛盾点,在保证业务容器不因突发的业务处理(burst)而被throttle,又能尽量提高容器的cpu使用率,让业务方感觉到“物超所值”。 + + +### 功能简介 + + +本feature的核心思想就是在本周期内没有用完的时间可以把这部分没用的runtime放到下一周期,这样有助于降低由于burst业务的突发运行带来的throttle的风险。 + + +这边通过场景演示来说明一下这个原理: + + +![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_11.png) + + +### 使用说明 + + +* 如果要使用此功能,首先要确保以下配置是否打开,默认是打开状态。 + + + +``` +[root@AliYun assist]# cat /proc/sys/kernel/sched_cfs_bw_burst_enabled +1 +``` + +* 需要在对应的group目录配置cpu.cfs\_burst\_us,这个值的意思是在period周期内最大允许burst的时间,默认情况下为0,即不开启此功能,此值的配置范围为[0, quota]。 +* 我们还可以通过查看cpu.stat的状态接口来查看当前group有没有出现过burst,如下打印信息中nr\_burst即为出现burst的总次数,burst\_time即为总共burst的时间,这里最好配合nr\_throttled(总的throttle次数)和throttled\_time(总的throttle的时间)。因为burst不一定会引发throttle,这也是我们想要达到的预期效果,如果有throttle的次数增加,可能是我们的cpu.cfs\_burst\_us值配置的不够大。如果burst\_time一直在累加,但是throttle并没有在累加,这说明我们的功能起到了很好的作用。 + + + +``` +[root@AliYun assist]# cat cpu.stat +nr_periods 114816 +nr_throttled 9 +throttled_time 512420200 +current_bw 5000000 +nr_burst 0 +burst_time 0 +``` + +### 注意事项 + + +* 当负载的平均CPU使用低于limit时不产生限流,满足细粒度的突发需求。但是不能在CPU资源不足的情况下使CPU更快运行。他解决的是burst的需求,并不是无中生有。 +* 我们可以通过cpu.stat的接口来获取本特性的收益值,可以观察burst\_time的值的大小,即是burst的总时间,原本这些时间是业务容器的throttle的时间。 +* burst值配置的越大,能带来的风险也越大,换句话说可能短时间内容器使用的cpu更多,可能会对其他容器产生cpu竞争压力。 + + +## Group Identity + + +### 需求来源 + + +为了满足业务方在资源隔离上的需求,在满足资源利用最大化的情况下,保证高优业务的服务质量不受影响,或将影响范围控制在一定范围,此时内核调度器需要赋予高优先级的任务更多的调度机会来最小化其调度延迟,并把低优先级任务对其带来的影响降到最低。 + + +为了满足以上需求,我们引入了Group Identity的概念,即每个cpu cgroup会有一个身份识别,按优先级由高到低排序依次为: + + +* ID\_HIGHCLASS:在线任务,对延迟敏感,可以抢占离线任务,但不能抢占其它的在线任务和普通系统任务; +* ID\_NORMAL:普通系统任务,如 sshd, systemd, init 等, 这是任务的默认分类; +* ID\_UNDERCLASS:离线任务,对延迟不敏感; + + +### 功能简介 + + +在被赋予不同的group identity时,底层内核会根据优先级的高低,可以最大程度降低由于离线业务引入的在线业务调度不及时的问题,增加高优先业务的cpu抢占时机等底层核心技术保障在线业务在cpu调度延迟上不受离线业务的影响。这些优先级的作用范围遵从cpu cgroup的资源管理概念,即相对于同一层的任务生效,对上不生效,对下生效,和同优先级任务之间的竞争基本服从CFS规则,但ID\_UNDERCLASS身份的任务没有最小保底运行时间的保障。具体如下: + + +* ID\_HIGHCLASS + + +高优先级的CFS任务,对低于其优先级的任务有更多的抢占机会。次高优先级CFS任务在调度时会有以下行为变化: + + +1. 被唤醒时,如果当前运行的是低优先级任务,可无条件进行抢占 +2. 被唤醒时,如果当前运行的是普通任务且自身的vruntime超前于它,可无视唤醒保底运行时间进行抢占 +3. 排队运行时,如果当前运行的是普通或者低优先级任务,且自身的vruntime超前于它,可无视保底运行时间进行抢占 + + +* ID\_NORMAL + + +普通的CFS任务,对低于其优先级的任务有更多的抢占机会,普通CFS任务在调度时会有以下行为变化: + + +1. 被唤醒时,如果当前运行的是低优先级任务,可无条件进行抢占 +2. 排队运行时,如果当前运行的是低优先级任务,且自身的vruntime超前于它,可无视保底运行时间进行抢占 + + +* ID\_UNDERCLASS + + +低优先级的CFS任务,次低优先级CFS任务在调度时会有以下行为变化: + + +1. 被唤醒时,vruntime会有默认1ms的惩罚时间,可通过sysctl\_sched\_bvt\_place\_epsilon进行配置 +2. 如果远端SMT上运行了SMT驱逐者任务,则无法被调度上CPU,等同于被踢出运行队列 + + +### 使用说明 + + +"Group Identity"通过CPU CGroup v1接口"cpu.bvt\_warp\_ns"配置: + + + + +| | | | +| --- | --- | --- | +| 值 | 含义 | 说明 | +| 0 | 该cgroup中任务为普通系统任务 | 默认优先级 | +| -1 | 该cgroup中的任务为低优先级任务 | 优先级最低 | +| 1 | 该cgroup中的任务为高优先级任务 | 优先级高 | +| 2 | 该cgroup中的任务为在线任务, 并具有SMT驱逐能力(见下文) | 优先级最高 | + + +#### 调度特性开关配置接口 + + +运行以下命令,您可以通过**sched\_features**接口查看到内核调度特性的默认配置。 + + +**cat** /sys/kernel/debug/sched\_features + + +具体说明如下: + + + + +| | | | +| --- | --- | --- | +| **调度特性** | **说明** | **默认值** | +| **ID\_IDLE\_AVG** | 该特性与**ID\_IDLE\_SAVER**身份标识配合,把**ID\_UNDERCLASS**任务的运行时间计入空闲时长,防止只有**ID\_UNDERCLASS**任务运行时仍保留空闲CPU(Idle CPU)的问题,避免资源浪费。 | **ID\_IDLE\_AVG**:表示特性为启用状态。 | +| **ID\_RESCUE\_EXPELLEE** | 该特性作用于负载均衡场景,如果任务无法找到可用的CPU资源,则正在进行驱逐**ID\_UNDERCLASS**任务的CPU会成为负载均衡的目标。用于帮助**ID\_UNDERCLASS**任务尽快摆脱被驱逐的状态。 | **ID\_RESCUE\_EXPELLEE**:表示特性为启用状态。 | +| **ID\_EXPELLEE\_NEVER\_HOT** | 该特性被启用后,正在被驱逐的任务在判断是否需要迁移至其他CPU时,不会因为热缓存的原因而造成拒绝迁移。用于帮助**ID\_UNDERCLASS**任务尽快摆脱被驱逐的状态。 | **NO\_ID\_EXPELLEE\_NEVER\_HOT**:表示特性为关闭状态。 | +| **ID\_LOOSE\_EXPEL** | 该特性被启用后,CPU不会在每次选择任务时更新驱逐状态,而是根据内核参数**sched\_expel\_update\_interval**设置的时间自动更新。该特性的开关仅影响CPU选择任务时的状态更新,不影响处理IPI中断的更新。 | **NO\_ID\_LOOSE\_EXPEL**:表示特性为关闭状态。 | +| **ID\_LAST\_HIGHCLASS\_STAY** | 该特性被启用后,CPU上最后一个运行的**ID\_HIGHCLASS**任务不会被迁移至其他CPU上。 | **ID\_LAST\_HIGHCLASS\_STAY**:表示特性为启用状态。 | +| **ID\_EXPELLER\_SHARE\_CORE** | 该特性开启时允许**ID\_SMT\_EXPELLER**的任务优先选择已经有**ID\_SMT\_EXPELLER**任务的物理核,该特性关闭时则不允许。 +该特性关闭时可以尽可能的把**ID\_SMT\_EXPELLER**的任务分散到各个物理核上,从而避免**ID\_SMT\_EXPELLER**任务之间的相互干扰。 | **ID\_EXPELLER\_SHARE\_CORE**:表示特性为启用状态。 | + + +#### 用于sysctl配置内核参数的接口 + + +Group Identity的部分功能的实现需要以内核参数的取值作为参考。相关内核参数的具体说明如下表: + + + + +| | | | | +| --- | --- | --- | --- | +| **内核参数** | **说明** | **单位** | **默认值** | +| **/proc/sys/kernel/sched\_expel\_update\_interval** | CPU在选择任务时,驱逐状态的自动更新时间间隔。仅在**ID\_LOOSE\_EXPEL**特性开启时生效。 | ms | 10 | +| **/proc/sys/kernel/sched\_expel\_idle\_balance\_delay** | CPU在驱逐状态下,**idle balance**的最小时间间隔。取值为-1时表示不允许进行**idle balance**。 +当CPU上均为**ID\_UNDERCLASS**任务且任务在被驱逐时,CPU的状态可以理解为空闲状态,在该状态下CPU会进行**idle balance**以提高负载均衡的效果,但会对**ID\_UNDERCLASS**任务造成损伤。通过设置**sched\_expel\_idle\_balance\_delay**参数可以缓解该问题。 | ms | -1 | +| **/proc/sys/kernel/sched\_idle\_saver\_wmark** | 设置CPU空闲时间的水位线。当**ID\_IDLE\_SAVER**任务被唤醒时,只会尝试找到高于该水位线的空闲CPU,不会尝试找到低于该水位线的空闲CPU。 | ns | 0 | + + +#### 信息输出说明 + + +在使用Group Identity功能期间,您可以运行以下命令,查看多维度的参数信息。 + + +**cat** /proc/sched\_debug + + +输出的参数说明如下: + + + + +| | | +| --- | --- | +| **参数** | **说明** | +| **nr\_high\_running** | 当前CPU上运行的**ID\_HIGHCLASS**任务数量。 | +| **nr\_under\_running** | 当前CPU上运行的**ID\_UNDERCLASS**任务数量。 | +| **nr\_expel\_immune** | 当前CPU上运行的非**ID\_UNDERCLASS**任务数量。 | +| **smt\_expeller** | 当前CPU是否有**ID\_SMT\_EXPELLER**任务在运行。参数值为1表示有;参数值为0表示无。 | +| **on\_expel** | 当前CPU的SMT对端是否有**ID\_SMT\_EXPELLER**任务在运行。参数值为1表示有;参数值为0表示无。 | +| **high\_exec\_sum** | 当前CPU上**ID\_HIGHCLASS**任务的累计运行时间。 | +| **under\_exec\_sum** | 当前CPU上**ID\_UNDERCLASS**任务的累计运行时间。 | +| **h\_nr\_expel\_immune** | 当前**cfs\_rq**上运行的非**ID\_UNDERCLASS**任务数量。 | +| **expel\_start** | CPU在驱逐任务的开始阶段,两个红黑树结构的最小虚拟运行时间的差距。 | +| **expel\_spread** | 由于CPU驱逐状态造成的两个红黑树结构最小虚拟运行时间的累计差距。 | +| **min\_under\_vruntime** | 低优先级红黑树结构的最小虚拟运行时间。 | + + +  + + +### 注意事项 + + +* 低优先级父组下的高优先级子组仍为低优先级,会被SMT驱逐者驱逐,不建议线上使用此种组合的配置。 +* 高优先级强调的是低延迟,而非高吞吐量,两者一般情况下是相互矛盾的,低延迟并不意味着高性能。 + + +## SMT expeller + + +### 需求来源 + + +超线程技术在一个物理核上模拟两个逻辑核,两个逻辑核具有各自独立的寄存器(eax、ebx、ecx、msr等等)和APIC,但会共享使用物理核的执行资源,包括执行引擎、L1/L2缓存、TLB和系统总线等等。这就意味着,如果一对HT的一个核上跑了在线任务,与此同时它对应的HT核上跑了一个离线任务,那么它们之间是会发生竞争的。为了尽可能减轻这种竞争的影响,我们想要让一个核上的在线任务执行的时候,它对应的HT上不再运行离线任务;或者当一个核上有离线任务运行的时候,而在线任务调度到了其对应的HT上时,离线任务会被驱赶走。这就是我们保证HT资源不被争抢的机制。 + + +### 功能简介 + + +当一个核上的在线任务执行的时候,它对应的HT上不再运行离线任务;或者当一个核上有离线任务运行的时候,而在线任务调度到了其对应的HT上时,离线任务会被驱赶走。这就是我们保证HT资源不被争抢的机制。 + + +### 使用说明 + + +"Group Identity"通过CPU CGroup v1接口"cpu.bvt\_warp\_ns"配置: + + + + +| | | | +| --- | --- | --- | +| 值 | 含义 | 说明 | +| 0 | 该cgroup中任务为普通系统任务 | 默认优先级 | +| -1 | 该cgroup中的任务为低优先级任务 | 优先级最低 | +| 1 | 该cgroup中的任务为高优先级任务 | 优先级高 | +| 2 | 该cgroup中的任务为在线任务, 并具有SMT驱逐能力(见下文) | 优先级最高 | + + +### 注意事项 + + +请参考group identity方案中的注意事项章节。 + + +# IO资源隔离使用指导 + + +![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_12.png) + + +## cgroup writeback throttle + + +### 需求来源 + + +block IO cgroup自合入内核之后,一直存在一个问题:只能对direct IO进行限流(buffer IO之后短期内执行fsync也可以限流),因为这些IO到达block throttle层时,当前进程就是真正发起IO的进程,根据进程可以获取到相应的cgroup从而正确记账,如果超过了用户设置的带宽/IOPS上限,则进行限制。对于那些buffer写,且最终由kworker线程下发的IO,block throttle层无法通过当前进程获取IO所属的cgroup,也就无法对这些IO进行限流。 + + +基于以上背景,目前在Cgroup V2版本中已经支持异步IO限流,但是在Cgroup V1中并不支持,由于目前在云原生环境下主要还是使用Cgroup V1版本,阿里云内核团队通过建立page<->memcg<->blkcg这三者的关系实现了在Cgroup V1中对IO异步限流的功能,限流的主要算法基本上和Cgroup V2保持一致。 + + +### 功能简介 + + +在Cgroup V1中实现了和Cgroup V2一样的IO异步限速的功能,可以解决由于IO在writeback过程中无法精准的进行IO限速的问题,可以在混部场景中对离线业务的IO进行限速,防止由于离线业务对IO的过度使用而影响在线业务。一旦配置限速writeback功能以后,不但可以限制异步IO,同时也可以限制direct IO。 + + +cgroup writeback功能需要memcg和blkcg协同工作,完成Buffered I/O的限速,但是内核接口cgroup v1的各个控制子系统间默认不协同工作。因此需要通过一定的规则把memcg和blkcg连接起来,规则为:通过任意一个memcg必须可以找到与之唯一对应的blkcg。即memcg和blkcg的映射关系可以是一对一或多对一,不可以是一对多或多对多。 + + +例如,存在进程A和B,对它们进行Buffered I/O限速,需要遵循以下约束: + + +* 如果A和B分属不同的memcg,它们可以映射到不同的blkcg,只需各自一一对应。例如:A属于memcg1,blkcg1;B属于memcg2,blkcg0。 +* 如果A和B分属不同的memcg,它们也可以映射到同一个blkcg。例如:A属于memcg1,B属于memcg2,A和B都属于blkcg2。 +* 如果A和B属于相同的memcg,那么它们只能映射到同一个blkcg。例如:A和B均属于memcg0,它们同时属于blkcg3。 + + +### 使用说明 + + +可以参考: + + +#### 第一步:确定当前内核是否支持writeback throttle的功能 + + +首先确认系统是否支持cgroup writeback的功能,通过读取内核文件/proc/cmdline,如果内核命令行参数中带有cgwb\_v1字段则不需要做以下三个步骤,否则需要进行如下三个步骤进行功能的开启: + + +* 通过命令grubby内添加cgwb\_v1字段开启该功能。本示例中内核版本为 4.19.36-12.al7.x86\_64,您在操作中需要更换为实际的内核版本,内核版本的查看命令为 uname -a: + + + +``` +grubby --update-kernel="/boot/vmlinuz-4.19.36-12.al7.x86_64" --args="cgwb_v1" +``` + +* 重启系统使功能生效 + + + +``` +reboot +``` + +* 使用以下命令读取内核文件/proc/cmdline,确认内核命令行参数中带有cgwb\_v1字段。此时,blkcg下的blkio.throttle.write\_bps\_device及blkio.throttle.write\_iops\_device接口能够对Buffered I/O进行限速。 + + + +``` +cat /proc/cmdline | grep cgwb_v1 +``` + +#### 第二步:建立blkcg和memcg映射关系 + + +这里我通过创建1个memcg的cgroup和1个blkcg的cgroup目录,通过建立两者之间的关系来说明使用方法: + + + +``` +#分别建立blkcg和memcg目录。 +sudo mkdir /sys/fs/cgroup/blkio/blkcg1 +sudo mkdir /sys/fs/cgroup/memory/memcg1 +#通过将业务进程PID attach到blkcg和memcg容器中,使blkcg和memcg因为attach了相同的pid而产生关联 +sudo bash -c "echo $$ > /sys/fs/cgroup/blkio/blkcg1/cgroup.procs" # $$为您的进程ID +sudo bash -c "echo $$ > /sys/fs/cgroup/memory/memcg1/cgroup.procs" # $$为您的进程ID +``` + +注意:实际的使用场景中可能需要通过runc或rund将对应业务同时attach到memcg和blkcg中去。 + + +#### 第三步:设置限流值 + + +通过lsblk命令可以获取对应磁盘的MAJ和MIN号,在限流中需要使用它们: + + + +``` +[root@iZbp14ah12fefuzd6rh5rkZ ~]# lsblk +NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT +vdb 253:16 0 100G 0 disk +vdc 253:32 0 100G 0 disk +vda 253:0 0 40G 0 disk +└─vda1 253:1 0 40G 0 part / +``` + +使用blkcg下的blkio.throttle.write\_bps\_device接口对Buffered I/O进行限速,这里当您的进程在写vdb盘的时候会被限流为10M: + + + +``` +# 通过设备号配置磁盘的回写限流bps为10 M +sudo bash -c "echo 253:16 10485760 > /sys/fs/cgroup/blkio/blkcg1/blkio.throttle.write_bps_device" +``` + +### 注意事项 + + +* 需要进行writeback限制的进程需要同时attach到memcg和blkcg,如果不attach,则记账到根组; +* 同一个memcg里的进程,不能属于不同的blkcg。如下图中css\_set1中的进程都被attach到memcg\_1和blkcg\_1,这些进程生成的脏页对应的回刷IO会被记账到blkcg\_1,memcg\_1和blkcg\_1属于一对一的关系;同理,css\_set2/css\_set3/css\_set4里的进程都分别被attach到memcg\_2/ memcg\_3/memcg\_4和blkcg\_2,这些进程生成的脏页对应的回刷IO被记账到blkcg\_2,memcg\_2/ memcg\_3/memcg\_4和blkcg\_2为多对一的关系,这些都是允许的。如果在此基础上,又来一组进程css\_set5,他们被attach到memcg\_4和blkcg\_1上,出现了memcg与blkcg一对多的关系,这就是不允许的,后续css\_set4和css\_set5里进程生成的脏页对应的回刷IO会被记账到根组。 +* 为了避免出现意外情况,建议您在启用cgroup writeback功能后,对进程进行Buffered I/O限速前,优先设置blkcg的cgroup.procs接口,向该接口写入一个进程ID来保证blkcg映射的唯一性。 +* 在实际运维中,可能出现进程移动到其它cgroup的情况。根据上述规则,如果进程在memcg之间移动,不会出现问题,但如果进程在blkcg之间移动,将会出现异常情况。为了避免产生异常,该功能的代码中定义了规则:一旦工作中的blkcg内的进程发生blkcg间的移动,则将映射关系直接指向root blkcg。由于一般情况是不在root blkcg设置限流阈值,所以当映射关系直接指向root blkcg时,限速功能会失效。 +* 如果是云盘,需要将rotation的参数置1 +* ![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_13.png) + + +## blk-iocost + + +### 需求来源 + + +正常情况下,为了避免一个IO饥饿型作业轻易耗尽整个系统IO资源,我们会设置每个cgroup的IO带宽上限,其最大缺点是即使设备空闲,配置上限的cgroup在其已发送IO超过上限时不能继续发送IO,引起存储资源浪费。 + + +基于以上需求,出现了一种IO控制器-IOCOST,该控制器是基于blkcg的权重来分配磁盘的资源,可以做到在满足业务IO QOS的前提下,尽最大程度利用磁盘的IO资源,一旦出现磁盘IO能力达到上限导致触及QOS设置的目标时,此时iocost控制器会通过权重来控制各个group的io使用,在此基础上,blk-iocost又拥有一定的自适应能力,尽可能的避免磁盘能力被浪费。 + + +### 功能简介 + + +由Tejun Heo开发的iocost控制器是基于权重比例来分配磁盘能力,每个cgroup根据设置的权重来获取磁盘时间,从而获得相应的带宽。在此基础上,blk-iocost又拥有一定的自适应能力,尽可能的避免磁盘能力被浪费。 + + +IO控制器如何根据权重分配每个cgroup所能使用的磁盘能力不太容易,这是由于不同类型IO请求实际所占用磁盘处理资源是不一样的,简单统计每cgroup的iops或者带宽是不充分的,因此io.weight控制器提出一个IO请求成本计算模型(cost model),该模型计算每个IO请求预计会占用的设备时间(device time),大体计算逻辑为:首先基于该IO请求是顺序还是随机,会赋值一个初始预计消耗设备时间,然后根据该请求的大小,以page为单位,计算出一个设备时间(IO请求越大,则相应的设备时间越大),然后将初始设备时间和根据请求大小算出的设备时间相加,就得到一个IO请求预计将消耗的总设备时间。控制器已经内置若干默认IO成本计算参数,但系统管理员也可以通过配置root cgroup中的io.weight.cost\_model来修改特定设备对应的IO成本计算参数,需要配置的参数有设备最大吞吐量,rand iops, sequential iops。 + + +当一个cgroup不发送请求时,它处于inactive状态,此时它的权重不会被考虑。一旦该cgroup需要发送IO,它就被激活,此时会计算在整棵层级树中的权重比例。以如下层级为例: + + +![](../../../assets/社区研发项目/资源隔离与混部/龙蜥os资源隔离使用简介/img_14.png) + + +cgroup B不发送请求,那么A0和A1各占50%的比例。若B开始发送请求,B获得300/(100+300) 也就是 75%的比例,A0和A1各占12.5%。这些比例称为hweights(hierarchical weights),所有被激活的cgroup的hweights总和为1。 + + +### 接口说明 + + +可以参考: + + + + +| | | | +| --- | --- | --- | +| 接口 | 描述 | 配置说明 | +| cost.qos | 可读可写接口,接口文件只存在于blkcg根组。在cgroup v1中,该接口文件完整名称为blkio.cost.qos,在cgroup v2中,该接口文件完整名称为io.cost.qos。该接口主要实现blk-iocost功能以及基于延迟(latency)权重限制I/O服务质量(Qos)的速率。 +当实现blk-iocost功能之后,内核按延迟数值统计以下比例:超过读写延迟rlat|wlat的请求占所有请求的比例。当该比例超过读写延迟百分比rpct|wpct时,内核认为设备达到饱和状态,会降低往磁盘发送请求的速率。默认情况下,rlat|wlat的值为0,表示该功能未启用。 | 每行配置以设备的Major号和Minor号开头(格式为MAJ:MIN),后边衔接其他配置项,说明如下。* enable:是否开启blk-iocost controller,即开启blk-iocost功能。默认值0为关闭状态,修改值为1时开启功能。 +* ctrl:控制模式,可选值为auto或者user。使用auto时,内核自动探测设备类型并使用内置参数;使用user,则需要输入以下QoS控制参数。 +* rpct:读延迟百分比,取值范围为[0,100]。 +* rlat:读延迟,单位为us。 +* wpct:写延迟百分比,取值范围为[0,100]。 +* wlat:写延迟,单位为us。 +* min:最小速率调整比例,取值范围为[1,10000]。 +* max:最大速率调整比例,取值范围为[1,10000]。 + | +| cost.model | 可读可写接口,只存在于blkcg根组。在cgroup v1中,该接口文件完整名称为blkio.cost.model,在cgroup v2中,该接口文件完整名称为io.cost.model。该接口用于设置成本模型(cost model)。 | 每行配置以设备的Major号和Minor号开头(格式为MAJ:MIN),后边衔接其他配置项,说明如下。* ctrl:控制模式,可选值为auto或user,表示是否使用用户输入模型参数。 +* model:模型参数,当前只实现了一种模型linear。当模型参数为linear时,定义如下建模参数。 ++ [r|w]bps:最大顺序IO带宽。 ++ [r|w]seqiops:顺序 IOPS(Input/Output Operations Per Second)。 ++ [r|w]randiops:随机 IOPS(Input/Output Operations Per Second)。 + | +| cost.weight | 可读可写接口,只存在blkcg的子组中。在cgroup v1中,该接口文件完整名称为blkio.cost.weight,在cgroup v2中,该接口文件完整名称为io.cost.weight。该接口用于配置子组的权重,范围为[1,10000],默认值为100。该接口可以为每个设备配置权重,也可以修改该整个子组的默认权重。 | * 为接口设置权重值:表示修改blkcg的默认权重。 +* 为接口设置端口号和权重值MAJ:MIN :表示修改设备上的blkcg的权重。 + | + + +### 使用说明 + + +#### 第一步:为对应的磁盘生成相应的cost model数据 + + +在进行IO评测的时候需要获取iocost的model模型数据,iocost\_coed\_gen.py用来获取model数据,这个脚本可以使用内核源码中的tools/cgroup/iocost\_coef\_gen.py脚本来生成,或者从以下网址可以获取脚本的源码,这个脚本会通过直接读写磁盘来获取对应的磁盘模型数据,所以会破坏磁盘上的数据或文件系统,可以在磁盘被格式化前进行,只需要获取一次即可,比如我这边获取/dev/vdc盘的数据,可以用如下命令获取,最后一行输出的数据就是我们需要的数据 + + + +``` +[root@iZbp14ah12fefuzd6rh5rkZ ~]# python3 iocost_coed_gen.py --testdev /dev/vdc +Test target: vdc(253:32) +Temporarily disabling elevator and merges +Determining rbps... +Jobs: 1 (f=1): [R(1)][100.0%][r=128MiB/s,w=0KiB/s][r=1,w=0 IOPS][eta 00m:00s] +rbps=179879083, determining rseqiops... +Jobs: 1 (f=1): [R(1)][100.0%][r=26.5MiB/s,w=0KiB/s][r=6791,w=0 IOPS][eta 00m:00s] +rseqiops=6862, determining rrandiops... +Jobs: 1 (f=1): [r(1)][100.0%][r=26.6MiB/s,w=0KiB/s][r=6800,w=0 IOPS][eta 00m:00s] +rrandiops=6830, determining wbps... +Jobs: 1 (f=1): [W(1)][100.0%][r=0KiB/s,w=128MiB/s][r=0,w=1 IOPS][eta 00m:00s] +wbps=179882078, determining wseqiops... +Jobs: 1 (f=1): [W(1)][100.0%][r=0KiB/s,w=26.6MiB/s][r=0,w=6798 IOPS][eta 00m:00s] +wseqiops=6862, determining wrandiops... +Jobs: 1 (f=1): [w(1)][100.0%][r=0KiB/s,w=26.6MiB/s][r=0,w=6806 IOPS][eta 00m:00s] +wrandiops=6830 +Restoring elevator to none and nomerges to 0 + +253:32 rbps=179879083 rseqiops=6862 rrandiops=6830 wbps=179882078 wseqiops=6862 wrandiops=6830 +``` + +然后将最后一行的数据写入对应磁盘的cost model文件中,如下所示: + + + +``` +echo "253:32 rbps=179879083 rseqiops=6862 rrandiops=6830 wbps=179882078 wseqiops=6862 wrandiops=6830" > /sys/fs/cgroup/blkio/blkio.cost.model +``` + +注意:不需要在所有的机器上都执行这个操作,同样的磁盘的model数据是一样的,我们只需要获取一次即可,然后将对应的数据写入blkio root目录的blkio.cost.model接口文件即可。 + + +#### 第二步:配置磁盘的QOS,开启blk-iocost + + +这里假设使用cost.qos接口为设备253:32开启blk-iocost功能,并且当读写延迟rlat|wlat的请求有95%超过5 ms时,认为磁盘饱和。内核将进行磁盘发送请求速率的调整,调整区间为最低降至原速率的50%,最高升至原速率的150%: + + + +``` +echo "253:32 enable=1 ctrl=user rpct=95.00 rlat=5000 wpct=95.00 wlat=5000 min=50.00 max=150.00" > /sys/fs/cgroup/blkio/blkio.cost.qos +``` + +#### 第三步:为容器分配io权重 + + +这里可以根据业务容器不同的io的时延等级,给与设置不同的io权重,假设这里设置be blkcg的io权重为50,lc blkcg的io权重为1000: + + + +``` +echo "253:32 50" > /sys/fs/cgroup/blkio/blkcg_be/blkio.cost.weight +echo "253:32 50" > /sys/fs/cgroup/blkio/blkcg_lc/blkio.cost.weight +``` + +这样在IO资源使用饱和时,会根据blkcg的io权重进行io资源的分配。 + + +### 注意事项 + + +在ECS实例中使用blk-iocost功能启动**ctrl=auto**配置项时,如果对应的云盘为高效云盘、SSD云盘、ESSD云盘或NVMe SSD本地盘类型时,需要手动将对应磁盘的**rotational**属性设置为0: + + + +``` +#[$DISK_NAME]为磁盘名称 +echo 0 > /sys/block/[$DISK_NAME]/queue/rotational +``` + +另外切记不要使用分区的maj和min的值作为参数进行配置,需要使用硬盘的maj和min值进行配置。 + + -- Gitee From 825157c72fb78a96ce1608562f398230ad684ee1 Mon Sep 17 00:00:00 2001 From: yutt Date: Fri, 3 Jan 2025 09:42:17 +0000 Subject: [PATCH 055/135] 3333 Signed-off-by: yutt --- .../content/\346\226\207\344\273\266\346\240\274\345\274\217.md" | 0 .../content/\346\226\260\345\273\272\346\226\207\344\273\266" | 0 .../content/\347\250\213\345\272\217\350\247\204\345\210\231.md" | 0 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 "sig/maozzi003/content/\346\226\207\344\273\266\346\240\274\345\274\217.md" create mode 100644 "sig/maozzi003/content/\346\226\260\345\273\272\346\226\207\344\273\266" create mode 100644 "sig/maozzi003/content/\347\250\213\345\272\217\350\247\204\345\210\231.md" diff --git "a/sig/maozzi003/content/\346\226\207\344\273\266\346\240\274\345\274\217.md" "b/sig/maozzi003/content/\346\226\207\344\273\266\346\240\274\345\274\217.md" new file mode 100644 index 00000000..e69de29b diff --git "a/sig/maozzi003/content/\346\226\260\345\273\272\346\226\207\344\273\266" "b/sig/maozzi003/content/\346\226\260\345\273\272\346\226\207\344\273\266" new file mode 100644 index 00000000..e69de29b diff --git "a/sig/maozzi003/content/\347\250\213\345\272\217\350\247\204\345\210\231.md" "b/sig/maozzi003/content/\347\250\213\345\272\217\350\247\204\345\210\231.md" new file mode 100644 index 00000000..e69de29b -- Gitee From 63e87430693279fc793539c28ccf5dd987fb691e Mon Sep 17 00:00:00 2001 From: WB01533938 Date: Tue, 7 Jan 2025 17:18:51 +0800 Subject: [PATCH 056/135] =?UTF-8?q?ci:=20=E6=9B=B4=E6=96=B0=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除多个项目的 dir_or_files 字段为空的情况 - 统一将空字段替换为 []表示空列表 -涉及项目包括: - TC2024120502 - TC2024080812 - TC2024110203 - TC2024120201 - TC2024110202 - TC2024080205 --- TC_Project.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/TC_Project.yml b/TC_Project.yml index 316351aa..3ca16089 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -2,7 +2,7 @@ projects: - project_id: TC2024120502 repos: - repo_name: openanolis-copy/docs - dir_or_files: + dir_or_files: [] - project_id: TC2024121101 repos: - repo_name: openanolis-copy/docs @@ -39,7 +39,7 @@ projects: - project_id: TC2024080812 repos: - repo_name: anolis/anolis7.9els - dir_or_files: + dir_or_files: [] - project_id: TC2024120001 repos: @@ -51,40 +51,40 @@ projects: - project_id: TC2024110203 repos: - repo_name: anolis/qemu-kvm - dir_or_files: + dir_or_files: [] - project_id: TC2024120201 repos: - repo_name: src-anolis-os/qemu - dir_or_files: + dir_or_files: [] - project_id: TC2024120201 repos: - repo_name: src-anolis-os/edk2 - dir_or_files: + dir_or_files: [] - project_id: TC2024120201 repos: - repo_name: src-anolis-os/libvirt - dir_or_files: + dir_or_files: [] - project_id: TC2024120201 repos: - repo_name: src-anolis-os/gcc - dir_or_files: + dir_or_files: [] - project_id: TC2024120201 repos: - repo_name: src-anolis-os/tpm2-tools - dir_or_files: + dir_or_files: [] - project_id: TC2024120201 repos: - repo_name: src-anolis-os/tpm2-abrmd - dir_or_files: + dir_or_files: [] - project_id: TC2024110202 repos: - repo_name: anolis/cloud-kernel - dir_or_files: + dir_or_files: [] - project_id: TC2024110202 repos: - repo_name: src-anolis-sig/cloud-kernel - dir_or_files: + dir_or_files: [] - project_id: TC2024080205 repos: - repo_name: anolis/anolis-container - dir_or_files: \ No newline at end of file + dir_or_files: [] \ No newline at end of file -- Gitee From bed1d244d3bfb59b9677c25e7be34d70c4a47ee0 Mon Sep 17 00:00:00 2001 From: WB01533938 Date: Tue, 7 Jan 2025 18:11:42 +0800 Subject: [PATCH 057/135] =?UTF-8?q?ci:=20=E6=9B=B4=E6=96=B0=20TC=5FProject?= =?UTF-8?q?.yml=20=E6=96=87=E4=BB=B6-=20=E7=A7=BB=E9=99=A4=E4=BA=86?= =?UTF-8?q?=E5=A4=9A=E4=B8=AA=20project=5Fid=20=E5=92=8C=E5=AF=B9=E5=BA=94?= =?UTF-8?q?=E7=9A=84=20repos=20=E9=85=8D=E7=BD=AE=20-=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E4=BA=86=20openanolis-copy/docs=20=E9=A1=B9=E7=9B=AE=E7=9A=84?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=20-=20=E5=88=A0=E9=99=A4=E4=BA=86=E5=86=97?= =?UTF-8?q?=E4=BD=99=E7=9A=84=E7=A9=BA=E8=A1=8C=E5=92=8C=E4=B8=8D=E5=BF=85?= =?UTF-8?q?=E8=A6=81=E7=9A=84=E7=BC=A9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TC_Project.yml | 77 ++------------------------------------------------ 1 file changed, 2 insertions(+), 75 deletions(-) diff --git a/TC_Project.yml b/TC_Project.yml index 3ca16089..656566d1 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -2,7 +2,7 @@ projects: - project_id: TC2024120502 repos: - repo_name: openanolis-copy/docs - dir_or_files: [] + dir_or_files: - project_id: TC2024121101 repos: - repo_name: openanolis-copy/docs @@ -14,77 +14,4 @@ projects: dir_or_files: - sig/AI - sig/AI/sig-info.yaml - - sig/AI/README.md - - project_id: TC2024080202 - repos: - - repo_name: openanolis-copy/community2 - dir_or_files: - - sig/AI - - sig/AI/sig-info.yaml - - sig/AI/README.md - - project_id: TC2024080403 - repos: - - repo_name: openanolis-copy/community - dir_or_files: - - sig/AI/content - - sig/AI/sig-info.yaml - - sig/AI/README.md - - project_id: TC2024080503 - repos: - - repo_name: openanolis-copy/community - dir_or_files: - - sig/AI/content - - sig/AI/sig-info.yaml - - sig/AI/README.md - - project_id: TC2024080812 - repos: - - repo_name: anolis/anolis7.9els - dir_or_files: [] - - - project_id: TC2024120001 - repos: - - repo_name: openanolis-copy/docs - dir_or_files: - - DEVELOPER_DOCS - - CESHI_ZHUANYONG/CI及代码门禁/日志文件 - - - project_id: TC2024110203 - repos: - - repo_name: anolis/qemu-kvm - dir_or_files: [] - - project_id: TC2024120201 - repos: - - repo_name: src-anolis-os/qemu - dir_or_files: [] - - project_id: TC2024120201 - repos: - - repo_name: src-anolis-os/edk2 - dir_or_files: [] - - project_id: TC2024120201 - repos: - - repo_name: src-anolis-os/libvirt - dir_or_files: [] - - project_id: TC2024120201 - repos: - - repo_name: src-anolis-os/gcc - dir_or_files: [] - - project_id: TC2024120201 - repos: - - repo_name: src-anolis-os/tpm2-tools - dir_or_files: [] - - project_id: TC2024120201 - repos: - - repo_name: src-anolis-os/tpm2-abrmd - dir_or_files: [] - - project_id: TC2024110202 - repos: - - repo_name: anolis/cloud-kernel - dir_or_files: [] - - project_id: TC2024110202 - repos: - - repo_name: src-anolis-sig/cloud-kernel - dir_or_files: [] - - project_id: TC2024080205 - repos: - - repo_name: anolis/anolis-container - dir_or_files: [] \ No newline at end of file + - sig/AI/README.md \ No newline at end of file -- Gitee From 4c28dbce042162f3f9bc3571e573d4e69f1e98e6 Mon Sep 17 00:00:00 2001 From: WB01533938 Date: Tue, 7 Jan 2025 18:27:29 +0800 Subject: [PATCH 058/135] =?UTF-8?q?ci:=20=E6=9B=B4=E6=96=B0=20TC=5FProject?= =?UTF-8?q?.yml=20=E6=96=87=E4=BB=B6-=20=E7=A7=BB=E9=99=A4=E4=BA=86?= =?UTF-8?q?=E5=A4=9A=E4=B8=AA=20project=5Fid=20=E5=92=8C=E5=AF=B9=E5=BA=94?= =?UTF-8?q?=E7=9A=84=20repos=20=E9=85=8D=E7=BD=AE=20-=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E4=BA=86=20openanolis-copy/docs=20=E9=A1=B9=E7=9B=AE=E7=9A=84?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=20-=20=E5=88=A0=E9=99=A4=E4=BA=86=E5=86=97?= =?UTF-8?q?=E4=BD=99=E7=9A=84=E7=A9=BA=E8=A1=8C=E5=92=8C=E4=B8=8D=E5=BF=85?= =?UTF-8?q?=E8=A6=81=E7=9A=84=E7=BC=A9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TC_Project.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TC_Project.yml b/TC_Project.yml index 656566d1..2bd4eb5b 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -1,7 +1,7 @@ projects: - project_id: TC2024120502 repos: - - repo_name: openanolis-copy/docs + - repo_name: love-sky/docs dir_or_files: - project_id: TC2024121101 repos: -- Gitee From b17799d866e7665e54dc514a045e7ff56d9b08d5 Mon Sep 17 00:00:00 2001 From: WB01533938 Date: Wed, 8 Jan 2025 09:58:50 +0800 Subject: [PATCH 059/135] =?UTF-8?q?ci:=20=E6=9B=B4=E6=96=B0=20TC=5FProject?= =?UTF-8?q?.yml=20=E6=96=87=E4=BB=B6-=20=E7=A7=BB=E9=99=A4=E4=BA=86?= =?UTF-8?q?=E5=A4=9A=E4=B8=AA=20project=5Fid=20=E5=92=8C=E5=AF=B9=E5=BA=94?= =?UTF-8?q?=E7=9A=84=20repos=20=E9=85=8D=E7=BD=AE=20-=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E4=BA=86=20openanolis-copy/docs=20=E9=A1=B9=E7=9B=AE=E7=9A=84?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=20-=20=E5=88=A0=E9=99=A4=E4=BA=86=E5=86=97?= =?UTF-8?q?=E4=BD=99=E7=9A=84=E7=A9=BA=E8=A1=8C=E5=92=8C=E4=B8=8D=E5=BF=85?= =?UTF-8?q?=E8=A6=81=E7=9A=84=E7=BC=A9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TC_Project.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TC_Project.yml b/TC_Project.yml index 2bd4eb5b..656566d1 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -1,7 +1,7 @@ projects: - project_id: TC2024120502 repos: - - repo_name: love-sky/docs + - repo_name: openanolis-copy/docs dir_or_files: - project_id: TC2024121101 repos: -- Gitee From 2dbd88cd24cd46d943cdbc72149a293902691e63 Mon Sep 17 00:00:00 2001 From: yutt Date: Thu, 9 Jan 2025 03:25:29 +0000 Subject: [PATCH 060/135] =?UTF-8?q?=E5=BC=80=E5=8F=91=E8=80=85=E6=8C=87?= =?UTF-8?q?=E5=8D=97=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yutt --- ...07\345\215\227\347\233\256\345\275\225.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 "\343\200\2200\343\200\221\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227\347\233\256\345\275\225.md" diff --git "a/\343\200\2200\343\200\221\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227\347\233\256\345\275\225.md" "b/\343\200\2200\343\200\221\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227\347\233\256\345\275\225.md" new file mode 100644 index 00000000..a8028690 --- /dev/null +++ "b/\343\200\2200\343\200\221\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227\347\233\256\345\275\225.md" @@ -0,0 +1,26 @@ + +### [【1】Anolis OS环境搭建教程](https://openanolis.cn/sig/Cloud-Kernel/doc/721476209221304399) + +### [【2】订阅Cloud Kernel邮件列表](https://openanolis.cn/sig/Cloud-Kernel/doc/721476296169226335) + +###     [【3-1】内核编译安装 - Make方式](https://openanolis.cn/sig/Cloud-Kernel/doc/721476224463405137) + +###     [【3-2】内核编译安装 - RPM包方式](https://openanolis.cn/sig/Cloud-Kernel/doc/721476230897467475) + +###     [【3-3】内核编译安装 - intree模块编译](https://openanolis.cn/sig/Cloud-Kernel/doc/796036400039221309) + +### [【4-0】Cloud Kernel开发基本流程](https://openanolis.cn/sig/Cloud-Kernel/doc/721476280021155931) + +###     [【4-1】向Cloud Kernel报告BUG](https://openanolis.cn/sig/Cloud-Kernel/doc/721476248891031637) + +###     [【4-2】Cloud Kernel补丁规范](https://openanolis.cn/sig/Cloud-Kernel/doc/721476251004960855) + +###     [【4-3】PR(Pull Request)规范](https://openanolis.cn/sig/Cloud-Kernel/doc/721476253496377433) + +### [【4-4】Cloud Kernel 研发规约(必读)](https://openanolis.cn/sig/Cloud-Kernel/doc/860616877348361648) + +### [【5】向Cloud Kernel报告CVE](https://openanolis.cn/sig/Cloud-Kernel/doc/721476285859627101) + +### [【6】Cloud Kernel仓库代码管理](https://openanolis.cn/sig/Cloud-Kernel/doc/721476298165715041) + +### [【7】从Cloud Kernel cherry-pick补丁的要求](https://openanolis.cn/sig/Cloud-Kernel/doc/831592015795327880) \ No newline at end of file -- Gitee From 73b8df51427cc12ef635737ead9ed14947c1a73e Mon Sep 17 00:00:00 2001 From: yutt Date: Thu, 9 Jan 2025 05:19:52 +0000 Subject: [PATCH 061/135] =?UTF-8?q?=E5=BC=80=E5=8F=91=E8=80=85=E6=8C=87?= =?UTF-8?q?=E5=8D=97=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yutt --- ...07\345\215\227\347\233\256\345\275\225.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 "sig/Cloud Kernel/content/\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227/\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227\347\233\256\345\275\225.md" diff --git "a/sig/Cloud Kernel/content/\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227/\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227\347\233\256\345\275\225.md" "b/sig/Cloud Kernel/content/\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227/\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227\347\233\256\345\275\225.md" new file mode 100644 index 00000000..a8028690 --- /dev/null +++ "b/sig/Cloud Kernel/content/\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227/\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227\347\233\256\345\275\225.md" @@ -0,0 +1,26 @@ + +### [【1】Anolis OS环境搭建教程](https://openanolis.cn/sig/Cloud-Kernel/doc/721476209221304399) + +### [【2】订阅Cloud Kernel邮件列表](https://openanolis.cn/sig/Cloud-Kernel/doc/721476296169226335) + +###     [【3-1】内核编译安装 - Make方式](https://openanolis.cn/sig/Cloud-Kernel/doc/721476224463405137) + +###     [【3-2】内核编译安装 - RPM包方式](https://openanolis.cn/sig/Cloud-Kernel/doc/721476230897467475) + +###     [【3-3】内核编译安装 - intree模块编译](https://openanolis.cn/sig/Cloud-Kernel/doc/796036400039221309) + +### [【4-0】Cloud Kernel开发基本流程](https://openanolis.cn/sig/Cloud-Kernel/doc/721476280021155931) + +###     [【4-1】向Cloud Kernel报告BUG](https://openanolis.cn/sig/Cloud-Kernel/doc/721476248891031637) + +###     [【4-2】Cloud Kernel补丁规范](https://openanolis.cn/sig/Cloud-Kernel/doc/721476251004960855) + +###     [【4-3】PR(Pull Request)规范](https://openanolis.cn/sig/Cloud-Kernel/doc/721476253496377433) + +### [【4-4】Cloud Kernel 研发规约(必读)](https://openanolis.cn/sig/Cloud-Kernel/doc/860616877348361648) + +### [【5】向Cloud Kernel报告CVE](https://openanolis.cn/sig/Cloud-Kernel/doc/721476285859627101) + +### [【6】Cloud Kernel仓库代码管理](https://openanolis.cn/sig/Cloud-Kernel/doc/721476298165715041) + +### [【7】从Cloud Kernel cherry-pick补丁的要求](https://openanolis.cn/sig/Cloud-Kernel/doc/831592015795327880) \ No newline at end of file -- Gitee From bbdc1f83687249afb7dd77949cb581cb4e5665e6 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Thu, 9 Jan 2025 17:57:53 +0800 Subject: [PATCH 062/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=959?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ab\347\256\200\344\273\213.md" | 3 + .../aghgb\347\256\200\344\273\213.md" | 3 + .../gb\347\256\200\344\273\213.md" | 3 + ...72\345\210\266\347\256\200\344\273\213.md" | 339 ++++++++++++++++++ .../\347\256\200\344\273\213.md" | 3 + .../\347\256\200\344\273\2132.md" | 3 + 6 files changed, 354 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/ab\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/aghgb\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/gb\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\347\256\200\344\273\2132.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/ab\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/ab\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/ab\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/aghgb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/aghgb\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/aghgb\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/gb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/gb\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/gb\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" new file mode 100644 index 00000000..2a362235 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" @@ -0,0 +1,339 @@ +# 1. RAS机制简介 + + +为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: + + +**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 + + +**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 + + +**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 + + +RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 + + +# 2. RAS机制错误处理流程 + + +RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 + + +RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_0.png) + + +# 3. RAS机制评测流程 + + +RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 + + +APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 + + +从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 + + +如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 + + + + +| | +| --- | +| 0 Processor Correctable +1 Processor Uncorrectable non-fatal +2 Processor Uncorrectable fatal | +| 3 Memory Correctable +4 Memory Uncorrectable non-fatal +5 Memory Uncorrectable fatal | +| 6 PCI Express Correctable +7 PCI Express Uncorrectable non-fatal +8 PCI Express Uncorrectable fatal | +| 9 Platform Correctable +10 Platform Uncorrectable non-fatal +11 Platform Uncorrectable fatal | + + +Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_1.png) + + +上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 + + +错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: + + +1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 + + +2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 + + +3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 + + +# 4. CPU及内存错误注入演示 + + +CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 + + +## 4.1 环境准备 + + +### 1. 安装EINJ模块 + + +使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html + + +此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 + + +### 2. 安装RAS测试工具 + + +直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git + + +### 3. 安装rasdaemon + + +先安装依赖包yum install sqlite perl-DBD-SQLite + + +使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git + + + +``` +autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make +make install +``` + +在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 + + + +``` + -d, --disable 禁用RAS事件并退出 + -e, --enable 使能RAS事件并退出 + -f, --foreground 前台运行 + -r, --record 通过sqlite3记录事件 +``` + +rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 + + +查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 + + +本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 + + +## 4.2 CPU错误注入 + + +本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 + + +使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 + + + +``` +./einj_mem_uc core_non_fatal +0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 +injecting ... +triggering ... +Manually take page offline +Test passed +``` + +使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 + + + + +| | | | | +| --- | --- | --- | --- | +| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | + + +可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=17(core), cnt=0xd +INFO: RAS reg: +INFO: fr = 10a9a2 +INFO: status = 44800007 +INFO: addr = 8007e0e95fffb7ff +INFO: misc0 = 4 +INFO: misc1 = 0 +RTC: 2000-01-06 09:32:09 + core[8] mm(17) return: 0 +--handler(17) end +[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error +[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 +[40858.436229] {42}[Hardware Error]: event severity: recoverable +[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 +[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable +[40858.454204] {42}[Hardware Error]: section_type: ARM processor error +[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 +[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 +[40858.475041] {42}[Hardware Error]: running state: 0x1 +[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 +[40858.487456] {42}[Hardware Error]: Error info structure 0: +[40858.493013] {42}[Hardware Error]: num errors: 1 +[40858.497702] {42}[Hardware Error]: error_type: 0, cache error +[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 +[40858.509857] {42}[Hardware Error]: transaction type: Instruction +[40858.516109] {42}[Hardware Error]: cache level: 2 +[40858.521058] {42}[Hardware Error]: the error has not been corrected +[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered +``` + +## 4.3 内存错误注入 + + +使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 + + + +``` +./einj_mem_uc single +0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 +injecting ... +triggering ... +SIGBUS: addr = 0xffffabcb3400 +page not present +Test passed +``` + +BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=0(exception), cnt=0xa +MM Mem RAS handle,Intr:0 +Ch = 25810000 + |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 + |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 + |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 + |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 + |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 + |-ECCUSYN0~2:1FF,0,76 + |-SBRCTL:1C01591B,SBRSTS:0 +RasData->ExceptionEl: 0, UeCnt:0x1 +RTC: 2000-01-06 09:27:58 +Get SystemAddrss through mAddrTransProtocol start +Get SystemAddrss through mAddrTransProtocol end +s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 +Locate error dimm, Socket:0, Channel:2 Dimm:0 + core[8] mm(0) return: 0 +--handler(0) end +[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) +[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 +[40606.668367] {41}[Hardware Error]: event severity: recoverable +[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 +[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable +[40606.686342] {41}[Hardware Error]: section_type: memory error +[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) +[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 +[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 +[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC +[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered +``` + +## 4.4 rasdaemon日志读取 + + +rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 + + + +``` +[root@localhost ras-tools]# ras-mc-ctl --errors +Memory controller events: +1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +``` + +# 5. Q&A + + +Q:RAS机制是否需要BIOS支持? + + +A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 + + + + + +Q: x86和ARM64的APEI是否一致? + + +A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 + + + + + +Q: RAS注入的错误是真实的错误吗? + + +A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 + + + + + +Q: rasdaemon日志查看是否有更易用的方法? + + +A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; + + +最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 + + + + + +Q: 可否使用mcelog? + + +A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 + + + + + +Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? + + +A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 + + + + + +Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? + + +A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\347\256\200\344\273\2132.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\347\256\200\344\273\2132.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\347\256\200\344\273\2132.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file -- Gitee From b85d12ebe97a4b285bc6c20b1b96482b989c3fcd Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Fri, 10 Jan 2025 14:38:40 +0800 Subject: [PATCH 063/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9510?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\345\210\266\347\256\200\344\273\213.md" | 339 ++++++++++++++++++ 1 file changed, 339 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/dnasdkaa\346\234\272\345\210\266\347\256\200\344\273\213.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/dnasdkaa\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/dnasdkaa\346\234\272\345\210\266\347\256\200\344\273\213.md" new file mode 100644 index 00000000..2a362235 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/dnasdkaa\346\234\272\345\210\266\347\256\200\344\273\213.md" @@ -0,0 +1,339 @@ +# 1. RAS机制简介 + + +为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: + + +**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 + + +**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 + + +**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 + + +RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 + + +# 2. RAS机制错误处理流程 + + +RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 + + +RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_0.png) + + +# 3. RAS机制评测流程 + + +RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 + + +APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 + + +从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 + + +如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 + + + + +| | +| --- | +| 0 Processor Correctable +1 Processor Uncorrectable non-fatal +2 Processor Uncorrectable fatal | +| 3 Memory Correctable +4 Memory Uncorrectable non-fatal +5 Memory Uncorrectable fatal | +| 6 PCI Express Correctable +7 PCI Express Uncorrectable non-fatal +8 PCI Express Uncorrectable fatal | +| 9 Platform Correctable +10 Platform Uncorrectable non-fatal +11 Platform Uncorrectable fatal | + + +Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_1.png) + + +上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 + + +错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: + + +1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 + + +2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 + + +3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 + + +# 4. CPU及内存错误注入演示 + + +CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 + + +## 4.1 环境准备 + + +### 1. 安装EINJ模块 + + +使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html + + +此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 + + +### 2. 安装RAS测试工具 + + +直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git + + +### 3. 安装rasdaemon + + +先安装依赖包yum install sqlite perl-DBD-SQLite + + +使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git + + + +``` +autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make +make install +``` + +在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 + + + +``` + -d, --disable 禁用RAS事件并退出 + -e, --enable 使能RAS事件并退出 + -f, --foreground 前台运行 + -r, --record 通过sqlite3记录事件 +``` + +rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 + + +查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 + + +本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 + + +## 4.2 CPU错误注入 + + +本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 + + +使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 + + + +``` +./einj_mem_uc core_non_fatal +0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 +injecting ... +triggering ... +Manually take page offline +Test passed +``` + +使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 + + + + +| | | | | +| --- | --- | --- | --- | +| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | + + +可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=17(core), cnt=0xd +INFO: RAS reg: +INFO: fr = 10a9a2 +INFO: status = 44800007 +INFO: addr = 8007e0e95fffb7ff +INFO: misc0 = 4 +INFO: misc1 = 0 +RTC: 2000-01-06 09:32:09 + core[8] mm(17) return: 0 +--handler(17) end +[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error +[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 +[40858.436229] {42}[Hardware Error]: event severity: recoverable +[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 +[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable +[40858.454204] {42}[Hardware Error]: section_type: ARM processor error +[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 +[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 +[40858.475041] {42}[Hardware Error]: running state: 0x1 +[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 +[40858.487456] {42}[Hardware Error]: Error info structure 0: +[40858.493013] {42}[Hardware Error]: num errors: 1 +[40858.497702] {42}[Hardware Error]: error_type: 0, cache error +[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 +[40858.509857] {42}[Hardware Error]: transaction type: Instruction +[40858.516109] {42}[Hardware Error]: cache level: 2 +[40858.521058] {42}[Hardware Error]: the error has not been corrected +[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered +``` + +## 4.3 内存错误注入 + + +使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 + + + +``` +./einj_mem_uc single +0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 +injecting ... +triggering ... +SIGBUS: addr = 0xffffabcb3400 +page not present +Test passed +``` + +BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=0(exception), cnt=0xa +MM Mem RAS handle,Intr:0 +Ch = 25810000 + |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 + |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 + |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 + |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 + |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 + |-ECCUSYN0~2:1FF,0,76 + |-SBRCTL:1C01591B,SBRSTS:0 +RasData->ExceptionEl: 0, UeCnt:0x1 +RTC: 2000-01-06 09:27:58 +Get SystemAddrss through mAddrTransProtocol start +Get SystemAddrss through mAddrTransProtocol end +s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 +Locate error dimm, Socket:0, Channel:2 Dimm:0 + core[8] mm(0) return: 0 +--handler(0) end +[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) +[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 +[40606.668367] {41}[Hardware Error]: event severity: recoverable +[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 +[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable +[40606.686342] {41}[Hardware Error]: section_type: memory error +[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) +[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 +[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 +[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC +[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered +``` + +## 4.4 rasdaemon日志读取 + + +rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 + + + +``` +[root@localhost ras-tools]# ras-mc-ctl --errors +Memory controller events: +1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +``` + +# 5. Q&A + + +Q:RAS机制是否需要BIOS支持? + + +A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 + + + + + +Q: x86和ARM64的APEI是否一致? + + +A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 + + + + + +Q: RAS注入的错误是真实的错误吗? + + +A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 + + + + + +Q: rasdaemon日志查看是否有更易用的方法? + + +A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; + + +最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 + + + + + +Q: 可否使用mcelog? + + +A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 + + + + + +Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? + + +A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 + + + + + +Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? + + +A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file -- Gitee From aeaaed00de67cee11c56823d6844fdf3003233f0 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Fri, 10 Jan 2025 16:48:10 +0800 Subject: [PATCH 064/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9511?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\346\265\213\350\257\22502/125662333.md" | 3 + .../465\347\256\200\344\273\213.md" | 3 + .../ceshi02\347\256\200\344\273\213.md" | 3 + .../ceshi03\347\256\200\344\273\213.md" | 3 + ...72\345\210\266\347\256\200\344\273\213.md" | 339 ++++++++++++++++++ .../\346\265\213\350\257\225.md" | 339 ++++++++++++++++++ ...64\346\230\216\346\226\207\346\241\243.md" | 3 + 7 files changed, 693 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/125662333.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/465\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/ceshi02\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/ceshi03\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\346\234\272\345\210\266\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\346\265\213\350\257\225.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\350\257\264\346\230\216\346\226\207\346\241\243.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/125662333.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/125662333.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/125662333.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/465\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/465\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/465\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/ceshi02\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/ceshi02\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/ceshi02\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/ceshi03\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/ceshi03\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/ceshi03\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\346\234\272\345\210\266\347\256\200\344\273\213.md" new file mode 100644 index 00000000..2a362235 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\346\234\272\345\210\266\347\256\200\344\273\213.md" @@ -0,0 +1,339 @@ +# 1. RAS机制简介 + + +为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: + + +**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 + + +**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 + + +**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 + + +RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 + + +# 2. RAS机制错误处理流程 + + +RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 + + +RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_0.png) + + +# 3. RAS机制评测流程 + + +RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 + + +APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 + + +从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 + + +如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 + + + + +| | +| --- | +| 0 Processor Correctable +1 Processor Uncorrectable non-fatal +2 Processor Uncorrectable fatal | +| 3 Memory Correctable +4 Memory Uncorrectable non-fatal +5 Memory Uncorrectable fatal | +| 6 PCI Express Correctable +7 PCI Express Uncorrectable non-fatal +8 PCI Express Uncorrectable fatal | +| 9 Platform Correctable +10 Platform Uncorrectable non-fatal +11 Platform Uncorrectable fatal | + + +Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_1.png) + + +上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 + + +错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: + + +1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 + + +2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 + + +3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 + + +# 4. CPU及内存错误注入演示 + + +CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 + + +## 4.1 环境准备 + + +### 1. 安装EINJ模块 + + +使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html + + +此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 + + +### 2. 安装RAS测试工具 + + +直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git + + +### 3. 安装rasdaemon + + +先安装依赖包yum install sqlite perl-DBD-SQLite + + +使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git + + + +``` +autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make +make install +``` + +在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 + + + +``` + -d, --disable 禁用RAS事件并退出 + -e, --enable 使能RAS事件并退出 + -f, --foreground 前台运行 + -r, --record 通过sqlite3记录事件 +``` + +rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 + + +查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 + + +本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 + + +## 4.2 CPU错误注入 + + +本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 + + +使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 + + + +``` +./einj_mem_uc core_non_fatal +0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 +injecting ... +triggering ... +Manually take page offline +Test passed +``` + +使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 + + + + +| | | | | +| --- | --- | --- | --- | +| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | + + +可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=17(core), cnt=0xd +INFO: RAS reg: +INFO: fr = 10a9a2 +INFO: status = 44800007 +INFO: addr = 8007e0e95fffb7ff +INFO: misc0 = 4 +INFO: misc1 = 0 +RTC: 2000-01-06 09:32:09 + core[8] mm(17) return: 0 +--handler(17) end +[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error +[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 +[40858.436229] {42}[Hardware Error]: event severity: recoverable +[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 +[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable +[40858.454204] {42}[Hardware Error]: section_type: ARM processor error +[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 +[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 +[40858.475041] {42}[Hardware Error]: running state: 0x1 +[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 +[40858.487456] {42}[Hardware Error]: Error info structure 0: +[40858.493013] {42}[Hardware Error]: num errors: 1 +[40858.497702] {42}[Hardware Error]: error_type: 0, cache error +[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 +[40858.509857] {42}[Hardware Error]: transaction type: Instruction +[40858.516109] {42}[Hardware Error]: cache level: 2 +[40858.521058] {42}[Hardware Error]: the error has not been corrected +[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered +``` + +## 4.3 内存错误注入 + + +使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 + + + +``` +./einj_mem_uc single +0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 +injecting ... +triggering ... +SIGBUS: addr = 0xffffabcb3400 +page not present +Test passed +``` + +BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=0(exception), cnt=0xa +MM Mem RAS handle,Intr:0 +Ch = 25810000 + |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 + |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 + |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 + |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 + |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 + |-ECCUSYN0~2:1FF,0,76 + |-SBRCTL:1C01591B,SBRSTS:0 +RasData->ExceptionEl: 0, UeCnt:0x1 +RTC: 2000-01-06 09:27:58 +Get SystemAddrss through mAddrTransProtocol start +Get SystemAddrss through mAddrTransProtocol end +s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 +Locate error dimm, Socket:0, Channel:2 Dimm:0 + core[8] mm(0) return: 0 +--handler(0) end +[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) +[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 +[40606.668367] {41}[Hardware Error]: event severity: recoverable +[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 +[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable +[40606.686342] {41}[Hardware Error]: section_type: memory error +[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) +[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 +[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 +[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC +[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered +``` + +## 4.4 rasdaemon日志读取 + + +rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 + + + +``` +[root@localhost ras-tools]# ras-mc-ctl --errors +Memory controller events: +1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +``` + +# 5. Q&A + + +Q:RAS机制是否需要BIOS支持? + + +A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 + + + + + +Q: x86和ARM64的APEI是否一致? + + +A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 + + + + + +Q: RAS注入的错误是真实的错误吗? + + +A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 + + + + + +Q: rasdaemon日志查看是否有更易用的方法? + + +A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; + + +最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 + + + + + +Q: 可否使用mcelog? + + +A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 + + + + + +Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? + + +A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 + + + + + +Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? + + +A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\346\265\213\350\257\225.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\346\265\213\350\257\225.md" new file mode 100644 index 00000000..2a362235 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\346\265\213\350\257\225.md" @@ -0,0 +1,339 @@ +# 1. RAS机制简介 + + +为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: + + +**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 + + +**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 + + +**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 + + +RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 + + +# 2. RAS机制错误处理流程 + + +RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 + + +RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_0.png) + + +# 3. RAS机制评测流程 + + +RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 + + +APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 + + +从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 + + +如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 + + + + +| | +| --- | +| 0 Processor Correctable +1 Processor Uncorrectable non-fatal +2 Processor Uncorrectable fatal | +| 3 Memory Correctable +4 Memory Uncorrectable non-fatal +5 Memory Uncorrectable fatal | +| 6 PCI Express Correctable +7 PCI Express Uncorrectable non-fatal +8 PCI Express Uncorrectable fatal | +| 9 Platform Correctable +10 Platform Uncorrectable non-fatal +11 Platform Uncorrectable fatal | + + +Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 + + +![](assets/ANCK_ARM64_RAS机制简介/img_1.png) + + +上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 + + +错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: + + +1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 + + +2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 + + +3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 + + +# 4. CPU及内存错误注入演示 + + +CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 + + +## 4.1 环境准备 + + +### 1. 安装EINJ模块 + + +使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html + + +此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 + + +### 2. 安装RAS测试工具 + + +直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git + + +### 3. 安装rasdaemon + + +先安装依赖包yum install sqlite perl-DBD-SQLite + + +使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git + + + +``` +autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make +make install +``` + +在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 + + + +``` + -d, --disable 禁用RAS事件并退出 + -e, --enable 使能RAS事件并退出 + -f, --foreground 前台运行 + -r, --record 通过sqlite3记录事件 +``` + +rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 + + +查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 + + +本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 + + +## 4.2 CPU错误注入 + + +本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 + + +使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 + + + +``` +./einj_mem_uc core_non_fatal +0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 +injecting ... +triggering ... +Manually take page offline +Test passed +``` + +使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 + + + + +| | | | | +| --- | --- | --- | --- | +| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | + + +可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=17(core), cnt=0xd +INFO: RAS reg: +INFO: fr = 10a9a2 +INFO: status = 44800007 +INFO: addr = 8007e0e95fffb7ff +INFO: misc0 = 4 +INFO: misc1 = 0 +RTC: 2000-01-06 09:32:09 + core[8] mm(17) return: 0 +--handler(17) end +[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error +[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 +[40858.436229] {42}[Hardware Error]: event severity: recoverable +[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 +[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable +[40858.454204] {42}[Hardware Error]: section_type: ARM processor error +[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 +[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 +[40858.475041] {42}[Hardware Error]: running state: 0x1 +[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 +[40858.487456] {42}[Hardware Error]: Error info structure 0: +[40858.493013] {42}[Hardware Error]: num errors: 1 +[40858.497702] {42}[Hardware Error]: error_type: 0, cache error +[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 +[40858.509857] {42}[Hardware Error]: transaction type: Instruction +[40858.516109] {42}[Hardware Error]: cache level: 2 +[40858.521058] {42}[Hardware Error]: the error has not been corrected +[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered +``` + +## 4.3 内存错误注入 + + +使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 + + + +``` +./einj_mem_uc single +0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 +injecting ... +triggering ... +SIGBUS: addr = 0xffffabcb3400 +page not present +Test passed +``` + +BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 + + + +``` +->Core[8](0x81080000) received intr=0(exception), cnt=0xa +MM Mem RAS handle,Intr:0 +Ch = 25810000 + |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 + |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 + |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 + |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 + |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 + |-ECCUSYN0~2:1FF,0,76 + |-SBRCTL:1C01591B,SBRSTS:0 +RasData->ExceptionEl: 0, UeCnt:0x1 +RTC: 2000-01-06 09:27:58 +Get SystemAddrss through mAddrTransProtocol start +Get SystemAddrss through mAddrTransProtocol end +s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 +Locate error dimm, Socket:0, Channel:2 Dimm:0 + core[8] mm(0) return: 0 +--handler(0) end +[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) +[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 +[40606.668367] {41}[Hardware Error]: event severity: recoverable +[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 +[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable +[40606.686342] {41}[Hardware Error]: section_type: memory error +[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) +[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 +[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 +[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC +[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered +``` + +## 4.4 rasdaemon日志读取 + + +rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 + + + +``` +[root@localhost ras-tools]# ras-mc-ctl --errors +Memory controller events: +1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory +``` + +# 5. Q&A + + +Q:RAS机制是否需要BIOS支持? + + +A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 + + + + + +Q: x86和ARM64的APEI是否一致? + + +A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 + + + + + +Q: RAS注入的错误是真实的错误吗? + + +A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 + + + + + +Q: rasdaemon日志查看是否有更易用的方法? + + +A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; + + +最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 + + + + + +Q: 可否使用mcelog? + + +A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 + + + + + +Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? + + +A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 + + + + + +Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? + + +A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\350\257\264\346\230\216\346\226\207\346\241\243.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\350\257\264\346\230\216\346\226\207\346\241\243.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\350\257\264\346\230\216\346\226\207\346\241\243.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file -- Gitee From d9576f6c4ebdfc6a31928201f2c84d832d59456b Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Fri, 10 Jan 2025 19:54:43 +0800 Subject: [PATCH 065/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9512?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../8888\347\256\200\344\273\213.md" | 3 +++ .../9999\347\256\200\344\273\213.md" | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/8888\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/9999\347\256\200\344\273\213.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/8888\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/8888\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/8888\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/9999\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/9999\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/9999\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file -- Gitee From 9b7b4ee5d3e5cb90b0d198653f4f6a22a1e56f49 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Mon, 13 Jan 2025 10:18:36 +0800 Subject: [PATCH 066/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9513?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test01/\346\265\213\350\257\22502/138983.md" | 12 ++++++++++++ ...257\264\346\230\216\346\226\207\346\241\24301.md" | 7 +++++++ 2 files changed, 19 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/138983.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\350\257\264\346\230\216\346\226\207\346\241\24301.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/138983.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/138983.md" new file mode 100644 index 00000000..25ada85c --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/138983.md" @@ -0,0 +1,12 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 高危CVE的分析、POC和处理。 +- 高危CVE的分析、POC和处理。 +- 高危CVE的分析、POC和处理。 +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\350\257\264\346\230\216\346\226\207\346\241\24301.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\350\257\264\346\230\216\346\226\207\346\241\24301.md" new file mode 100644 index 00000000..9c353741 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\350\257\264\346\230\216\346\226\207\346\241\24301.md" @@ -0,0 +1,7 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file -- Gitee From f54542815b5398ac9764dc7a92dbf0eccbc7615e Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Mon, 13 Jan 2025 10:50:27 +0800 Subject: [PATCH 067/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9514?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../8888\347\256\200\344\273\213.md" | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/8888\347\256\200\344\273\213.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/8888\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/8888\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/8888\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file -- Gitee From b08674d84bb08cf2b93630459aab7b6d79db5b14 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Mon, 13 Jan 2025 11:23:23 +0800 Subject: [PATCH 068/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9515?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/test01/\346\265\213\350\257\22502/22222.md" | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/22222.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/22222.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/22222.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/22222.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file -- Gitee From 4f6db2e5de37fab59b822acbdac4a5a08b4277f3 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Mon, 13 Jan 2025 11:31:21 +0800 Subject: [PATCH 069/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9516?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/test002/22222.md" | 3 +++ .../content/test002/33333.md" | 3 +++ .../9999\347\256\200\344\273\213.md" | 3 +++ .../\347\256\200\344\273\213.md" | 13 +++++++++++++ 4 files changed, 22 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/22222.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/33333.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/9999\347\256\200\344\273\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/\347\256\200\344\273\213.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/22222.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/22222.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/22222.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/33333.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/33333.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/33333.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/9999\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/9999\347\256\200\344\273\213.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/9999\347\256\200\344\273\213.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/\347\256\200\344\273\213.md" new file mode 100644 index 00000000..0ee56960 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/\347\256\200\344\273\213.md" @@ -0,0 +1,13 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 高危CVE的分析、POC和处理。 +- 高危CVE的分析、POC和处理。 +- 高危CVE的分析、POC和处理。 +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file -- Gitee From 2ba912f4abdca40be60de72d7e4a3210afeda501 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Mon, 13 Jan 2025 13:38:57 +0800 Subject: [PATCH 070/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9517?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/test002/11111.md" | 3 +++ .../content/test002/\346\265\213\350\257\22503/11111.md" | 3 +++ .../\347\256\200\344\273\213.md" | 9 +++++++++ 3 files changed, 15 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/11111.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/11111.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/11111.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/11111.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/11111.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/11111.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/11111.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/11111.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/\347\256\200\344\273\213.md" index 0ee56960..5808cb57 100644 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/\347\256\200\344\273\213.md" +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/\347\256\200\344\273\213.md" @@ -10,4 +10,13 @@ - 龙蜥社区贡献的CVE案例分享。 - 龙蜥社区贡献的CVE案例分享。 - 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 - 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file -- Gitee From 0dc11988a1c4ace46ea2ee2987bfdbb0f10e9b39 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Mon, 13 Jan 2025 13:57:14 +0800 Subject: [PATCH 071/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9518?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/test002/11111.md" | 3 --- .../content/test002/22222.md" | 3 --- .../content/test002/33333.md" | 3 --- 3 files changed, 9 deletions(-) delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/11111.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/22222.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/33333.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/11111.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/11111.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/11111.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/22222.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/22222.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/22222.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/33333.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/33333.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/33333.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file -- Gitee From 5915d977a63c52395821e17fdbf85e1138c2128d Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Mon, 13 Jan 2025 14:04:21 +0800 Subject: [PATCH 072/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9519=5F?= =?UTF-8?q?=E4=B8=80=E7=BA=A7=E7=9B=AE=E5=BD=95=E5=A2=9E=E5=8A=A0=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/test002/22222.md" | 6 ++++++ .../content/test002/33333.md" | 6 ++++++ 2 files changed, 12 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/22222.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/33333.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/22222.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/22222.md" new file mode 100644 index 00000000..2807e235 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/22222.md" @@ -0,0 +1,6 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/33333.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/33333.md" new file mode 100644 index 00000000..2807e235 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/33333.md" @@ -0,0 +1,6 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file -- Gitee From bbc0519c1a4fa4ac1d82a2ff6b61636fff1d2e1a Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Mon, 13 Jan 2025 14:58:54 +0800 Subject: [PATCH 073/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9520=5F?= =?UTF-8?q?=E4=B8=80=E7=BA=A7=E7=9B=AE=E5=BD=95=E5=A2=9E=E5=8A=A0=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/test002/11111.md" | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/11111.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/11111.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/11111.md" new file mode 100644 index 00000000..ade5bf41 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/11111.md" @@ -0,0 +1,5 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 + +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file -- Gitee From 16203a49f7168bf8e885e84126744bf91b8a16e0 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Mon, 13 Jan 2025 15:26:56 +0800 Subject: [PATCH 074/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9520=5F?= =?UTF-8?q?=E4=B8=80=E7=BA=A7=E7=9B=AE=E5=BD=95=E5=A2=9E=E5=8A=A0=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/test002/22.md" | 1 - .../ab\347\256\200\344\273\213.md" | 3 - .../aghgb\347\256\200\344\273\213.md" | 3 - ...72\345\210\266\347\256\200\344\273\213.md" | 339 ------------------ .../gb\347\256\200\344\273\213.md" | 3 - ...72\345\210\266\347\256\200\344\273\213.md" | 339 ------------------ .../\347\256\200\344\273\213.md" | 3 - .../\347\256\200\344\273\2132.md" | 3 - .../\346\265\213\350\257\22502/125662333.md" | 3 - .../\346\265\213\350\257\22502/138983.md" | 12 - .../\346\265\213\350\257\22502/22222.md" | 3 - .../465\347\256\200\344\273\213.md" | 3 - .../9999\347\256\200\344\273\213.md" | 3 - .../ceshi02\347\256\200\344\273\213.md" | 3 - .../ceshi03\347\256\200\344\273\213.md" | 3 - ...72\345\210\266\347\256\200\344\273\213.md" | 339 ------------------ .../\346\265\213\350\257\225.md" | 339 ------------------ ...64\346\230\216\346\226\207\346\241\243.md" | 3 - 18 files changed, 1405 deletions(-) rename "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\350\257\264\346\230\216\346\226\207\346\241\24301.md" => "sig/Anolis\350\277\201\347\247\273SIG/content/test002/22.md" (84%) delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/ab\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/aghgb\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/dnasdkaa\346\234\272\345\210\266\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/gb\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\347\256\200\344\273\2132.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/125662333.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/138983.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/22222.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/465\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/9999\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/ceshi02\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/ceshi03\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\346\234\272\345\210\266\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\346\265\213\350\257\225.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\350\257\264\346\230\216\346\226\207\346\241\243.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\350\257\264\346\230\216\346\226\207\346\241\24301.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/22.md" similarity index 84% rename from "sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\350\257\264\346\230\216\346\226\207\346\241\24301.md" rename to "sig/Anolis\350\277\201\347\247\273SIG/content/test002/22.md" index 9c353741..2807e235 100644 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\350\257\264\346\230\216\346\226\207\346\241\24301.md" +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/22.md" @@ -3,5 +3,4 @@ - 龙蜥社区贡献的CVE案例分享。 - 龙蜥社区贡献的CVE案例分享。 - 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 - 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/ab\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/ab\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/ab\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/aghgb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/aghgb\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/aghgb\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/dnasdkaa\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/dnasdkaa\346\234\272\345\210\266\347\256\200\344\273\213.md" deleted file mode 100644 index 2a362235..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/dnasdkaa\346\234\272\345\210\266\347\256\200\344\273\213.md" +++ /dev/null @@ -1,339 +0,0 @@ -# 1. RAS机制简介 - - -为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: - - -**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 - - -**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 - - -**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 - - -RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 - - -# 2. RAS机制错误处理流程 - - -RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 - - -RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_0.png) - - -# 3. RAS机制评测流程 - - -RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 - - -APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 - - -从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 - - -如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 - - - - -| | -| --- | -| 0 Processor Correctable -1 Processor Uncorrectable non-fatal -2 Processor Uncorrectable fatal | -| 3 Memory Correctable -4 Memory Uncorrectable non-fatal -5 Memory Uncorrectable fatal | -| 6 PCI Express Correctable -7 PCI Express Uncorrectable non-fatal -8 PCI Express Uncorrectable fatal | -| 9 Platform Correctable -10 Platform Uncorrectable non-fatal -11 Platform Uncorrectable fatal | - - -Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_1.png) - - -上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 - - -错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: - - -1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 - - -2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 - - -3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 - - -# 4. CPU及内存错误注入演示 - - -CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 - - -## 4.1 环境准备 - - -### 1. 安装EINJ模块 - - -使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html - - -此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 - - -### 2. 安装RAS测试工具 - - -直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git - - -### 3. 安装rasdaemon - - -先安装依赖包yum install sqlite perl-DBD-SQLite - - -使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git - - - -``` -autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make -make install -``` - -在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 - - - -``` - -d, --disable 禁用RAS事件并退出 - -e, --enable 使能RAS事件并退出 - -f, --foreground 前台运行 - -r, --record 通过sqlite3记录事件 -``` - -rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 - - -查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 - - -本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 - - -## 4.2 CPU错误注入 - - -本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 - - -使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 - - - -``` -./einj_mem_uc core_non_fatal -0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 -injecting ... -triggering ... -Manually take page offline -Test passed -``` - -使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 - - - - -| | | | | -| --- | --- | --- | --- | -| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | - - -可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=17(core), cnt=0xd -INFO: RAS reg: -INFO: fr = 10a9a2 -INFO: status = 44800007 -INFO: addr = 8007e0e95fffb7ff -INFO: misc0 = 4 -INFO: misc1 = 0 -RTC: 2000-01-06 09:32:09 - core[8] mm(17) return: 0 ---handler(17) end -[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error -[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 -[40858.436229] {42}[Hardware Error]: event severity: recoverable -[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 -[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable -[40858.454204] {42}[Hardware Error]: section_type: ARM processor error -[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 -[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 -[40858.475041] {42}[Hardware Error]: running state: 0x1 -[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 -[40858.487456] {42}[Hardware Error]: Error info structure 0: -[40858.493013] {42}[Hardware Error]: num errors: 1 -[40858.497702] {42}[Hardware Error]: error_type: 0, cache error -[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 -[40858.509857] {42}[Hardware Error]: transaction type: Instruction -[40858.516109] {42}[Hardware Error]: cache level: 2 -[40858.521058] {42}[Hardware Error]: the error has not been corrected -[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered -``` - -## 4.3 内存错误注入 - - -使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 - - - -``` -./einj_mem_uc single -0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 -injecting ... -triggering ... -SIGBUS: addr = 0xffffabcb3400 -page not present -Test passed -``` - -BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=0(exception), cnt=0xa -MM Mem RAS handle,Intr:0 -Ch = 25810000 - |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 - |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 - |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 - |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 - |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 - |-ECCUSYN0~2:1FF,0,76 - |-SBRCTL:1C01591B,SBRSTS:0 -RasData->ExceptionEl: 0, UeCnt:0x1 -RTC: 2000-01-06 09:27:58 -Get SystemAddrss through mAddrTransProtocol start -Get SystemAddrss through mAddrTransProtocol end -s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 -Locate error dimm, Socket:0, Channel:2 Dimm:0 - core[8] mm(0) return: 0 ---handler(0) end -[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) -[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 -[40606.668367] {41}[Hardware Error]: event severity: recoverable -[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 -[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable -[40606.686342] {41}[Hardware Error]: section_type: memory error -[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) -[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 -[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 -[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC -[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered -``` - -## 4.4 rasdaemon日志读取 - - -rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 - - - -``` -[root@localhost ras-tools]# ras-mc-ctl --errors -Memory controller events: -1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -``` - -# 5. Q&A - - -Q:RAS机制是否需要BIOS支持? - - -A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 - - - - - -Q: x86和ARM64的APEI是否一致? - - -A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 - - - - - -Q: RAS注入的错误是真实的错误吗? - - -A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 - - - - - -Q: rasdaemon日志查看是否有更易用的方法? - - -A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; - - -最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 - - - - - -Q: 可否使用mcelog? - - -A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 - - - - - -Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? - - -A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 - - - - - -Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? - - -A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/gb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/gb\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/gb\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" deleted file mode 100644 index 2a362235..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" +++ /dev/null @@ -1,339 +0,0 @@ -# 1. RAS机制简介 - - -为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: - - -**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 - - -**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 - - -**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 - - -RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 - - -# 2. RAS机制错误处理流程 - - -RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 - - -RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_0.png) - - -# 3. RAS机制评测流程 - - -RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 - - -APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 - - -从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 - - -如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 - - - - -| | -| --- | -| 0 Processor Correctable -1 Processor Uncorrectable non-fatal -2 Processor Uncorrectable fatal | -| 3 Memory Correctable -4 Memory Uncorrectable non-fatal -5 Memory Uncorrectable fatal | -| 6 PCI Express Correctable -7 PCI Express Uncorrectable non-fatal -8 PCI Express Uncorrectable fatal | -| 9 Platform Correctable -10 Platform Uncorrectable non-fatal -11 Platform Uncorrectable fatal | - - -Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_1.png) - - -上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 - - -错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: - - -1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 - - -2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 - - -3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 - - -# 4. CPU及内存错误注入演示 - - -CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 - - -## 4.1 环境准备 - - -### 1. 安装EINJ模块 - - -使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html - - -此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 - - -### 2. 安装RAS测试工具 - - -直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git - - -### 3. 安装rasdaemon - - -先安装依赖包yum install sqlite perl-DBD-SQLite - - -使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git - - - -``` -autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make -make install -``` - -在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 - - - -``` - -d, --disable 禁用RAS事件并退出 - -e, --enable 使能RAS事件并退出 - -f, --foreground 前台运行 - -r, --record 通过sqlite3记录事件 -``` - -rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 - - -查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 - - -本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 - - -## 4.2 CPU错误注入 - - -本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 - - -使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 - - - -``` -./einj_mem_uc core_non_fatal -0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 -injecting ... -triggering ... -Manually take page offline -Test passed -``` - -使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 - - - - -| | | | | -| --- | --- | --- | --- | -| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | - - -可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=17(core), cnt=0xd -INFO: RAS reg: -INFO: fr = 10a9a2 -INFO: status = 44800007 -INFO: addr = 8007e0e95fffb7ff -INFO: misc0 = 4 -INFO: misc1 = 0 -RTC: 2000-01-06 09:32:09 - core[8] mm(17) return: 0 ---handler(17) end -[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error -[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 -[40858.436229] {42}[Hardware Error]: event severity: recoverable -[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 -[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable -[40858.454204] {42}[Hardware Error]: section_type: ARM processor error -[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 -[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 -[40858.475041] {42}[Hardware Error]: running state: 0x1 -[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 -[40858.487456] {42}[Hardware Error]: Error info structure 0: -[40858.493013] {42}[Hardware Error]: num errors: 1 -[40858.497702] {42}[Hardware Error]: error_type: 0, cache error -[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 -[40858.509857] {42}[Hardware Error]: transaction type: Instruction -[40858.516109] {42}[Hardware Error]: cache level: 2 -[40858.521058] {42}[Hardware Error]: the error has not been corrected -[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered -``` - -## 4.3 内存错误注入 - - -使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 - - - -``` -./einj_mem_uc single -0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 -injecting ... -triggering ... -SIGBUS: addr = 0xffffabcb3400 -page not present -Test passed -``` - -BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=0(exception), cnt=0xa -MM Mem RAS handle,Intr:0 -Ch = 25810000 - |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 - |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 - |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 - |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 - |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 - |-ECCUSYN0~2:1FF,0,76 - |-SBRCTL:1C01591B,SBRSTS:0 -RasData->ExceptionEl: 0, UeCnt:0x1 -RTC: 2000-01-06 09:27:58 -Get SystemAddrss through mAddrTransProtocol start -Get SystemAddrss through mAddrTransProtocol end -s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 -Locate error dimm, Socket:0, Channel:2 Dimm:0 - core[8] mm(0) return: 0 ---handler(0) end -[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) -[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 -[40606.668367] {41}[Hardware Error]: event severity: recoverable -[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 -[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable -[40606.686342] {41}[Hardware Error]: section_type: memory error -[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) -[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 -[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 -[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC -[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered -``` - -## 4.4 rasdaemon日志读取 - - -rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 - - - -``` -[root@localhost ras-tools]# ras-mc-ctl --errors -Memory controller events: -1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -``` - -# 5. Q&A - - -Q:RAS机制是否需要BIOS支持? - - -A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 - - - - - -Q: x86和ARM64的APEI是否一致? - - -A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 - - - - - -Q: RAS注入的错误是真实的错误吗? - - -A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 - - - - - -Q: rasdaemon日志查看是否有更易用的方法? - - -A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; - - -最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 - - - - - -Q: 可否使用mcelog? - - -A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 - - - - - -Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? - - -A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 - - - - - -Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? - - -A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\347\256\200\344\273\2132.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\347\256\200\344\273\2132.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22501/\347\256\200\344\273\2132.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/125662333.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/125662333.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/125662333.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/138983.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/138983.md" deleted file mode 100644 index 25ada85c..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/138983.md" +++ /dev/null @@ -1,12 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 高危CVE的分析、POC和处理。 -- 高危CVE的分析、POC和处理。 -- 高危CVE的分析、POC和处理。 -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/22222.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/22222.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/22222.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/465\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/465\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/465\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/9999\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/9999\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/9999\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/ceshi02\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/ceshi02\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/ceshi02\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/ceshi03\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/ceshi03\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/ceshi03\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\346\234\272\345\210\266\347\256\200\344\273\213.md" deleted file mode 100644 index 2a362235..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\346\234\272\345\210\266\347\256\200\344\273\213.md" +++ /dev/null @@ -1,339 +0,0 @@ -# 1. RAS机制简介 - - -为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: - - -**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 - - -**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 - - -**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 - - -RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 - - -# 2. RAS机制错误处理流程 - - -RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 - - -RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_0.png) - - -# 3. RAS机制评测流程 - - -RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 - - -APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 - - -从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 - - -如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 - - - - -| | -| --- | -| 0 Processor Correctable -1 Processor Uncorrectable non-fatal -2 Processor Uncorrectable fatal | -| 3 Memory Correctable -4 Memory Uncorrectable non-fatal -5 Memory Uncorrectable fatal | -| 6 PCI Express Correctable -7 PCI Express Uncorrectable non-fatal -8 PCI Express Uncorrectable fatal | -| 9 Platform Correctable -10 Platform Uncorrectable non-fatal -11 Platform Uncorrectable fatal | - - -Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_1.png) - - -上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 - - -错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: - - -1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 - - -2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 - - -3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 - - -# 4. CPU及内存错误注入演示 - - -CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 - - -## 4.1 环境准备 - - -### 1. 安装EINJ模块 - - -使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html - - -此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 - - -### 2. 安装RAS测试工具 - - -直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git - - -### 3. 安装rasdaemon - - -先安装依赖包yum install sqlite perl-DBD-SQLite - - -使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git - - - -``` -autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make -make install -``` - -在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 - - - -``` - -d, --disable 禁用RAS事件并退出 - -e, --enable 使能RAS事件并退出 - -f, --foreground 前台运行 - -r, --record 通过sqlite3记录事件 -``` - -rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 - - -查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 - - -本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 - - -## 4.2 CPU错误注入 - - -本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 - - -使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 - - - -``` -./einj_mem_uc core_non_fatal -0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 -injecting ... -triggering ... -Manually take page offline -Test passed -``` - -使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 - - - - -| | | | | -| --- | --- | --- | --- | -| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | - - -可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=17(core), cnt=0xd -INFO: RAS reg: -INFO: fr = 10a9a2 -INFO: status = 44800007 -INFO: addr = 8007e0e95fffb7ff -INFO: misc0 = 4 -INFO: misc1 = 0 -RTC: 2000-01-06 09:32:09 - core[8] mm(17) return: 0 ---handler(17) end -[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error -[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 -[40858.436229] {42}[Hardware Error]: event severity: recoverable -[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 -[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable -[40858.454204] {42}[Hardware Error]: section_type: ARM processor error -[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 -[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 -[40858.475041] {42}[Hardware Error]: running state: 0x1 -[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 -[40858.487456] {42}[Hardware Error]: Error info structure 0: -[40858.493013] {42}[Hardware Error]: num errors: 1 -[40858.497702] {42}[Hardware Error]: error_type: 0, cache error -[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 -[40858.509857] {42}[Hardware Error]: transaction type: Instruction -[40858.516109] {42}[Hardware Error]: cache level: 2 -[40858.521058] {42}[Hardware Error]: the error has not been corrected -[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered -``` - -## 4.3 内存错误注入 - - -使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 - - - -``` -./einj_mem_uc single -0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 -injecting ... -triggering ... -SIGBUS: addr = 0xffffabcb3400 -page not present -Test passed -``` - -BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=0(exception), cnt=0xa -MM Mem RAS handle,Intr:0 -Ch = 25810000 - |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 - |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 - |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 - |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 - |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 - |-ECCUSYN0~2:1FF,0,76 - |-SBRCTL:1C01591B,SBRSTS:0 -RasData->ExceptionEl: 0, UeCnt:0x1 -RTC: 2000-01-06 09:27:58 -Get SystemAddrss through mAddrTransProtocol start -Get SystemAddrss through mAddrTransProtocol end -s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 -Locate error dimm, Socket:0, Channel:2 Dimm:0 - core[8] mm(0) return: 0 ---handler(0) end -[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) -[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 -[40606.668367] {41}[Hardware Error]: event severity: recoverable -[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 -[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable -[40606.686342] {41}[Hardware Error]: section_type: memory error -[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) -[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 -[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 -[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC -[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered -``` - -## 4.4 rasdaemon日志读取 - - -rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 - - - -``` -[root@localhost ras-tools]# ras-mc-ctl --errors -Memory controller events: -1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -``` - -# 5. Q&A - - -Q:RAS机制是否需要BIOS支持? - - -A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 - - - - - -Q: x86和ARM64的APEI是否一致? - - -A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 - - - - - -Q: RAS注入的错误是真实的错误吗? - - -A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 - - - - - -Q: rasdaemon日志查看是否有更易用的方法? - - -A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; - - -最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 - - - - - -Q: 可否使用mcelog? - - -A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 - - - - - -Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? - - -A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 - - - - - -Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? - - -A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\346\265\213\350\257\225.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\346\265\213\350\257\225.md" deleted file mode 100644 index 2a362235..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\346\265\213\350\257\225.md" +++ /dev/null @@ -1,339 +0,0 @@ -# 1. RAS机制简介 - - -为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: - - -**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 - - -**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 - - -**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 - - -RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 - - -# 2. RAS机制错误处理流程 - - -RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 - - -RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_0.png) - - -# 3. RAS机制评测流程 - - -RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 - - -APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 - - -从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 - - -如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 - - - - -| | -| --- | -| 0 Processor Correctable -1 Processor Uncorrectable non-fatal -2 Processor Uncorrectable fatal | -| 3 Memory Correctable -4 Memory Uncorrectable non-fatal -5 Memory Uncorrectable fatal | -| 6 PCI Express Correctable -7 PCI Express Uncorrectable non-fatal -8 PCI Express Uncorrectable fatal | -| 9 Platform Correctable -10 Platform Uncorrectable non-fatal -11 Platform Uncorrectable fatal | - - -Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_1.png) - - -上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 - - -错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: - - -1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 - - -2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 - - -3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 - - -# 4. CPU及内存错误注入演示 - - -CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 - - -## 4.1 环境准备 - - -### 1. 安装EINJ模块 - - -使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html - - -此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 - - -### 2. 安装RAS测试工具 - - -直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git - - -### 3. 安装rasdaemon - - -先安装依赖包yum install sqlite perl-DBD-SQLite - - -使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git - - - -``` -autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make -make install -``` - -在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 - - - -``` - -d, --disable 禁用RAS事件并退出 - -e, --enable 使能RAS事件并退出 - -f, --foreground 前台运行 - -r, --record 通过sqlite3记录事件 -``` - -rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 - - -查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 - - -本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 - - -## 4.2 CPU错误注入 - - -本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 - - -使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 - - - -``` -./einj_mem_uc core_non_fatal -0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 -injecting ... -triggering ... -Manually take page offline -Test passed -``` - -使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 - - - - -| | | | | -| --- | --- | --- | --- | -| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | - - -可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=17(core), cnt=0xd -INFO: RAS reg: -INFO: fr = 10a9a2 -INFO: status = 44800007 -INFO: addr = 8007e0e95fffb7ff -INFO: misc0 = 4 -INFO: misc1 = 0 -RTC: 2000-01-06 09:32:09 - core[8] mm(17) return: 0 ---handler(17) end -[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error -[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 -[40858.436229] {42}[Hardware Error]: event severity: recoverable -[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 -[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable -[40858.454204] {42}[Hardware Error]: section_type: ARM processor error -[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 -[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 -[40858.475041] {42}[Hardware Error]: running state: 0x1 -[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 -[40858.487456] {42}[Hardware Error]: Error info structure 0: -[40858.493013] {42}[Hardware Error]: num errors: 1 -[40858.497702] {42}[Hardware Error]: error_type: 0, cache error -[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 -[40858.509857] {42}[Hardware Error]: transaction type: Instruction -[40858.516109] {42}[Hardware Error]: cache level: 2 -[40858.521058] {42}[Hardware Error]: the error has not been corrected -[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered -``` - -## 4.3 内存错误注入 - - -使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 - - - -``` -./einj_mem_uc single -0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 -injecting ... -triggering ... -SIGBUS: addr = 0xffffabcb3400 -page not present -Test passed -``` - -BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=0(exception), cnt=0xa -MM Mem RAS handle,Intr:0 -Ch = 25810000 - |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 - |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 - |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 - |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 - |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 - |-ECCUSYN0~2:1FF,0,76 - |-SBRCTL:1C01591B,SBRSTS:0 -RasData->ExceptionEl: 0, UeCnt:0x1 -RTC: 2000-01-06 09:27:58 -Get SystemAddrss through mAddrTransProtocol start -Get SystemAddrss through mAddrTransProtocol end -s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 -Locate error dimm, Socket:0, Channel:2 Dimm:0 - core[8] mm(0) return: 0 ---handler(0) end -[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) -[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 -[40606.668367] {41}[Hardware Error]: event severity: recoverable -[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 -[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable -[40606.686342] {41}[Hardware Error]: section_type: memory error -[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) -[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 -[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 -[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC -[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered -``` - -## 4.4 rasdaemon日志读取 - - -rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 - - - -``` -[root@localhost ras-tools]# ras-mc-ctl --errors -Memory controller events: -1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -``` - -# 5. Q&A - - -Q:RAS机制是否需要BIOS支持? - - -A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 - - - - - -Q: x86和ARM64的APEI是否一致? - - -A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 - - - - - -Q: RAS注入的错误是真实的错误吗? - - -A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 - - - - - -Q: rasdaemon日志查看是否有更易用的方法? - - -A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; - - -最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 - - - - - -Q: 可否使用mcelog? - - -A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 - - - - - -Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? - - -A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 - - - - - -Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? - - -A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\350\257\264\346\230\216\346\226\207\346\241\243.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\350\257\264\346\230\216\346\226\207\346\241\243.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test01/\346\265\213\350\257\22502/\350\257\264\346\230\216\346\226\207\346\241\243.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file -- Gitee From 1012be63d29a43695b140a12eb488ee2122c6313 Mon Sep 17 00:00:00 2001 From: WB01533938 Date: Mon, 13 Jan 2025 15:31:06 +0800 Subject: [PATCH 075/135] =?UTF-8?q?ci:=20=E6=9B=B4=E6=96=B0=20TC=5FProject?= =?UTF-8?q?.yml=20=E6=96=87=E4=BB=B6-=20=E7=A7=BB=E9=99=A4=E4=BA=86?= =?UTF-8?q?=E5=A4=9A=E4=B8=AA=20project=5Fid=20=E5=92=8C=E5=AF=B9=E5=BA=94?= =?UTF-8?q?=E7=9A=84=20repos=20=E9=85=8D=E7=BD=AE=20-=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E4=BA=86=20openanolis-copy/docs=20=E9=A1=B9=E7=9B=AE=E7=9A=84?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=20-=20=E5=88=A0=E9=99=A4=E4=BA=86=E5=86=97?= =?UTF-8?q?=E4=BD=99=E7=9A=84=E7=A9=BA=E8=A1=8C=E5=92=8C=E4=B8=8D=E5=BF=85?= =?UTF-8?q?=E8=A6=81=E7=9A=84=E7=BC=A9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TC_Project.yml | 75 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/TC_Project.yml b/TC_Project.yml index 656566d1..316351aa 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -14,4 +14,77 @@ projects: dir_or_files: - sig/AI - sig/AI/sig-info.yaml - - sig/AI/README.md \ No newline at end of file + - sig/AI/README.md + - project_id: TC2024080202 + repos: + - repo_name: openanolis-copy/community2 + dir_or_files: + - sig/AI + - sig/AI/sig-info.yaml + - sig/AI/README.md + - project_id: TC2024080403 + repos: + - repo_name: openanolis-copy/community + dir_or_files: + - sig/AI/content + - sig/AI/sig-info.yaml + - sig/AI/README.md + - project_id: TC2024080503 + repos: + - repo_name: openanolis-copy/community + dir_or_files: + - sig/AI/content + - sig/AI/sig-info.yaml + - sig/AI/README.md + - project_id: TC2024080812 + repos: + - repo_name: anolis/anolis7.9els + dir_or_files: + + - project_id: TC2024120001 + repos: + - repo_name: openanolis-copy/docs + dir_or_files: + - DEVELOPER_DOCS + - CESHI_ZHUANYONG/CI及代码门禁/日志文件 + + - project_id: TC2024110203 + repos: + - repo_name: anolis/qemu-kvm + dir_or_files: + - project_id: TC2024120201 + repos: + - repo_name: src-anolis-os/qemu + dir_or_files: + - project_id: TC2024120201 + repos: + - repo_name: src-anolis-os/edk2 + dir_or_files: + - project_id: TC2024120201 + repos: + - repo_name: src-anolis-os/libvirt + dir_or_files: + - project_id: TC2024120201 + repos: + - repo_name: src-anolis-os/gcc + dir_or_files: + - project_id: TC2024120201 + repos: + - repo_name: src-anolis-os/tpm2-tools + dir_or_files: + - project_id: TC2024120201 + repos: + - repo_name: src-anolis-os/tpm2-abrmd + dir_or_files: + - project_id: TC2024110202 + repos: + - repo_name: anolis/cloud-kernel + dir_or_files: + - project_id: TC2024110202 + repos: + - repo_name: src-anolis-sig/cloud-kernel + dir_or_files: + - project_id: TC2024080205 + repos: + - repo_name: anolis/anolis-container + dir_or_files: \ No newline at end of file -- Gitee From 4c2efb6b9132aaa0ab6f48be66bfa5c0c4b71094 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Mon, 13 Jan 2025 15:41:46 +0800 Subject: [PATCH 076/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9522=5F?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=87=E4=BB=B6=E3=80=81=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/test003/654321.md" | 6 +++++ .../content/test003/999.md" | 6 +++++ .../\345\223\210\345\223\210\345\223\210.md" | 6 +++++ .../\346\265\213\350\257\22504/555555.md" | 3 +++ .../\346\265\213\350\257\22504/dhaisdasjd.md" | 3 +++ ...13\347\273\215\344\270\200\344\270\213.md" | 22 +++++++++++++++++++ ...13\347\273\215\344\275\240\347\232\204.md" | 22 +++++++++++++++++++ ...31\346\230\257\344\270\200\344\270\252.md" | 5 +++++ 8 files changed, 73 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/654321.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/999.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/\345\223\210\345\223\210\345\223\210.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/555555.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/dhaisdasjd.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/\344\273\213\347\273\215\344\270\200\344\270\213.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/\344\273\213\347\273\215\344\275\240\347\232\204.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/\350\277\231\346\230\257\344\270\200\344\270\252.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/654321.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/654321.md" new file mode 100644 index 00000000..2807e235 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/654321.md" @@ -0,0 +1,6 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/999.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/999.md" new file mode 100644 index 00000000..2807e235 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/999.md" @@ -0,0 +1,6 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\345\223\210\345\223\210\345\223\210.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\345\223\210\345\223\210\345\223\210.md" new file mode 100644 index 00000000..2807e235 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\345\223\210\345\223\210\345\223\210.md" @@ -0,0 +1,6 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/555555.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/555555.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/555555.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/dhaisdasjd.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/dhaisdasjd.md" new file mode 100644 index 00000000..110c33fe --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/dhaisdasjd.md" @@ -0,0 +1,3 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/\344\273\213\347\273\215\344\270\200\344\270\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/\344\273\213\347\273\215\344\270\200\344\270\213.md" new file mode 100644 index 00000000..5808cb57 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/\344\273\213\347\273\215\344\270\200\344\270\213.md" @@ -0,0 +1,22 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 高危CVE的分析、POC和处理。 +- 高危CVE的分析、POC和处理。 +- 高危CVE的分析、POC和处理。 +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/\344\273\213\347\273\215\344\275\240\347\232\204.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/\344\273\213\347\273\215\344\275\240\347\232\204.md" new file mode 100644 index 00000000..5808cb57 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/\344\273\213\347\273\215\344\275\240\347\232\204.md" @@ -0,0 +1,22 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 高危CVE的分析、POC和处理。 +- 高危CVE的分析、POC和处理。 +- 高危CVE的分析、POC和处理。 +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\350\277\231\346\230\257\344\270\200\344\270\252.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\350\277\231\346\230\257\344\270\200\344\270\252.md" new file mode 100644 index 00000000..ade5bf41 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\350\277\231\346\230\257\344\270\200\344\270\252.md" @@ -0,0 +1,5 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 + +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file -- Gitee From 3ea9676c0bbd871920793cc17ecf8b97aff11da7 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Mon, 13 Jan 2025 15:53:11 +0800 Subject: [PATCH 077/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9523=5F?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=87=E4=BB=B6=E3=80=81=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/test003/abc/\345\220\274\345\220\274.md" | 6 ++++++ .../content/test003/\346\265\213\350\257\22505/654.md" | 6 ++++++ .../\345\223\246\345\223\246\345\223\246.md" | 6 ++++++ 3 files changed, 18 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/abc/\345\220\274\345\220\274.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22505/654.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22505/\345\223\246\345\223\246\345\223\246.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/abc/\345\220\274\345\220\274.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/abc/\345\220\274\345\220\274.md" new file mode 100644 index 00000000..2807e235 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/abc/\345\220\274\345\220\274.md" @@ -0,0 +1,6 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22505/654.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22505/654.md" new file mode 100644 index 00000000..2807e235 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22505/654.md" @@ -0,0 +1,6 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22505/\345\223\246\345\223\246\345\223\246.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22505/\345\223\246\345\223\246\345\223\246.md" new file mode 100644 index 00000000..2807e235 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22505/\345\223\246\345\223\246\345\223\246.md" @@ -0,0 +1,6 @@ +本项目专注于: +- 高危CVE的分析、POC和处理。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 +- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file -- Gitee From 46f9def691bc24f14b4e1c3c088120a4f810a96a Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Tue, 14 Jan 2025 14:16:34 +0800 Subject: [PATCH 078/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9524=5F?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=E3=80=81=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/test002/11111.md" | 5 - .../content/test002/22.md" | 6 - .../content/test002/22222.md" | 6 - .../content/test002/33333.md" | 6 - .../\346\265\213\350\257\22503/11111.md" | 3 - .../9999\347\256\200\344\273\213.md" | 3 - .../\347\256\200\344\273\213.md" | 22 -- .../content/test003/654321.md" | 6 - .../content/test003/999.md" | 6 - .../test003/abc/\345\220\274\345\220\274.md" | 6 - .../\345\223\210\345\223\210\345\223\210.md" | 6 - .../\346\265\213\350\257\22504/555555.md" | 3 - .../\346\265\213\350\257\22504/dhaisdasjd.md" | 3 - ...13\347\273\215\344\270\200\344\270\213.md" | 22 -- ...13\347\273\215\344\275\240\347\232\204.md" | 22 -- .../\346\265\213\350\257\22505/654.md" | 6 - .../\345\223\246\345\223\246\345\223\246.md" | 6 - ...31\346\230\257\344\270\200\344\270\252.md" | 5 - .../ab\347\256\200\344\273\213.md" | 3 - .../aghgb\347\256\200\344\273\213.md" | 3 - .../gb\347\256\200\344\273\213.md" | 3 - ...72\345\210\266\347\256\200\344\273\213.md" | 339 ------------------ .../\347\256\200\344\273\213.md" | 3 - .../\347\256\200\344\273\2132.md" | 3 - .../ab\347\256\200\344\273\213.md" | 3 - ...72\345\210\266\347\256\200\344\273\213.md" | 339 ------------------ .../\347\256\200\344\273\2132.md" | 3 - 27 files changed, 841 deletions(-) delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/11111.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/22.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/22222.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/33333.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/11111.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/9999\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/654321.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/999.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/abc/\345\220\274\345\220\274.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/\345\223\210\345\223\210\345\223\210.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/555555.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/dhaisdasjd.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/\344\273\213\347\273\215\344\270\200\344\270\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/\344\273\213\347\273\215\344\275\240\347\232\204.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22505/654.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22505/\345\223\246\345\223\246\345\223\246.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test003/\350\277\231\346\230\257\344\270\200\344\270\252.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/11111.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/11111.md" deleted file mode 100644 index ade5bf41..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/11111.md" +++ /dev/null @@ -1,5 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 - -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/22.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/22.md" deleted file mode 100644 index 2807e235..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/22.md" +++ /dev/null @@ -1,6 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/22222.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/22222.md" deleted file mode 100644 index 2807e235..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/22222.md" +++ /dev/null @@ -1,6 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/33333.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/33333.md" deleted file mode 100644 index 2807e235..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/33333.md" +++ /dev/null @@ -1,6 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/11111.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/11111.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/11111.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/9999\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/9999\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/9999\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/\347\256\200\344\273\213.md" deleted file mode 100644 index 5808cb57..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\346\265\213\350\257\22503/\347\256\200\344\273\213.md" +++ /dev/null @@ -1,22 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 高危CVE的分析、POC和处理。 -- 高危CVE的分析、POC和处理。 -- 高危CVE的分析、POC和处理。 -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/654321.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/654321.md" deleted file mode 100644 index 2807e235..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/654321.md" +++ /dev/null @@ -1,6 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/999.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/999.md" deleted file mode 100644 index 2807e235..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/999.md" +++ /dev/null @@ -1,6 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/abc/\345\220\274\345\220\274.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/abc/\345\220\274\345\220\274.md" deleted file mode 100644 index 2807e235..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/abc/\345\220\274\345\220\274.md" +++ /dev/null @@ -1,6 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\345\223\210\345\223\210\345\223\210.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\345\223\210\345\223\210\345\223\210.md" deleted file mode 100644 index 2807e235..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\345\223\210\345\223\210\345\223\210.md" +++ /dev/null @@ -1,6 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/555555.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/555555.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/555555.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/dhaisdasjd.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/dhaisdasjd.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/dhaisdasjd.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/\344\273\213\347\273\215\344\270\200\344\270\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/\344\273\213\347\273\215\344\270\200\344\270\213.md" deleted file mode 100644 index 5808cb57..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/\344\273\213\347\273\215\344\270\200\344\270\213.md" +++ /dev/null @@ -1,22 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 高危CVE的分析、POC和处理。 -- 高危CVE的分析、POC和处理。 -- 高危CVE的分析、POC和处理。 -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/\344\273\213\347\273\215\344\275\240\347\232\204.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/\344\273\213\347\273\215\344\275\240\347\232\204.md" deleted file mode 100644 index 5808cb57..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22504/\344\273\213\347\273\215\344\275\240\347\232\204.md" +++ /dev/null @@ -1,22 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 高危CVE的分析、POC和处理。 -- 高危CVE的分析、POC和处理。 -- 高危CVE的分析、POC和处理。 -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22505/654.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22505/654.md" deleted file mode 100644 index 2807e235..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22505/654.md" +++ /dev/null @@ -1,6 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22505/\345\223\246\345\223\246\345\223\246.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22505/\345\223\246\345\223\246\345\223\246.md" deleted file mode 100644 index 2807e235..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\346\265\213\350\257\22505/\345\223\246\345\223\246\345\223\246.md" +++ /dev/null @@ -1,6 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\350\277\231\346\230\257\344\270\200\344\270\252.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\350\277\231\346\230\257\344\270\200\344\270\252.md" deleted file mode 100644 index ade5bf41..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test003/\350\277\231\346\230\257\344\270\200\344\270\252.md" +++ /dev/null @@ -1,5 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 - -- 龙蜥社区贡献的CVE案例分享。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/aghgb\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/gb\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" deleted file mode 100644 index 2a362235..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" +++ /dev/null @@ -1,339 +0,0 @@ -# 1. RAS机制简介 - - -为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: - - -**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 - - -**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 - - -**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 - - -RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 - - -# 2. RAS机制错误处理流程 - - -RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 - - -RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_0.png) - - -# 3. RAS机制评测流程 - - -RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 - - -APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 - - -从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 - - -如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 - - - - -| | -| --- | -| 0 Processor Correctable -1 Processor Uncorrectable non-fatal -2 Processor Uncorrectable fatal | -| 3 Memory Correctable -4 Memory Uncorrectable non-fatal -5 Memory Uncorrectable fatal | -| 6 PCI Express Correctable -7 PCI Express Uncorrectable non-fatal -8 PCI Express Uncorrectable fatal | -| 9 Platform Correctable -10 Platform Uncorrectable non-fatal -11 Platform Uncorrectable fatal | - - -Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_1.png) - - -上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 - - -错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: - - -1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 - - -2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 - - -3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 - - -# 4. CPU及内存错误注入演示 - - -CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 - - -## 4.1 环境准备 - - -### 1. 安装EINJ模块 - - -使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html - - -此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 - - -### 2. 安装RAS测试工具 - - -直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git - - -### 3. 安装rasdaemon - - -先安装依赖包yum install sqlite perl-DBD-SQLite - - -使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git - - - -``` -autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make -make install -``` - -在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 - - - -``` - -d, --disable 禁用RAS事件并退出 - -e, --enable 使能RAS事件并退出 - -f, --foreground 前台运行 - -r, --record 通过sqlite3记录事件 -``` - -rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 - - -查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 - - -本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 - - -## 4.2 CPU错误注入 - - -本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 - - -使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 - - - -``` -./einj_mem_uc core_non_fatal -0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 -injecting ... -triggering ... -Manually take page offline -Test passed -``` - -使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 - - - - -| | | | | -| --- | --- | --- | --- | -| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | - - -可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=17(core), cnt=0xd -INFO: RAS reg: -INFO: fr = 10a9a2 -INFO: status = 44800007 -INFO: addr = 8007e0e95fffb7ff -INFO: misc0 = 4 -INFO: misc1 = 0 -RTC: 2000-01-06 09:32:09 - core[8] mm(17) return: 0 ---handler(17) end -[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error -[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 -[40858.436229] {42}[Hardware Error]: event severity: recoverable -[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 -[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable -[40858.454204] {42}[Hardware Error]: section_type: ARM processor error -[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 -[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 -[40858.475041] {42}[Hardware Error]: running state: 0x1 -[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 -[40858.487456] {42}[Hardware Error]: Error info structure 0: -[40858.493013] {42}[Hardware Error]: num errors: 1 -[40858.497702] {42}[Hardware Error]: error_type: 0, cache error -[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 -[40858.509857] {42}[Hardware Error]: transaction type: Instruction -[40858.516109] {42}[Hardware Error]: cache level: 2 -[40858.521058] {42}[Hardware Error]: the error has not been corrected -[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered -``` - -## 4.3 内存错误注入 - - -使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 - - - -``` -./einj_mem_uc single -0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 -injecting ... -triggering ... -SIGBUS: addr = 0xffffabcb3400 -page not present -Test passed -``` - -BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=0(exception), cnt=0xa -MM Mem RAS handle,Intr:0 -Ch = 25810000 - |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 - |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 - |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 - |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 - |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 - |-ECCUSYN0~2:1FF,0,76 - |-SBRCTL:1C01591B,SBRSTS:0 -RasData->ExceptionEl: 0, UeCnt:0x1 -RTC: 2000-01-06 09:27:58 -Get SystemAddrss through mAddrTransProtocol start -Get SystemAddrss through mAddrTransProtocol end -s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 -Locate error dimm, Socket:0, Channel:2 Dimm:0 - core[8] mm(0) return: 0 ---handler(0) end -[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) -[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 -[40606.668367] {41}[Hardware Error]: event severity: recoverable -[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 -[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable -[40606.686342] {41}[Hardware Error]: section_type: memory error -[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) -[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 -[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 -[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC -[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered -``` - -## 4.4 rasdaemon日志读取 - - -rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 - - - -``` -[root@localhost ras-tools]# ras-mc-ctl --errors -Memory controller events: -1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -``` - -# 5. Q&A - - -Q:RAS机制是否需要BIOS支持? - - -A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 - - - - - -Q: x86和ARM64的APEI是否一致? - - -A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 - - - - - -Q: RAS注入的错误是真实的错误吗? - - -A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 - - - - - -Q: rasdaemon日志查看是否有更易用的方法? - - -A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; - - -最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 - - - - - -Q: 可否使用mcelog? - - -A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 - - - - - -Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? - - -A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 - - - - - -Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? - - -A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/asadasd\346\265\213\350\257\225/\347\256\200\344\273\2132.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/ab\347\256\200\344\273\213.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" deleted file mode 100644 index 2a362235..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\346\265\213\350\257\225\346\234\272\345\210\266\347\256\200\344\273\213.md" +++ /dev/null @@ -1,339 +0,0 @@ -# 1. RAS机制简介 - - -为了提高系统的容错能力及可用性, 面向服务器的处理器芯片都需要支持 RAS 机制。RAS是可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的简称,分别代表下面的意义: - - -**Reliability**:指的是系统尽可能最大化运行时间,不会意外崩溃,重启甚至系统物理损坏,即对于某些错误能做到自动修复,无法自修复的也尽可能进行隔离,保证系统正常运转。 - - -**Availability**:指的是系统最大限度减少非预期宕机的时间,当出现问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行替换组件操作,严格确保系统宕机时间在一定范围内。 - - -**Serviceability**:指的是系统提供诊断功能,例如系统日志,动态检测等手段方便管理人员进行系统诊断和维护操作,尽早发现并修复错误。 - - -RAS是评估服务器系统容错能力及可用性评测的一项关键指标。错误等级可分为三级分别是可纠正错误(Corrected Error, CE)、可恢复错误(Uncorrected Error, UE)以及致命错误(Fatal),RAS机制实现对错误的分级处理。 - - -# 2. RAS机制错误处理流程 - - -RAS机制需要硬件、固件、OS内核协同工作才能得以支持,因此需要一个统一高效的接口来进行硬件错误的上报与处理。ACPI Platform Error Interfaces(APEI)正是为解决这一问题而出现,APEI规范统一了软硬件接口。它通过提供BOOT Error Record Table (BERT)、Error Record Serialization Table (ERST)、Error Injection Table (EINJ)以及Hardware Error Source Table (HEST)这四张表来实现OS内核与固件、硬件之间的协同工作,其中,HEST用于错误上报,EINJ用于错误注入。 - - -RAS机制错误处理流程如下,当硬件(如CPU、内存、PCIe总线)产生错误时,中断信号会首先交由运行在Secure World的固件处理,固件首先调用CPER库产生规范化的错误信息记录并填入CPER表中,然后将中断信号交由linux内核处理。linux内核中SDEI驱动接收该中断并调用ghes\_proc\_in\_irq函数从ACPI Table中读取错误信息,然后调用ghes\_do\_proc对错误进行处理,并且调用ghes\_print\_estatus打印错误信息。ghes\_do\_proc函数会最终调用memory\_failure函数对内存以及Cache的UE错误进行处理,对于CPU错误进行记录,对于fatal错误则会产生kernel panic。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_0.png) - - -# 3. RAS机制评测流程 - - -RAS提供的EINJ机制可以在系统发布之前评测系统的可靠性、容错性以及完备性。EINJ 可以注入各种类型的硬件错误,这些注入的错误通过 EINJ 和底层 firmware 以及硬件共同配合产生的,对于软件来说和硬件真实发生的错误没有差别。 - - -APEI按照错误等级以及错误类型进行组合,总共支持以下12种错误注入,需要以实际系统支持的错误注入类型为准。 - - -从表中可以看到,错误类型分别有Processor错误、Memory错误、PCIe错误以及Platform错误。典型的Processor错误有L1-Cache/L2-Cache/TLB中出现数据一位或多位翻转;典型的Memory错误有内存中出现数据一位或多位翻转;在ARM架构中,典型的Platform错误有LLC(last level cache)中出现一位或多位位翻转。 - - -如果仅一位翻转,那么硬件(比如通过ECC)可以检测到并且纠正,像这样的错误就是Correctable Error,在软件层面则只需要进行记录发生此类错误的次数,在次数未达阀值前不需要进一步处理。如果有一位以上的数据翻转,那么硬件只能检测到发生错误没有能力进行纠正,这就是Uncorrectable Error,需要软件层面根据错误等级提供处理逻辑:如果产生的错误是Uncorrectable Non-Fatal Error,可将该数据直接丢弃;如果产生的错误是Uncorrectable Fatal Error,触发kernel panic重启系统。 - - - - -| | -| --- | -| 0 Processor Correctable -1 Processor Uncorrectable non-fatal -2 Processor Uncorrectable fatal | -| 3 Memory Correctable -4 Memory Uncorrectable non-fatal -5 Memory Uncorrectable fatal | -| 6 PCI Express Correctable -7 PCI Express Uncorrectable non-fatal -8 PCI Express Uncorrectable fatal | -| 9 Platform Correctable -10 Platform Uncorrectable non-fatal -11 Platform Uncorrectable fatal | - - -Linux内核进行错误注入的流程如下。EINJ.ko模块封装了APEI进行错误注入的操作细节(具体操作细节可参考ACPI SPEC 18.6.5节),在/apei/einj目录下为用户提供了便于操作的接口。这些参数的意义如下,available\_error\_type展示系统支持注入哪些错误;error\_type是当前注入的错误类型;flags取值与当前错误类型相关;参数param1~param4可传递注入错误的地址、掩码、CPU编号等,也与当前注入的错误类型相关;向error\_inject写1表示开始注入错误。EINJ.ko模块接受到这些参数后,调用EINJ Table中相应的action,由固件进行错误注入。EINJ.ko模块等待错误注入成功后,可继续调用EINJ Table中的action触发该错误,或者直接返回由用户自行触发(参数notrigger置1表示由用户自行触发)。 - - -![](assets/ANCK_ARM64_RAS机制简介/img_1.png) - - -上述流程比较简要地介绍了APEI错误注入机制,linux内核中的APEI Error INJection support模块已经完整地支持了错误注入机制,可调用EINJ.ko模块的接口或者使用封装了该模块接口的ras-tools进行错误注入。 - - -错误注入是为了验证系统RAS机制的正确性,因此**RAS评测流程**可分为如下三步: - - -1**.使用ras-tools工具注入错误**,比如,内存、CPU的错误。 - - -2.**触发错误**。ras-tools工具默认注入错误后即进行触发。 - - -3.**观测系统对错误的处理是否符合预期**,比如,上报的错误信息是否准确,系统对各类错误的处理逻辑是否合理等。 - - -# 4. CPU及内存错误注入演示 - - -CPU和内存在计算机系统中的具有十分重要地位,它们出现错误有可能导致系统宕机甚至程序执行出错,对于服务器系统来说是不可接受的。因此,本节演示CPU与内存的错误注入。 - - -## 4.1 环境准备 - - -### 1. 安装EINJ模块 - - -使用命令modprobe einj进行模块加载,如果无法加载,则需要配置内核重新编译,可参考文档 :https://docs.kernel.org/firmware-guide/acpi/apei/einj.html - - -此外,由于RAS机制需要固件的支持,如果后续的测试未看到上报的错误信息,那么需要检查固件(BIOS)是否支持RAS,或者将固件更新到最新。 - - -### 2. 安装RAS测试工具 - - -直接使用EINJ接口进行错误注入比较繁琐,可安装ras-tools工具进行错误注入,该工具由C语言编写,直接编译即可,链接:https://gitee.com/anolis/ras-tools.git - - -### 3. 安装rasdaemon - - -先安装依赖包yum install sqlite perl-DBD-SQLite - - -使用如下命令编译安装rasdaemon,链接:https://github.com/mchehab/rasdaemon.git - - - -``` -autoreconf -vfi && ./configure --enable-sqlite3 --enable-arm && make -make install -``` - -在命令行中输入rasdaemon -r 即可开启rasdaemon守护进程,rasdaemon支持如下参数。 - - - -``` - -d, --disable 禁用RAS事件并退出 - -e, --enable 使能RAS事件并退出 - -f, --foreground 前台运行 - -r, --record 通过sqlite3记录事件 -``` - -rasdaemon用户态守护进程能将捕获系统events并将错误信息输出到log、database或console。 - - -查看系统详细的错误处理信息可以通过dmesg命令查看,或者从BMC串口查看。 - - -本次测试需要使用rasdaemon -r命令开启该进程,并在跳板机上使用BMC串口连接到目标机。 - - -## 4.2 CPU错误注入 - - -本文主要使用einj\_mem\_uc工具,该工具可注入内存错误以及CPU错误,可使用命令./einj\_mem\_uc -h查看使用说明。 - - -使用./einj\_mem\_uc core\_non\_fatal命令注入一个UE类型的CPU错误。 - - - -``` -./einj_mem_uc core_non_fatal -0: core_non_fatal vaddr = 0xffff88f22400 paddr = 8a878e400 -injecting ... -triggering ... -Manually take page offline -Test passed -``` - -使用BMC串口错误处理详细信息如下,没有时间戳的信息是由固件输出的,有时间戳的信息则是由内核输出的(如果使用dmesg则只能查看到下述带时间戳的信息)。可以看到硬件产生了17号中断,并首先由固件接管。17号中断的意义如下,它是一个CPU错误信号。 - - - - -| | | | | -| --- | --- | --- | --- | -| 17 | nFaultIRQ | Core fault interrupt | Generated from CORE and connect to nFAULTIRQ pins; nFAULTIRQ pins are connected to GIC components; this CPU or other CPUs handle the faults in firmware, firmware behavior is implementation-defined. | - - -可以看到,这个错误是来自L2 Cache的错误,它是不可纠正但可恢复的。恢复手段应该是硬件层面CPU丢弃Cache中的数据,软件层面通过memory\_failure函数删除Cache数据对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=17(core), cnt=0xd -INFO: RAS reg: -INFO: fr = 10a9a2 -INFO: status = 44800007 -INFO: addr = 8007e0e95fffb7ff -INFO: misc0 = 4 -INFO: misc1 = 0 -RTC: 2000-01-06 09:32:09 - core[8] mm(17) return: 0 ---handler(17) end -[40858.417829] [Firmware Warn]: GHES: Unhandled processor error type: cache error -[40858.427894] {42}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 4 -[40858.436229] {42}[Hardware Error]: event severity: recoverable -[40858.441961] {42}[Hardware Error]: precise tstamp: 2000-01-06 09:32:09 -[40858.448473] {42}[Hardware Error]: Error 0, type: recoverable -[40858.454204] {42}[Hardware Error]: section_type: ARM processor error -[40858.460629] {42}[Hardware Error]: MIDR: 0x00000000410fd490 -[40858.466272] {42}[Hardware Error]: Multiprocessor Affinity Register (MPIDR): 0x0000000081080000 -[40858.475041] {42}[Hardware Error]: running state: 0x1 -[40858.480163] {42}[Hardware Error]: Power State Coordination Interface state: 0 -[40858.487456] {42}[Hardware Error]: Error info structure 0: -[40858.493013] {42}[Hardware Error]: num errors: 1 -[40858.497702] {42}[Hardware Error]: error_type: 0, cache error -[40858.503606] {42}[Hardware Error]: error_info: 0x0000000000800015 -[40858.509857] {42}[Hardware Error]: transaction type: Instruction -[40858.516109] {42}[Hardware Error]: cache level: 2 -[40858.521058] {42}[Hardware Error]: the error has not been corrected -[40858.528062] Memory failure: 0x89b78f: recovery action for dirty LRU page: Recovered -``` - -## 4.3 内存错误注入 - - -使用命令./einj\_mem\_uc single注入一个UE类型的内存错误。该命令首先向一个内存地址注入一个UE类型的内存错误,然后通过读取该地址的数据触发该错误。 - - - -``` -./einj_mem_uc single -0: single vaddr = 0xffffabcb3400 paddr = 8aaf74400 -injecting ... -triggering ... -SIGBUS: addr = 0xffffabcb3400 -page not present -Test passed -``` - -BMC串口中显示详细的错误处理详细信息如下(如果使用dmesg则只能查看到下述带时间戳的信息),硬件产生了一个中断号为0的中断,这代表产生的是一个同步异常。接下来的信息指出该错误是一个可恢复的内存错误,并且展示了产生该错误的内存地址以及ECC寄存器的状态。最后调用memory\_failure函数删除该地址对应的内存页面。 - - - -``` -->Core[8](0x81080000) received intr=0(exception), cnt=0xa -MM Mem RAS handle,Intr:0 -Ch = 25810000 - |-ECCERRCNT:10000, ECCSTAT:0, ADVECCSTAT:8000002 ECCSYMBOL:760000 - |-ECCERRCNTSTAT:0 ECCERRCNT0:0 ECCERRCNT1:0 - |-ECCCADDR0:0 ECCCADDR1:0 ECCCDATA0~1:0,0 - |-ECCCSYN0~2:0,0,0 ECCAPSTAT:0 - |-ECCUADDR0:176D ECCUADDR1:2010480 ECCUDATA0~1:1FF,0 - |-ECCUSYN0~2:1FF,0,76 - |-SBRCTL:1C01591B,SBRSTS:0 -RasData->ExceptionEl: 0, UeCnt:0x1 -RTC: 2000-01-06 09:27:58 -Get SystemAddrss through mAddrTransProtocol start -Get SystemAddrss through mAddrTransProtocol end -s:0 d:0 ctl:2 ch:0 rank:0 bg:2 b:1 row:176D col:480 DeAddr:DDB599400 -Locate error dimm, Socket:0, Channel:2 Dimm:0 - core[8] mm(0) return: 0 ---handler(0) end -[40606.624019] EDAC MC0: 1 UE multi-symbol chipkill ECC on unknown memory (node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 page:0xddb599 offset:0x400 grain:1 - APEI location: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory) -[40606.660031] {41}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 -[40606.668367] {41}[Hardware Error]: event severity: recoverable -[40606.674098] {41}[Hardware Error]: precise tstamp: 2000-01-06 09:27:58 -[40606.680611] {41}[Hardware Error]: Error 0, type: recoverable -[40606.686342] {41}[Hardware Error]: section_type: memory error -[40606.692159] {41}[Hardware Error]: error_status: Storage error in DRAM memory (0x0000000000000400) -[40606.701275] {41}[Hardware Error]: physical_address: 0x0000000ddb599400 -[40606.707961] {41}[Hardware Error]: node:0 card:2 module:0 rank:0 bank_group:2 bank_address:1 device:0 row:5997 column:1152 chip_id:0 -[40606.720028] {41}[Hardware Error]: error_type: 5, multi-symbol chipkill ECC -[40606.727781] Memory failure: 0xddb599: recovery action for dirty LRU page: Recovered -``` - -## 4.4 rasdaemon日志读取 - - -rasdaemon日志存储在数据库中,可通过ras-mc-ctl --errors读取日志。可以看到rasdaemon简要地记录了系统中的错误信息。 - - - -``` -[root@localhost ras-tools]# ras-mc-ctl --errors -Memory controller events: -1 2022-09-01 10:29:28 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -2 2022-09-01 11:25:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -3 2022-09-01 11:55:11 +0800 1 Uncorrected error(s): multi-symbol chipkill ECC at unknown memory location: 0:-1:-1:-1, addr 4434626552832, grain 0, syndrome 0 APEI location: node:0 card:6 module:0 rank:0 bank_group:6 bank_address:2 device:0 row:529 column:256 chip_id:0 status(0x0000000000000400): Storage error in DRAM memory -``` - -# 5. Q&A - - -Q:RAS机制是否需要BIOS支持? - - -A:需要BIOS支持,并且由于BIOS对RAS支持的更新较快,最好将BIOS更新到最新版本。 - - - - - -Q: x86和ARM64的APEI是否一致? - - -A: x86与ARM64的芯片只要都遵循同一套ACPI协议,那么APEI是一致的。 - - - - - -Q: RAS注入的错误是真实的错误吗? - - -A: 错误中断是真实触发的;关于内存中的数据,是通过写入ECC相关寄存器模拟的。 - - - - - -Q: rasdaemon日志查看是否有更易用的方法? - - -A: 首先安装rasdaemon依赖的库yum install sqlite perl-DBD-SQLite;使用rasdaemon -r 命令启动; - - -最后使用 ras-mc-ctl --errors 命令可以查看rasdaemon日志。 - - - - - -Q: 可否使用mcelog? - - -A: mcelog的原理是通过读取并解析x86的machine check机制的寄存器信息来捕获硬件错误,因此它是x86专用的,不适用于ARM64。 - - - - - -Q:einj\_mem\_uc是否覆盖所有case,例如向用户进程地址空间注入UE,是否kill掉用户进程而让系统保持正常?向内核注入UE,系统是否crash? - - -A:ras-tools工具提供的测试用例比较丰富,可满足RAS机制测试与研发的需求。比如,./einj\_mem\_uc single用例实现用户进程访问UE数据,einj\_mem\_uc程序对SIGBUS信号进行了处理,否则会被直接kill;而./einj\_mem\_uc copyin用例实现内核访问UE数据,系统会crash。 - - - - - -Q:由于RAS错误导致内核crash,对应记录未被记录在rasdaemon中,是否合理? - - -A:需要检查是否是rasdaemon某些选项未开启。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" deleted file mode 100644 index 110c33fe..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\244\276\345\214\272\347\240\224\345\217\221\351\241\271\347\233\256/\345\260\261\346\230\257\346\265\213\350\257\225/\347\256\200\344\273\2132.md" +++ /dev/null @@ -1,3 +0,0 @@ -本项目专注于: -- 高危CVE的分析、POC和处理。 -- 龙蜥社区贡献的CVE案例分享。 \ No newline at end of file -- Gitee From 79fe5b3a548bd4b870834cc77c0a97677096b7f6 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Tue, 14 Jan 2025 14:29:54 +0800 Subject: [PATCH 079/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9525-?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=80=E7=BA=A7=E6=96=87=E4=BB=B6=E3=80=81?= =?UTF-8?q?=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\350\203\275\346\265\213\350\257\225.md" | 205 ++++++++++++++++++ .../content/\346\265\213\350\257\225.md" | 205 ++++++++++++++++++ 2 files changed, 410 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\225.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\346\265\213\350\257\225.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\225.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\225.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\225.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\346\265\213\350\257\225.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\346\265\213\350\257\225.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\346\265\213\350\257\225.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + -- Gitee From 76e5c978f36528d6316c14f0394b4632911ef129 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Tue, 14 Jan 2025 15:05:29 +0800 Subject: [PATCH 080/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9526-?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=87=E4=BB=B6=E3=80=81=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...56\345\275\225\346\226\207\346\241\243.md" | 205 ++++++++++++++++++ ...6\345\275\225\346\226\207\346\241\2432.md" | 205 ++++++++++++++++++ ...7\350\203\275\346\265\213\350\257\2252.md" | 205 ++++++++++++++++++ ...7\350\203\275\346\265\213\350\257\2253.md" | 205 ++++++++++++++++++ 4 files changed, 820 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\243.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2252.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2253.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\243.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\243.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\243.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2252.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2252.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2252.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2253.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2253.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2253.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + -- Gitee From 90a22a40e0ada53161a8b0c5a456a1325128da39 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Tue, 14 Jan 2025 17:42:10 +0800 Subject: [PATCH 081/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9527-?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=87=E4=BB=B6=E3=80=81=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\350\203\275\346\265\213\350\257\2254.md" | 205 ++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2254.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2254.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2254.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2254.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + -- Gitee From 03c2c494f7a321825686e86a4cae21437f66bf2a Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Wed, 15 Jan 2025 10:19:44 +0800 Subject: [PATCH 082/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9528-?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\345\275\225\346\226\207\346\241\2433.md" | 205 ++++++++++++++++++ ...7\350\203\275\346\265\213\350\257\2255.md" | 205 ++++++++++++++++++ 2 files changed, 410 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2433.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2255.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2433.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2433.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2433.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2255.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2255.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2255.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + -- Gitee From 45740a12ec65ffae8be3ce98c132dd47ccb51bbb Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Wed, 15 Jan 2025 10:42:53 +0800 Subject: [PATCH 083/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9529-?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E7=9B=AE=E5=BD=95=E5=90=8E=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/test001/abc.md" | 205 ++++++++++++++++++ ...7\350\203\275\346\265\213\350\257\2256.md" | 205 ++++++++++++++++++ 2 files changed, 410 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/abc.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2256.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/abc.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/abc.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/abc.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2256.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2256.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2256.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + -- Gitee From 9255e0ddb5c5534a54875c9cb9828c29b2419bb3 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Wed, 15 Jan 2025 11:07:08 +0800 Subject: [PATCH 084/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9530-?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E7=9B=AE=E5=BD=95=E5=90=8E=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/test001/aaa.md" | 205 ++++++++++++++++++ ...7\350\203\275\346\265\213\350\257\2257.md" | 205 ++++++++++++++++++ 2 files changed, 410 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/aaa.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2257.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/aaa.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/aaa.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/aaa.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2257.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2257.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2257.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + -- Gitee From 675ab5cdcfec631f7aa6ba1010ea19077debd885 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Wed, 15 Jan 2025 13:26:43 +0800 Subject: [PATCH 085/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9531-?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E7=9B=AE=E5=BD=95=E5=90=8E=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\350\203\275\346\265\213\350\257\2253.md" | 205 ------------------ 1 file changed, 205 deletions(-) delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2253.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2253.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2253.md" deleted file mode 100644 index ec8e22ac..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2253.md" +++ /dev/null @@ -1,205 +0,0 @@ -# 背景 -代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 - - -我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; -​ - -本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 - -作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) - -# hugetext使用 - -## 使用开关 - -- 启动参数 - -打开:hugetext=1 or 2 or 3 -关闭:缺省即为关闭 -​ - - -- sysfs接口 - -仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled -仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled -打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled -关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled -​ - -## 回退 -在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: - -- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches -- 清理单个文件的page cache:vmtouch -e /\/target - -​ - -## 注意事项 -打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 -如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 -​ - -在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 - - -想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 - -# mysql测试准备 - -创建用户以及修改密码: -```c -mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; -``` - - -创建数据库: -``` -CREATE DATABASE hugepages; -show databases; -``` -所创建的数据库hugepages需要与下面的步骤保持一直。 -​ - -开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): -``` -sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare -``` -其中,prepare表示准备数据,在的sbtest库生成测试数据, -创建200张表,每张表10万条数据,每2秒显示一次报告。 - -# 代码大页 - mysql数据库测试 - -下面是代码大页的测试数据。 - -## arm平台mysql性能测试 - -测试说明: -测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 - - -测试命令: -sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run -​ - - -测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: -![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) - - -**图1:arm平台mysql TPS测试数据对比** - - -上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: - -- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; -- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; -- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; - -另外,还有RT的对比,如下图: -![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) - - -**图2:arm平台mysql RT数据对比** - - -RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 - -## x86平台mysql性能测试 - -测试方法以及测试数据与arm平台一致。 - -该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 - -TPS、RT对比图如下: -![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) - - -**图3(a、b)为TPS、RT对比图** - - -由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 -​ - -除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 -![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) - - -**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** - - -上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; - -## 微架构测试数据 - -除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 -x86和arm平台的数据如下: -​ - -x86平台下的iTLB miss和iTLB MPKI数据: -![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) - - -**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** - - -上图数据显示: - -- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; -- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; - -测试iTLB MPKI使用的工具可以从下面的链接获取: -https://github.com/intel/iodlr - -arm平台下的iTLB miss和iTLB MPKI数据: -![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) - - -**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** - - -上图数据显示: - -- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; -- 在iTLB MPKI上,大约下降了6倍左右; - -**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** - -## 代码大页 vs THP和4k - -这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 - -对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: -![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) -**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** - - -在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 -​ - -根据图7,可以大致得出以下结论: -**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** -**收益:代码大页 > anon THP > 4k** - -# 代码大页 - 达梦数据库测试 - -达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 - -下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: - -![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) -**图8 代码大页+达梦数据库性能测试对比** - - -根据图中的数据,大致可以得出以下结论: - -(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); - -(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; - - - - - - -- Gitee From 497e0d131cbc05c626275c33a9a2ff3be5987ec2 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Wed, 15 Jan 2025 14:13:33 +0800 Subject: [PATCH 086/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9532-?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\345\275\225\346\226\207\346\241\2432.md" | 205 ------------------ 1 file changed, 205 deletions(-) delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" deleted file mode 100644 index ec8e22ac..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" +++ /dev/null @@ -1,205 +0,0 @@ -# 背景 -代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 - - -我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; -​ - -本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 - -作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) - -# hugetext使用 - -## 使用开关 - -- 启动参数 - -打开:hugetext=1 or 2 or 3 -关闭:缺省即为关闭 -​ - - -- sysfs接口 - -仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled -仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled -打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled -关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled -​ - -## 回退 -在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: - -- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches -- 清理单个文件的page cache:vmtouch -e /\/target - -​ - -## 注意事项 -打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 -如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 -​ - -在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 - - -想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 - -# mysql测试准备 - -创建用户以及修改密码: -```c -mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; -``` - - -创建数据库: -``` -CREATE DATABASE hugepages; -show databases; -``` -所创建的数据库hugepages需要与下面的步骤保持一直。 -​ - -开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): -``` -sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare -``` -其中,prepare表示准备数据,在的sbtest库生成测试数据, -创建200张表,每张表10万条数据,每2秒显示一次报告。 - -# 代码大页 - mysql数据库测试 - -下面是代码大页的测试数据。 - -## arm平台mysql性能测试 - -测试说明: -测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 - - -测试命令: -sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run -​ - - -测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: -![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) - - -**图1:arm平台mysql TPS测试数据对比** - - -上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: - -- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; -- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; -- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; - -另外,还有RT的对比,如下图: -![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) - - -**图2:arm平台mysql RT数据对比** - - -RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 - -## x86平台mysql性能测试 - -测试方法以及测试数据与arm平台一致。 - -该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 - -TPS、RT对比图如下: -![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) - - -**图3(a、b)为TPS、RT对比图** - - -由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 -​ - -除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 -![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) - - -**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** - - -上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; - -## 微架构测试数据 - -除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 -x86和arm平台的数据如下: -​ - -x86平台下的iTLB miss和iTLB MPKI数据: -![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) - - -**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** - - -上图数据显示: - -- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; -- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; - -测试iTLB MPKI使用的工具可以从下面的链接获取: -https://github.com/intel/iodlr - -arm平台下的iTLB miss和iTLB MPKI数据: -![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) - - -**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** - - -上图数据显示: - -- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; -- 在iTLB MPKI上,大约下降了6倍左右; - -**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** - -## 代码大页 vs THP和4k - -这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 - -对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: -![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) -**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** - - -在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 -​ - -根据图7,可以大致得出以下结论: -**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** -**收益:代码大页 > anon THP > 4k** - -# 代码大页 - 达梦数据库测试 - -达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 - -下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: - -![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) -**图8 代码大页+达梦数据库性能测试对比** - - -根据图中的数据,大致可以得出以下结论: - -(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); - -(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; - - - - - - -- Gitee From 796028c59bcbdbe8395139f992e8beb368d49e7e Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Wed, 15 Jan 2025 14:19:57 +0800 Subject: [PATCH 087/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9533-?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=90=8E=E5=86=8D=E5=A2=9E=E5=8A=A0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\345\275\225\346\226\207\346\241\2434.md" | 205 ++++++++++++++++++ ...6\345\275\225\346\226\207\346\241\2435.md" | 205 ++++++++++++++++++ 2 files changed, 410 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2434.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2435.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2434.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2434.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2434.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2435.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2435.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2435.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + -- Gitee From 4ca8dd7fc637889a65f323db663e73ade2a3b4e8 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Wed, 15 Jan 2025 14:26:55 +0800 Subject: [PATCH 088/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9534-?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=90=8E=E5=86=8D=E5=A2=9E=E5=8A=A0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\272\247\347\233\256\345\275\225\346\226\207\346\241\2431.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "sig/Anolis\350\277\201\347\247\273SIG/content/\346\265\213\350\257\225.md" => "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2431.md" (100%) diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\346\265\213\350\257\225.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2431.md" similarity index 100% rename from "sig/Anolis\350\277\201\347\247\273SIG/content/\346\265\213\350\257\225.md" rename to "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2431.md" -- Gitee From 3dec8ea269cfaa1f808e6cffcd982cc5b85ba376 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Wed, 15 Jan 2025 14:48:03 +0800 Subject: [PATCH 089/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9535-?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=90=8E=E5=86=8D=E5=A2=9E=E5=8A=A0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\345\275\225\346\226\207\346\241\2436.md" | 205 ++++++++++++++++++ ...6\345\275\225\346\226\207\346\241\2437.md" | 205 ++++++++++++++++++ 2 files changed, 410 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2436.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2437.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2436.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2436.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2436.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2437.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2437.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2437.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + -- Gitee From 8e70e2fe5028ee3e1c2821d176931681d2f6c687 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Wed, 15 Jan 2025 14:57:15 +0800 Subject: [PATCH 090/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9536-?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=90=8E=E5=86=8D=E5=A2=9E=E5=8A=A0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\345\275\225\346\226\207\346\241\2432.md" | 205 ++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + -- Gitee From c59994399540086cf083c940da5c22f06437909d Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Wed, 15 Jan 2025 16:00:12 +0800 Subject: [PATCH 091/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9537-?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=90=8E=E5=86=8D=E5=A2=9E=E5=8A=A0=E6=96=87?= =?UTF-8?q?=E6=A1=A3=EF=BC=8C=E6=96=87=E4=BB=B6=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\345\275\225\346\226\207\346\241\2438.md" | 205 ++++++++++++++++++ ...3\350\257\2252\346\226\207\346\241\243.md" | 205 ++++++++++++++++++ ...350\257\2252\346\226\207\346\241\24302.md" | 205 ++++++++++++++++++ ...7\350\203\275\346\265\213\350\257\2258.md" | 205 ++++++++++++++++++ 4 files changed, 820 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2438.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252\346\226\207\346\241\243.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252\346\226\207\346\241\24302.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2258.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2438.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2438.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2438.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252\346\226\207\346\241\243.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252\346\226\207\346\241\243.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252\346\226\207\346\241\243.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252\346\226\207\346\241\24302.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252\346\226\207\346\241\24302.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252\346\226\207\346\241\24302.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2258.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2258.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2258.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + -- Gitee From c0b4cca9ad56781c1ed7f6ea55984fa5e1104397 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Wed, 15 Jan 2025 18:16:36 +0800 Subject: [PATCH 092/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9538-?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=90=8E=E5=86=8D=E5=A2=9E=E5=8A=A0=E6=96=87?= =?UTF-8?q?=E6=A1=A3=EF=BC=8C=E6=96=87=E4=BB=B6=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3\350\257\2252\346\226\207\346\241\243.md" | 205 ++++++++++++++++++ ...350\257\2252\346\226\207\346\241\24302.md" | 205 ++++++++++++++++++ ...7\350\203\275\346\265\213\350\257\2259.md" | 205 ++++++++++++++++++ 3 files changed, 615 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/abcd/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252\346\226\207\346\241\243.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/abcd/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252\346\226\207\346\241\24302.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2259.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/abcd/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252\346\226\207\346\241\243.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/abcd/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252\346\226\207\346\241\243.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/abcd/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252\346\226\207\346\241\243.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/abcd/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252\346\226\207\346\241\24302.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/abcd/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252\346\226\207\346\241\24302.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/abcd/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2252\346\226\207\346\241\24302.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2259.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2259.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\2259.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + -- Gitee From b643b57cfba3b05bd0056d69bf3d87843e2d6412 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Thu, 16 Jan 2025 10:04:13 +0800 Subject: [PATCH 093/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9539-?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=90=8E=E5=86=8D=E5=A2=9E=E5=8A=A0=E6=96=87?= =?UTF-8?q?=E6=A1=A3=EF=BC=8C=E6=96=87=E4=BB=B6=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/test001/eeeeeee.md" | 205 ++++++++++++++++++ ...3\350\257\2253\346\226\207\346\241\243.md" | 205 ++++++++++++++++++ ...350\257\2253\346\226\207\346\241\24302.md" | 205 ++++++++++++++++++ ...\350\203\275\346\265\213\350\257\22510.md" | 205 ++++++++++++++++++ 4 files changed, 820 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/eeeeeee.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2253/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2253\346\226\207\346\241\243.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2253/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2253\346\226\207\346\241\24302.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\22510.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/eeeeeee.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/eeeeeee.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/eeeeeee.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2253/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2253\346\226\207\346\241\243.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2253/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2253\346\226\207\346\241\243.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2253/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2253\346\226\207\346\241\243.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2253/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2253\346\226\207\346\241\24302.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2253/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2253\346\226\207\346\241\24302.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2253/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2253\346\226\207\346\241\24302.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\22510.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\22510.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test001/\346\200\247\350\203\275\346\265\213\350\257\22510.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + -- Gitee From 35695f3f85f1778f3fee95ea237b23d3b676c70d Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Thu, 16 Jan 2025 10:19:11 +0800 Subject: [PATCH 094/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9540-?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=96=87=E4=BB=B6=E5=A4=B9=EF=BC=8C=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/test002/aaa.md" | 205 ++++++++++++++++++ .../content/test002/abc.md" | 205 ++++++++++++++++++ ...56\345\275\225\346\226\207\346\241\243.md" | 205 ++++++++++++++++++ ...6\345\275\225\346\226\207\346\241\2431.md" | 205 ++++++++++++++++++ ...6\345\275\225\346\226\207\346\241\2432.md" | 205 ++++++++++++++++++ 5 files changed, 1025 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/aaa.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/abc.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\243.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2431.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/aaa.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/aaa.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/aaa.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/abc.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/abc.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/abc.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\243.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\243.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\243.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2431.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2431.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2431.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + -- Gitee From a73833516db48d0ae1b814bfc04facfaca8b8896 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Thu, 16 Jan 2025 16:34:12 +0800 Subject: [PATCH 095/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9541-?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/test002/a.md" | 205 ++++++++++++++++++ .../content/test002/tttfsdfsdf.md" | 205 ++++++++++++++++++ ...6\345\275\225\346\226\207\346\241\2432.md" | 205 ++++++++++++++++++ ...6\345\275\225\346\226\207\346\241\2430.md" | 205 ++++++++++++++++++ ...56\345\275\225\346\226\207\346\241\243.md" | 205 ++++++++++++++++++ 5 files changed, 1025 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/a.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/tttfsdfsdf.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/gddgdfd\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2430.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\347\233\256\345\275\225\346\226\207\346\241\243.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/a.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/a.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/a.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/tttfsdfsdf.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/tttfsdfsdf.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/tttfsdfsdf.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/gddgdfd\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/gddgdfd\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/gddgdfd\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2430.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2430.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2430.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\347\233\256\345\275\225\346\226\207\346\241\243.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\347\233\256\345\275\225\346\226\207\346\241\243.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\347\233\256\345\275\225\346\226\207\346\241\243.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + -- Gitee From 47a60662e360b578bd24204644d31a1daedc640b Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Fri, 17 Jan 2025 10:11:56 +0800 Subject: [PATCH 096/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9542-?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=90=8E=E6=96=B0=E5=A2=9E=E6=96=87=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E6=96=87=E4=BB=B6=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/test002/aA.md" | 205 ++++++++++++++++++ .../a.md" | 205 ++++++++++++++++++ .../c.md" | 205 ++++++++++++++++++ 3 files changed, 615 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/aA.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2250/a.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2250/c.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/aA.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/aA.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/aA.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2250/a.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2250/a.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2250/a.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2250/c.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2250/c.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2250/c.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + -- Gitee From d87e0af6e7e2b6e6b9cc54c978a606ca3e17fe98 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Fri, 17 Jan 2025 10:13:14 +0800 Subject: [PATCH 097/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9542(2)-?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=90=8E=E6=96=B0=E5=A2=9E=E6=96=87=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E6=96=87=E4=BB=B6=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../abc.md" | 205 ++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/abc.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/abc.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/abc.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test002/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/abc.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + -- Gitee From b8649138b6dd2a56e0f57e2e491b5a79f3f847ab Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Fri, 17 Jan 2025 14:12:13 +0800 Subject: [PATCH 098/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9543-?= =?UTF-8?q?=E6=A0=B9=E7=9B=AE=E5=BD=95=E5=A2=9E=E5=8A=A0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/acbsds.md" | 205 ++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/acbsds.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/acbsds.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/acbsds.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/acbsds.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + -- Gitee From a4f64d8cd32bdb0bc7543642d70f2bd696a11d38 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Fri, 17 Jan 2025 14:25:55 +0800 Subject: [PATCH 099/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9544-?= =?UTF-8?q?=E6=A0=B9=E7=9B=AE=E5=BD=95=E5=A2=9E=E5=8A=A0=E6=96=87=E6=A1=A3?= =?UTF-8?q?=EF=BC=8C=E6=96=87=E4=BB=B6=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/a.md" | 205 ++++++++++++++++++ .../content/dvdvdv.md" | 205 ++++++++++++++++++ .../content/test000/a.md" | 205 ++++++++++++++++++ .../content/test000/aA.md" | 205 ++++++++++++++++++ .../content/test000/aaa.md" | 205 ++++++++++++++++++ .../abc.md" | 205 ++++++++++++++++++ ...6\345\275\225\346\226\207\346\241\2432.md" | 205 ++++++++++++++++++ ...6\345\275\225\346\226\207\346\241\2431.md" | 205 ++++++++++++++++++ ...6\345\275\225\346\226\207\346\241\2432.md" | 205 ++++++++++++++++++ .../a.md" | 205 ++++++++++++++++++ .../c.md" | 205 ++++++++++++++++++ 11 files changed, 2255 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/a.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/dvdvdv.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test000/a.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test000/aA.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test000/aaa.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/abc.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/gddgdfd\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2431.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2250/a.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2250/c.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/a.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/a.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/a.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/dvdvdv.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/dvdvdv.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/dvdvdv.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test000/a.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test000/a.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test000/a.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test000/aA.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test000/aA.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test000/aA.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test000/aaa.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test000/aaa.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test000/aaa.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/abc.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/abc.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/abc.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/gddgdfd\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/gddgdfd\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/gddgdfd\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2431.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2431.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2431.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\225/\344\272\214\347\272\247\347\233\256\345\275\225\346\226\207\346\241\2432.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2250/a.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2250/a.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2250/a.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2250/c.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2250/c.md" new file mode 100644 index 00000000..ec8e22ac --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/test000/\344\272\214\347\272\247\347\233\256\345\275\225\346\265\213\350\257\2250/c.md" @@ -0,0 +1,205 @@ +# 背景 +代码大页特性将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,以此减低整个系统中TLB entry的资源竞争。对于MySQL、JAVA等应用,能显著减少iTLB miss,提升E2E性能。下面会采用hugetext来代表代码大页。 + + +我们在本地基准测试以及业务真实压力测试都验证了hugetext性能效果。对于数据库类业务(例如 MySQL),x86物理机/虚拟机上hugetext提升性能2\~4%,ARM物理机/虚拟机上hugetext提升性能6\~10%; +​ + +本文档主要用于展示**透明代码大页**使用、mysql相关测试数据,平台涉及x86和arm物理机。最后将代码大页、THP以及4k在mysql上进行性能对比。 + +作者:王荣巍(雨庭) 徐宇(弃余) 邓刚(据德) + +# hugetext使用 + +## 使用开关 + +- 启动参数 + +打开:hugetext=1 or 2 or 3 +关闭:缺省即为关闭 +​ + + +- sysfs接口 + +仅打开二进制和动态库大页:echo 1 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +仅打开可执行匿名大页:echo 2 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +打开以上两类大页:echo 3 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +关闭:echo 0 > /sys/kernel/mm/transparent\_hugepage/hugetext\_enabled +​ + +## 回退 +在打开hugetext\_enabled后,若关闭hugetext\_enabled并且完全消除hugetext\_enabled影响,可以下面几种方式: + +- 清理整个系统的page cache:echo 3 > /proc/sys/vm/drop\_caches +- 清理单个文件的page cache:vmtouch -e /\/target + +​ + +## 注意事项 +打开、关闭并不意味着立即合并、拆散大页,hugetext是异步的。 +如果一段代码曾经被整理成大页,即使关闭hugetext功能,还是会大页映射。 +​ + +在测试性能时,为了消除这些影响,可以通过 `echo 3 > /proc/sys/vm/drop\_caches` 来回收整理的大页,以保证下次是普通页映射。 + + +想确认代码段是否大页映射,可以通过 `grep FilePmdMapped /proc/$(pidof mysqld)/smaps` 来确认。 + +# mysql测试准备 + +创建用户以及修改密码: +```c +mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; +``` + + +创建数据库: +``` +CREATE DATABASE hugepages; +show databases; +``` +所创建的数据库hugepages需要与下面的步骤保持一直。 +​ + +开始为创建的数据库准备数据,执行以下命令(**进行该步骤前需要安装sysbench**): +``` +sysbench --test=/usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare +``` +其中,prepare表示准备数据,在的sbtest库生成测试数据, +创建200张表,每张表10万条数据,每2秒显示一次报告。 + +# 代码大页 - mysql数据库测试 + +下面是代码大页的测试数据。 + +## arm平台mysql性能测试 + +测试说明: +测试过程中需要对mysqld进行**绑核**,并显示指定内存分配节点为local node。 + + +测试命令: +sysbench /usr/local/share/sysbench/tests/include/oltp\_legacy/oltp.lua --mysql-db=hugepages --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --time=300 --threads=1 --report-interval=5 run +​ + + +测试过程中,mysql并发数分别是1、8(25%)、16(50%)、32(100%)。测试结果与普通的4K代码页数据对比如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img1.png) + + +**图1:arm平台mysql TPS测试数据对比** + + +上图TPS对比可以看出:代码大页的性能始终高于普通的代码页。关于这张图中其他的结论,还有: + +- 并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约在6.9%; +- 并发数8、16基本可以保证没有cpu的竞争,代码大页的性能提升大约也在6.5%以上; +- 并发数32时,由于总核数为32,存在于其他应用竞争cpu,所以TPS较低于前面的测试结果。但是代码大页的鲁棒性更好,此时相比普通代码页,性能提升大约在11%左右; + +另外,还有RT的对比,如下图: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img2.png) + + +**图2:arm平台mysql RT数据对比** + + +RT的数据主要是前95%的请求的最大响应时间(**95th percentile**)。代码大页在RT上的表现与图1一致,大约提升在5.7%~11.4%之间。 + +## x86平台mysql性能测试 + +测试方法以及测试数据与arm平台一致。 + +该测试主要在Intel(R) Xeon(R) Platinum 8163平台下完成。 + +TPS、RT对比图如下: +![图片 4-x86-TPS和RT.png](../../assets/内核技术分享/代码大页-mysql性能测试/img3.png) + + +**图3(a、b)为TPS、RT对比图** + + +由于TLB硬件的差异,代码大页在x86和arm上性能提升存在差异,根据图6(a、b)中的测试数据,代码大页在x86上,对TPS的提升大致在3%-5之间,在RT上大致有5%-7.5%的收益。 +​ + +除intel Xeon平台,在海光的机器上对mysql数据库+代码大页进行了性能测试。 +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img4.png) + + +**图4 海光平台测试数据。图左为并发数为1的测试(上为普通,下为开启hugetext),图右为并发数为4的测试数据** + + +上图代码大页性能结论为:单核提升6.5%,4并发数提升3.9%; + +## 微架构测试数据 + +除前面展示的mysql数据库中的TPS和RT数据,我们也记录了在测试过程中iTLB miss,以及换算后的iTLB MPKI数据。 +x86和arm平台的数据如下: +​ + +x86平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img5.png) + + +**图5 x86平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- 从iTLB miss的数据看,代码大页相比4k代码页大约下降了1.5-2.3倍左右; +- 从iTLB MPKI的数据看,代码大页相比4k代码页大约下降了1.6-2.3倍之间,与iTLB miss效果相似; + +测试iTLB MPKI使用的工具可以从下面的链接获取: +https://github.com/intel/iodlr + +arm平台下的iTLB miss和iTLB MPKI数据: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img6.png) + + +**图6 arm平台使用代码大页前后iTLB miss和iTLB MPKI数据对比图** + + +上图数据显示: + +- mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右; +- 在iTLB MPKI上,大约下降了6倍左右; + +**此外,可以看出在使用代码大页后,性能提升存在平台差异。图6和图7的iTLB miss差异主要是x86和arm的TLB entry差异。** + +## 代码大页 vs THP和4k + +这里将代码大页和目前比较熟知的THP进行对比,对比中将4k测试数据作为baseline。 + +对比数据主要包括mysql单线程、4线程和8线程测试。数据如下: +![image.png](../../assets/内核技术分享/代码大页-mysql性能测试/img7.png) +**图7 arm虚拟机中代码大页、THP和4k baseline数据对比** + + +在图7中最后一列为性能与4k base相比提升的百分比,如代码大页和THP在单线程测试中,相比4k页,性能提升分别是12.7%和4.47%(本数据为虚拟机下测试数据,数值大小不能代表物理机下测试数据)。 +​ + +根据图7,可以大致得出以下结论: +**代码大页的性能以及稳定性远优于anon THP;其性能存在以下规律:** +**收益:代码大页 > anon THP > 4k** + +# 代码大页 - 达梦数据库测试 + +达梦数据库安装测试文档:https://openanolis.cn/sig/third\_software\_compatibility/doc/390232652013568029 + +下图为在x86 skylake平台上,关闭THP,分别设置hugetext=0,1或者2对达梦数据库进行测试: + +![](../../assets/内核技术分享/代码大页-mysql性能测试/img8.png) +**图8 代码大页+达梦数据库性能测试对比** + + +根据图中的数据,大致可以得出以下结论: + +(1)在x86 skylake平台上,当磁盘I/O利用率峰值在94%左右时,hugetext对于达梦数据库的提升大约在3.86%左右(如图最后一行数据显示); + +(2)当磁盘I/O成为瓶颈,利用率100%,代码大页无法提升性能; + + + + + + -- Gitee From 7330c3d34c04583702cf789a6ba2114aa1f9a48d Mon Sep 17 00:00:00 2001 From: WB01533938 Date: Mon, 20 Jan 2025 11:22:28 +0800 Subject: [PATCH 100/135] =?UTF-8?q?docs(sig):=20=E6=B7=BB=E5=8A=A0=20T-One?= =?UTF-8?q?=20SIG=E7=9B=B8=E5=85=B3=E6=96=87=E6=A1=A3=E5=92=8C=E4=BC=9A?= =?UTF-8?q?=E8=AE=AE=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 T-One SIG 的 README 文件(中英文版本) - 添加 T-One SIG 的用户指南、开发手册等文档 - 记录 T-One SIG 的历次例会内容 - 新增 T-One SIG 的测试相关文档 --- sig/T-One-copy/README.en.md | 57 ++ sig/T-One-copy/README.md | 56 ++ .../assets/Dingtalk_20240614165831.jpg | Bin 0 -> 6459 bytes sig/T-One-copy/assets/dingding_group.jpeg | Bin 0 -> 176005 bytes .../1\346\234\210test" | 2 + .../2\346\234\210test" | 2 + .../3\346\234\210test" | 1 + .../SIG\344\276\213\344\274\232(202203-3).md" | 20 + .../SIG\344\276\213\344\274\232(202204-1).md" | 22 + .../SIG\344\276\213\344\274\232(202205-1).md" | 36 + .../SIG\344\276\213\344\274\232(202306-1).md" | 24 + .../SIG\344\276\213\344\274\232(202307-1).md" | 26 + ...13\350\257\225\346\226\207\344\273\266.md" | 4 + ...23\345\214\205\346\211\213\345\206\214.md" | 63 ++ .../test.md" | 16 + ...345\244\226\346\234\215\345\212\241API.md" | 1 + ...06\346\210\220\346\211\213\345\206\214.md" | 282 ++++++++ .../\346\234\210\346\212\245/202212.md" | 82 +++ .../\346\234\210\346\212\245/202301.md" | 101 +++ ...10\346\212\245\350\257\264\346\230\216.md" | 7 + .../000000000130_anolis.jpg" | Bin 0 -> 47154 bytes .../T-One\346\246\202\350\277\260.md" | 30 + .../assets/Dingtalk_20240614165831.jpg" | Bin 0 -> 6459 bytes .../assets/jiagou.jpeg" | Bin 0 -> 366652 bytes .../test1.md" | 73 +++ .../tone\351\203\250\347\275\262.md" | 615 ++++++++++++++++++ .../test.md" | 70 ++ ...26\351\223\276\345\233\276\347\211\207.md" | 2 + .../\350\201\206\345\220\254.md" | 2 + sig/T-One-copy/sig-info.yaml | 40 ++ 30 files changed, 1634 insertions(+) create mode 100644 sig/T-One-copy/README.en.md create mode 100644 sig/T-One-copy/README.md create mode 100644 sig/T-One-copy/assets/Dingtalk_20240614165831.jpg create mode 100644 sig/T-One-copy/assets/dingding_group.jpeg create mode 100644 "sig/T-One-copy/content/SIG\344\276\213\344\274\232/1\346\234\210test" create mode 100644 "sig/T-One-copy/content/SIG\344\276\213\344\274\232/2\346\234\210test" create mode 100644 "sig/T-One-copy/content/SIG\344\276\213\344\274\232/3\346\234\210test" create mode 100644 "sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202203-3).md" create mode 100644 "sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202204-1).md" create mode 100644 "sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202205-1).md" create mode 100644 "sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202306-1).md" create mode 100644 "sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202307-1).md" create mode 100644 "sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232\346\265\213\350\257\225\346\226\207\344\273\266.md" create mode 100644 "sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/ToneAgent\347\274\226\350\257\221\346\211\223\345\214\205\346\211\213\345\206\214.md" create mode 100644 "sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" create mode 100644 "sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/\345\257\271\345\244\226\346\234\215\345\212\241API.md" create mode 100644 "sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/\346\265\213\350\257\225\345\245\227\344\273\266\351\233\206\346\210\220\346\211\213\345\206\214.md" create mode 100644 "sig/T-One-copy/content/\346\234\210\346\212\245/202212.md" create mode 100644 "sig/T-One-copy/content/\346\234\210\346\212\245/202301.md" create mode 100644 "sig/T-One-copy/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" create mode 100644 "sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/000000000130_anolis.jpg" create mode 100644 "sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" create mode 100644 "sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/Dingtalk_20240614165831.jpg" create mode 100644 "sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/jiagou.jpeg" create mode 100644 "sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" create mode 100644 "sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" create mode 100644 "sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" create mode 100644 "sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" create mode 100644 "sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" create mode 100644 sig/T-One-copy/sig-info.yaml diff --git a/sig/T-One-copy/README.en.md b/sig/T-One-copy/README.en.md new file mode 100644 index 00000000..831cee37 --- /dev/null +++ b/sig/T-One-copy/README.en.md @@ -0,0 +1,57 @@ +## SIG Home + +https://openanolis.cn/sig/t-one + +## SIG Mission +T-One SIG focus on building a one station test system, to fully support OpenAnolis community test activities. + +The main activities of this SIG are: +1. Explore excellent solutions, collect requirements by the community, design and plan direction on the test platform. +2. Develop and maint T-One/Testfarm to support testing tasks by the community. +3. Make T-One open-source, attract develpers by the community, provide testing services for community developers and cooperative enterprises此处有中文. + +## T-One Link +T-One:https://tone.openanolis.cn/ + +Testfarm:https://testfarm.openanolis.cn/ + +## Members +| Member | Role | +| ------------ | ------------ | +| [yongchao](https://gitee.com/zy_chao) | maintainer | +| vosamowho | maintainer | +| wjn740 | maintainer | +| suqingming | maintainer | +| jacob2021 | maintainer | +| fuyong | maintainer | +| wenlylinux | contributor | +| zhangxuefeng | contributor | +| wb-cy860729 | contributor | +| jpt2021 | contributor | +| woohello | contributor | +| as461177513 | contributor | +| vosamowho | contributor | + +## SIG Repositories + +Source code repositories: +- https://gitee.com/anolis/testfarm +- https://gitee.com/anolis/testfarm-front +- https://gitee.com/anolis/tone-web +- https://gitee.com/anolis/tone-runner +- https://gitee.com/anolis/tone-agent +- https://gitee.com/anolis/tone-agent-proxy +- https://gitee.com/anolis/tone-agent-front +- https://gitee.com/anolis/tone-front +- https://gitee.com/anolis/tone-deploy +- https://gitee.com/anolis/tone-cli +- https://gitee.com/anolis/tone-storage + + +## Meetings + +## Chat GROUP + +欢迎使用钉钉扫码入群 + +![](assets/dingding_group.jpeg) \ No newline at end of file diff --git a/sig/T-One-copy/README.md b/sig/T-One-copy/README.md new file mode 100644 index 00000000..9c662bcc --- /dev/null +++ b/sig/T-One-copy/README.md @@ -0,0 +1,56 @@ +## SIG主页 + +https://openanolis.cn/sig/t-one + +## SIG目标 +T-One兴趣组主要目标是建立OpenAnolis社区的质量保障基础设施(包括但不限于一站式的自动化测试平台T-One/Testfarm,Bisect缺陷定位工具等各类测试平台), 支持OpenAnolis社区的各类测试活动;此SIG组的主要活动有: +1. 探索业界在测试工具方面的优秀方案,同时结合社区在测试方面的需求,设计规划测试工具的后续方向。 +2. 开发并维护相关测试工具,支撑社区的各类测试活动。.... +3. 开源相关测试工具,吸引社区的开发力量,并为社区开发者及合作企业提供测试服务。 + +## 平台链接 +T-One:https://tone.openanolis.cn/ + +Testfarm:https://testfarm.openanolis.cn/ + + +## 成员列表 +| 成员 | 角色 | +| ------------ | ------------ | +| [yongchao](https://gitee.com/zy_chao) | maintainer | +| vosamowho | maintainer | +| wjn740 | maintainer | +| suqingming | maintainer | +| jacob2021 | maintainer | +| fuyong | maintainer | +| wenlylinux | contributor | +| zhangxuefeng | contributor | +| wb-cy860729 | contributor | +| jpt2021 | contributor | +| woohello | contributor | +| as461177513 | contributor | +| vosamowho | contributor | + +## SIG仓库 + +Source code repositories: +- https://gitee.com/anolis/testfarm +- https://gitee.com/anolis/testfarm-front +- https://gitee.com/anolis/tone-web +- https://gitee.com/anolis/tone-runner +- https://gitee.com/anolis/tone-agent +- https://gitee.com/anolis/tone-agent-proxy +- https://gitee.com/anolis/tone-agent-front +- https://gitee.com/anolis/tone-front +- https://gitee.com/anolis/tone-deploy +- https://gitee.com/anolis/tone-cli +- https://gitee.com/anolis/tone-storage + +## 小组例会 +双周会,采用线上会议形式 + +## 钉钉群 + +欢迎使用钉钉扫码入群 + +![](assets/dingding_group.jpeg) \ No newline at end of file diff --git a/sig/T-One-copy/assets/Dingtalk_20240614165831.jpg b/sig/T-One-copy/assets/Dingtalk_20240614165831.jpg new file mode 100644 index 0000000000000000000000000000000000000000..925bf2945891170613821e8e7dbc9e4206d17c8d GIT binary patch literal 6459 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 literal 0 HcmV?d00001 diff --git "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/1\346\234\210test" "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/1\346\234\210test" new file mode 100644 index 00000000..8c388782 --- /dev/null +++ "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/1\346\234\210test" @@ -0,0 +1,2 @@ +test +0228 \ No newline at end of file diff --git "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/2\346\234\210test" "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/2\346\234\210test" new file mode 100644 index 00000000..479dbaff --- /dev/null +++ "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/2\346\234\210test" @@ -0,0 +1,2 @@ +test +顶顶顶顶顶 \ No newline at end of file diff --git "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/3\346\234\210test" "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/3\346\234\210test" new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/3\346\234\210test" @@ -0,0 +1 @@ +test \ No newline at end of file diff --git "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202203-3).md" "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202203-3).md" new file mode 100644 index 00000000..3bf59177 --- /dev/null +++ "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202203-3).md" @@ -0,0 +1,20 @@ +## 会议主题 +测试管理系统TestLib的方案讨论 + +## 会议时间 +2022.03.16 10:00-11:00 + +## 参会人 + +- 参会方:来自电子五所(赛宝实验室)和阿里云的社区爱好者 +- 参会人:yongchao、qingming、wjn740、as461177513、VosAmoWho 等等 + +## 会议记要 + +1. 对齐五所提出的方案扩展需求,主要是字段的扩展以及流程上适当进行松耦合 + - 设计对象:需要考虑测试用例套与测试需求的关系,测试结果与测试执行记录集的关系,测试方案的扩展等 + - 评审相关:测试用例、测试方案、测试结果 + - 流程上:主要对象之间需要进行适当的弱耦合 + - 平台输出:需要考虑测试用例及测试用例执行记录集这两块内容 +2. 讨论后续社区合作、运营等方式 +3. 后续yongchao会结合这次新增扩展需求进行设计上的优化并与大家对齐 \ No newline at end of file diff --git "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202204-1).md" "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202204-1).md" new file mode 100644 index 00000000..6bec3ab0 --- /dev/null +++ "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202204-1).md" @@ -0,0 +1,22 @@ +## 会议主题 +测试管理系统TestLib演示及需求讨论 + +## 会议时间 +2022.04.28 11:00-12:00 + +## 参会人 +- 参会方:来自电子五所(赛宝实验室)和阿里云的社区爱好者 +- 参会人:yongchao、wjn740、as461177513、VosAmoWho 等等 +## 会议记要 + +1. 我们演示了testlib目前全部功能,包括大纲,需求,方案,用例,任务,设备等等功能,强调通用性。 + - 测试方案已经跟测试用例和测试任务打通。 + - 测试用例跟t-one打通,测试任务结果跟t-one打通中。 + - 测试设备状态跟t-one打通中。 + - 介绍目前规划:用户权限,自定义字段,测试任务结果打通,测试方案维度的报告,还有系统配置等。 +2. 讨论下阶段主要需求,主要考虑两个方面: + - 希望演示的时候打通台式机的一个**完整测试流程打通**(大纲,需求,方案,任务,报告等)。 + - 有一个台式机的**测试报告**可以看。 +3. 演示发现的主要问题: + - 方案关联的任务没限制,用例管理信息问题,任务结果问题,还有方案维度的报告结果。 + diff --git "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202205-1).md" "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202205-1).md" new file mode 100644 index 00000000..8139fbee --- /dev/null +++ "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202205-1).md" @@ -0,0 +1,36 @@ +## 会议主题 +测试管理系统TestLib开发进度同步、演示、以及问题交流 +## 会议时间 +2022.05.20 10:00-11:00 +## 参会人 + +- 参会方:来自电子五所(赛宝实验室)和阿里云的社区爱好者 +- 参会人:yongchao、VosAmoWho、juexiao、wjn740、zhizhisheng、as461177513 等等 +## 会议记要 + +1. yongchao和VosAmoWho 与五所同学演示了testlib相关功能,着重介绍了与上次demo的开发重点变化,主要是测试方案及报告,测试用例的优化,测试任务及结果录入,以及系统配置等模块的优化。 +1. 大家一起交流了 testlib 以及 t-one的相关问题: + - T-One相关问题: + - 文档指导类: + - 升级debian相关步骤,涉及toneagent, tone配置,tone-cli等。 + - 同步本地用例出现故障, 以及系统同步用例相关的配置。 + - 测试机器:内网集群与内网单机的区别,如何配置等 + - 测试工具的管理问题: + - 不同的脚本都通过git进行管理出现的问题,离线模式介绍。 + - 测试工具的管理,版本管理如何做。 + - TestLib相关问题: + - 和tone的联动需要完善。 + - 用例结果:测试用例 及 结果 通过excel 导入及导出;关联任务/跳过任务 + - 测试报告:需要显示测试设备信息,后面考虑软硬件信息的提取及展示 +3. 目前系统已经发布上线,可以给五所同学配置权限即可进行试用。 +3. 五所提出的5月25日正式演示时间点不变,主要演示需求点还是: + - 希望演示的时候打通台式机的一个**完整测试流程打通**(大纲,需求,方案,任务,报告等)。 + - 有一个台式机的**测试报告**可以看。 +5. 后续开发重点主要是: + - 权限管控体系完善,方便社区线上使用。 + - 与t-one对接起来,固定ws、project、job类型等,自动执行并同步用例。 + - 手动录入用例结果、及设备的优化。 + - 测试方案报告及结果中设备等的展示优化。 + + + diff --git "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202306-1).md" "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202306-1).md" new file mode 100644 index 00000000..4274bb1b --- /dev/null +++ "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202306-1).md" @@ -0,0 +1,24 @@ + +### 会议主题 +项目例会 + +### 会议时间 +2023.06.08 10:30-11:30 + +### 参会人 +参会人:yongchao,fubing,ylsong, zhizhisheng,suchunyang,T-One项目小组 + +### 会议纪要 + +1. T-One最新进展同步 +- runner2 性能优化 +- toneagent新增日志自动拆分、自动清理功能 +- 同步用例逻辑变更,不依赖同步用例的机器 +- 用例管理批量编辑字段优化 +- 时序分析中性能分析、新建 Job 提交、消息通知相关慢接口优化。 +- 新增接口可查询某个产品下的 Job ID。 + +2. 需求反馈和意见收集 +- 物理机迁移的方案:主要关心数据的可迁移 +- 版本升级原地升级的方案:升级的便捷性 +- 社区版和开源部署版的数据节点间的互相同步数据 diff --git "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202307-1).md" "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202307-1).md" new file mode 100644 index 00000000..e59dcd0f --- /dev/null +++ "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202307-1).md" @@ -0,0 +1,26 @@ + +### 会议主题 +项目例会 + +### 会议时间 +2023.06.08 10:30-11:30 + +### 参会人 +参会人:yongchao,fubing,ylsong, zhizhisheng,suchunyang,T-One项目小组 + +### 会议纪要 + +1. T-One最新进展同步 +- runner2 性能优化 +- toneagent新增日志自动拆分、自动清理功能 +- 同步用例逻辑变更,不依赖同步用例的机器 +- 用例管理批量编辑字段优化 +- 时序分析中性能分析、新建 Job 提交、消息通知相关慢接口优化。 +- 新增接口可查询某个产品下的 Job ID。 +- [这是一个链接]: http://www.z01.com/ "这里是链接的title内容 +这是一个链接 [这是逐浪软件官网链接](http://www.z01.com/ "欢迎访问逐浪软件官网") +2. 需求反馈和意见收集 +- 物理机迁移的方案:主要关心数据的可迁移 +- 版本升级原地升级的方案:升级的便捷性 +- 社区版和开源部署版的数据节点间的互相同步数据 +- 测试验证 diff --git "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232\346\265\213\350\257\225\346\226\207\344\273\266.md" "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232\346\265\213\350\257\225\346\226\207\344\273\266.md" new file mode 100644 index 00000000..1732d313 --- /dev/null +++ "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232\346\265\213\350\257\225\346\226\207\344\273\266.md" @@ -0,0 +1,4 @@ +### 收尾验证 +这是收尾,验证同步作者信息 +### 验证history +2023年11月16日10:49:13 \ No newline at end of file diff --git "a/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/ToneAgent\347\274\226\350\257\221\346\211\223\345\214\205\346\211\213\345\206\214.md" "b/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/ToneAgent\347\274\226\350\257\221\346\211\223\345\214\205\346\211\213\345\206\214.md" new file mode 100644 index 00000000..0949b8e7 --- /dev/null +++ "b/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/ToneAgent\347\274\226\350\257\221\346\211\223\345\214\205\346\211\213\345\206\214.md" @@ -0,0 +1,63 @@ +# 1. ToneAgent编译 + +## 1.1 环境准备 +Go 1.17 及以上版本([下载地址](https://go.dev/dl/)) + +## 1.2 下载ToneAgent + git clone git@gitee.com:anolis/tone-agent.git + cd tone-agent + +## 1.3 编译 +`-o` 后面是二进制的名称 + +### 1.3.1 编译 AMD64的二进制 + GOOS=linux GOARCH=amd64 go build -o toneagent-amd64-v102 + +### 1.3.2 编译 ARM 的二进制 + GOOS=linux GOARCH=arm64 go build -o toneagent-amd64-v102 + +# 2. Linux环境二进制打包 + +## 2.1 RPM包制作 + +### 2.1.1 RPM环境准备 + sudo su -c bash # 使用bash + yum install rpmdevtools rpmdevtools # 安装rpm打包工具 + +### 2.1.2 打包RPM包 + rpmdev-setuptree # 创建目录,会在用户目录下创建rpmbuild文件夹 ~/rpmbuild + cd # 返回用户目录 + vi rpmbuild/SPEC/toneagent.spec # 修改创建spec的模板文件 + mkdir rpmbuild/BUILDROOT/toneagent-0.0.1-AMD + cp ${二进制路径} rpmbuild/BUILDROOT/toneagent-0.0.1-AMD/ # 拷贝二进制到RPM目录 + cd rpmbuild/SPEC/ + rpmbuild -bb toneagent.spec # 构建rpm包 + +### 2.1.3 RPM安装及启动 + sudo yum -y install ${toneagent包位置} # 安装 + sudo systemctl start toneagent # 启动 + +## 2.2 DEB包制作 + +### 2.1.1 环境准备 + sudo apt instsll -y dpkg # 使用二进制打包,只需要安装这个包 + sudo apt install -y dpkg build-essential devscripts quilt dh-make git # 扩展安装 + +### 2.1.2 打包DEB包 + mkdir toneagent.work + cd toneagent.work + mkdir -pv toneagent_0.0.1_amd64/{DEBIAN,bin} + cp ${tone-agent二进制} toneagent_0.0.1_amd64/bin/ + echo "Package: toneagent + Version: 1.0 + Architecture: arm + Maintainer: alibaba + Installed-Size: 100 + Depends: + Priority: optional + Description: toneagent for SUNXI devices (A10,A20 ...),example is Cubieboard. + " >> toneagent_0.0.1_amd64/DEBIAN/control + dpkg -b toneagent_0.0.1_amd64 toneagent_0.0.1_amd64.deb + +### 2.1.3 DEB安装 + dpkg -i toneagent_0.0.1_amd64.deb diff --git "a/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" "b/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" new file mode 100644 index 00000000..9dca95d4 --- /dev/null +++ "b/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" @@ -0,0 +1,16 @@ +HCT密码计算套件的目录结构如下: +阿斯顿法师打发斯蒂芬 +44444444444444444444444444444444444444444444444444444 +hygon-devkit/ + + ├─ hct +  ├──pkg +  │ ├── hct_1.0.0.20230224_rc +  │ ├── hct_1.0.1.20230512_rc +  │ └── hct_1.1.0.20230730_rc +  │ +  └── README.md + +\* pkg目录:内含各版本hct密码计算套件。 + +\* README.md文件:有关HCT的简单情况。 \ No newline at end of file diff --git "a/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/\345\257\271\345\244\226\346\234\215\345\212\241API.md" "b/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/\345\257\271\345\244\226\346\234\215\345\212\241API.md" new file mode 100644 index 00000000..6be2fe13 --- /dev/null +++ "b/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/\345\257\271\345\244\226\346\234\215\345\212\241API.md" @@ -0,0 +1 @@ +参考文档:https://tone.openanolis.cn/help_doc/7 \ No newline at end of file diff --git "a/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/\346\265\213\350\257\225\345\245\227\344\273\266\351\233\206\346\210\220\346\211\213\345\206\214.md" "b/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/\346\265\213\350\257\225\345\245\227\344\273\266\351\233\206\346\210\220\346\211\213\345\206\214.md" new file mode 100644 index 00000000..67b07c6d --- /dev/null +++ "b/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/\346\265\213\350\257\225\345\245\227\344\273\266\351\233\206\346\210\220\346\211\213\345\206\214.md" @@ -0,0 +1,282 @@ +# tone-cli介绍 +tone-cli主要用于测试套件(testsuite)的调度及运行。 + +# 代码仓库 +https://gitee.com/anolis/tone-cli + +# 测试套件构成 +测试套件主要由套件本身和集成脚本构成,其中: + +- 测试套件可以存放于gitee或其他代码仓库,也可以是一个系统中已经包含的命令 +- 集成脚本由两部分构成: + - 适配脚本 + - 测试套配置文件 + +# 测试套件集成 + +## 测试配置文件 +测试配置文件位于`$TONE_ROOT/conf`目录下,与适配脚本一起为测试套件服务。 + +为了便于组织,当前根据测试类别分为`functional`,`performance`和`stress`。 + +测试配置文件主要用于描述测试的参数,以netperf为例: + + test IP runtime send_size + TCP_RR ipv4 60s Na + TCP_RR ipv4 60s 16K + TCP_CC ipv4 60s Na + TCP_CRR ipv4 60s Na + ... + +第一行描述为变量名,后续行描述的是变量的值。tone-cli会将测试套配置文件按照配置进行执行: + + $ tone list netperf + test IP runtime send_size testconf + TCP_RR ipv4 60 None netperf:test=TCP_RR,IP=ipv4,runtime=60s + TCP_RR ipv4 60 16K netperf:test=TCP_RR,IP=ipv4,runtime=60s,send_size=16K + TCP_CC ipv4 60 None netperf:test=TCP_CC,IP=ipv4,runtime=60s + TCP_CRR ipv4 60 None netperf:test=TCP_CRR,IP=ipv4,runtime=60s +在后续的脚本中,conf中的变量会以参数形式传递给适配脚本。 + +> 注: +> +> - 没有任何变量的测试套,仍然需要创建对应名称的配置文件,保持内容为空 +> - 对于某个参数,如netperf的send_size,在某些状况下不需要传入参数,则可以置为NA + +## 适配脚本 + +测试套件适配脚本需要存放于`$TONE_ROOT/tests`目录下,创建工具对应的目录,如`$TONE_ROOT/tests/netperf`。 + +tone-cli将测试定义为以下几个阶段,可以根据需要来决定是否需要对应的阶段: + +- 测试套件获取 +- 测试套件编译安装 +- 测试执行 +- 结果处理 +- 测试套件卸载 + +适配脚本需要最少包含`install.sh`,`run.sh`和`README.md`,其中: + +- install.sh: 定义测试套件获取、依赖包、测试套件编译及安装 +- run.sh: 定义测试执行过程,结果处理方式 +- README.md: 测试套件必要说明 + +其他脚本可以根据需要决定,如:将结果处理脚本单独编写,在run.sh中加以引用 + +### 测试套件获取 + +当前支持通过URL下载或git方式获取对应的测试套: + +| 方式| 参数 | 说明 |举例 | +| :--:| :---: | :---: |:---: | +|URL下载 |WEB_URL |测试套下载地址 |WEB_URL=“https://gitee.com/anolis/tone-cli/repository/archive/master.zip”| +|GIT仓库 |GIT_URL |git仓库地址 |GIT_URL="https://gitee.com/mirrors_HewlettPackard/netperf.git"| +| |BRANCH |git分支| BRANCH="netperf-2.7.0"| + +tone-cli将根据提供的`WEB_URL`,`GIT_URL`,`BRANCH`等信息拉取对应的源代码 + +### 举例: + +`netperf/install.sh` + + GIT_URL="https://gitee.com/mirrors_HewlettPackard/netperf.git" + BRANCH="netperf-2.7.0" + +### 测试套件编译安装 + +tone-cli提供的标准安装方式由以下几步: + +- 执行安装前额外的操作:extract_src +- 安装依赖包:install_pkg +- 编译:build +- 安装:install + +**extract_src** + +用于在安装依赖包之前进行必要的准备,如centos安装epel源: + + extract_src() + { + logger yum install -y epel-release + } + +**install_pkg** + +绝大部分状况下,不需要重写install_pkg的方法,而仅通过设置DEP_PKG_LIST的变量,tone-cli将自动进行依赖包安装。如netperf/install.sh: + + DEP_PKG_LIST="automake gcc texinfo" + +**build和install** + +通常状况,build和install都需要根据测试套件进行重写。以netperf为例: + + build() + { + local configure_flags=( + --prefix="$TONE_BM_RUN_DIR" + ) + if [ "$(/usr/bin/arch)" = aarch64 ]; then + configure_flags+=('--build=aarch64-unknown-linux-gnu') + fi + + export CFLAGS="-fno-strict-aliasing -fcommon" + + ./autogen.sh + ./configure "${configure_flags[@]}" + make + } + + install() + { + make install-exec + } +### 测试执行 + +测试执行被定义在`run.sh`中,主要的步骤有: + +- 测试准备:setup +- 测试执行:run +- 测试拆除:teardown + +以netperf为例,netperf测试可以划分为: + +- 启动netserver +- 使用netperf命令进行测试 +- 拆除netserver + +**setup** + +netperf测试中,netserver启动主要逻辑为: + +- 判断是否设置了$SERVER,如果已设置,则认为netserver将在对应的server上执行 +- 启动netserver,启动netserver的主要逻辑在netserver.sh中体现 + + setup() + { + [ -n "$SERVER" ] && server=${SERVER%% *} || server=localhost + echo "Run netserver on host: $server" + + if [ "$server" = localhost ]; then + source "$TONE_BM_SUITE_DIR"/netserver.sh + else + ssh $server "TONE_ROOT=$TONE_ROOT TONE_BM_RUN_DIR=$TONE_BM_RUN_DIR IP=$IP server=$server $TONE_BM_SUITE_DIR/netserver.sh" + fi + } + +**run** + +netperf测试套的执行逻辑,主要根据测试套件配置中的参数组合,设置netperf命令行参数以执行测试 + +> 注: +> +> 在执行命令时,使用logger方法将netperf命令行输出写入对应的日志文件中,以备后续进行结果处理 + + run() + { + export PATH="$TONE_BM_RUN_DIR"/bin:$PATH + + [ -n "$send_size" ] && test_options="-- -m $send_size" + + opt_ip= + [ "$IP" = 'ipv4' ] && opt_ip='-4' + [ "$IP" = 'ipv6' ] && opt_ip='-6' + base_cmd="netperf $opt_ip -t $test -c -C -l $runtime -H $server $test_options" + + # check online cpus with cpu_affinity set on multi-processor machine + if [ "$server" = localhost ] && [ "$(nproc)" -gt 1 ]; then + check_oneline_cpu + # the last cpu is reservered for netserver if test on single node + cpu_online_num=$((cpu_online_num - 1)) + cpu_online_tpy=$(echo "$cpu_online_tpy" | awk '{$NF=""; print $0}') + cpu_x=$((1 % cpu_online_num)) + [ "$cpu_x" -eq 0 ] && cpu_x=$cpu_online_num + mycpu=$(echo "$cpu_online_tpy" | awk -v n=$cpu_x '{print $n}') + test_cmd="taskset -c $(echo "$mycpu" | cut -d- -f3) $base_cmd" + echo "run netperf on cpu: $(echo "$mycpu" | cut -d- -f3),"\ + "socket: $(echo "$mycpu" | cut -d- -f1),"\ + "core_id: $(echo "$mycpu" | cut -d- -f2)" + else + test_cmd="$base_cmd" + fi + + logger $test_cmd & + logger wait + } + +**teardown** + +netperf的teardown阶段,主要通过执行pkill命令杀死netserver进程 + + teardown() + { + pkill netserver + } + +**结果处理** +tone-cli当前规定的结果规范为`key: value`,所以只要符合这个输出规范,对应的结果会被收集并存储。 + +以netperf为例,其结果处理的`parse()`调用了一个awk脚本: + + #!/usr/bin/awk -f + + /^Size.*Okay.*Throughput.*Demand$/ { + unit = "Mbps1" + next + } + + /^Size.*Throughput.*remote$/ { + unit = "Mbps2" + next + } + + /^bytes.*secs.\s+per sec/ { + unit = "tps" + next + } + + $8 && $0 ~ /^[ \t0-9.]+$/ { + if ( unit == "Mbps1" ) { + printf("Throughput_Mbps: %s\n",$(NF-2)) + } + else if ( unit == "Mbps2" ) { + printf("Throughput_Mbps: %s\n",$5) + } + else{ + printf("Throughput_%s: %s\n",unit,$6) + } + } + +执行完毕后会输出: + + Throughput_tps: 91336.30 + +# 公共变量 +tone-cli提供了多个公共变量用于在测试集成时使用 + +## 测试套配置文件 + +|变量名称| 用途| 举例| +|:--:|:--:|:--:| +|nr_task |设置使用的线程数,可以使用百分比形式表示,当设置为百分比时,框架会根据当前测试机CPU数量进行计算 |nr_task=1, nr_task=50%| +|cpu_affinity |设置CPU绑定| cpupin| + +## 测试套适配脚本 + +|变量名称| 用途| 举例| +|:--:|:--:|:--:| +|$TONE_BM_CACHE_DIR |测试套件cache目录| /tmp/tone/cache/netperf| +|$TONE_BM_BUILD_DIR| 测试套件build目录| /tmp/tone/build/netperf| +|$TONE_BM_RUN_DIR |测试套件run目录,可以将测试套件安装于该目录中,而不用安装到系统目录下| /tmp/tone/run/netperf| +|$TONE_BM_RESULT_DIR |测试套件结果存放目录 |/tmp/tone/result/netperf| +|$TONE_CURRENT_RESULT_DIR |当次运行时的结果存放目录| /tmp/tone/result/netperf/1| +|$TONE_BM_SUITE_DIR |测试套件脚本目录| /tmp/tone/tests/netperf| + +# 公共函数 + +tone-cli提供一些公共函数已方便脚本编写,公共函数主要归档于$TONE_ROOT/lib目录下,在编写脚本时可以按需引入。常用的函数有: + +|函数名| 文件 |用途 |举例| +|:--:|:--:|:--:|:--:| +|logger |lib/common.sh |记录日志 |logger netperf -t TCP_RR| +|set_cpu_affinity_server |lib/cpu_affinity.sh |设置服务端CPU绑核,会将server绑定在最后一个CPU核上,注意,需要通过server_cmd变量进行传递 |server_cmd="netserver" [ -n "$cpu_affinity" ] && set_cpu_affinity_client logger ${server_cmd}| +|set_cpu_affinity_client |lib/cpu_affinity.sh| 设置客户端CPU绑核,会将client绑定在第一个CPU核上,注意,需要通过client_cmd进行传递 |client_cmd="netperf -t TCP_RR" [ -n "$cpu_affinity" ] && set_cpu_affinity_client logger ${client_cmd}| \ No newline at end of file diff --git "a/sig/T-One-copy/content/\346\234\210\346\212\245/202212.md" "b/sig/T-One-copy/content/\346\234\210\346\212\245/202212.md" new file mode 100644 index 00000000..88250c90 --- /dev/null +++ "b/sig/T-One-copy/content/\346\234\210\346\212\245/202212.md" @@ -0,0 +1,82 @@ +# 整体进展 +- 发布 ANCK 4.19-027 版本。 +- 初步建立了龙蜥社区第三方驱动的研发流程,并试用该流程集成了国产化网迅网卡驱动。 +- ANCK-5.10 内核产品化。 +- 成立"浪潮信息龙蜥联合实验室"。 + +# ANCK 4.19-027 版本 +## 内核更新 +- 版本更新至 4.19.91-27 +- 重要内核缺陷及安全漏洞(CVE)修复 +- 在 namespace_unlock 中使用 synchronize_rcu_expedited 加速 rcu 宽限期,使并发启动100个 busybox 容器的速度提升19% +- 调整 Trusted Platform Module 驱动的缓冲区大小,避免上下文切换时因内存不足报错 +- 默认使能 mq-deadline IO 调度器 +- 提升 NVMe、megaraid_sas 和 mpt3sas 三个驱动的稳定性 +- 全面支持 Aero 系列 raid 卡 +- 修复了飞腾处理器 SMMU 的硬件缺陷导致的问题 +## 自研功能 +- 支持动态开启 Group Identity 特性 +- 支持稀疏文件映射使用系统零页,减少启动虚拟机时的内存消耗 +## CVE修复列表 +详情请参考: +- [Anolis OS 7](https://anas.openanolis.cn/errata/detail/ANSA-2023:0002) +- [Anolis OS 8](https://anas.openanolis.cn/errata/detail/ANSA-2023:0001) + +重要CVE列表: +- CVE-2021-33656 +- CVE-2021-4037 +- CVE-2021-4159 +- CVE-2022-0001 +- CVE-2022-0002 +- CVE-2022-0494 +- CVE-2022-1012 +- CVE-2022-1048 +- CVE-2022-1184 +- CVE-2022-1198 +- CVE-2022-1462 +- CVE-2022-1679 +- CVE-2022-1729 +- CVE-2022-1734 +- CVE-2022-21125 +- CVE-2022-21166 +- CVE-2022-2153 +- CVE-2022-2318 +- CVE-2022-24958 +- CVE-2022-2503 +- CVE-2022-25258 +- CVE-2022-2586 +- CVE-2022-2588 +- CVE-2022-2602 +- CVE-2022-26365 +- CVE-2022-2639 +- CVE-2022-26490 +- CVE-2022-27223 +- CVE-2022-28388 +- CVE-2022-28389 +- CVE-2022-28390 +- CVE-2022-2978 +- CVE-2022-30594 +- CVE-2022-3176 +- CVE-2022-3202 +- CVE-2022-32250 +- CVE-2022-3542 +- CVE-2022-36879 +- CVE-2022-36946 +- CVE-2022-39188 + +# 龙蜥社区第三方驱动 +建立第三方驱动的社区研发流程:https://openanolis.cn/sig/Cloud-Kernel/doc/721476448598622343
+ +网迅网卡已经按此流程合入 ANCK : +- 支持ANCK-5.10 10GB 网迅网卡驱动: https://gitee.com/anolis/cloud-kernel/pulls/540 +- 支持ANCK-4.19 10GB 网迅网卡驱动: https://gitee.com/anolis/cloud-kernel/pulls/709 +- 支持ANCK-4.19 1GB 网迅网卡驱动: https://gitee.com/anolis/cloud-kernel/pulls/1043 +- 支持ANCK-5.10 1GB 网迅网卡驱动: https://gitee.com/anolis/cloud-kernel/pulls/1063 + +# 重要议题 +- 讨论并决策了将 ANCK-5.10 作为 Anolis8 的默认产品化内核,详情请点击[这里](https://gitee.com/anolis/community/blob/master/proposals/Anolis8%E4%B8%8AANCK-5.10%E4%BA%A7%E5%93%81%E5%8C%96%E7%9A%84%E6%8F%90%E8%AE%AE.md)。 +- 讨论并决策了将 ANCK-5.10 作为 Anolis23 的当前默认内核,详情请点击[这里](https://gitee.com/anolis/community/blob/master/proposals/anck-5.10%E4%BD%9C%E4%B8%BAanolis23%E7%9A%84%E5%86%85%E6%A0%B8%E9%80%89%E5%9E%8B%E7%9A%84%E6%8F%90%E8%AE%AE.md)。 + +# 运营活动 +- [浪潮信息正式发布基于龙蜥 Anolis OS 的服务器操作系统 Inspur KOS](https://openanolis.cn/news/726244284765327879)。 +- 于2022.12.24 举办了“[龙蜥走进系列活动之走进浪潮信息 MeetUp](https://mp.weixin.qq.com/s?__biz=Mzg4MTMyMTUwMQ==&mid=2247510368&idx=1&sn=95a1d511b32670f8388745682483046a&chksm=cf655a12f812d30494be938d7bf8a46b7244711c8fb75f44e8379ab261b1fd4aeb1c8bb0805e&scene=21#wechat_redirect)",并成立了浪潮信息龙蜥联合实验室,致力于共建龙蜥社区的软硬件兼容性生态、标准建设和技术创新等。 diff --git "a/sig/T-One-copy/content/\346\234\210\346\212\245/202301.md" "b/sig/T-One-copy/content/\346\234\210\346\212\245/202301.md" new file mode 100644 index 00000000..85bbb428 --- /dev/null +++ "b/sig/T-One-copy/content/\346\234\210\346\212\245/202301.md" @@ -0,0 +1,101 @@ +# 整体进展 + +- 发布 ANCK 5.10-013 版本。 +- 确定KABI机制整体方案。 +- 浪潮信息龙蜥联合实验室的工作事项更新。 + +# ANCK 5.10-013 版本 + +## 内核更新 + +- 版本更新至 5.10.134-13 +- 重要内核缺陷及安全漏洞(CVE)修复 +- 支持用户态/dev/ioasid +- SWIOTLB机制性能优化 +- virtio-net 打开 napi.tx 优化 TCP Small Queue 性能 +- 支持AST2600 PCIe 2D VGA Driver +- 支持FT2500处理器 +- 支持动态开启Group identity特性 +- arm64平台默认内核启动cmdline调整 +- 添加 Compact Numa Aware (CNA) spinlock 功能支持 +- 丰富arm64的perf mem和perf c2c功能 +- fsck.xfs 支持日志恢复 +- hugetext自适应按需大页 +- 支持SGX动态内存管理 +- 使能wireguard模块 + +## CVE修复列表 + +详情请参考: + +- [Anolis OS 7](https://anas.openanolis.cn/errata/detail/ANSA-2023:0002) +- [Anolis OS 8](https://anas.openanolis.cn/errata/detail/ANSA-2023:0001) + +重要CVE列表: + +- CVE-2021-4037 +- CVE-2022-0171 +- CVE-2022-1679 +- CVE-2022-2585 +- CVE-2022-2586 +- CVE-2022-2588 +- CVE-2022-2602 +- CVE-2022-26373 +- CVE-2022-2663 +- CVE-2022-2905 +- CVE-2022-2978 +- CVE-2022-3028 +- CVE-2022-3061 +- CVE-2022-3169 +- CVE-2022-3176 +- CVE-2022-3435 +- CVE-2022-3521 +- CVE-2022-3524 +- CVE-2022-3534 +- CVE-2022-3535 +- CVE-2022-3542 +- CVE-2022-3545 +- CVE-2022-3564 +- CVE-2022-3565 +- CVE-2022-3566 +- CVE-2022-3567 +- CVE-2022-3586 +- CVE-2022-3594 +- CVE-2022-3621 +- CVE-2022-3623 +- CVE-2022-3625 +- CVE-2022-3628 +- CVE-2022-3629 +- CVE-2022-3633 +- CVE-2022-3635 +- CVE-2022-3646 +- CVE-2022-3649 +- CVE-2022-36946 +- CVE-2022-39189 +- CVE-2022-39190 +- CVE-2022-39842 +- CVE-2022-40307 +- CVE-2022-40768 +- CVE-2022-41222 +- CVE-2022-41674 +- CVE-2022-42719 +- CVE-2022-42720 +- CVE-2022-42721 +- CVE-2022-42722 +- CVE-2022-42895 +- CVE-2022-42896 +- CVE-2022-43750 +- CVE-2022-4378 + +# 龙蜥社区第三方驱动 + +* 提供主流GPU在AnolisOS的Driver、CUDA、cuDNN安装测试与卸载指导文档:https://openanolis.cn/sig/AI_SIG/doc/721423765456666646 + +# 重要议题 + +- 调研并讨论了KABI机制的整体方案与实现细节。 +- 基于浪潮信息龙蜥联合实验室,讨论了关于整机硬件兼容性的相关事项,后续长期共建 AnolisOS 硬件兼容性标准和生态。 + +# 运营活动 + +- 无 diff --git "a/sig/T-One-copy/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" "b/sig/T-One-copy/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" new file mode 100644 index 00000000..30020428 --- /dev/null +++ "b/sig/T-One-copy/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" @@ -0,0 +1,7 @@ +- 每月的月初总结发出上月的报告,并更新到 SIG 页面,如 2022.12 + +- 月报包含内容: + + 整体进展:SIG 该月的亮点特性汇总。 + + 具体进展:SIG 该月项目的详细进展,分别展开细节。 + + 重要议题: SIG 该月讨论的重要议题。 + + 运营活动: SIG 该月发生的运营活动。 diff --git "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/000000000130_anolis.jpg" "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/000000000130_anolis.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..25e606c9c5d28fccaf9f6caa351e3720570e4162 GIT binary patch literal 47154 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 literal 0 HcmV?d00001 diff --git "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" new file mode 100644 index 00000000..74f3dbc4 --- /dev/null +++ "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" @@ -0,0 +1,30 @@ +### T- One是什么 + T-One是一站式的自动化质量协作平台;打通了测试计划、测试准备、测试执行、测试分析、测试报告、覆盖率检测、智能Bisect,环境服务等流程的闭环,为社区研发提供一站式质量服务。 +​ + +### 平台架构 +![](assets/jiagou.jpeg) + +### 核心特点 +- 一站式质量平台:平台打通了测试准备、测试执行、测试分析、测试计划、测试报告、覆盖率检测、智能Bisect、智能巡检等流程全闭环,为社区研发提供一站式测试支撑。 + - 支持多CPU混合架构(x86、arm、loogarch、risc-v) + - 支持多操作系统类型(龙蜥OS、centos、debian等) + - 支持复杂环境测试(企业内网、独立隔离、弹性云虚拟机/容器、应用集群及多种混合环境) + +- 质量协作能力:通过分布式的业务架构和独立租户空间能力,支持多企业、多团队的质量协作模式。 +- 数据分析能力:平台提供了时序分析、对比分析,以及聚合生成测试报告的能力,在大量测试之后对数据进行分析以发现软件问题。 +- 开源软件包CI服务:社区开发者可以将自己的软件包(可来自代码托管平台如github/gitee/codeup等)注册到Testfarm, 平台会监控软件包的代码变更,一旦有变更则会立即触发测试,并将测试结果通知开发者,方便开源软件包引入。 +- 开发者资源服务:社区开发者可以reserve测试环境并登陆,方便在测试环境中进行测试及debug。 +- 缺陷定位诊断服务:对于发现的软件缺陷,平台可以提供了缺陷的自动化定位诊断能力,可以发现引入缺陷的commit地址。 + + +### 应用场景 +- 场景1:OS发布测试,每次AnolisOS的发布,社区测试团队会根据发布测试策略进行大规模测试,保障产品发布质量,外部用户可以在Testfarm查看发布测试数据。 +- 场景2:开源软件包CI,社区开发者可以将软件包注册到平台,平台会自动监控软件包的变更,一旦发生变更会立即进行测试并推送测试结果。 +- 场景3:自定义测试,社区开发者根据自己的需求可以在T-One平台进行在线测试,或者使用命令行测试。 +- 场景4:离线测试,对于网络不可达的测试环境,用户可以使用离线测试模式测试并上传数据。 +- 场景5:独立部署,外部用户也可以在自己环境下独立部署平台,测试并上传数据到Testfarm。 +- 场景6:登陆测试环境,社区开发者可以根据需要reserve测试环境登陆进行测试及debug。 +- 场景7:缺陷定位诊断,一旦测试出缺陷,平台会自动诊断缺陷引入的commit。 + + diff --git "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/Dingtalk_20240614165831.jpg" "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/Dingtalk_20240614165831.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..925bf2945891170613821e8e7dbc9e4206d17c8d GIT binary patch literal 6459 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

}E@Hj0_{W?|f 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

FG!grkAXdJNt$uIvKqhcJq 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 z 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[WR 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ⅅQKHz};_SkLL8?V2PS1YROEdQ3~XQxay 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ċXdTaw*%m;m5ZDbWgJ_XqbT zDvAh;-~A5{-eY6$?_p6wFPKWC2wO#bCkhup5n5$xivQYC8gC{q6W18Df;8o)yZA^L z&19`0^;+FlAyp9lc`R#?1}XdxA=qZp@qYg0K_H~ccT+X*5)8#~rET{E?)6ete%?+` z>Pg;Oc!igL?}wr%P%Jl@>kT2>A_9lw&WZ1JDr##o*-z!EZ(sXULd{qi52l@J2FAZh)l%b1RxVsPVT45>GYK6W zs%mt)YBEJObA&^*vaO~&Ylbo`Q*J?uQnpw@EGyN#=FD{MpiJ?21iE=JK@!i{WQwiN z)*KO=f$)&wM8z%)PSI(CGAWa3)9c;ND@?)lyrRtaD7$GqMXV^g$953;;!hXxxUiRa z{)GPb`7iQmMGUkxRpBs!#wr?u=&Mts2N^sjCv}q8AWjT2j+a*tX4s1U)^X`h<$6f6 z<#{PRw?(ir$IPNe(R5FYC9daux!_Ty_s*Sduj|)adE_3Nm6{4cb89eLQ_KCsL(^t8 zmONhdjy;uav|LBMmFJmw)HSpDHl46wr2>kjJDF$H`h>YmCMPl;nd353r|-GB2~crJlEYSZdvg__fXQwTu_6lDVdjdWA1o{3pj<* zWO7`~@K{3uUOy}vzP|fwRJ|qtV1!mFv;onWLycv;NES?DdSWTx7<4q$E(7u-h5`*y zunjTjaPhRXv>5{Y=$2uqyQi2ZfQq)L2rSx1#qp2#kA?Cat1N}Vess|sMKCc!m>fu# zskZ_Dk$MRV&f0w`meIYU7U&TXTLZk#7Jyte?LOzQY4aWx7Jw$Q~AW05`zp#STqFF;8>m(vmt6lfA_v~Z zPR||?_~jnZv`K@EVgRKEX5W(W*9-znsc1ALK-W7`aQY%CLFZcpXF@&6^`$)77hpYo z+MF(7h6)8Jg-v8eiTVL$q!< z6Dva)^)DRY@#s3N<7D%mVKJO5Ef3}A=sBe0`p_8|XbHCSjuVlg^#tR(kG0h7_lfWM zl1KPfPXTED71gAg({M9iGpA9D(7lpLmYY^kHI2xI^)RNz_q_|9^Vt1u@Lt}?$Rx3q zHB5%ploO($xfB!a{`_da$~3pMA*$%)S5+tR16^{WCtPCoxk9|No(`ulTm=fi#KHxn8b$4Gmy;6T91*vrdDsFfq&&+a>I}QT$-}alE@Cye%#p7#M?m1`^VJfG8cOpRxv-IIy|LD(Bu zup^9K&aifKUsoB@Nn7bY)Aa1qEhPJzHOH=PpUXl~YKAlYhmBJ6h+Mf(of4$kGP zTX$P|+AfOJI{A+^{3aYTYfWZ-JyTk6^vZL><~Vh&vlYu3rfjlYLOQ3~Vuvc(WU3or zr1Tw_hLp&V{<6V6?{K~U=lAWc`Sn2g#B)Y1$I|vgI{Vms_kn4(^n+9`GM{>0jzVyc zw}D4rdDqgU7lE0S_m?prJ)yM*{lKmMrVAUiXJ%@od0D)1YmPYm1Oz%%dCc&P?81Gi zPrCw9tq1gXqQ{a;6W*LaTZ}hEfZQ8KgPkk$SnEiQR0cX@1pK7h#t)q&g}+E9;vJ`^ z)W#ra{#A7IZRFuvDtpnu`uUfL3)UPQ%^$9Gte&zFN_HT6wbgM%x*;df&FYfEG1M7C zi^8c2vThidKUDO4O3I6kMs#~2@X%(71?`{{b^!S4o*dmNZdgCkaA=OK8Oj^B=V<(E zwsIA@Dm!xAHWE_a&F{IWFkTgR4(!*CvG%g%MP)n?n_8LP-+zdm&-~kpr)ZgNFt64= z4y*IK#RIXN#67XEE}w2jH5KB|X!O9sgS0jZaz346t+tVpa;&*}P+mM;GizAtAr7oD zzJ8NePQ%;;ZuX_g*>X0l`h$sNY5e8_m@+(I; z9jJe?g@n)80~8;b0WsrkzymB6?GP=0@X-||R`xgwF~lER*GMXe0L{oJ8sw1>3;HW~ zavo)i>3u9hC@kMB(jhAQ8Hub)#;Im9oEt&u5LAAKA{9-T;Uo~ZvcZ1VM>HCI=tL08 z9Flu?l(}k&j~%E26#63lz55_*BPZ%M<>gJ&A*9Q{*81JdEHQB*O`<$`g(&RZBI5P) z3w;&((H>lRL1fAdngPe z|DM?l6daIXAD}C+F_N5}(4h!@0FsFhk z)}9(slQ13XTG~*X6#4QOT%rgitrTSyu@8O`9k`XdB8ZoQkhrIo8d4l1RUit!Yq#5nAZ7~&4Kb?jMk=5p zuYHaR;rgv^VHD49*kh>!z|9}MR5}9*m)B4g41#VUE=Qd|pgS2aVRN!DLyk8M2;8xU zx=|ud_tx=GP!?Arft%7gp$a6R5yvBExr3$A96Rqb3~A?zrw@N^$kb+lcVWq%aoY#g zWXAs4z&2E%MNRBYmsBxVs5cxWVO)jT|KoSKl21~`FfHXz+3PkL9R}?WHXW53AhnGb z!Mq_*Y(BCCa`ZKHSKw}p6k+;F^5wEpf^rpSaV&^{p{Wm57KC`!Mct0Jv~IQ84#2Za z>A?Li^|XuAgNufcu~$4l9l0MaMp-Xuv(YSd7CBwZ>>tHUI;A9$ zK#-m;DU$|e%TQK#{;0#|P0bfjRFzc{hEC26sIU}CwN+B#Ys2VaYkG<{uXO+H92g1x zFcbeye!yZmqHN*D8>nC~cx9t+At&AU;gHEAZr|6N{Q*wQ5b!{@_L99cM-CM>K~}?B zOA|;a^w3;LLYzFTNZh8jjuZUXLhd6?({M+9N+NJ=Qh7xG9?TBIL|^k79K1G8J$`zz-f z{LcoV(wMBU$-4#I1f!K9bZTyo5|~K0fND5mtn>zsr?P4I3HFCf&hvtjpoSy-bOwyR z7DxneuS-w~V(&}@1Qs>=3Wl0#-4R{FcJu1?JuFF(KutI@YBSL_Vu^TSVVcgrQu6lg z`YL)Ip8xX#@N}OSg>jFcT{w$&tTILH3^*z(&E{ojAo+Y z?}1f^ZFE!ZbKI||WR~c)hr|sW5*>-0=4vllV?4{AJ(}cb!0x)(d-$86*j=|}jQit;;=T9t#`2- z#ho=jO14r6+ifC^9n}o8@0M*VJbR^7(8uuqyQ03@vV94ocz_nB#FA7nFamBH10C~=;yg9masmmH zn2d70nZH%inRjtzGaUMs+&oxg1#A-4$XSByBQ)uCc^Ux|T6Ivk$P!;$l89Rc?^HZa z6xChNiRu{Ix=59@P)lsstJ=3q;ok_}(h6j}^-^s3-4C5n0$g0cS2P4Z#ORH%@NY0} zjNwypw3$A~wW@u6Y&10DWWyyBcSKA4t8&gP*5?Q7IgBO>KGX>FIODC@#CpfW(J7^2 zx|jrH%I&=Gt`ln_gzo=}L#_1t#8yul$wdEvVt^ZbcP$&%?5gj&kMX!1`dxNsE>%*2 z=l0ppYmZ(`XO-o6P#f2x`vbynvDMtW2gG(+z0Qs^@bXGC^5@q*`8# zJiTFiU|(aUyPn$A?7FA3IT~R0#sNc*>Dwv?!WJ61Sx>AC?j7pim<>8;(?Q8RQm^A0 z(xb5Fs}xiB6J+grKWeNr`IIyG$g3Eb7LAf&-1@_R4bL4W02C31vQW*^pA zZ#+Y6EF-PtXl6b~#rI^unQ*d!K<4-XeGy8xIKhWmn&tRk9B=1F3GH7j2>gw3*6UZ7 zZW*107M(EK$g26SgQ(6+ninA`ajbWZC63?slr$7#X}~w6_%&Q)*QtABV58!%GX2F+2q>XIczR{vfFXJ2Cay zf}uGwNA|O3H;Na9E5Oxm+Pr#*KtC^3!3uJ_WUc8tj!I6wDUB%4lmR1>e%UQ^wN>^- z22DIvc>)_0Y1HHaNB293pfK7_0EGzz4)$xs#)b>g`7*p+m3tPvk27D?TqZ(CY}1Ot zp#tkAAuymZrfX+e42w=nS~#K$#B|CYD`^lA?~-gg?1_QGE={V|k~Em5)J@lp8+g;Dz?dnI^n)@La~@$3lt_uC%ZL~I z^vaTvwO^kJDWYRcfPOsuR`-R*RSkAjzhLu&8rTn5ASvAKCUGM{xiKs{l|eazU2PVO z#7VA2?nW8cjE@o`FA6tLkqr>jD@4MwRaq~;A1rsC*O>^=dxPWqp(HsLbKQ7aKW7>? z#|rYIF!9$lQVE3=5@cZpPf-SqkW@cfb!Ko;dhzik843}dp2JqWDv~3{cINKG= zG4xObQGx|yfxpMQ?9q1r5^-E6|ntGW_mfP6Xxk~`3ZXYV$EVG;ggChqrl=%_L!gGzLdZ#&#c;iKcwNBjVDp^msR zN?}4wU-O}4Rsy)kzSL*yuPdj7govOIVM4DwDX^YW z{l+{+3e@%#B zM$lL$^lEJ**z(J%J-8{~UMzibIVWL^oEA&()K!q?-M@WsEKJ~9uyi@TwNfaP+s3i8@Q}Z5r*@NdR z2&sU<&KAlcl~f~f5Eqx!Gwk1T_|3p4Fdr)%3o0Y6!8z_1D2AB)%sr*x>Cv4uGVamk zNY4EwUBIeP)R%~Y9hE&uQ7lyYH-KB0tW%M)Tax8Ji!tmwZS&?x1%l&5AR zQx%IxDVgCt9I?e*98W+bEhJN*DU{6A3B!!q4nIQk60jer#>Cf_8AF@R2yD{dq8y>% z@5aY<+6rkGrY22CixG%9(?GqjpO`{X`%AvBOA7P`g`Y~yg}=nH zdNrBJre9~$+&9v`nJt>*2RZ$^CeYx%|2aJbN}L;G*Af&q{ql^OK!+bf<{}Le6@nHL zfVLa$Nr*&{jk$-}w}~}O7C}M;8Z_YU9W5F|l~LVq-iYI_=vbkyn}~rxw-YcI`4t5-@YD-9;$+u3LBUYgf_@kqx|k zm|kGcaM8N7G`q(H^Zx~QwdKBqOY;2!27Hre9y$Zj4CgSkm)#!S3qWTxUbH4I7PDX6 zOULp4RQb-kESXp`_}p_#@eZ>7=BG;dMUmZSf~sKjoCz7K^WdvBzQE@sJ2d8P)@_|iW3`1XqWlKRX)gX+8uO?{}# z3x3&Cxv|;ELAtA4@*)2sF*z$!_;@3e_Szi_zn@nmuJ7r zkTPGMP&Xwq3kF44rLs2?iO#FQ9+08)Hg%TZL>=eIYP?+Fm>OoeHi$K%!-(6u!4Mh< zV;&dJaJFh9CLr(Qn5>Shx61<`k(YI(ka^k?t81Rz-b=s9M5@m;$ybg#y?;#TNoZ>u z(<`(|Ix%hMCttK_f7+T>Q~5<+4vP+rF$qfWz1HL$92Ya<2Li5gNfI5;gW&`G>bD__ zOMg0>gwc2ja9m>JH!)(Nnc%AE53W4;IK9m*X=5n)L3+&|gYYXx-VjYiX}P1txfwc3 z-K-ieV+E+0g+_ zXUJ__P;C+>i%wdbVWm?7g$Ng&Tv2Ci_=iI!kXf5A>+SbjU{XO4>hkpVjr3+qc?XSd z=||H>gjh9KLh*`0z?;Y7hgmO*=AuF35zS>U+8bZfeAh!6xnkut#C?5A+5RY!rFCA4 z&W2XDWDGjyp^u7T!l-?#<7weR(|PII?e4oS(P^_-uzGerd97>lUY)48by!(`y24hp zZe%pHDHYT-O>aZ_X>$_2Pl%Eq0jF&`ur0w2K(HUGPRR0W>aEeZ`Z{(+!8_^3YJgfC zTAOB^5jbtoJYTo(8xA)AZj9rI!>VlynOvf3(7sZ&V$N4>H9j?+j1usqUKP(|UiYiu zx~)xqwI_rNvAk3Hi!k&wr>-^E7So>F@OK-Bc9;y#9V`IFYgD%K z+sC7BngS!7*_)PNU56M(ntgBj-Bjdm47&c7*B9f*YOZ=1#MQ&CrR_bu;z_CC_sx@S zsKtbYf)*RiG)RVPjHsVZUG&+IhqVmuvX5!N4tNr_;nT4>W<_opCR!r zC&sLtbpZ*T@!!LN!_G!N);=1qx9BF`xIWL92E12Y|G7%d=>fLq4Ld;q+G9n~i)Jm{ zzV}X{L+}AuH-FK+PI7QhUvp<_Ed&nQ3QrvHu?QR)AX;)$H0rqO)$sDgbq{EbRIk{q zyk!+F6#rGe{4?mh6spwM-_3P`%H!g;=$J-Y7pDNi)f(zG-w?+=0_C$|ad8QFj!%oy zb2)cDY)Z>^r&o~I zW9GQpVuP!+08X1@K5MPrZcPJ*VJGXf2l`+|Q5l9uRBbwbZkL&91&;-ZEfFImfZ14| zv(6Agw$yuF z<#4(PKI^j?QWyy=VY#iU!&i!^HO9Vjp}uxOn%6iLrfvIusg41;l(KGFfhiKTwsG)b z9j+rJfu{E*H>jQy9>^;EHmTZ=UBsc%I`-G{3bo>@!b_5OkBL~VVO@}PwdwdT@s{rpDZ$P z8>YzJMFpvEHIPO&r^heeMGt^@Qk7_*BT97OFQKy3AltCr2Oh{RCqoAwhTpbxb6aed z9YY&vnBbt{c5KQRhmx{3=z3`e08WUf@lZ+~0|9n72Hlmj41Zphwe&uCy2BU?>ZirX zLwc0hz~cAJS%2+pFH6cFmR{LqC!zn|V1edf)oZU@^gy(mzG^h4WjKuBWlgJQ_&qAM zKpn+alf7z7H}rZ6g}NN36qOry+g5vG z_Y02>GSdeCwy8Neph;h@fwp5)Iz@W>?Tive7#Lwd~TOl>eI`h zaAU|yZR$rF<1R?>CS$48?1ES7m$RC(#^V82+Pj+Ew#x;8DMG1b%3;qQ-sHznf7g$R z*@2!_=ZU$kbGZtbRX=W_RM&y)YxcFD74Vh)svY%-j}s_KAVGGOsS{%oI8k3~j2el# zmDS#0(9YrKSJ%WQu5^28zd&@aJ7!Bx+Rr0%1 z=a@pGVoh*#p;lSdO^`ui!_KAud~0H|pIzM) zA0Bm&F0Rk92&Oj53Qr}@qNrOZRGo|v5#xn$a9~n(&29Wl*mZYbjk$Ov3?wios#>jld z6!-^Fr*pmH&yqYTj@4vHq?{CQ&5iK8KsP;UnVbG(vmfdjtr??kqdM+8Af-k$k*sl` zra7%Imot?b@pKwj>Rpi8m^>8DyEpp|D?jpC>=H95rf19i4F=dIi z_IU(zzyF2j-;tQ@9K#9#v3V_g1Z&XTMTb7eOSf5<_z;=RYD+na2d*z}e=B=+W56c` z?4opk`)Uq5P0ZACnayu246N1#$)x3UW^EsHwg6N5?B<$~bs*5|){=dyb;Cji8o16x zWoMC#OP5kivQo-+*$hQ3L1_4*-in0X=Xn>zZT={w!hWv4Cdh6M#~G~!g9ck zmmSWdYiQRKFW#C8wf}o>_MRH$S*he?)PR?69TRoQ%2wq-f+^F(zKP1_Gk@RnuHrJg z?k?w&UU zPrp^mCm5CKuzY{?H#v1RTQ4LMJnEoNZ-HYqJliVE!Y6=)E*quJ<^`f0?ce@tPt1u9 z5Cl~81wl(5;Z7VdAUi$-)fP@9_xJ4!$1sO83RkrN8@Mhle4FPEcS(x>0P zu`yK1ar!MiFSl-Oq3KsS3N7L$IkZYBDjh_RfGDY7f%^q@j1=pKKFJO|NU#$5y2RP5 z>bxy(gm!9~(%I`YQ(M8lDy( z^xq3~LNkQPmQuAJx}q?cac{NG=E%9&(l;_Q|03;{-iIBHGBf4Trh`_(IZ2|Z%>jH7 zjyRwwtopGMVqJ;fYg$?*(|O<(gPc0U+;)>6+4jLPfVxk3enI~!^uwo#z?5{ro;*#X zxtm5WL@A6}LQCQ9KHBEf#AM{PT>yA$tCBJ*)bKg#kGT)+Q zQ(Bc?f{Lhynsp7PT5LU}a~oLRPiVR;C@t)98xjr^Rr~usLBi~;0k(^i_2zoe_{J-E z7gDpXSKAQ@{@w_y4Uk$Abm-&Bzz)YhbykaG-0Df+r9<+~w>}NCKQwt`3^lkp`fWAu zMv!dm-70@A`280RCW5zg5{O(ZKR!v+@DBgIEj;~**l*Z)u}?TsUju+6R?jupWS~}D zo@YUeOsRlx%#zy6DzZAF1CNAEh*)it>p>P1T6Qnl)iL+4tReM64Dg?Nb1@=&n0J)B zPXKwqv?qB(0Nc-d7vq}0w1{-k;J5tC@!y#S^1uIx><=K>F}tR&9+M7bg-T$qvbDdd zI~n!krBg4ZW|SF&k}h7wSTSOLpwfV4&q_dGj7IU5jJh;(Sb)d#JM|B%VbdUzL1)@) ztI+g3AsB#(1^F);1Vd=hhDi zG`cc~ZnMRTDNhS#jRwhl;UXxDV+;l^C$u{&SG$>5Bq}&CmJSch(#(eR$n3atJFb}A z0A#(zwTA;E!O@{<5Y_O?xs;sp_l5qy3)i4{T7gS|*BST)7p4VW_n(#_m65U|fye40 z>p|Cvdj{}@GP#(8Ei|+H+)Tb6gL>&25-ggf$?fM_C7O6z*occOz0tx6INb_x}acWX6x^8;S z%j{B3iRR!^7sr?h1fm9(}goCi}T?Cmop|94FHlI2rBXrPn<+J|6n-xm7v?lN9$Up~L%ick2J|O**_)=aKllq$N~gHKu`4p`kB zV0l8cb$F@+bF*Y{W0|7yTBG{JDg3*g!R{2t|8^ z48#cLY=eV?4FZ;|))k_P1BC-D)PaE^Pu~SLkTY9Zkm)R2Ru0Xk=eru6Vp)r>kXIaN za3EDHw?%r2MS6RC8~VQiw&+Mhq&KJM$0oZvdj{zFmL;1mE}Gyf*P-G!G06G$xQ~M$9#Ht8U)gda`qOC^=jMojv># zZLO`7tt|tC!{klkT=KS5b#8C(92ps7ADbl>J>SDUQS^MZe`2Y4T;aKE4z#t#mWoxY zR^@^-yLNbZcm>=R*0$T)Vz}w<=|#ZAR18D5d+?szHPIDB#eq3EFq`%ai5efP>-n}e zT9>j-J>OEv+Z>#{J0&msw9P1P@V3Z6jnbh*LnG|hy7#MXiZMMkZN-myEv0%^99SF& zT1UsnxLQZXMoFEG1O`#^Hnp|f0j=#FZEYQ$ty2?|BX&r3bdHXXceJ&un|mX;EoM9s zTFHOKfkkqlyDKJXLxZDzeSK-a4i2o>9mJP)+?t{1hw6I1lIO+gu`1UhIbiXDG%_~m z|J*GvWm$zEa;^#`GIi`y&O*mWZBFiNnesuJMfT;&3aU83LiP=j~+ zjSmiu_V@NpPK~YVU$bFweP??YdwRJ=y~4lMIk4>0Hj5rs*?6IBmE`y8>h2vaDz!dy z+v*&s2)J8uzzTy&QjF5=9ekam!=sav<7M(@?6l~{6sU#zji&YA%k;OkeQBK9`A*3hh0C0~4e1-NN49{-L2^vo%{A+B>?)TU$AGv+0_1 z_J!ydTNVOCM@RUDttzLUH)l)J*;%71R2*0_4onqo&${5e5R~h=giFmcM~&Pcp@_ku zAr89suFf2KT01(&C#L(PSBwu;L3bMtY~t9h+YENEQMf(5{j7`j&W?d0PiN-25AHVg zt|~Go2bO)>MuGA|F(5`q#-}D*{p9-MnJSwHh*4CK);Wg})4_(G9~~w6eil7X&fBYYsW`A=9N-`${5C9F zYU3uh{6!jdfz-yE5#U9?O3Vb_-VP>Co~9cc&1 z!+g``0oAE(B$#R)uP+A|Rlmssag|bW;4V1eOi$fv99!ML%E)b*;X@z#P%D{Z(v~d* zW=zq4YIodi`D#NTYYsV(*M{?{mKVSHrIRfaz1@B52kz`>>$LgY6@OAHIj=adF!-Wu)+4o=yWk% ztn_?igWp|@-A!8oE6AA~sBMp|AFP<_>FOCA9yDR|-^V`kvEh;7_SW{U>L}%sbn|T+ z$#Hn2&+CeLsghx4F%RvcI`2gsY}0j zw&rdbxK=)lk59(!5V2Kq2ub!cjEzl5sU*DOz;bYaYPD0*l!?`7y(?E9RzU1G)$?%) zyH1ySzS86s2Ud&&1drGgJR9Tr5%S1odeD}&7vxqYty3&VAFpuUBRLR8 za_L9$m2cf@+Hp>(RP>>r!5d$-+Lh&w7tte~MJ*G_(3|30vItSrR5t5CrN2#>t+nZKBN6Q!Z}<5u z>)H!e(6cvWm0EFN9vqlz=@=fF=;>*9nWH7I(7@#^eG&V4jPlWWwQC1ex$l8xJYGpud4 z2Wp&Y!k;Hmn_(tuH*FT?)a>+`wnvt@xpFr{(h9s<#%WuFdYa8n1qyVWdW%aKYDPl? zpo&x+SXvH*nAL-LjNC09jy=S&vJ!}39D-{CtAj7{Z=y;qnJ7#Vi_uU!R+ouOSmGiH zt+L(SIY7ot#zMkdio?PccP4DJO`n>@b<4S;Tt48?^R8kDJzp~#wj6VXq2jQPXf8UJ-#b2YZao(*i%G9zpS}Mq24j_HAsh&6 zwP`X|eoopg)6v@F4oCm3j0!_Tv0ulBhr@)OR_HV$7gE2wA8ftH%&%t4uOH?|$2JdD zWUPhc+w0KX)x`xnQx2E55=G{Vo*x|(FOHL?x0{!i<_g>0j05DZ9Oi6s%#ybv6>m)# zm!YaKvu*e(bTsjqdcJn_Z5fKLP%e}McS~ioQO~z_ba$?Vo?j5#H(4vYiv~!WIqZQ= za?PW>&07WeHrL#I)^Q&A5+p5?ZPAinv1wbJvT$fJ6zE+v-n_Y50ahHCg9FXuw7ByI zF^0Eyb(9NB8kw5G8i|XGG@}w1Oxwu(&`?~g*TC5vZzNWciUUi<0i!tge_ScX^E%Z+ z^3B)mQD;(S5oMU)D3D84E<6pHA07_(oVB(kL|&n)I4~a$5WJkW@lz1{oJUE_$b2wt z9wr349>j&Zo*xo#*f!1aI(YTB;=qz|V56RobMi&cw|958Z~Q*z^6B{{t3!oou^d?T zXy^QlRLyed>2SP>48e5(#7at?JeWS6hZqUOVdy~pVJ<>O_Ad5bte=AE(3uf50V zsESxi<)YsGS^4k>9*ENmA~xegr4tio9qrnzpQ$GX=^g`vP)A*?un11V!BQ6%4Nsv(xk$DGje zm7ZTd{#Kah#{t^DA@G@FIp%DQ4%LwPO3%-)eJZG>Wkvs0yEWbU7Mb5{@#W8LpGN&)1T4&c4mB`YkkX&e;in+KWOA4sjwmMXna4l}b@9yMfV+NSGTHX_=aE9R_b) zT#ZqxFs;xeBkJW~^W>E4>c>Y$ee4UW#FI5j{v=N_i#;LD{P7B8rU2;da5KRKug2uW zScm)Xry|AAMv4!Y6~ZRGP3H%;%cvko1SDm3vM!M4Crtr}XZG>25qV+oPl|t8#LTBG zkY~M;PDNxyx*|NYcH&utXC?xZsL^EslOeNVSsnQW# zL)%u)BsRlm+ch{Tf(&>v-S?&&aS>!lPht{Dl9#0<{YgVgAeaC-$Bh2QV={+TGRR86B+?+N)eiSRszfi=W@UxCI?VtWE`nd zs9&f4nl+yEBmiVGO(awN+&pa{;e;QUt2|xPdAoAb}|{gS;X+9016S2`S#t z;j-kbX~e)LNR&kcHnxzbpdnz+x6^Vpegc3Nujif#FXX2>Y1c})^ znX+NS28lgAJ&V8(GyDQniV%Tnp?KzkPf{C-MiJs!BTt&h;ZYKnXHFWGf-NiSl`OzK zSFKtF%qtYSUl`d9Qpu_8&T zbQnO&2w1u}NXSu}Pw+`381+q@4N9g(3>&Hgj{qJLkwoZcqRQetlPV0!f&lmR^&w0V zQl!h`C!DII=xJqDKbMIE2FT>L2GSxa655fdXrpY4Y*w#QY_yaV;wl9U!lcYfUP>%5 zc*Hd>NFj4c5j4HLN{1Yz6!HLn${vxBm?@c<#DIrHNcjOEBRo<72r|M9OvKMbtFp7w znTe2OM6O0eTsj&AWf6FStqRfwV2~?F)x?vA%v(Jx4pbbdII!g$pn0e@x+QfET}qGT z;G25STct>+i$tg?5x|}~|4AJ?D0Z4VY;W1Sle5k_=hE$cse+7G)iihH2TW zpY!AZPGTTdYcl-A5(U{&1;2s_jEoWiY)4_6o3?3Ge8gFORU2R^qfql?BF=gx&iIpv z?+fKMoN{S(m?81B9A%QeP&{+N_jJXA)6j;2?vBp(me#KJkU3Io)=x4&9!93He!NEaz0^Mu@0L2Yq z66vP^Q0+Vsrganzr&@bTkuC-P(gWkJTiF$nb@x`eSshP5tFQtb&=y)sqX^kL8cVlQ zbm~NH0YKwQ*HWJ1S{bmm)2yC^YA#Zz#wYZh(XrvlshVZ5X3d(+n*t*v4B2-QxfH}m zOq?k{iUuP^t_*;c3le!rSc-9Gr){J|0vL=$*;5D;?X;&V!`4707x*MBGkPn#CrAZ( zg#fQIi>Hu+Jq>g9v*JL-fr9+^+Ng3W)u;Pmx**KT?e^DDu_m+oKq8e zMTb*UB6F3VuM%NuJoqKbC5wok2=G*#CzvD&<}5TR5tl_UtV{70RSkH#kOYsQ7Epn2 zJhLKF1dxy@LebKplE_XdFK2lG6R<@_15NB~VunmceWgfGp7@!i&w`>#ng<8$!^&+Y z_MR|zV~MPct++ioJ~}=+JT@{EMsH`kg)dLZeLY>?F@4MTnk;dQh=B3bG|Wp9LQX`q zGVvfSS~41MbXay4IC~y^SOeqZgX=etQf~(a1~etFa!*fm2dL7h*7Pmq5`=lwW?KQ- z=B91>65e3=>eZ`rqLK@1*~zo_;<$(u9d)6M)L`;5^r?yLnaa}J7m8;tcxb(%FA{Ca zmV(qP)mAD6l9V$Iz*2~E&Rc-_DK8}@7izsqQe{c2m&i(#QA(E5%!hm>J%dv6Ewu1R zls(aAxl%+VdMX{k(58ySVQ&?bqRqSN}hI zcLDEbaV!r1xW(Pwkl>yK2uTPMoFc`&c%elL#T`ni7pKLw6ev~*uEmQJ0TL330kPxf zyx-Xk=e88?ZTjBZ@^8=Pe4gxYpWWHnnc3OdS$QxQr~Je=1Tt_^p>~-CIlXO($kS4VMETV#h-5+X1X;E$LNe1f5=C+s05ITwy*G}u zLri8k07AEDsV4}YAS-o1PKSzaCnbK7=ROP4N|v#hM7Q>RWF zZ@h7a2CF<$69ctK{C_C?uT59}x7uvQ$+X$b+brDV+oaj-+0v+#dl zl?*RUF~*D;)uTr@yd*tYH8@fBmzPYY<{-{;(+4yXw(4plD=N#JQ7el@w^&B2EHBNj z1wMnyvhup>8a|$;`k2dQJp~!klaU!SX3W}auPrWxm_o+etZK9FGs&S@vbxEd#m}s6 z6cH538V%{PuL7;OBDUOo;;8l4<=v;J2o?QlOOrtrS>Z3ea+tOtx_791##CW_3rG zvRSi6rQhWADr+GMFdNoXB7OUH^(y5p$h4)h;>H3`DlS_W>^Bi3G8NsfO=Z@N^dvRt zRmb*iDM|5c_T;kQKnXxdW^+92Nhu&hOlE_K0V4n90mYaik_{41akd2efdRvo_;2u! zIch_r#g?iz?4fY6$*f&!&sgOYwMVtB;UA&^#$h7M;9G*!2V9ARaKOG#o{9g$_k2vz@)=zc~THoYY~@jU2XLeqJ?$L`+fG> z?ZWfV-EsRJthezh!@5mnC6NGU{P;}{JLJHh|MX`Ytha7`ZA=2O7;c#Uw~h17x4-=m z+}~#Vm!vHBwB-L9OLWvv1T*jT)>{v^GUGjuJMOqkFTHfL%{KFvC|Kgmy?VJ&0;glg zjtA_&_j%`?H+uAFlA!mtIQ5qc)K_LE0rcGo#~=NxU;S#Yz4o$ZxY0%%nSc=vbhdeavvyMjoE3q#cnh>7+wqVHj;El# zSuUlkeV1K!IrNbI&ph+Yo;`aiC{a%EWrK#Cz$ztO3bZAv%M;C^mz^9i`ObH~v+~L- zOKEAEvOp=G5m4kSLx&C>1`ZskplrEb)hP?6pP4vP;Fg;Jh_L~-haY|@mWjYbeh@OM za*`QM^Am)xth6=pf1LuD(!wAS>>w~%0B{5^{9Je4b+_1J3thlZ0b4zZ6JF!KB2vB% zF>(b0&MNNNxpQaFEEpn!f--o@>8DD?^Am8GWPHR$)SEN=nNvI=kc($ovWY_R+?Ko{ zlceRg$o6$1i@g@@xZ{rcqv9az^4+_47lBxo)o$Io@dE13xld&cra9zRk*@>Zn%+u* zRtmII;2)p>#g#`xT8MU{{b)HV$Z7)>BoRz0UWrga^m*PzCQ-A?J z$_&EmEF^48=`3Q55Rr{fQ+^p_Hny@_zxAze5e$-pvv?Rj@xg&(~etTdg)d4$>E0{z+kxX#+&ZF_ui7S*gG_0*wDT9*ma-1cD?()M}GU; z-xAckPunYW%b0v6{MN))3baz7l>*C40s1YhqqNP8LZc7q!mYR7x>KjN-~RTuk2&TT zDYTG8%7+S~jwn5f(UUL9Th_A-U#FTtR!YtxLxxP5GDS|+NwMQ$`|Y=<_aF>fj~+dw zv)sh#I;A+Uh7KM2#1l`bQ7N@#RC96ou>ClNA9&yaVAU=UQ1W;Mg24eOaK1#4TwGaB zdBcP}Qsl31`ic!5xh#9e2;l6ry>mY}@%z)JfArIz{&e;ya{*T{QwAKQV3x@Ir5am* z{+$#E{wA)ivF2*%sg!42XPzS1#B`LxmWYcV3kzO&;f0k}T1iTlL%aZCx7~K@*RS`` z!F|h1ORl~4TBYioez#=jqR6yo2iM9=%j{EAfi@?p?sp6|iLbo!%9zpXh@f3I_i=Q2ziNrQeBqcxY|cIJ;ul|h5h#7KsPKP>6cmlA zAfJJm(&d+5&Vu~KFMe_K(MN2$=|)8A2PdDz;$*XGCgin+?u39AK`a}xYpt~wW0QD4 z^w8u-9(jbwW+g(lvPz}MR$OsKlrdN7)w83vuvWkKz3)i}1Sr7sQ>4BrRxd>qw@?YP zEc55jr@JL)m2L7P|3({a0Owx4`~UKnzx?#mPpK*m$<&rpfF44@fo41>g^f2}cgW!W zC!KVXMDQuiL4*1YA3j_yU$=x1+bEj~__q!?fN2|xb*fg2;&}?nsGT!sj)vrkfvzP^ z@85OTT|4cxowkG)NRGGsgxKMSA3l2YdT+fo{@ioVt^4c#2Y74vzn}n)r+|-S zpaoU_8XnN`xVXUq9B# z--2yTX{A6b1zIWa4^w~!qj@MXDwmRMu>t5(t|$hT6k5?>YP{wPV`<1qRpuh}l8rgW z;spy9d?gOlX4aesAH44iFZ}ua_up3|XhQ}KSZD23$Bi3jYYbDz9)$JQTj&1!AEXsy zQdd-D#jj(>Dl@lhuDQlfl?ssYRz-PqFcm!g^b;pfewxcZn-**j`d_yD?)d}NolD6N zhm4*SdA8kl+d+f+o_p>^ufP5}d;(@j&K|b_06+jqL_t)V9{g<+RGmhg*i7`ZpZ)Bj zi!K^4pwHQ7pS|A!2g&S}ws?YI;9!zH`|PuS3#2vWf22TW5GI+fn~itw)Fv0HuVZ`$ z@2n|QRajXKo?<3z;E+QOF>AJJVDF0+Q=AgvYn7RWyZPo53ESh3Kc4w(Zmyt33Cvn! z%{7>&2KdR7AD=mMrm6|jfC0TvJn{Q?+;PuMH{SBa(7bFXnt`4~sS>XX@+XG=$M$?P zGW_q%RhFkMc}Gx@126c2vS_ET>K^DWQdqx;9X4V7Sm!|&F0T3RcaK_HQ&&(}+*DBf z@~dyCXwwOsS;E2q_r$WqHY~FTZf(^*8Lb*KTbpi#8gy!ELwQR#{q-#H^VU zqO7zMJS+31CB;s9p}@wYHz;l{nD^P@n{U36FUUQYJ-T(KM*H>YJz&6qo;|x;6RU83 z#^>Fj%0MhE=+wUK;DZmMdf)(g3K@OeNC`dn@py8L*&Q)-=l~eL{>Gb2tCy5l#2Q5? zyRwSnf}#yJSX-Ac+w4DhNS7WxKV7uAh7ZFDw6gMATfiHeDlEH6DJ&?hC|_E=c=3{j zcinyGE<0~$>C7=aW;D!e>uQkT%+pU}i8dAl{eN@KZ}f|oUww;0RJA-mzvQBB-MU=# z^NXE5DlRK#BNzG(NBWXp-#$IoU1#K)YhEzxquK1*+WNGSGVQ-}_g}}3opG&gRq4-u zd@-~gd(^JPxPmS{I_tSBtvu|QKm%t zRr(4-4ewNAnkJ!4<|Y|#43|WSLtx2=MXuT?7$ikrPkyh6BsWTZW2E>gb3;?~)7YfYPLt4UPJUjjzSG-g^D`v7_6!uWDCip9GAO6QQ8#(8CVfV1spTxZ#$2?u`*$ zmnXNjCT_juq~Rk54<9^Ok0jXGT36ff=JcsEXUtx(@bdzv!y0S5w69uY^;K$X>RidX zWJz^pMH~IysYl~0+ErC>`iy_&m6vMk3tX*ZL0ca&3SV&EIh{Jh5i;FWM~}Xmx{qg2 zys2P|aiczb=e7GDeI|se$)5Z05yIi@(@&viY8t4i@+MLneJWP)HlH|Q(4axi=b`)x zE3I76==@&st~>2uj{tx$-+tR|1`i&nI@}q#(uxvac>dWJo_@STWy~bockTGCop+fq zVdGnGzne}-g#xAj^xzO+S=o{$i`rDCuS%qOKAMM=rhq>6NScE5X6hpa9PvLX@|3Y9 z;-|8HN{l?ojBEDY%FvtbARvH)lX`Bz z$uJXD5?PcIJ?3fQf{1CGc3h{08>D;N^D#K4X_1qtS z@WBV@5xnrltt3wJII#w1I>cVE+R7_*?bt5MXZJ203mcpJcJI8}iYrY1% zWZoRW$yHTl?Dtt~tu;*BR1{L4 zA3k`sm5*eol$A#}&T2Lktmd%k>l(|;SOotJtVtko>7b+dQr+&QyY|W3JJcEqNMpz<7E^p7LUr{Ujvi&!;E3fdx7^|qFluVph!wEs z?YF1gbI)CAYp^>P3YhUg3C3kZc}>33EM4jj8K6K_y95Y)Ggkrr`O`N23+W1qO9~re zx)QsPL$g#?+Wv2s_S);c5@f>z{QmI6x&8b1|K!uogcz`LLY0XLbIACqlyn6{*Q69>jYP6>5;zWK@g0V=gBAZVV>Yzy zYR4V7ArQ7*wN&RykfKr(HVP|zV*~p28!%`f{d@cEw>uiN?Y7%@?b?-AN_QxPacO|| z_ws9ROq)90nwYf?8!s0u_{_})V1mGVlqAoWf6ZwN>)qH9$Hppm+G!`~39xlU&{Gp2 zBXh@g9adRom9}lmKlotQspnjX&MgaonW}y+Nw@art!oYSVRJn6&_kPVzIn&?70^(1 zCJt?ii6GOe3AjPJ;Mc$YHU6TlYzm_Bg885F1(rB<8YWAg@iwC^lb3tX5_WJs8E5OR zvGU--L+`r#Zg)3eV=w}g=H{&@O?u~@cgzpf>q=11+QjSJ#(%%3hT{b>b3W>z@9f7| zb8#2SacM}O{n5cxfqH;G@On`9%|xJN7rRU@$Y{3yKAns#;dQqcJU=Y z4mKr=6s1k=2x_`irj)c32C}#EDkBN-^!MIF%HKpD^>o8E?Gt#tA2!07AR=ZSjZz5Cn5JrR+-Q3h_C1XtZnJp+oyB3h~?D-g(AH zpYV(VsA5`I)Qb#^Q z0M%t}4GWAqJ$rW55k`%&u(y8p4rNnA&Ts9wHFx;E_dghA{^J8VH-4XV(upGBP)oPM z;1NMWauHToQAsIZKADly*c?~dO2;)pDM5PHLefz*vZX=9tA?gD159+zr9^3`IyYT? zRRBCg1|-zl7n2I0zAF3Ire%GrxEw%v0xRNc6i_8LD$1|&PftIkduHTw+{X6YC{M)$ zh#V>86q!Xb&N-4X&ub{rkliUkzx!yHr?s>8~$q*RJa4 zKl^!-@aVZzzglD-IB?)P>#V-&su$bl5Q>`M!l$fM^U=Xb2Y#D26%-3NrDfsfh`ZCu z%e!~)Ow!j_W8_gs9d-VN7X{jBWkwZry9@4@pE>_QC1U7I$_)!JPSAM!W6wI{bQU;^ zMY?PMa~{G;TI?P36P=YM4~)!V!v_8S_kXzQrki9Y(j59S&{VkNivkk4n!0r9}7TMQSSrwBFs3+BsE+A@(`4VQs)8^~cp95l>Hf;wC7`QOD&z9bB z(@j74!LjVX9e3K!!7L)k&FUVb`hxnBf?}GH{4q&4-FzZBnKS=0ZST;jqm>Qye*XEV zOyNa~7A{`2=r>ngt)5$NxsCfF30ZS#c^UVRrGP{P*K)*>A&Vyps@M97Flo|uUAlCh zG2>%hWt(lc;)}W_ZBZb*^4J5`rj0XfO_yDE*{2KURaTTYxXd$6v9v{mYI9jG#t*zDxxV;TvY1*P}B()ry(2*NFXh_-+udG z&fD)!Gof04-StMUIuc)Adu_mrFTVng{A4C;)#M?&`r?Z&r1f+SGn|)Se%ZA#Q>MPh z2p~2G9k`z=NQAR(_RJVuL5Qor7<|deilG2vG?bi9eEEeJn+xh2YwM`ittL(C)2B~1 z8cK@8Q>&2X=&%~7$5p3gy6{c#K@?Ept{sgFY=ANmDk=$UJ~T{0v0BtV=i}L=3qZA3 z*M26ORv5n_z&J$M?B4N{K%rjVoC%c9r5k898CJa3M}A6*AAkIDg1W+x0S?_wojM(a zY15|t_{TqXG3t#sUN>vjC%^g4Z*&tlklxi-ANkQov+Tx!{HRf*w%KNDG&%94AHqbX zW_=>9AydG)*%2d#8f0h9oNWLexzb8ThPiV;<38v&V1OHdd9~~~$osNbW%xy?&>4e7 zFwWEHo+DT+WXRH!54Fe=wYR1%DLw8MPxHGkaUh0@q?AGvi4z!46=iY#Qtto$r&7>> z03dMlQ~vnbSZ|+&Nn^HDw8dLn(T#?>kBa<^WhdjHO@aMGdOSn90VxoLD{Y8I$$GF{51DVD|>C*nA2LB39C9X z+j5bDua71y{_A0(E#szat^(CWi`}AZ(!&K-aWiM7l%G2^z7 z2tr0!Tm#h@>r>q;3loN-g;}s`yW6|y5Yu2Dzy+u z)TpRxo8&W;Ls|mJg<79qK>@=w+6s7qXju%<)0V5Pw%Tmr!nmKTwtCrzqcD`@9D3-X z@@H7&p-mg#Z7y(Z$~wWEdGpDJ#1Mm;CD=`|2-w5~lFi@44?nD|Y|dHa5!{AJt9&MM zojP_V>x_B9A|6BK=%bG=E-hoaJp9OGih$G724Vx@zes3#^RJKm^QLY1kpmqO3y{fc zh)js3Ki~vbxv+K5J@*Wwv!>A$LWCVzmbZdfkt-{Abi~Qg;lqdQzyJQ1UwSF#8FRu8 z3}#g5x}YKVn{U2((#dD&qMy!RKrGY}-K?qE*5~bZoK#oeaN22S&_|UORjaSQ`k(&v z;o z)tZ2+-h#j?4Z@ps? zraoYHgeU~9PVikjL!uHJ$rU@{CCbL3mAFajW|v~ zn;L3NV({+31NXti%P+s?fj>T|)GasN%xy7px z3IgUpLXB@|78g^snHOd(VtSK8-Za2 zNbs{m#||n5C(WR0wZOh*DpraHDy>qls%yjF97Ib!mo2JOl3tMIOnbpX?Qq@M0vbJ( zU@HP*zpU{;HjXrdo=6@n zvMBzAi_e??3KS8Tg5pvEY=QG%nf{KLf^wg(&BBHJ&lb^ zmMpcEgCXaZGK&BD8#(tieHnS?|kQQ)&lL9rNZ(oU&9qwTw$fI#O_$3DNUHu z`Sbd^rInTCJ^`@fw{{>EbmtFJXliUSArIj!C^+YwGx>Ab9a*)wf8o+ge;zDNmbn}z z9Usm9goVjVNV;->aL7qXIJUlN;jgTd{|n?;;_>&_pebf*UMJDF(TJ10zBcY~@7=Rk zx}di3+N-ZK=|Wi+(&D9YF$M~|fYE<<+;;1+#~w9q+=kPpyl3-aVX1FV7rVZWDDdS2 zh;t1MjqklXRacjY_dd6${;r)nj~hQ$~rHCfX%9*{(i#nVRg9i^@Fn=L8 zzXQQiP@X)=@6a%4_uO+|o)4>$m+|r|uOcvmh74AhIa07vy-l%}8;9!}8{J_;sPON= z{rCT5?p%GRZJTzaMb9#adFGkt7~C@Rc%65_g;!m5)#Fb-fy=RksYKt4!Br_wO(2uvdPj7< zw0YQfS|)Bb(Y}{QAAchHNNFhzqYJ2oNP}san(IF{EhkdzehET&L!x&_hYLT3{E+u# zJP=feKvV}6C-2uU&UDIH@ zv?eZYCGM>O1=xc_h7J4d^Xl7fyTi@UQs^}QXIGB*x88dDCgUfd{DTioCY&;05Ei#| z1aYE4mU21)@H3c~^mBYRiYwQ_TE=Lzm8IxE27WAVp}zq=#e*f*D_Y8eEaYr@K}-I> zCxX$6nApIJ11?LcB{dNTgj|p2t+>w;#b*h5pv~6Ixaz}`MaaF%1|r)yP>2btjnHWY zo{4NANwchs3Gf+bTDr+0>)7=WOCKmHohz-TW-0oxymLGMqEQGF6I5^V0-&;nIo%VQ zv~wtsL;+EtV!f>>1|R{3`i@oz(9pAxG+LA@k-^ZVT}}1X8VHC+;VH=CT0{LKgc)Kq zA(UL6?|HR+bj}oLec}S*JCW{E5Lc`RgBluL&wyiNMr|;0!g%Mz)?IszpIKUs>%=b8_6#W0Rc4WL=Pwz3p<%l zuJZPK8ysvwCpX4Ky{4+FTz=?fKeB`M z*Gr@1V^2Q8r0m(F7dNyU(Ui){#N7e18C&gsVkOGl8orJKSpy(`B3+m(7#ICK&ie%4 z!(=Utjf->?Akr0~J*b_I?c>U^R4`^xG?=l{PiqIEd9Jy;FRpg)e`STEAYuKz z^Y)t{lYtGbzZDex`qHca{OW7oP!z)i*HwGtv4h!vq_215f5nwPRh5UzL^|dg#GS!Pj4Z`wxHkL+T{y5~Q-&T!Dho z<(eAZ{rJR_&sY{X=%D@j_3LxPEw{P*t+LF{C3`=jLz=6Q27FaYN4HOj+Ok=Bx81(o zp+lR6i>u8~LIET#W96!}w0*XpBoY^J$PfrimoDLVscDE+azYRYmy~|=(MND2e1J<- z3uTcU`BAk*UjxQ?^E&YTG%o@wlx9Jk3Lu4UP;jedF*gdxW8pOl_rkMGdpiU~smOl-vWZISl1vk2%^w!Amar1r3-- zZWo8pbSIv8;&$6^1uaJWtFOMvu!bbCYEe*N?Ep*jYK25`r_MGVzlno7K9UHZ(Hm^g zr%(4`E3U+**9X+7INhkfopHt)m?c=J?%1(|)gicz7`_7ixW#4@b1mMo1E4AbI4dN2 zcwvDHW6nPNYzHV%#w^bHWzF1Xn=SphWP%NlzMyDVO}I}^KmAmz6a-6eAGgWq*|R^n z>z=#8|Mv?)oa8vS&THpulGtb^sY86Wptuc+AAUHyU;kda@4ox9&%Z#Djk94UHpFM{ zY#E<5>tkzKy?b@HD8x_UHVqS}Bv&Cqu1sv--VwxD!&IGt8kb4M?Af!eq>bHp19LX& zOrrVNiYtw<(f6IV-X*({ zs11matD?zpb-F~sEC9AiNn{g*`RkBRUAqqL^+(NtttyT@@<@49nzw+u-(|b)wyUYD z)np24yY04q>ZxaKNu4@%x-LLb9CFBaMvPd|KI=t`s*x1qAi#qQrum8*TLV%I9@OXN zo9+lHN}FerfW;Uu;-DrTJ^l341JlvvOfDSs7T^6OuHso0qixQRHD~5^lRbn#sP$QeT^1}YtvJt_l$%9^u*nF*DPt2#GdL9hH&W2Pa*bWcAs z*j$CoQUuVrPW)6w07-MXsI;+BzZP+iYepto(U=Z_CprV3JH98Za;2&O2ejBTlLjNN zKn1xqEH4ERALT16+W@gaPQGz#@=7pBD$C<@Sm?^C;jwz|xfhX|gKz58X_Od7*u6}aGBDa^ zBED(qpi+P(6|rSqfB^AU1#<}4E}c4$8#m4lAm#+fQoNFF+O%noK=aP=LHFz3NAklD zKMYiC^iTa=b##cag9yQ&UQpJDzC0E8$`u2ojzJ>>pPEF(G0F&8RzcH9GYfSM88YO! zV~^()?$f8wuYY|R=Y=LXu?K(s55j~Ugx2tN6d)V8AjlAMlsq!YSwn0JeTtbXU{A`B zd4WrI_fS@mIql7HQi)DdgecN@^4B?_oTh)l_l6pbv($#WT>bV;S}C!JF<|Im*6Djw zXFUG+<7s2OJxBG1VDbw%;UU0~3B%Lpoe%1EE*E`)*UzQGq3Y{8iX#*dsb>!E6;_Jim)LsdB)vX6YhgG4Im_db6LY zlgFngU6~k0M3MVUiWe<0XRD}9-pqKgGLHVT!9pReW>~( zN^ISwuws^zbP!V&+Jb3IHl4*&{y6L>&p`(rpy6kqeePRt#U-3tA-zM#_EV-zF`w+; zuQxgs7ZtLhDNwa25|cu-Gha&cWU_9`39OcCg%1ym8@DkGKm2f3w{Bg*?AyP8k6wK~ ze4px%AVp?Ybsh$c5UeSeAMRjx>WU+nU0GF0qu54-ytsbiR-!dfXrjgiY zr=ms*hzMY)t$^jF6|Tu4b+!taocHd%1NVegAP$Zs1|g_%^tMm;2k(Cfi+lGPXR$(A zQ;{-5Xn59Rohg5+^36Bj{$%bPH*n}pg(AWhpy`aCf4+o^RG!mLJIzJRk3RNftipW}$e4XEmt1o3xJ@>6HtDRh&cP|& zim1o}L-#PNG0g9D$~4<+#~t^*I>%p&3Wg5pcksanhlmyy9CvJ-TxGY0(U5eQA)8oI z!fLOois_siXaP58%c7_XVhN6euZ#>zCkE-_Quj(_v1#9~!xDFCmMt?Qz)zhljOkD* zaiG7vraBf7oHg=vA$7ZU?SJ{J%l6xEzsFFqiYYHP0HA$%<7EkgEPjFUpiF-EHV=(haWlqY%5QzTduJU7k*iB+_53EZ0Ul@ zKqG}vCSZ9hh+8j;XWBQRV9N9NKCH75C-$d;1kyM{s0fTEc!Hv(f(Vh2C%R`IT*|}8 zr{Qq$s-dy2q}i3MVUiMWts_4Pc`MJce8C0+C(ewS5SmtnnG)3*Mk~zOmc~Krz{5Zj zlnDb!PP*SS6CpKs8TG_v08lM40;T}xTyK<3Twq~|%M)!#2C-UTsP`GQP%OxlCUrdP zj-;wKIMwVz;MnFGIa4XQ6pTxR5_u)I_KP6h-xtEu`9;VQYo^2pN+fW{h0iOkG#t;_ zHkSHjAb5DXq!F0Hm}0qrL>%%PkJ+%Qs*D@m&!HoRJB>DJ%dHFn`K=#SGC5S? zfgzb1l66a_M(gt{DS*q^fn45Z6^&?ql0$@@K7D$`(>->WHF)p5c@`HVOj35R@c$8EwU-gx!$1F3;e>gDqh#Uic|RW1y9thX(I~rFYyE#^7kvCO&Fu z)k5RwsTk*CBG%NcOV{z6Y~rlA0nt%%ix^Jg1#rV~-bv`z^>i>@rB zb94$aY)YxRnwq?gu$gJ-GE6%Ovp6ckDq^zxGDg=f9bGqQZ;pO);f3elefJ-TxV}NC zks=x!BYGIDbZdCUQn>1>t7xv8rAy%dlOJE~l+=0WU7+t}BS|gFo__idlbMBDVO0w* zuH;1(nK*I0ry4Xos2cviup1KnGOg zqQ#i*CP_^BcXiGpf0j4oVta8-p%sFYA`*xQp5`m=MA~JS*!9}CchBdZ3mHSes*3WJ zS6m4>-+udT1e`c=+`xf-Ep2_iXc1_FyLP&D?Q8;$Wkz&)TIzCjq73||21`r_8Ig^< zzy9@=habNGs8MU1Y@c<;Y0%SUFphKAB{7z(1 zxZws4`P?*Xxu>0W?x6ky=FFWn|C2czZa8Yk9kzqdS!bR*d)}P7+QyG>?DawTAQ~CA(xqAyg9#FC zv(=W+cIH7&5~jU`)iV%IZs6EI=_YtaXu7+F9qhxk{rmU7@WPAUe*LvW4?XCUPv&26 z!3EmJCUAzt=Iyi3J%=zNluwPr!C0bpQ@GqU^g+cxocWO=Iv}uL7!0}2|J)~4gCm$o zTl$na9tkKJglcZ)dQbW-&aFv7H=Gj3EWC5zO(3O=!gt?&S40L+LDw++Bm4U6uER^E zBjEVZ;Un;6=8RdEslSfmST@LEh<^R3Al|NN)21z{UbZgrbw$21UG3_EBsp|DjzjQV zS}=#9(>oB;E^jr&!E8f`3__L@{$moW`35X&=CrhJ3)-k%`py@mXbwF4^rab4hECQ- z4HOraSg(E-KYdemZLt1mEcT%wf^qy0P8c+3;Bm(ubLe4*v$9O> z+z)ZtWmoW`D3$xKy*Zmr+{i6$3l@CZrBg@M5?AAt%@Od?BI2MU>lYBnjtnUxuF=|d zhix8s;31$$rKZX68N*_dBG(mwLsVzXnEl(|{uWIZ%$o=2J@(pbz4g}m!@UpC(jb%4 z_~=Vf(ZxTxglTl>q2J97_vC)iQ*7q-4`lHqq%lx>+Zw)(0*IMkAyoFSAu_e_zyp&h zG4eyGxNnFemSwT=Ih@4{KhNxwPUDd@`h-T}UkF>YEY^($Wo`c2a?8!8PWyl@vH2Dg zu^ZD_lC<3GufM|}0fCK+U+vo1>210Z1yjVFB9>d!OZ+^=MIfwd8H5((qs%uc{7a^7 zK>(yNfMvqDNMVaDCVuwmLW-Wzufyk%JA{5A#a~2{48(BZF1YGi{*~3%bo)iY;6eTT zb?x5$s;jO^FGCH5K&0Ix2Of0D;6Vd(`id*8WZ1(bJ)bn_$?_OeVM3l@)vjH95RjYR zbPfa_NErlg?ckzWw%dLiaVcJc;As&SG(%BEMMS^zCBIF{^mE=Z#`+NF5NmqK%&_gQ`=e!nInikY+&szlOh}x;VOcB zamP-bY*U;$YnB;Q(!T@|ne1_MbK~U&X%`$r6Al!dg~YL&Y-lf{y$U9ob|$U!=PgiO08d{e!$UlxzSmxB9Tf$& zqt&6EtroG)5y$Ri`FUcJ3jOy~qlh1LCKYL)fcD}wYDo7qMj;FGGI~%5Ur4W+jFe0? z=c!C@-3&=R1_28SScK2N@B*2P1-0fTYu5^zs@UZMI2CEN%6Z&OaJ2|n=4a;VlTST9 ze!?azju`AZCg~e)7>>^;pL}xawCQ+lo`Y+{hYwk}aLIzXY{Gfu!E@0P7osjY;GhFL zc8Gm`u5cKmM)3UMUby|-<`thr6?4)Mi~B) zbihd~0J-X_t2NF5?5!r$r`^SYdO`H@M6uYYnMEk{PetUk0ggxsx3o{M-d@d`HB+TZnbYpM z&)y&}UhGoVinZ2S%~8W!Zo6Gy`*==VJCsCM4gcu@t#E{T!I2oyb$7(E28D$_zu;!X z7+J%H1Ba* z@ZbHh>(bf13oEQJM16T@`x$4R&$|acqi5*gp_<>fZ;!=`Ywc68pQ2s6Z6Lz{ zy8E8Ec-?@o)ub)<*nJnZgYeQzFMR*|NB8K_)j%M4JpJ^av}>7(UtDy|_m1w_GnR#4 zd+n_qx985@7BZR$LpxB+d#$%4l!BBEj^LU_mE(^+rhk9?)`F_KzvD=E-1&Qlf{aBr z*XV#JoN%n~V#y%Pne!+Z4mGOS zJ#rwQch1>;`}TBG2rDA%1i*nk_0%6IsP~f&@&WV9F8gJq#20-h$lwpo5C$-cB;<{c z>hj9y#w{X0%_2{7E5xBV!B8SULG(0d)639DU{}CDQPD}h5L6)xC#O*Q)%y7FD1aR# z2gMqbP>mfscEW@S9Q|B8Loqo&S@I!4fO<2HKfrB_k8ddU*QRkq0x@q5P{WAJ$M&3EjI zkw5x&b0d51s3Q&s!7POZw&@m|@36y;-v0EbKY#hvKZB`D5)@a}>&xH+NJqGYu-ql$ zg+)MdL*|Zcus`akBlKjRa)QFn1J<>(d+oLRYp=a&U$vif3g!_MbDpJ(7E>a`0$3fM z8OqM{U2bA==bd-67b5)-o zdEmbLci3+G7_FL`2=^LmtYewBv?7kl8mo!7B4&nE)o#1(Mxm6YOaF%q8|vHh9Xbs= z<&=|8KmBxhV4KP7Sy>vZe0H}xxug{1V8+bZ)?{p1G}3cXSdQCz%dL#ecHFGB)~ai) zvFhQ6AN=mr_kHtv`Umg(TAJG|HBEEAGN{Xd?oa{(Mh`4>MPBU9uJ~GOuD!#? ziyS+SX{7tWW&aNfLH`)@VnLrOG>Bq>;GmbMw>pAX0|xY4_~~cfE?wHZV8O!no!YOk z!tj?~c_qX<%`2=bC`grAzzji+W0Ubs3yjjIKp;z4N%93f!bKoP<EDk( zo)HRaafna@;%bzRgkEp=~=n1qwF@4j#g+bP|lW)!l$9a#4+Re3Sut?JY;w zFD)-F;bXH{Lfap4#G#wK^X{*HdD*~HP>8Y z=n5k)z4UV09b}a8v}Da(FwQTS8{HNJEndT6*P`S33Lp^Pm5m$H!*Q^hJ$E>Vo0olZorEzwV-?)l|ywZu^}n zt_3<^ci(+yf1iF{Z3X*}4?hx>wT8c-K-@<0KUwYgVoH3_LHkh%*WYlP4PXFBF{~VY z^kG+Cc`fr4TX}Z(-~Rx2d$y@E(jVjs+dJ?4!_!YcYiVewU3Tu*x4Yw@-cruYg7V5Z zY_`un`%Id&>1UrUG5vevt+%ZpF%ec=aj3;)-x73$T}5j5)FVhjM!Y2@i;Z;BBEvDq zo^;MRXUpXNaqMP0x;@A?A-C+>N&EfpfB*8!FP%UCQ>)WDAp6yJVgkv@)wy#Ao)Jsa z%!})qo(iw)<3KvUlE@YJq$% z#aeJUC5jgp>pouT9a<6X3eRt>HyYvw4jedo^k`tC;Z3pToHrt6Rj&vM2SlmXu)GvN zZF-E2O*YURznBMrm?X0X^>m!#am5S7@7Hg8Oy_Hp=4WOigWus<+JjEUcRY>D{8D~b zfDRhi_ks(5?Djj8Had-CkNmv<;RjbDRt}k0YqI7h~7^>4|GsRR*bnr~bl}Z$$LE2Tdu}j3r znzMoLtk;AI8@a%r>LD4lfHQc|&;+A?yY`hMS6$_U88hW%?vX=lXzpb!E00|(CMw!! zMb3~sW5#R_1I1O^=&Vf=YaU`(Th5$0t2UkTipg9Y^$vG3!4gPVU2Q#qe(}Xc)(z+# zW1h7LGuALZU5--D?u}~_#*G_mr?}&CS6y}OqmMnpgr$Xs4;$>_1S>FxRfD=d!1!+8 z&e}r3@F4^F#@4G}-^y5ZZNWbK>>D`!MObE};G+`@ahGdt+QjNSL(mghII4~DCbxKM z#_QV#g9i_B0u?Eol-6*8iJys#*&v~tVVa4rA*$kA_m&Z32impQ-@r;hpLpfgmxhL4 z{rqPzXLZe(G1CTA9KpfhX7hiR1I+9dtd@LXE&ZKyZIk~CkSa8-WrsHxB= zQ}j)Ocj1MX(84`>^%^v!{{#2^G4+eM_5dTc+G?xU&UtO(rkm}#`)>9s*n&&9S~2L+ zqx<7eK7H)5$NNcad|gdl@b?5$zbLOLg_}ihM!PY0&L{I$T5z#M05j|XA zG#;0hR|d8Xbv$_k`}aHNtTSiMS%4tkhZaZyZvH1(p%_viy0F#3fN}we#ltq0F|IGF z|NMz3o)|OAQpqUP`()1SlTSKnI0OqHZzx)ZlUP+;o^N(iC zobv9Jl~<097!q;AV&BEW? z?@VWZaJ^Nw38`cI5=En)F1C2dA~m`$_30;`JYe7bI(BU9B&Pw?229e<*RXKmlJ;%e za8vkjF!yEB#!d6)%su_|lZOoH&&BDpG^Dz^w&vA8zqbAcYiru8e|`%Q0&IQ#n{U76 zGohC5_uhA(S6+M7+qUIxk!!bIcQI#s_SqLreS<6o1-d*#dCxs}-ENz$A9>^vTcC~J zl!@h@sqei<&v)zAamO9Ex0=WOD!*lCVBdQ4o!PTKab*`pqzAft01dru4PQ@zJQRPK zN_1-5wpIM#l&Z~XgaliR)P(iY%dWQaw)*NTkDD;T@OD44}4@PA1 zCaxsvxZ_SVWXzg5gS}zo^~z3k*AuL{_Ug6uO=q2Xww(wJErROWuy*a*-gNy9Y>YUz zSX^vn%kY%^V@(BR(P0f7f>B0K@l-`N_98c1Eq$xaD^1|+6B#pRj6LlPBEf*d!nyJ0 zTVOJO{=!b39H)=*D=v^USLA_9>Y5Qkk*gXsG~w9RXqbE2$g|q2tLMv6P21$R+9o}B zReh6$w_X|bB^miUeQ1`;>#ukWQL^Mc~e$i$@1KCtIe@H1U}te z$4d`D@S;=qGfB#IJ{z|hXDwkL~ zHxw;de^gHVu|8gSI;jU*G|4mK0lTl>eyak{c!17QoJvv@- z$-sdFxkU|WX5Q8WY}`^XvZWP&Fm+(?mBlANy$v)X!!m~rI1)XDEJNPXWI4a$snQUy z7SVLJ7R#kfpFVxn)mCzX;+}i%H8w9zi&0q-Xq~dqkZt!p_YgVjoO3`(yH3IemGa6f zulcfyX`5|qFpT_Z@o>Vp(J(d9GNO|(pPpmlkS%5}MNN!fCB@ZnDYP&Yip5ec!#Y<-94Da2;A~f&8Bk$wL(GS6C>hPMaH- z*7y>)yAw0lWEi>9%4EhYOWc@eK;3xUMz%Adsvd+XRTY)<=gvhygB*4sV@PaW4Am>H zFr4y~GxdvD&7*d+tqGJvL747x4y1nk@y8Xkr6hBi0ZI?bX?=M7_>K8HoF4#?U|4|i zR%U#pnAHdkIir^Nj6@x|g)lkcp>xOSAx9qW_DiP5DW{y>seRliHFL&CI#KtYy)Hce z%*BhBeD{bW_>{F*)e5?1$7K_KI+*7_ez=`>*`-6rN|U|Oqt_cXYCYKI?bb0NYq|cU ziDi7={)f06GJGcip{EHjMr#Q&=-G_9KoAoU*We<)xR8I_k(-vuE}1 z-xrKO|M?9|oE9IpO-J>zcuK$Y(koo0!7`d0cEzb#K+IsRrwto6 zSi2s5{4p?PR?t2%&QP~az&6CbBz8KnY}Q?8jf!raY$Tyc_^i1h91w!1SK6+w+_eqv zoD_zawbx$T%uS2JN>2NhGl^XMd(lM~!AfeUd!08fE9NYQ1s+G>(L3riL)QlwwMzP{NzaPSb50YEfDPVlQLV_O7ilt_AYD^Z#j zK{ZFK#3LZ!l&8;4VYgR_S3YaJEt+Gxf~2TVpB^gYx>{wGk?fPBk2>^cKQD18&XzWd zF%1o&m#7JKP{ttO^&NNoZtncgtme&`%dVLVh(uRtIFY{1R-3-_&Xk}2{1;iFku-}3 z;9J2XnHeP*s#-jEjpb?XKPm73`LvB6H2(g&Ir@OEi%h7N4LIXRneWNC$;~(18XK&% z3>`i!b5Z}14V9zwG%45)nSH>)RN7T+1j0Aa^gu3@MkZKHTH-8L?>;?$aMB5F+LT>; z?G45ZGC_$nH@ES9YgZV!23`NQux_qsNg?m#R*DzbPw+W(-Ax!5j-@S^#0UhEgqQ8w zw#j?{GE*@fn_&nOO2H_F<$Q{7zx$49n{D5DajYt>hK0Y84l**?)t2P<&9~pRXJ+pF zc}(ZHrkwSe+ze4yb8Jq~BASzhkgpqIA2NK^r4C=m0wa)3`V8tzmc+tHd0FLo=bqoE zch{-YW}2?@?{#T&5{b4ZW@5^{Fg}E_64wkz9gKmR{4DH*$pLJCG6;d}2iopc# zf%z9fW2I2^Fk#LfcGw|c)>qfsZ?>em!5kG;gUUA|rcHF@%6wd*O$KKtwocinY2W7W@Iy}H_&qo-uqc3&mglSdQa+@_)uCMG$0 zs}JaO=+F*sj_4eD#G%Gr)fiL~)oYcNhyCIgml=s+sN)N{3-{{P>}HmMfXO51u1R8J z7l1_S$h3{x@zduJ+O)9^xxz7e)bpuHpiE5_C!(vYva+h`>KZ=(d@3UZ^aj4qU+`(xKelwCyn?12giwa^vN-eXM%E#N23mWYK5Z&V=+vRTk5Y!b)z@1W z#VRXBY6)mbjJy&u!a3qeS_F|$k8zBr{N39dRU>RyG)#4jlpBw{Kt5LZkwO ztolSv+p2c(DJ_nbaPBz;;idsH=aE3W`so0#^RA6un z7T{Mh!pt`RvvyBp%KZO-qBb((7YYv=FktxbK?@g!fDInhA8@sU6{;HfoUv&8Qn zarn@ogGC;BqBq?>@7qlS>nj`@yGM0PoGXQP5wzmx1K#J%1h`+OWBx=;1cCzN8-MM&Tvt6 zSb4+|NA9!FKI^WtrdPlC)#cPB6`7B{sTVXJEYfFB6a>JL2m(GDR{extus0o3@$@#_ zUdy&3$2VKqpb91lDKh1;5p%+X2|Drp_y2J{PK0*t6k)UW?>FeZ>C?oktCtcOJEark zaACMCUavGT>k$B!`|=y7NKsgUS|l^M)$r5LJiAY?9q;27Tl~=3zxAEd1>A4`+M;|0RoJdPc>VxjDmQ z(eeAo9HW-%y6`UPs74)RcM~Rq6#~9G0KIUIw1(xUz@R~cFqkS!q7@P-kOZtTDq|~M zL_CsUgy~6L6F>jsKE*F*3?e1LN<7k&q?0-y3*y(=dNOhTl)D%t5`+cHhsQ;`CPPAP3$897i?O%gN&aCIpP zJreWq!w&97_i(e#HlI6p z-iIH~&_id>|16(AW%3bJW}$uiWB?k()=#a-lEd`Z?_kcm2Vurc-o9b6clhwZR(f*} zwe}7@+2RU{6rzt56+u-xtqbjZPE}`FxVXk}X@#Dp;jLFhUemgEPuIc~6dZE!0q;$n z?y6PWL}X|U%S!Q}!otjbASl1z+K*6H8= z{d?ONW`h8>l9TevxJWEcMVM}thCi;V(vkQYL#SyMuyoBb7e9$fnwdJaVbZINzar|* zwdacHNke%W0*GPQ;eao1WB+OS|7Efmw}KV=CR=S|ZOq&(g1Oe->Q_;7_!M=;RaaTD zrmpGU`|nE&P|Zc@Za1Gt_r+UN0@qF!+kqU64^IrzBN;-Ye%EfDPd)92pUj$V6tQa` zd-6WRigNa74Dd3$kx{AOeOet-BS`{*lz6&`OhgLATxK8+&yc_5ahIr|YCw8_>K+GzA02(V%}K- zpaU}+;*%5%S|5Y0YS-50vA{4!+;9LuNuyH3eH=b+Oz}05kmLf!2V=DAt+(DGg^IVW zD0k!Sb=Uniizy6OTYc5hqt^%IjAb7xXex7ier+x5VZHS(C#zRob(L-wAKH$u55$U% z^}F0;rM?JcI*b+nja+FZr}SxIj#c+kV2WnyAn2pIGp8CM7c;&<)R*#{Y&(J~{j$Hp{|gh0={wW6xBz9F_-{O1Ie zB@F0EOtqTx9%)5Q+L4i9FvYrd?fCoO|KXOKZp0Dmu4vn-Yqz!6THRz@!G?5S=z<0F zIlJ{QOK=W=ktAiSYZf=xG(7*zv!-q4`Ac6E{q-$f+ z?igb%YXjx!tw7#F(wdv;{gY4m;pd+(Jm-S*nSZvtl$3HqG&|tQ43$lfQ(I|CSTh=~ z_lanZJ;TKQgZDqMN|%WVqZSc`KqR_>B#0b4fm!~baa`!6R&egP^Uf}vIwi}v)_xC> zMw+al0o`>#O=DHVu%tZh9vnY*lg&4u;ATzdg=T&HiB=P7>A5%M7PUVAehMHj;-Mk# z2xJMVJ&`mi@MX%G*a%*M9J1#cn^HYt*~v7C)zvn7g=;q0VY^4#MDX5}sZTxijQk+S ztMZD+9t)i&KmHPo49!zWOpHiNdd`{pV>8>Aw7frUYRA=A<1Vo#_S93)S!C@S&*@8Ri+b|kjp1wLGk&irR+8Vxw0@<`=`KI^(WoTk6t`S_v-Q6_iiqWSY ze`14m*Q02P%&2|XFpb5Qk@Jv|r)}6rj0r!31T3~S7(nH89tC=jAn9Lprfa3_s*QEH zn8h`jgW0jnAvkj76*e5R(IuDsRJP-f|K5}-(*XyNEiP*|V0!lK>LOFJ^x?;!J@n8+ zSqK3qIYfnKRtp6$g>dq`s3@94OMmbIHv##9k~{_-MZl3W`S)W=sR%2gv?TW9IoC(W zGNsDHhKbcSw*!3i(d>f`I!Jo2K7GzT_Z(fuH;Moxfi_DG8Z_t!KRm@pbQdqFwc!); zY%N%Q4F_72|2qoc4t5|lUNCVf0lda6q9vlF^n4{4;)f)q6d4d)2KmECPU|QbB+;v^ z%F>3L!dm+v3SxPUUChH}yAU6+JYm^4V||$1wq}O%i7R+{ufka3A)<{XLJu?;`aZD; ziIvh~f`O~&#RA_8)bwYfEExRE@Wv7q{=WH}H5wo9o;t4!J%IHyP{;i`j znb={nBP-@sRM-tdIDF|V=q}O0rw8x5Kjfe=w$;gn`gU>f2xePNrw3Nxd=;`ZV5hQ5 zVXyq&rt}!zV1mbtIhZ6g;{mb&0LhaxS6$V%(l!`9pKriI?STjEGjKqkv17+R_~3(i zuDOQ4*7UN*N%v;o z9!nndZ(=Xgp#Q6Yk|sx%f{ao$4|6a}sM)M4y_JH}v8tB(0#PL-20zob!Gi}9VB2lc z+1@9nTZc~VFv4XXJQO-;m`$-L;g^r|2DCc65lYMWP)|MeF zT}0>oYY8kXYwJV@2oy(tReGL%EE<`&ouBM*70Cl1 zGB{(#EQ#v%lunX!SsDB^bfT^C*Bsd^hei^FQa4p5+zJc=6%|B8)GJu7^`c%2e$=aYvC9=H7c9I;69pU6yYyZI1dh1u_?tXimvy8xLokW%@UmJ=*s@bG`)Gycx z&)eR1h$d9uS$i8=SECMbSsLOV&OiSg0;!YlN^(LNQ@2(Hx%?z%VUm291rSybn`os= zkW$IZZWm=0p=aw^9J-f~nBt3I8sAH5EhaY*6OXDhwO&9*R|F7(gC zJzkWBK8ochp@nO(Axtp5d39{k8oF+#PY>H-=zHFMw2stOf4A=-pWt#&X(n z*ie)fzp{W01y&|UW2ld0O@-diilw!GyYe4Q0ZprEhuR;$wa^-wNEJ4giTcQX`dUY$ zs^)~4Tkm*)*cdbLMhqPmhg!{rMNAisV1*qrP%vqQ6e@~m{YaHv)KrJUu$rp39{QGX z+wgQxb4E_XEh-wf+N?0Kw=34 z^E7vuv{3J8@9%#1yB|9CnD@Q+-IW!Ffm_W!zwX8x8iGGC7`NDqb8UxL&!-g)TYK}>fz7B|%u zmsdCXY~m*z*R7RfW9E}j{qP589Cp}Y)22Fk%Oa zpj&J+RZ-R0RF5R-qJO9qJ&ZA9#&A>{6)v`uk%8v+E0tQ-@jD6*IIT`l6m2>^4C0iv zmi*|4KiYlTlm+u&TKeiM%a$x<)QRI2g>dRu{`2LR7k}ehr>P+Boxovh90e~4$3mX* z;~&A9tArZEcdYAB?@>bro$1o?j(-QtEeubE@tpYWhtayE+YL9cL}1v+(G$*cEL&L{ z>O#kB#~rs#>vKXvlgX>YsDTI;dXc?Zvu1f#gI=LY7XaHnlPEJr;;Uf1c_j`}iTM^i zH+#00U5Nb*C z$DVqc@a#5qvX@WJ44>q`?enHl+mAGP@}(E&1wVLc7<vi|t35 z_(sAPr%8$eZxWpk+!&&K!)z#35WIY$AIA7wSr?pjp?1ue;6IF?D&l$tK9;Du+u#jZ z=4&kkQcKY>n7R!=^(o9>9XocPz4y5Nj(e}U?)sqmd^oW60mOwB1X8O_ARl|`*%x1a zrK#1B6_G4mxngw4j8aY9VVdyjtSt+(Df`?+UHh4BIs^7CJwWnkKvyZt;IBY)m+ zev{^ROqn!k+LX!9&wBRZ2k+C_z>9T6j?jpe9xBw1+0I!#)g1E);g&DZ*d5nGb* zstWybFC7J>!$wiphP}#*TPl%itlwkzsie=|r@BTy5TAx!4fwQu)V$m*$&Y^YcoQWE z>X*NK>Kon=rV5{P_PN@%CZmn9?l>s-~Dk%;(De)1E8 zH;Wc8Hh8a*YahkYn{-4~eK`23rKM)jAZu87+i|AG7d%z`}iB`m*JmREqwXKVXMrv z92QGSWU(qHaDv1KAq&s0RB&%aQx;2c@#8_)u%bK+cLiA5Cy#}$XIx{ZHQg~T9kv|r zsi$T={q)oLi{Qk$pv}#?KGfg*`HO{XPy>3gj^v1-EM$j>yO-vDnG$I-TV;9iWtaWY zMETEsE*wMTC?quT0G4N-dBzBqC{DwSjp5S)Bb(|L?!rU*z?K) zVdaGtGsX}&7(e>akG|mz!_|U4JOG&NcHTCF=vtaogM>kCI>8AARl&FR?6c3p2XT{C zjy&=Ra^?WsbIv(OG?8V4IQaCIJqsLKIur^UmQsX|5piq;L9J+8 zO(f2Y8PmnFg(>!QU&rsfQ)7Ld{*YlB9VUT98d=}Fv1(;8A1O$0b8JXjTRFYA8acvD zp>KTS8zxMKZhyXF%L=*#hAM-e`Vs&-b?O;N0q{6NF9Hp7zybU0y6Yt4K0L;1N}$Wc zDhG~ zb=O@o3JF6eCtN@Dyl@tCt>!}#bTl5oOY

!tZ;CYHP`zs%5L9s@Bf|BnDpS3uFEr_Ny=71yO`A3x2<`+6 z?(XjH?(XjH?(Xgog1bX-C%C)2liYACeWxCJqImCIIj{`I< zL~!EKGHV~ni>c2n`sO#CCtuHwAqrji5~O3Tl&3nlH!$PWPmVn4Kq8R!ZXEr`BzNi;B)P(TZQUub|LN^ZZC z$(U6)rHmX+{<4N!xZT%nmtBex1)@d}MDNS_ZNWL^_fI~zxjb(<#?vXaH3r!q(P>(g zknz8e%r~xepcRGNPtQA5IxA8|%Q84z#6?)(E!Po)Q`|r!T=h}IWU{jT08sjq1^H!r zbXp#hqk+Eg9X)0RAw`LpwFs*pfIa*JP~MMan2T~oEreh9 zhbvu{wqW}-NK8i&xdaNbAPz+xEGw;i*$9+yOv?yblFA2Zw?jw(r~3DC&toxd7=qW) z>2b9ciXZ`45`vHdz49xDUd~VM^lq5jV9~;Fn}?}<87X7pa~9@jQF}l0eV&uX>9ZM) z#Y|s&g(jBLujX5YcR!qF?UK^mxYqm+?o0OgMr^>u4exE=1q)G84i(f}s5F%jME?${k+p!sB1n3T9~KI+!39-KFy16W84T08FG=#FB5K-}eK4$-*ZA)aPmDi1&7bey zswWn{2;lM7_8Y-q zL}(p(USF=Gp^Vx0MsN{lki?yIBGdR#?oe2>_-qYGMZPc!R=`p>#7^aBvce9OFpgm~ z3oy5g_({nzDG~=NwMnpcSl`91FR-5ku+ivtO8lxjB)kSU5CDTKMTpACU}=dB;-F(W zKgTkg_Uj9-c0}aZA$X}WDtv>%MQ~{Sz!C88L$LirU_4pfZ5I{o0TYsE8K_Xr4BeN2 z@>|fD_!f9&fBW5L|8e5E19}B_5zK0ym=&}EXrTn^pBrl{*&zl;V#i~W$@wd6i*5vXqJH=Fl`>k(Ugt3wbEa=`B z-PkRTrj@~H%}ev?{O<=SiyAN)!mY(hLY*w z#7(d92pl44Ux64+&*hFqjX4&I1Hz4t$z&HH!uhGYqMnAm4%qfl{Qy%Se2pvUoh8_B zk1jc<#6rR6Xu{k>MM_#o+B~uOrhy1o+JLZLazw}T6VI;|MATmRejkH-sgfXAapPtP@#xDBRmSRT}h|KtWgs4UNqawbh1;<;AvxzzbW+qoE! z$TdEAI>Q6|-jj7iD6PT;8v+kuxQF1WS%!s=?78x?{jlYEJll9ox1dxSAEyAlJgv%F zfEHW%T)en3$cnm~tr$-fj$H4yOp(y-i@4u#je3y=>T==T(*lgQt-1err9PjS+))^-wMEkI! z7IAF8QJsRF4brscSWH@5DUc5V1(C>uAP_E+|8*C!H0Q>V@)T@7_2VJFlJ#2%TM9+q zsHM9N^nCZv2uK2>WhlYb!%Ai_6~`b7*79%4Jz0KCU;@_r)ml339?(O@aU-8H3!b`& zsFHg5W06-3!sLYvDw+fQI%PHzLpK!VE}M^wEW6}&NTE?F1|bC?jXtS!BuJs_RkyVi zG~V3BUQL>{%))Ak=VxXGbi|vF8*2Mp7~`)WZ7wHW}2Ggyr zU0Hg9Ur#}lD<^-8Gez#KtFHDki}<=fYg(n-wlN%Yfr3^^T@Lev|Nhd`^U+4{)Azi2 zZr_>94C!d8+STNR2$hBHJQHZY)Zdm74PYUdvOn@Vew*r^)L`P*;Yk=;u;{i>u<-VO3X8o$#{TY6V8AKwFF2ydCP; zNPQr69BgtBQqkIi#4Aw%IxqArTJjkML!r82N58@~n)>VMU!S5*DqtaHrZ|?SYlG9w z<_qA(=^ucrZW!r$wbp-$N;5vKl)f?(3Pp(Aqo^9mQ1R(d;1B>@S1CzBLoZ1B7PS%i zFKF#O$G-`(c+UnS@=PR;y4Sz_QkE5OrhJ_u-xzjF^N1M{T9_tvYKZ?PnFWd$qf(kMeOdTmdrnoQ5 z#I5P+9~-p?4`$>B@C(Ike;N;m9y)*SrZR{rUji)XGFD}2$}Yt(Pq4c_0)HOl@o9+g zMB~us2Jd7&(9AGlSAynw+f7}zZp)noJ%SU$MSYd_3qx!fv1&rr(Z+-FoJ=re1KAgw z2YFkponqd~k2iLm($eOy`G0gZW37QF8MrO&^erOL zw_WwaDmq`U`5sd1*N^AaS1HSJ4oMj|Rzddy#KONabcO1ws(aK(`I+S1QuUjO(H54M-m6%s(79bWLyU8iJ*Mf8+KzS zk6xHqZVU0>98TvB)#4Wxu4+)}d6Q*+$K)e(rA`kw4L7oabs^Eo3IISfckeIovix5|ipnE>zDVE$ zUjk2r9*c3d8j6Mb(}o)bfP^cIzqoPadc^d!ZSJ3C+RBq|>jQyA`tW*2nb zs`7=|>iqBNlGUskazh;um*+C}3Qvnid zjo#;1<3O0&w!=Iw8G0C*XTs*ez;pfjhwE|Ktnt>tfr2;rAZZN1hg|r2|B;LiIQgEtvH5@_kO`v*f$3RCl|*${yT zzQ>6nSwgvpVHKf-{YlVy4^^{VMQ7Elg7^<1ae@MI6w?<;XaL7P4v73bAJ)<>%E_;o zZjh$yF&>Au5pi@%=dgHz;A>?=PKPaPBVg|}iny8DGQUVkHbYiKLPvEuPs69iRgJIY zC3ncQ&i5j=ti3O``|Ek;ChlP9WfUsabi6|lvj80PD#Eq`VTjB7Vas|9x=E8z+b}=DIT)8}I;d2R?aWoIK>#3WEAbEq+)FbBv zTMh&8TvZjqTDw%UHh%WS?Ps;iWeV5G_0(atl0Oc2S>d1}tey7^GI~$6`PQW!)-gd zp1KO;tKi)vchcNM$ex{f3Ek)<=*l~x6Fz9cEd&$^iTf*6!s zTY&kjuNP)~X{gD%f-G!kBf1RAG$`|h2d3|f`s3Idnw&keLX4{I=-_Ba*p#?u8}fH` zeO$oYkD$tgrtY*EA52tL-1Q7c(QTsvybp)k<2)C`l7N*H$mibbXQUSEugriNx< zvZ`s|9-c6%d1Zn+}Ea{YU{&ZZnKyXC@DT*zVr0IKD7?sA#ml zrea5u3_=B_&(GZ51Z&M?_&~#ZX`IUJo}FTQ-xro&7V}6E`A`7f5UDV6h}2Kvs#3pJ zQ@;qja=39AP@rGt{iAfghHkDwtJRcoJze+5admQT*#+RXXXjF+w>cj}lXTIIeD$>X zfE!Rb-r=>g^0a#ZXmEU)U(6^4FZ#mqGntQ{ynnT0$Mh|2dSSnJb^Lx!4-%G{wP|sC z{>UjP1RQR^68o}mvZQat4LgY7>9pW7i5CXSPpgT=f4ui^&q8p=VZ{cT=V$*_`s!>j zk+ij4xewg9!6{Y5-n5?2yzBK@<`Yh%#Vu}AgqaxE5*E08DKANYsg~)4TQzWXr5OOQ zL_l|Of`OKQ7=vl*YPTTz1fE5}W=$k$OM5K@JteQ({t45zyHDL9l~XdJ`Jx|AAK_G3 zw(ULf;*Mj^_#Wr-9WN+!ehsxqM9r5jKPHj&_IUegs_?EQ1g^#{MezdiXCmvHiIWkB z{1O$eXJba`0T`jd;*8!!ybh)OF$MxG1@0qofk zYG{^qT4ugx#Q?Yni?NhZV1ltr*X3)rn611$n)H5N)r|0F*!!3pH+&op<-<9Mh{L&E z!~{jq4{f_7U%)UV^cYlP9+N(5KhAprSj)SK#NrNA7fthDldM>1BfqyR-z%+xsSI=}YVu}qnG##zLMiQtqX-I*(M$L`X5`LpV1>*N7JT7-Ai#@A z;G|ln=}agZKuc4(U$kz_v>nvNKJqS{TwKKiRKA`D8-dOC;ezknkxCn6*|Uge$PXPk zj$IC}{^vDV`c4I>FGyfSS*q3pl?`AOx{gXFskGdXN(JTM_sU=&*%5oNf54pz*=h8! z_(l%)qe?gxg+*jUva+ybGFGj|4FS7{90w5*1m@`=NoC6-NZH+MbB)AeMP)F4#X7fN zYu2R-C>`>-RpTRi&ztu2B*Rz|O&8zxcI!=GUU z%oy6ND*}%e`ygdY4K?Atj=%PLj+B*2xcg7#JlTBSAH)$cTaU-jt(Vc6K$b*eNAA;FqWg1<9-)U4`924dVJ3e(3sL=R${P=b&Q>8Nz*b=Bs` z$Nfw>6F;d$ltcm_R({yBGb5e`=cl~zgB#e!UqkZ0;uDdOK_JCvF& z8jCwdgkDFRHFr+veK;l7O2-LaeLs}se^fHL+@soX%Qh%NgP`-h22T#|HZX;$kfx+R(PO zvGjg@W9B8ZgkFGa83WDNtA{OuNvTd|yHZwro}BM)K4kbw4v{>)*=BoxKYDDxB>wfD zAyY4PHCGkny0DJ0_Q&Th4WD0$Mgzc^WL%yL5?_-QzF0T}>R46~BH9|ER2}}PWcWOd z^x1$ERaxjJO|LxH;9b;NnsiJE2ZJbtCqmZ-_JG>+nTP~g8T|sY#(052Awg-k-g7me zT}X|JC6+Y%1ApvGx?bV5YADF-k7NxcL18RD6v*(KR0TPbpVUfcg5PFCX4WINd*@8Y zUEGrrjFT!q+^4~<@I;Z%gLU%OZ(6Sw^@~ByO{izUPd`~(=m}n z_rLNJZFd#1c)syqUo{&@n4pmZ_lil{O7%QV3%qi89Ost1A50w=I2y_ntJ^XCDl9au zy~5(Z2IAK$)I~=~b4UuPv7{H$yQoj}*Kzj(=v}uB$MtBscDN5Bg&&GmK^L>xMbgd# z+3L#1Q=JGIjDsZ$Oj(k#>(_W(e}+Y^+8Tvi4vye?Tp$#Np;EtO|rzgLOpilvG~ zL}@k#j!UQ&cx^1sDMKMizbi;yCUxX%4t|onn>}fxOdYV4L(+T$B!~|q!iZ&v+H01o z!JKH_=F*y4))4juzU>cL=dG(=+_CT{fp)(!TnqJR5w+Rt-SYHQ)rEwu74K#&PvMbI_tQ*qM*!3T8|nolk#&@6rW|~Wd&upM&=%eZQ(g;M$k|- z!i+=))71Uk*4?`9cjpV83>PdlW36JSlC?EQY$Qu}q~LDJ0v0zkqyE)&EU<5?vU6KFiy{XJG-u1b%V0xZrWN;S0PhG%|(- z&Lne+5PnnDSp&ZwVf7V*Y!mB*9me)D1vfKX29UWL%Ao7|@5?T62Tpl3Lg8)bUUdQ{ zC#c)~qPJsrU3A?ZWXZwNpC=uDFCO&VAS$}sH2Ln`mor+SP%$TwYFAFBz{Twku1EuIHI<{LtxHK90cTzY zA6>a;Z;awLU`<$drU)Dx3Pbzo+MYm#Z6~Fmat~kyG&qz5`7s8UmiM6x_H~Hz%q@Vs zRwzj{NoBHHFKL?RLq5GBa3s{}x?H1i^-W+4Nqm9o3UwGJPw&)n2hu30yTG@%GwWae zSGxcfK!Q&H^QE)-v>JCoLzSoZy(;D?-C|ZJLrDf8?3KNJz{PMNNyR`}ZAEHHM4pD4 z?_e~c3uQ$jg_HTk)&6iV^=4@?l(*^xkgmDs*Y_~wqX(((woGF-J=?xZ6ir1fl=wnW z9bGQFN~6IeavoMlNIz4{8p^KsojPZ8#8cN+V-FnNVO5jmWH)Li)umXJi~&(q=)M`u zT~>nyv)S6~idRGZv!MctC}U*TVd{hX165A*4xv|eEKQ;(y)TW8Sy36*7{8mit?(j+ z**8pamIFC5OCBLp4fX}^6A7DM(f7lm^B{yH)z&p~V<$L#reZAg1FML=W1OV}ja79W z=0TWz21^_=K0Q;$krD1)RI0UX18-}ojGHf7aKX|t`ypOCYfL84)dvj*Cdi8QzDnpR zOh(3Y3RhpMbyh-(7A*_VW+#N*|0#vj3Ihqs+aj5AGrnPr#Rtyq(VE?r zzvPnhGV9!q@fDW~A_uMfSPE+2BBlJuzx#}SO<7A9QS35-v5`}R476l6t7~E5D};ZS z*G^zK=7UOWmPk0VYah5_2_s?soX2T{7oSxj?c7`!sBGSs?Ow3!+hmonQwXfO8P5n? z_a;a*$EPtaZ(RSK&p)?(&UO7?=kuXsrWHX@Nv?MivO;TV_@U$;MW8H|TxlI5Nw zy1?wa-dY%Vbn#sHp6$JVCenBQ*jYQb--+e}fVr6_h2r+&CKz;DW=Mkc`GIGJWbF&l zZwM1Uy{~{FW^WmDkd1=J#EGq|1OV#yl!cf|gx}WUfeQTOUO)xmg31-1@c5vLe_|l` zyIjP))w`ulAFh^Ve}{YfDQ{PiUz9+a#44JwAkt<|NNGutNtNPiNDv(vOw=JBcb2K~ za5SuGkHiu~Uv_jvo-r1O_t_!ikXq+vA($31y98p|mcOEuVXPa^txMGa8TcH>GOb2l zOMZh@`^7ZkkuSZrOt;(TFh~@3`gyUI)6r;R<`V%Ps^G=mdKI(J7sLE`mJ3{jC}^wV zO%&Shkzc1uo+mDB zA}oPg4!e=x@I%NK+%0B>DeEqoACQz*+1VeEhvL=rzeUEmC(S4uJ)UOT#dZZcjGzTm zhOn?HId~*9v4p_2c(5?E;%&w3j1wV6&J+-veG#!|&HqIy0ygV%J!|P57cq($@ToKML#lU%)orSBMMa>7mgSAIx;cMI{};ZoLzi6(1~Y_-yL*#^BB1;VWHFI>Pc<(Jz*tba6P5-ifspF7FOshIU%H{^NB=? z(mM#e+nDr^Cc1sWyzH!CaF55`@EeIMgZ+dik8?a{#0yMl^q=Tt5$fvTC|Y2 zLmURc{!yXKPBIi9b)jikllOWr7Ol;>uXNtCnWt#SPJ%oN{Oqu36)`4{CcXvg1T9cG zH*nX>CQ8fjEW-WkzqJ5TM}(`seS1(uioh3rU>=fm&mec3`6DGpRCvT0it)X9QBLvO zk)}+oQ0!0J?_a_wC6|AjU5ruqdPVX*i70=o>=iRo>XstWhe9<8n>_lg^M2NFhe=jG zoG~&&MB3dawXJ2){FW@9AiftdfRM}K$YUqVx@Zqf1-F@2B3vZ13&SL0QZr9`82t8- zTKggaIsE>}h>@p>sPP$GgJEO?t?0|$8 zCXXbQ`c|{%=bfJgz29L*l?O;}32ml=^U@$uPHKJPY#Fjr#tB~QUv%0bdDc}8S5G2= z*<%kQ3}(ALUVz-)f;alPusP!gfn(iGl(J+mjq)Pttuv8;i7k9 z`4&GApYK9s|4^mbXyGj_{Wuo$(s2tXT{!|H{m4s_)>I+1k_inKX!e>#X4{nLF&@F= z9V%R_AOT>OR#H_gMi}pr*2wzM?>aT>hpJ0`_E5BAaau&-dG+Bd?^uhysYb#YN?npl z=O|f8RDX)yndflrRg^)oDt*Ib)mG>%0?~BE*ayQeIS#4Vz&!4cb*{iwQVHN?Bui)! zWE+eWQZ2(Gym69WNI)YTn#D*JkwI3nO`>4r?rDejpCGA$@znf7eE`Vjws?aUTv@## z&N6BGr{H;Ke^tf&G~^yM=Ujn@Xd;SM64fVKu!09OU1=s;J!MYx9R+jkaj$^`e3U>s zn~NCCN;ist=)G)jCs$hDwrd!yp2P}+Injq<`Xpz;8&;Db(nqJkbTdv^f{4~JHw9~n z$^&Neg5vA<@Xn}U#6Gm)mah)iF~|eOgd`AO(@i?U*wOh}R^P|3iA$OjmM5E3_RW zL8cmLgt?UTI?ILqoZ*yh#=MpzjkZKdj=WT{&YPbWXrI;}oj4gWTgQqg5w6cNA`L$T z0f~I<>nN3?hhl>{RSi@rYkcrRg~|b?IVJ2v!`d%fQ0gCyuTd=%Nzylq)Z%dctRDKi z|Eoz9&LAZpT7RlkV9kKw+WHXbu>1+gAY6yUyP1}^DJ9ueH3~`&AN*+_$0Od|IiW7_ zDNMjBx%Y93IvPy;S}Gy2RO(fDV+}rWxglCsE+7L81Y5cT&aj{tqptms!@}u zOS*bRuiw!+j5Yf!54nZhh^nirCpv`BPU>Gdfy(||Kxo?7?E4|ia|fC#Z|G}bIOc%yp^$t}(VkdQkXT;gm(j43DxA?FKS57%YLI5G(kHZO7#9J&=%;E&>m4&%QWKXf&D#XD?&=%9{TgM(CqBT6_cM7 zXg_I|cTV)zc8xq?Hyqa3$@I5tc`R_ml~@x=#l%Q?;M`LQZ$hfX`j#bMQNOB)gO|aI%ozxd zO|7$53{2lu%=myM#tHikmRApKEFH@uzs&nOXW70%mri-aW?#BJFom0gF@e^?f(gAO z*2W0*2ov0EO_Vj^J$AngJXEyP(~+T*v+)aGAU3ah_uuyq)gMrDes|3UFUfPE@qR~o z&V@1wV+O?xTt)-+owBjcHkhdNo*?s~MC*_x-8`qyDme)oI1R^m?|om^eM9 z6jJY_zOEo-Ua!a987mhaF&d8?mfPPP^)W^E+f}0d+4x1Vny`tOgi%d>><3qyYEDx) zB*OY>NGp&1uWH;|+xX}9*LA%I73J*Gh}>~``>RH`U)f3LRvr)^jvXVeTom(!auYwO z+rK*_tT&$X3=8a;Ejya;NYAr7`FF zCv{zXbLq`Z+3~dUbUq9z`{?*|s^NZ$!&LsLA?)>WRq5bft+JNBSg2 z@IlXOe2&^A*`%BKO+O+HUr!vWssMYLLemSo$#nVN`FE4P?sV}v<1&TM`zj)`25Eg| z>rMHPeovGA``&}=I~%`HX7GPidIaiD7;MGnf-c6};kxCzf^oRY))@Gm^CQf$u|&h! z#`2D-l#Ni?D}s8fJIOr!=dvp<5rY7abuO(^!-1JaUaj24b8GD_+@G^3srT`0)wurm zo!mE>TSWoIfZ~JeSaFnxJ{u8L?pMTj>`-9q->s%K0RQ{0VaK|Cs`t;0b z^&)epu;tc%Y7b>etxNvi3qM)eGx%Ghly}nkXJ@;--=HNcMiy~&Bi^R_&c~0kVl|Qz`W2vAimmbXYGwJz*?{DojPY+jg=Q9W;=kU zMkZQ@W}DY$0MnABU27aOiFfKtj^=+|SrsQhpJ|I=P?xSMDtTW2n}1C({DHV-NpoOF z>a{3L(7K+>`$=8QAQ+iIl&;Yi4sUs3A?7RN_s*4a$4=MXlWLY%nJt`5E1I@}q*(Z= zGUK48C4Gr8UL^!^qReI6 zVDtx2P28BP*EZSW$J+YN=c06Qk8-i6z4g;&$!*~_PTFC^Ik=OB@ux4r`4ipuj6z!~ zP!m5_-fg9`!L}9uU+BE?epx!WhdekX$HY$4Z<#92ys;n8hlS}AY%*nj?Te~kSEK_Y zdlr&4_-mhR#lBHPC9vS5F-qSYahBu#sUi7Y!x1XOn84BZg_9o6&s|+CbLx}$w?c!` zBa!I5gC2s{E(l~Zn7KS0js`l1jC-G2)xmS_!XjN|btcM{W>dbQQ%f8rx?h^pe^?ei z=kQ@t6U@AL@r^$n4fQD8<9Th^NT=qqWaWjV&MYo2mR}!PNkj1Rh5X>!n@b#j%|Sll z0+l>y+CxZoMdqAtPom_Ry_VT(murk>gaysHNh+^m41i}&0n2hhCGC1?{6!Sbxpw{~ zFlcACX@Le;`hX)RGCzSNmQoI}d^JUM>9$t-^ei}(DuS_3T1g$rLrXn^8rnymLH}FM zAm8~@-Y3p^9c9spXRt9YiU1G7X6%LTcxNFQUdH5Tq;N5{LbW0 zM%-A|l_sXXPVQm`(h()_(cXxy-0ACDuCow^*49K9v2kU^n5cg(m5>%0;m;IrB&QjU zHDe{eh=)QIv9L{)Q!>vhiXM5A+-~O@mYELiwr?c}DA8%i`;E@PoOnB+_)_|JqEy8#>h&DA{RT5DA94jQHZ3f|NeSeZzj5W9=sv@M%%z&pNBS1PuESQa zohIkj9Cq&MszyWtIt zuFcRQrDVHeRab3IJC<5%(W`*QyH1GcCv&lH=TJx_RAiCK5UD$DFl^d_yFoLI3BJUzPSBlLyncZKZ zA-RfMKO9m>Qz)Hh8^f!P*%3x_DyX3p3M8kKkApl=T=&uk`M}APHYpw?yU2qik4#B^ zRvmXJS#wT>5h*AvORm6-zPTiJ;mrZ@qby{@eh7)y-WC9j*+zCPwVKTAYoVdg0gY_m zbu+)Y4k|97S?1Q0VFADX|+;?G8pW+F9kQ$9gunKIB9#;qA5Z?fc;f zkY9-qjH(L0CSARpdQCQEe-%V;kQU)F;q8g^I662N4^S&rIlZOW+$9r9BDn=u)ZtH* z^~pBT)6<-`CraXcf*=&Q8l;cVPx9o~#TF@zPE1SLv1T`4lYE>T!VX@5bo0^%4+_=em*obZh@9x zw!X_Si+s|m z=$LNg()Dd3@J8!`(EdCX1B2PSB-G_CIBv{wS2Jb!Q-S+()k=Q#o8}K5@P?*=$7aGD znZrniUc^-6>9?^B#(_4 z*iu3(tKS2KF=cI#ZHwEIb@&|xf2N1nw`HV}hD~dQ;}|x2P@oU>UY&n+1q-CzZuPZA z17FcrmqhcNnqqpzi0fMPsT0>|bVpsy)-c1dbq{hF{#j_@D8OKdjjU6=a;e;7IX2&& zb2EW@UUHZRWn%!LWMg~?{pzx9L2J6?BK_8@<~IUmg98fQM#V$I1>U#L(SV(6Wy`h% zwQ4cOX((o33-&BwUVqhQYN_85=QL76Jd>$Yd=>O)>m{aJR0qNTRfD)F+69P6KpkmC z$IB1C9Iwu)yX{K8VRrvmv4$|nidWY<!DL@$(muw+U6jJ z3A8IxAUjR}jrl?r!buM^a7zSO54S|PkDJ?&Mu1x-{LZkq_g?2Z$^}+t-Vg!t!=ya+ z^ez(j<)g8#@SRDM7aCA-Nohor+UbTY%yB3i7SLR1H^F!Iteas{I4xjth#jCSU2_0~ zaoQRO)-TVB%E?gwu`Xr%>@&wEtRpVGI<+0wfgzewpe69Ypf1f))+e)Hjs$s**C3H3 zF0JtmNE#E6PyE1=^mJdk+x{*$ziRho>S3Yo8hXt+^$X?NBltIL`d2qLE{c%cMMA0s zE6(}3S=W(dA+*OP%KN5L291^_k25d>|0iQL0rp=1{53Ej>J5-WxA*n+_4MT2pBxa= zw#$`Evazud=_)7?gs2%ClOi0|z{&V=tn_!o_OE-;5h1j z3n5ju$U?5}h{66c3dbkGY0)VlkNZ~;y5ay6a<|gMlj<7Y`CA*ff`x zmc|B1>&`om{&Vetr;euS=)(cTOF*}ZhHIT88{X@jdA(C^INQd`%4%Zd^*Y`^XR-x^ z!nqBY4gYTg0xw>#R^wg_{E$I1L$$NGlmCR7CG7vl z#tRJlbQ^b|CSf49E> zCm4`$0k(Aroz!E{|M09g*g%_>``YKR4YPkY;AaG&5dH_%H28mL-)9WaRhx7D`_#6{ ze>Xk^4p4~gpqdAp^G}Zbzk&s}Mf6||t4lp+)Xv%eE`;L%3fXolcrZBrV?|9GtNj<% zkJ$cQ_|*Z*q|vrl)sxQQe{%c(dG1UP(ukS%M@8*~?Y|2dc7Ve5fXW-4o&VEzz~68F zgb9-^@2dKl>;En^=>1y=qJG%c`>%G75%>@y$hLi}>}G2HcVTaU@DA%lOIR300t+i^ zTWd=T0*8lF;D6{pAk!l5^|G?GOr+a{<%dmC@_1goZbK^A7j`rs{;FJERaJ%5+}76C z)P&l$x3?!`08E|#;cdVSY(_RP*Up8bCPdSl_H9h-dRKC3Uje)iA)(O zP}0}eS5-YET(`lkAD{kr*aCl7G7{Lyi=msF8xt{7{EXwE)g@P0YhN|pEW${@-+oCG zh4cTL@&8W{Rgi&EQ7|o61K4z zZ>Rs=VShJ$ClQ|@v67>BhqR29NQr4DlVxU;h^L(UZq71%Vvm8jsU(X>fgM9RD`g%) zfHa%*R|}GUO#J6I1qF>^99A(kE#}4^6V}z;%rwtCE#(*;Ak$&tpYKX=y9}3`Y&kHI zw(BqBqwyYINCRvbWP7hmKAeaTh{XZGa$wzNEre8SM@BV&17oS8w~+-El&|4IjyojHC9@Zn5?m(U&CrsR^+tW5Nv#bMYSmH z5X~G-u5UFAGe2e^Nbo1tLn|v7NFUC6&ii{vnNw%Mh`p5>?-W^Y#V8FM+;n1b(3MTn1fVN(z9#u8$j2#5wy;1o@OzE zJ#}y~y{N17bQkCGIeTtmYfVALP)||ctt)FTsxK%g>Z~F`CrvG_wi%+V;%1s+`Ddo- zg&-0TJiTY!pirV3myM|8KqR*%NUAM8S#_Nkx1L|X)y2naVd-x0dAeaq7H3~JZ~$^{ zJ$$GWme!=>oox^J@;Ll6>p@RngE@Su`ikx(`>3q%wK9+lnc)MpvFy;N)@Q5_9zh7E z9gfg@35lAzyc!bHj*D$nMxrMgFlk0WqiNk#8D3=hlBGBKdPfGj zy1tZcVK1QP7*TAx+JH92Wp86sQ-QUxu%V@;HoG#XqoiVVDf%}gM5v~CtTW15{fhmc z$)x^`#0F+pvoh5u)+ zWX`j5xWEhB^Fp*NHHs{%%ud@M3;0pi40o9>^f$c3S6%`H6Oz{Ox~58#$1Mn}2)>qb z@jGyl+h^^22lU@tkt}Gb0EJpBss-sX^a{#YFl8OQ7_Q=KKBLt80`0zaGq{fK?%Dp` z_BF3xeHM+R7(}-;e5h!xE`87&_&SAG>Sh1L_>2j9e%GQ{7nN8G5-qTe1A|+)SYNTz zE@<{!C9}&oQo{ONT%M=?JJAKD$pWdzT9P@@HZ$lOPGH(zS`q`A?V>O3s@}aK!-djs z=W33p=o3;fBUx}|+3NDpAp44{qDR2}d9S~sx)NJOSJF4r|0_GkFKtYD2+ukS2)>mmHFF36?mSZ`qIe(`Ke}l zf|=H}h3)_e{9Qr!{{EI{hH(lw-E7}MlL76QBI38GE9$>7;(@RQd~j_ECvuIodRIj-b$0Wv3M+CG@pmA^ME6tS9%ikgbs$^ZsRmQixj zaF`igzgr?KY1G3y6?M(;t9;H;pl2ZvKxf6AVTZA8Q@H{^mp--?or?g=-+4$e`)B2J z>q$jjUxIlLxEc=&3p>j_r|7q$qsLPAC+rbVkZn=*_OH{17JT-*3)P^BgKaxag4~yw z_<{5-P~Ia6geB{iKa%oE_P49A>>28Vo+VY$-KPGChDg@nXo#B50sv=~WGZ7kTL%c< zoKMnUqvz0utKaS{!+V2bEywKET{cFdGLxRh{uzGRp9718*4Mh-AdHB=rePdd8xYML zXDtS5!k^Q+RuOL&3&mS@)!&ZW2@>32euW#At9vG0x7h@>!HDd|e`HH>{}n2_!b4bJ zse7X1o+uNyqzpx3n^Kj_Hn~uXs$#(Qihm>~#;@IxbxGOFwD~^^kPQ{^_O+Bl*%>{v zn9bF*uN`@wd_}#D$o+0(W>2(*owmW2SH%jrc5AD7Y%zS{e0WBN$~AjC-kCo+ahBeX z#+kY@@6RMkl5>z-toKWLvPC39IY7wre5TBq`;n__6&WJ|S^ z+hzsJuo`vRx7v48M#jner7N9lZ2G_RLys=Pgf3g(GO=Z5zDWmbXuW)!wtFRCMr;i` zIEbbG3`S!&fagzL+nID5PCF}&0~cd6;!0uR#8s!8|9mBC@zpa1cC>?*3m ztNFf|4Ary!Cg~roB|x){c~Q699R_X#W;|o znlDb!D(TxDwZYFg-Wxl-Jo za%-l?O5WM*>}qN0tZe4~0Ic8kX1A${C9L`&T3fq+>PB>bI9?IM(NLRwDmTxRN?9L1 zkd1%c%Fz1bBzr*Syk%xh8g;wn5)U(9+ZmQaLRP8Pp({hRUtP~9A^Nx+coYjldy!AN4q@9vJyDW2O2K#Z?3sui%ZKBP{Y%;9uinx9Td zO-=Uxxu1%fo}P*hcsp;6`OO5rtm2mdAjtSlvZjgB!l^!rY!lo}E#8Xk@hx&{FB-Nf|HD5pzqRf~mOF8R3J+iRq>+xJIHRB7^< zhS;LgXx}X_=CHX}QNj`H)5^l~9q-oP?jT6rvq!?V*FN1NW7LjftBU?ISMBF&V>q83 z$4s+!+DbXSnB4MamA;EaF6p|Awbv`Tz7azqdTF_wDM{!c`@YN{%%0jxFab_g$zQc6 z()j6VEp>d)Gs9I2{;>n&r@SsTG;C+pO#;%k!pcDygW=t*kuf0$PfrNu)LqZQ<|Y(y-ZQ z%=u3ffXahw|5XwxHKvH{q-Z?P&7-{kjk8!*EJZr4zE>{@q)dKy{uRK~I@kmRyS%qw z^xjaka{$087v1X{Y0Jj9BxD&BP;6|huhOM{Ptx2Mb+irNQ&Z3v7h9u_jN&aF83U*# zHLM?J;f)-J@)WF}DRm+&VyMkDgq`OBDWS;Eh&+N+9%tsKr`~7d z{hCZhE9V-1Y!vqo2SVaF%t?}`siPGD$&QKkr04B%y&N_5_#GNBEc1EsSG$rTT9X{Xd$$kSm zb6==U_umAsJ4T=mMM|nH=xmIteX0(bcOcDz8I9=t@+daW@~q(D5cHn;{}J_#!F9f0 zv~kkdb{gAhY&5oQ+qP|^jqRqfZL_hH#>Rd7``R ztld11>%RpZ+KT!9sDWw^Do@zpk8@df8mI4m-TZ6UIH~4*H1*kwcEBi~ z%Y6d<=W|QF>n1fU>_td*k=JG-1Bvjpt6ce9rfq#9b6UrFl0C=iFaPOr=fm1w*(1K| zYi=u}hbi@IMWLOkrswn0y8R~*!r0x>v=2m%asTbOy|aG+ynBI_^y~Lw{7}&Iw!N7+ z>e1pbXA(%BSc1Wyy{zkD(*NG|?dg2}+oSKps`YHq;ODKtC+llyTavS<@1=7-PzI!^ z^8H>uCCRf?Vq+(jOXc_uQqa;F?cbgmr}h&o33;EoKhC<{@SAgGWm8=i5Z9^N_wns8 zQV)iGuU3F0caznI)X&%M&(|JsBw&KK3pfG1P4UD(13uP3%wFI>8zem-trhS`c~7R4 zUvXXj0=(mi#pSo;+p7zE@3W8B3unOXeZ!$Yww6v)Nly=G*IY))({)@%#kf6{OJzP@ z)a89WcgFMI@65BJXi4I6`B%fEFo~QVYjjg?|HKFqiT4bEY|JuMJDTrfT=P!!dF{9b zS1SY{I8j58_t;{g)yk7p)m$uNv0m3>szW|3Ju38-k6+3_DN0nj_(sD1)yu9lISDK0 z+R?)BchxtNVC!rA2477-xfZ(MmZF}*v9zeBQWhsko^1~r=3@%+!uF5cnO{uKT-Skd zNOUZy*Mo=O3-sL9v@Y%MH9xpnVuhO=A@??Zy#QSNdXsAX-_J-{i!@w-P3|>7S=N|H z)(Qj@{~6Xn$VY33w|FrcZj{EfGtk#^}(pTUnG2Z5zPo17Z)>En%j1gxm zdTN@335Kc~`efd%l7s5va(2pyqdPF;%ox(_OV$|R{I#$D`LaA9m8_983R__f<6R%| zFy-EbmS|o3dgS}KIozYIsQo$*1QflN0*9{(TRO^e>Sy~&ineX@;`$#y7%O1w8_8@k zD|Bj{v3r8@OW;nwHTwRB^R%hHPym2&c)6H}{GJ>sYM!m4hNw1yxPq1yqdMvz(t5gx z=IA;nfg)49&b&GfbBiS}jah6tAmUed5BmolwXlvIg zChOPs@V}~1GLJLfzKVrIdtB+Bho%Uzt|{hD9#FctQ@;cB8t(M;2d9chVLIaeaaU($ zEY6C*kwC*hgJTUbk1(_DhtJTK?CQ5RR&CYc5X zYO1w4?DUyRr^jN~L-JgFyb{^i+R@N6lvC0A{_&0*+Szm$=)slY12>uNet!TIgb)2d zpav;V%t@0c?cwe8^gsJBJ_D(dF^p#CqX|47FCIT>kf7f`n+ANQ=H^Na?P#=#89x-yxV_l z;GHW(mNv~;kP=J#Yb;QXHH*^6_rrLhcg1L&197b%LDE4keofB?p zU-7S&6l#wDGCcua0Qw*8Ok_oUyJ8Ge)iq_P%25qis#q8^F=2$TkbEB-o1B&oOF*{G zYvmQ-x%@?@o*FBTZ9J--8bgE`Uh~CYMbmP%#eU_bzGxVmlvHw@tHCLzz0zvN08`pR zLR*thJUh5>&|xl~S(j;up8x&z&tqd1ord*6s^Oo+LJ?@@oEE~iRH3uoxnuXJ79$7k z(9lCeXi1l(d<474HPM4p&#yZsSEuFP+@ZIt;QrvQZZT~@TWkIsC+0~}!zt}hlzhHZ7VAYzy! zAVgDA(;4fz#i!fq6-iNd!X(&}E%~pBeqjN7WPlJTlC} z+^lEPt=paBZd$@_G+vv!^J#$R8Ir-NxxCkUeXr1{?DR%BTCVtY;nx^9DDCMMF>g4i zrQLBq_xD!?{h&Mv!ML5B)yxEk3jLSl)8TkLZL@*diQ8YgX4sDK&T9Rg)`TO-tor|G zX?s$Dc>gz!TeL?upl3=LlkQiMl4;}&`L$lC_v>h85e8H8+YjlGg>IO%)Y#X(uDDSz zL#GA!8X-{worR$3${+h#1K)>3N!6z&vg*cKg2>hvPdT69PM(aRTor@|dOdK3wpb zwvr?aazzx2gIM|<(|ES|EYE;1$1xC|V3D4PoJ1jm(DNSRB!j1pre|}AQ z`L@irA_zeZse=FfJ10G0JtQ?zx4Z*mIE?n#BcR#=~NE1ph6+t)=c-s>Q}4wIs|9b1j_C?brO50lkh?NU;!{CdJW(dKL(Z5&$@f+#Ds zV8OJ8+3ZL#)&G-MHpYJs@3C)M;Nv>JKz)zAty|?fi&Z%tr|DdJexPKHA;urWaDJWo@WMh!Fg%(a34GA0fy>S zf0cciYFg4Xq6Fb=$ZPrPlCZT!aIBKb*AkU#+?Qi*kxA`~;w8m8s1@>ySx#XiB9%6{Vcg5gA**+gv_(YQAjV zn~l@LmmZN_Q7aVDC4}!JdGY)&7W9w6!u33GAL%MLhROwWD%m{7gI;fvpf}LlLH3PQ zhpm4>JL)r~Bni?xl{=Z-@H(rGB!5i7^#09a(-I(atoSSF1P-5&9Z$6%GaNK?&dJ+3 zD&D}CEt~l{G2UmtLEvL_?VG~zrI-Qrf3-s~;OJR?I)g^Dq<0plo9d)7)&`t?&AU+=)Xrt%B=aV)z@Dr z@#XJnymi52wOpPL{D0rgNlT9h2Zk>$PW9V35guMC%fF+NDU!e!=K8(h#PdHe$Hg5Id(95q;zgdp;4xzI$TeA&(uj4{!{JO_yAesd% z46sLPgC_LxdEBHV@O#>k7kF<Opu z#iG+`@*B`lpxWEmWWANr)>A~Gpfyq`;16FkU0e*l#|WV<)p>UVHmK8L1NjP@I`G_m*jK4LLltcJyt^nU+Wjg(+&|_o1*ovTR8|Ki1JGSMH6`_8IYJw8JkF zxy)pL{vl#eBz@;i%a$8@DIBr?H!z-z>-qDM2t0C@tXqBk_qh&FIR4K;Mx4@yXqe%4 z&m?{y4!lm2&_&SK3x9ymz=3|9gv2WL_4;#@)|%t78{U1@CZFs7@%OxZ++Iyh$>%|{ zJCDbE>U!AUU~OSk**%-r`LGedtX;300KN~er-aVQK#*)+yd?XJFMqE6%a`|Id) ziZ5L0`;npFcE*n=tt{I_VP#M&z{uxD&~|92r4AY+l^nx#&RWVv_$?DOQVsBxIaXX>!-^Vh zy=Wn`Y+TV`v+KMcA$og!v{CozM`-={cir4WaBu`)`qwHTK{GiSu)df>P$la zjaPSEPOtRbc>lx9RlRRW%HU0(AKt^aO!htIrk&sn-yc2`@ z&v)h`jxlkI;kF6cHpe(QPKM~y85?HlnG^qM<57SE>?%qoU=Fc{JY$y`#p*I*5L|$O z03U-IE_%i-lfiXD@Ye$f-}zHekHx-9h`S(_-1T_q`v*umH}rxp_vGJC5P8^e#&tg5 z70{V8F&;=WsAgs=+A--f$T-$8bYQR2ZX6#`AS>6lVV02)>bJB<48+oPnWYqXjs!Bo zZj;+n@~(zBYjegT#+TYEsklifak@xwoaArWyq-atUyTc|B@{Bt(~IE~MK zB+?ZJ?&mvjBwTi@c1FMJ=%YOEnoJIEDyaBawB-erE14*2`kDY`#jTbw1ZguTZk1kb z%>YRnls?oJg#spoMM7}IZ4T?X5_-UWEWGB|X)PM1oX>Lmmg_|`C-X|3m3RVSqzZ}H ze|If^Oo07TPwX{y8d7#Z-t{Oa`?YzdsP3S*{CG3l9JH)9BGJnZl7EK4DS!=FEEO_E zOA@uTvOeDb2zVqHkQA>e`j;d+-UqfXK4)*A;9REO#u4fi<(iL-}+SlhIcf5g$&L? zZ*av314w!b6<#XQxe1A3mhTSl1lKj0DBO|ZkQ6Z_`i%$x`RdwGfbRdWCNRf8UsMpz zJo@?f?-@KMg2CfM;FjIVzZCQJ9lu}JXUstV)<4EdKp<>gjfIXUAU zmNAZOt1)%)g1=-6YKF`eC##Md73GU27FoUFI;yIjMJ-FDtyeq4!L&f;%uH66(~;WV#GA$@yu=E8Vs% zd99BlhlvnG`%2VO;jlX2PAjFw0lICRK77?0HuQ9CtXkZrc^S`LouQ+-xVq{m>cz7E z1ha&(>zmvjW>*8Y`a&%Xp`On*`6WL&tj%z2=+RVet1(c&CvWVT7Fmau8R~e)X=(7X zC(EGKbu}#^6Ht_7Lcz$KYyQHi9x{c+1$gfn1MR{3zg@3(t($H+>Pvt@?$e%H^9j)I zhUJAodFP5HEmexLI#MypegKB~$=MGZ$%#Yom9_RAFQ;w4aV-FQPPNwl<7O0{>aKkX zQkLnDYj?e7xHH@{u<5L~urQ(EitejWMwwM#PB@x8ueUF}0g$aRi?ul~&B5mQY(vby zc`hSpovG`sgm|$B6L~)1g1Z`+Jm_|SY!h1gkV*HX@u;=bIW@I#aPT{lJ3<@99;ZB> zS5G+I3g~4zjkU|1m^gco_kbk6RK&9m+GZc}Y1%E*#j~Lv zdF(KVc6~=0!ypu2FdDo!vXahRRu)Jg*1#sT-V_ezT#O zNopP1*fQypWmlJfGfCW~lH3RtbCbnIEN3b>AN|f|?ORzLRy4EnRNEu9@e9%xMv(EE z8o$z|s%a(>Iqc%dFpOg)B0Hwsg?Tf40p6AeiPdV`qH%}Adwn|{pyr7FN$PydSXgL% zp+V{M(_~n2DDzV`yg$Jox4df)C!c;oEo#da$cY>~52z{kmuH&mdZdzi6bsC5REXIu z+~F7;63=Pi!YpxfJ8+PjG}dd}$?Ti%2q{NOak=%!o5QQ9@#tnnS|k;=j*Owduf5a- zlMgjjmCHAB*cll~VUmt4=)#b`-~yR~0?Nn)nMDc54%pl++JA^KWQ99PO^&)d>bfE! zGtA&ZH}JBu^Rijj4eeSqt~ZP*LC-mwRn%3oE-eu7)W1IL*C2rgE)*MVo^WPJm!q#p z+KlU}Ps9-0wayTfBdpu6MS<*1#u`?BW?<&sb91aLh11e}(N3j8k<<9KOLmOfzySkD zzyURzHq5}L3l6+gG5TwsroE7I@oLhYp0q1KUY)wHd3Ly}N~bf_RBE4`VTMEfNH066 z!%&t^tS6}msBpxp$$%%U5M&D^EQZXF?#Owd_0{EVc6l^C2Pb_R*Y~C(Kp|7vdC_5QWv<4iCQggoN1+>Qv z@5lD7`#9iU^s!JO${Kol*mTcw?5V5)nge3xU7(NQaHXSnBs6n1Rkf8KVbd}lQ*s-^ zF_#P-<&KX10m@-iSr{u@eP~3Lg{(!8&m=j!fdQJV*Ot9(2c#W**HTi0w93#hM&M** zX3R>pf$!LDm@6KS6@xO?m|WoGxI%cKe;(Zc#3{W0MqXE>37{HSU|Rf>jpSzK*Yk&~ zZ_F!rVuk`p_Vc>R74+!J5fnPnq-8%bG!(vC$9%uJZ`cdRQDGiy!Ej5Yz?Kx9N25-DQVw=Y zOO>Lb-J}3;QX`rY^)hOdf(^8csLZQbdl+wjiQ$5;UQ9NUn_Lv7TX+vw=Y2W!Y!_P> z4UKR?#}L+yH0Pqb)%j=w>x$a1m(P`D_N(+2GY*=xn z3hZ;{uC|L9d|pXQkpw!UXvkxHW=Ys0xll_;=Ml=tb1A@Jsoy>u-7!JbFttIt2=JO* z=r+kaiHQ-wps1)KisbX7rbWe61nYfQka!f3@dgBi5*olE;Z;P_-HUFSqu5J2DW4p40x5l z)ub8EO5xuPjRB7&&jZp`kym#KnDP z<$Hhn<}9yO9G@f2Y*P*1e+J-R;*V13Di{<<5By5BSO{dI=dLz@C=*QCJPa0d_*E=l z_uWMwaR-AiI@UAPHe3uR`0!BT0Zx{lxxIV^c zUz}O5wv`POY8YpJBO1GM#UH3Qm;-1uVKYTM!$Y!du)~fuW0&Xn5qK#Wzr(9`oiyqi z5XA~sU?@ogAm5Gb5ZVI5#)8*)`v!0;dNG%@|4z*hmJ5xTeRyVMkU)`s{~kgG>w)ZW zOjY-N<$D>82~HvE9DyY?C^)LckV(rmZ#g_scgR23qb1v%3|Rhkrn+qG?{%&L5Vh@UzdP;mjuE4 zBJ}433~5H{H^}HRDsDA+u!7$rBL{e}&=pzK_oPt-wb9eB=oFhqbSax%*z9%KBeRlSKMPViC#?GB%!V7 zMO8I{B8Xd_XU!86G83*>*u9CtD;7BrJ>sq$pb$R%@swgm=(8yG?5LpFwmqYA)qm2Z zLpzG(2=7>{oo7jv%8bZTQq<7PC?*Yh3<~xQ1;rBX8L@ehTLCHv;j8h_TW z)@c4fElm?juR9L52!PEil>2%kGvYmFRRJ?e0vROEA#09qi$b5QMm3wmQ7VcgE~_Bn zR^a!3uRcdot)svSi)!N3#f_AlRTwKM_8y_MG5W&*88kBba73O%62}M+46*5UQC*)L zPc}IaT9BNdsnBIKMjYm1(iQk`}+BoB>Qy&U$0ny}mC z_E$ATP+t;0E5hkd32t!ce&ni9m!54KY(0{^*`l!6Al&+mz}U58xNn8O4I&E|dqj+S zJu_Tlvj|RkCzj1dJu~uB*iO8=nq)!`S+JR~C86N4>*;aCdwUd|n2E!vNZ}k&!bP7o zVc<{^pa-i4DZD4}>0|pw4J9bmnkK|GchFN(;iRe07^2yxoQjefBk!ZDHavD$4Vg6B z#K2S#hU}^4JcMzE_)uZ{`FcQmQhs_2fJ3Omjx~fRBf)Xj%|ZxcMgEes+5CNRzigh! z;6O7Z<`&G%prlsd@MVA5y``!gO|oow&n-;E$VMt!P%M>A{`1#}Aji!%y*#aVAkDW4 zQzio@1z~28>KRgqAXq$(R9f|b?}7-D0@nj*>#g?jpoQm8Pw%3}r!$4R(Q2}l%TEtb>#jgH2|ef6m@&Y0sE>N;KC?wB>>JZ|R& z!PzZu^;U}&=Q?lRd!)y;-8Gx_tgSYy3nU_8$V901n4~g7zd3-x<;T0119nfGt+pi` znZh?wlD<)hT?K^wCMpY|?SYq+c}87qx`G zx8&cDl4HL?1tBJ_{@+U=u&8xE8JZtFvRBY?IN*?eAVll})7iYxR5NsEM!SQz2evMb zu%MJ~vBQ*{qI60g*1Pp*T|-h|E_Y(HOW3|E0l#R8V-t%A|5su$pw5#iWVx9HeU3~738o30%fZb# z>_2g#AQpinWj1v#OZ+4z({Mxov&q&_TXl|?n`NCr2=HA+MzYak5<3(tvhO2J=(VCj zY1gr0o`_Iy^%es}Fb#JN11zVzkR>k4ke&Oi`_+1FnyJmi5YB?!a7dAy>x2J6_(daFt)68U&IbiCuT7*W5O*ktTO~jplVugh zoq`~qG)^)GIsHkg>SM+1zYx+4kISYo)x2`#s&o&{IK`zqSU!yE4g8Nyd&>L^Qjj)Z zAfSYY^HBcqH-QDsRZ$O%EDKaRg81~E}Q*Bbgjb?eBcOB?bIq$f`f;= z+~c7NCao24r1bqxTEb(q(dzcQAQ6$XUasL=bUR%DvM#IfyUVkOz=FmK)f8Awa~Q@M z2W@2>zHF5xrA{HB!1%YFE?NT`-!{9=7`aT!yNk_eaNd)(qkLb*dLvV|AOO%jJiqKy9K4W+IYry zT;lNDeSd_x_AyI09@1B+RbG#l=7$O!_WCpJyZsh1?0BH7)?zPLZoTXg0$+2tuy1ZJ z;b&o&NOV{DIoOTL1s5%!ex7y=th}Hj>D8sd#j>l{_xE&FO$`(I%P`ilYptqCq8E%Y*wIOmy^GG7(Uypyg#Yr9eR>c$mRF5fHS>mz41mW# zK9?h1N2aElUw%D2cwVVGAm-XVcWzQlyibr6s`3NI)n);ieBK-r5U!`z$20RQ4hP3A zz;o&q*mRkH0-mJ6^M3Ll-$w#*S?aO%Kyh+W6D~VNsdfc?1_TW45e?9K6yH_T^j=Fx zmh+>0Kk@Ws+XUlg*E7+tvrZJ$#OD4ESuVk#!GWk@p!`0P2<~jgkw=C_CVRXxyv-hB z=_D>$EWE(Y1JIs3*TY2dwqM1Qo|Z^`h2jc0B8a*+@X>W9PKdvc_YjDls=w(OaKOzR@sgeWUQMzL-P zkqaA2Hm>-iFdqSbyR0U7-=0dn&D)5==ArG_tBj4v?Q7V8#Z z<^n726BBX3rCOqlAJ*n_QUVBu^MH93G4eLD@^xarIZ{S1O^!$@My;njQ=az%liFSf&LpN7bQX| ztf*j6aIu%zIz?IV9$8HkRT+NCsp(h1#8$Kb$=S$gJesNRFa-6R^CP=Wvk@ zggXJh9D2AF;1r6BJ)}!Z5xFfv?t!6Q1R$FxKyf??C!%iog4Iqu9BMsPRS;T394XWn&1QAq$LjpSJ&fPLIGm{%T(yp7Xc+^JBX= z7?-o=arjUc8)xX;h)OQhdZ|jY`+*Y%okglt?m`kB50pFxGI)1X+@d&>)m#aQ6b)kz znJI#*EQH)CiPSxNGMzH7$C5fvYms(=`!C2kYp1%tU#KW9q!^H-!h4YtNWhIBuU4%bj;LCxCYB_MyjgFJWrBTCPcbsmBhPyu zBTnt^N?4LAsIkyb-U$bJ+^4SZe|sO5`ZK^*EN9X)Bhq=27Z3g`0aT2=_8dYaXxUdo zK~{*WNe7UZ%+%D}SwQ|3Ke@s0>m`%Jg(BfLDW72L?`y7UdSa?+dSEuV*a6vvLp3?G zSudA7@;zRNj2(H##{WJcJbG=U&T>8u&?}}xw`g4pLBrGZF2U%*szYZ$IlX_pQmml3 z1iNptXRern$op+Wpc1MO&NeENFgYZ`P=*jt@FK6VW0MKPP2|4%iHkRnGvEc�R;g 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

ddeE*SWKS`wD5C=M^ov`A=E-e{k-D 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 literal 0 HcmV?d00001 diff --git "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" new file mode 100644 index 00000000..bce7de80 --- /dev/null +++ "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" @@ -0,0 +1,73 @@ +*斜体文字* + +_斜体文字_ + +**粗体文字** + +__粗体文字__ + +***粗斜体文字*** + +___粗斜体文字___ + +*** +* * * +****** +- - - +------ + +~~删除线~~ + +带下划线文本 + +# 一级标题 + +## 二级标题 + +### 三级标题 + +#### 四级标题 + +##### 五级标题 + +###### 六级标题 +[链接](http://a.com) +![图片](http://url/a.png) +> 引用 +* 第一项 +* 第二项 +* 第三项 + ++ 第一项 ++ 第二项 ++ 第三项 + +- 第一项 +- 第二项 +- 第三项 +1. 第一项 +2. 第二项 +3. 第三项 + +1. 第一项: + - 第一项嵌套的第一个元素 + - 第一项嵌套的第二个元素 +2. 第二项: + - 第二项嵌套的第一个元素 + - 第二项嵌套的第二个元素 +水平线: + +--- +带反引号的“内联代码” +``` +# 代码块 +print '3 个反引号或' +print '缩进 4 个空格' +``` + +> 区块引用 +> Markdown教程 +> 学的不仅是技术更是梦想 + + +SDFGSDFGSDFGSDFG \ No newline at end of file diff --git "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" new file mode 100644 index 00000000..12f85c9b --- /dev/null +++ "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" @@ -0,0 +1,615 @@ +# 部署说明 + +> 此文档以开源版本 T-One 最小单元部署举例说明,不保障系统的高可用及性能等 +> +> 若期望大规模集群化部署可以联系SIG项目组进行具体讨论。 +> 若遇到问题请参照文未的 FAQ 文档,或进 SIG 群联系我们。 + +**组件说明**: T-One 包含多个自研组件和几个开源组件,此文档以开源版本 T-One 最小单元部署举例说明。 + +* 自研组件:tone-web、tone-agent-proxy、tone-agent、tone-runner等。 +* 开源组件:mysql、kafka、redis、zookeeper + +**机器要求**: + +* 硬件要求:推荐使用 8c16g 以上规格机器。 +* OS 要求:推荐使用 Anolis OS 系统进行部署( 暂不支持debian、ubuntu等)。 + +**部署说明**: +- 主要分为安装环境、项目构建、项目启动、数据初始化等几个步骤。 +- 该文档以x86_64机器为例, 如果您的部署机器为其他arch类型的机器,则需要将docker-compose.yaml中指定的第三方开源组件镜像更换成对应的镜像源。 +- 可以自己指定安装目录,该文档以 ~/tone目录为例(推荐)。 + +# 部署步骤 +> 后续步骤以 Anolis OS 8.6 环境为示例进行行详细说明。 + +## 1. 环境准备 + +### a. 安装docker +``` + yum -y install yum-utils + yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo + yum install -y docker-ce # 若出错:yum install -y docker-ce --nobest --allowerasing + + # 启动docker + systemctl enable docker + systemctl start docker + systemctl status docker +``` +### b. 配置docker源 +``` + vim /etc/docker/daemon.json + { + "registry-mirrors": [ + "https://6kx4zyno.mirror.aliyuncs.com", + "https://docker.mirrors.ustc.edu.cn", + "http://hub-mirror.c.163.com", + "https://registry.docker-cn.com"] + } + systemctl restart docker + # 建议使用国内镜像源。 阿里云: https://6kx4zyno.mirror.aliyuncs.com,网易: http://hub-mirror.c.163.com +``` +### c. 安装docker-compose +``` + pip3 install --upgrade pip + pip3 install docker-compose + docker-compose --version +``` + +## 2. 项目构建 + +### a. 下载项目源码 +```shell +yum install -y git + +git clone --single-branch --branch master https://gitee.com/anolis/tone-web.git ~/tone/code/tone-web +git clone --single-branch --branch master https://gitee.com/anolis/tone-runner.git ~/tone/code/tone-runner +git clone --single-branch --branch master https://gitee.com/anolis/tone-agent-proxy.git ~/tone/code/tone-agent-proxy +git clone --single-branch --branch master https://gitee.com/anolis/tone-storage.git ~/tone/code/tone-storage +``` +下载后的目录结构: +``` +~/tone/code/ + ├── tone-web + ├── tone-runner + ├── tone-agent-proxy + └── tone-storage +``` + +### b. 集成前端代码 +```shell +# 下载前端代码包: +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/tone-front-latest.zip +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/toneagent-front-latest.zip +# 安装unzip命令 +yum install -y unzip +# 解压到指定目录 +unzip -j -o tone-front-latest.zip -d ~/tone/code/tone-web/static/front/ +unzip -j -o toneagent-front-latest.zip -d ~/tone/code/tone-agent-proxy/static/front/ +``` + +## 3. 项目配置 +### a. 下载 docker-compose.yaml +```shell +cd ~/tone +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/docker-compose.yaml +``` + +### b. 设置并替换变量 +执行以下脚本(需手动替换`必填的`变量): +```shell +# 部署机外网IP地址(必填) +server_ip= + +# 账号密码(必填) +db_password= +redis_password= +tone_storage_password= + +# 镜像版本标签(非必改、默认latest) +version_tag=latest + +# token(非必改、可自动生成) +toneagent_access_key=$(uuidgen) +toneagent_secret_key=$(uuidgen) +admin_urls_token=$(uuidgen) +pub_api_token=$(uuidgen) + +sed -i "s/var_db_password/${db_password}/g" docker-compose.yaml +sed -i "s/var_redis_password/${redis_password}/g" docker-compose.yaml +sed -i "s/var_tone_storage/${tone_storage_password}/g" docker-compose.yaml +sed -i "s/var_toneagent_access_key/${toneagent_access_key}/g" docker-compose.yaml +sed -i "s/var_toneagent_secret_key/${toneagent_secret_key}/g" docker-compose.yaml +sed -i "s/var_admin_urls_token/${admin_urls_token}/g" docker-compose.yaml +sed -i "s/var_pub_api_token/${pub_api_token}/g" docker-compose.yaml +sed -i "s/var_version_tag/${version_tag}/g" docker-compose.yaml +sed -i "s/var_server_ip/${server_ip}/g" docker-compose.yaml +``` + +### c. 启动docker-compose +```shell +docker-compose -f ~/tone/docker-compose.yaml up --build -d +# 注:如代码有更新或首次部署,需要加 --build 参数才会自动重新打包镜像 +``` + +## 4. 数据初始化 +### a.初始化db +* 进入`mysql` docker 镜像中,`docker exec -it {数据库容器ID} bash` +* 连接数据库:`mysql -h 127.0.0.1 -P 3306 -u root -p` +* 创建 `T-One` 数据库 `tone-db`,`ToneAgent` 数据库 `toneagent-db` + ``` + CREATE DATABASE `tone-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; + CREATE DATABASE `toneagent-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; + ``` + 也可以直接通过 mysql 可视化界面初始化数据库 + +### b.初始化 `T-One` 数据 +浏览器或者curl命令请求接口($admin_urls_token可在docker-compose配置里查看或更改) +```shell +curl -s "http://${server_ip}:8080/admin/migrate/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8080/admin/init_data/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8080/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." +curl -s "http://${server_ip}:8081/admin/migrate/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8081/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." +curl -s "http://${server_ip}:8081/admin/import_access_token/?token=${admin_urls_token}" +``` + +### c. `T-One` 关联依赖配置 +**系统执行任务还需对以下配置进行设置** + +- 配置 `T-One` 测试用例 +- 配置`T-One` 测试机器 +- 配置 `ToneAgent` `token` + - 在 ToneAgent 系统-账号管理中增加一组 token + - 更改 docker-compose 配置中的toneagent_access_key和toneagent_secret_key + +## 5. 验证 +使用浏览器打开链接查看: `T-One` 页面:`http://{host}:8080` `ToneAgent` 管理页面:`http://{host}:8081` + +## 6. T-One 多生态使用 +`T-One` + `TestLib` +### a. 创建 `TestLib` 数据库 +- 进入 mysql docker 镜像,docker exec -it {数据库容器ID} bash +- 连接数据库:mysql -h 127.0.0.1 -P 3306 -u root -p +- 创建 TestLib 数据库 testlib + + CREATE DATABASE \`test-lib\` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; +- 创建 TestLib 数据库表 +### testlib数据库初始化 +

+ 点击展开/折叠脚本 + +```shell + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; + +-- 表 test-lib.case 结构 +CREATE TABLE IF NOT EXISTS `case` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试用例名称', + `creator` varchar(64) NOT NULL COMMENT '负责人', + `type` enum('FUNCTIONAL','PERFORMANCE','STRESS','LOAD','SECURITY','COMPATIBILITY','OTHERS') NOT NULL COMMENT '测试用例类型', + `priority` enum('PRIORITY_0','PRIORITY_1','PRIORITY_2','PRIORITY_3') NOT NULL COMMENT '测试用例的优先级', + `suite_name` varchar(128) DEFAULT NULL COMMENT '测试套名称', + `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试用例执行方式,手动、自动', + `run_model` enum('SINGLE','CLUSTER') NOT NULL COMMENT '测试用例运行模式,单机、集群', + `is_available` tinyint(1) NOT NULL COMMENT '测试用例是否可用', + `tone_case` varchar(128) DEFAULT NULL COMMENT 'T-One测试用例,当run_method为自动的时候生效', + `device_type` varchar(128) DEFAULT 'unlimit' COMMENT '设备类型,可多选,默认支持所有设备', + `device_arch` varchar(256) NOT NULL COMMENT '设备架构类型,可多选,默认支撑所有类型', + `labels` varchar(256) DEFAULT NULL COMMENT '设备标签,多个用,隔开', + `desc` varchar(512) DEFAULT NULL COMMENT '用例描述', + `pre_condition` varchar(512) DEFAULT NULL COMMENT '前置条件', + `steps` json DEFAULT NULL COMMENT '操作步骤', + `custom_fields` json DEFAULT NULL COMMENT '测试用例扩展属性', + `parent` int(11) NOT NULL COMMENT '测试用例分类节点', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`), + KEY `ix_case_suite_name` (`suite_name`) +) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_label 结构 +CREATE TABLE IF NOT EXISTS `case_label` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '用例标签', + `creator` varchar(64) NOT NULL COMMENT '标签创建人', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_label_map 结构 +CREATE TABLE IF NOT EXISTS `case_label_map` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `label_name` varchar(64) NOT NULL COMMENT '用例名称', + `case_id` int(11) NOT NULL COMMENT '用例ID', + PRIMARY KEY (`id`), + KEY `ix_case_label_map_label_name` (`label_name`) +) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_tree 结构 +CREATE TABLE IF NOT EXISTS `case_tree` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(16) NOT NULL COMMENT '用例结构树节点名称', + `parent` int(11) NOT NULL COMMENT '父节点id', + `level` int(11) NOT NULL COMMENT '树结构的深度', + `path` varchar(128) NOT NULL COMMENT '模块完整路径', + `children_nums` int(11) NOT NULL COMMENT '子节点数量', + PRIMARY KEY (`id`), + KEY `ix_case_tree_path` (`path`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device 结构 +CREATE TABLE IF NOT EXISTS `device` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '设备名称', + `arch` enum('X86','ARCH64','RISCV','LOONGARCH','NOARCH','OTHERS') NOT NULL COMMENT '设备架构', + `ip` varchar(16) NOT NULL COMMENT '设备ip', + `type` enum('UNLIMIT','VM','DOCKER','PHYSICS') NOT NULL COMMENT '设备类型', + `sn` varchar(16) DEFAULT NULL COMMENT '设备序号', + `status` tinyint(1) NOT NULL COMMENT '设备是否可用', + `label` json DEFAULT NULL COMMENT '设备标签列表数组', + `owner` varchar(256) NOT NULL COMMENT '设备负责人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device_label 结构 +CREATE TABLE IF NOT EXISTS `device_label` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '设备标签名称', + `color` varchar(32) NOT NULL COMMENT '设备标签颜色', + PRIMARY KEY (`id`), + UNIQUE KEY `ix_device_label_name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device_label_relationship 结构 +CREATE TABLE IF NOT EXISTS `device_label_relationship` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `label_id` int(11) NOT NULL COMMENT '机器Label id', + `device_id` int(11) NOT NULL COMMENT '机器Label id', + `is_delete` tinyint(1) DEFAULT NULL COMMENT '对应关系是否删除', + PRIMARY KEY (`id`), + KEY `ix_device_label_relationship_device_id` (`device_id`), + KEY `ix_device_label_relationship_label_id` (`label_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.func_result 结构 +CREATE TABLE IF NOT EXISTS `func_result` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `sub_case_name` varchar(128) NOT NULL COMMENT 'tone job名称', + `sub_case_result` enum('SUCCESS','FAIL','SKIP') NOT NULL COMMENT '功能结果', + `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', + `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + `current` json DEFAULT NULL, + `expect` json DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ix_func_result_tone_suite_id` (`tone_suite_id`), + KEY `ix_func_result_task_id` (`task_id`), + KEY `ix_func_result_tone_case_id` (`tone_case_id`), + KEY `ix_func_result_tone_job_id` (`tone_job_id`) +) ENGINE=InnoDB AUTO_INCREMENT=479 DEFAULT CHARSET=utf8; + +-- 表 test-lib.outline 结构 +CREATE TABLE IF NOT EXISTS `outline` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试大纲文件名', + `title` varchar(128) NOT NULL COMMENT '测试大纲的标题', + `owner` varchar(16) NOT NULL COMMENT '测试大纲负责人', + `tid` varchar(256) NOT NULL COMMENT 'oss文件地址', + `remark` varchar(64) DEFAULT NULL COMMENT '测试大纲备注描述信息', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + +-- 表 test-lib.perf_result 结构 +CREATE TABLE IF NOT EXISTS `perf_result` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `metric` varchar(128) NOT NULL COMMENT '指标名称', + `test_value` varchar(64) DEFAULT NULL COMMENT '测试值', + `cv_value` varchar(64) DEFAULT NULL COMMENT 'cv值', + `max_value` varchar(64) DEFAULT NULL COMMENT '最大值', + `min_value` varchar(64) DEFAULT NULL COMMENT '最小值', + `unit` varchar(64) DEFAULT NULL COMMENT '测试单位', + `track_result` enum('NA','INVALID','NORMAL','DECLINE','INCREASE') NOT NULL COMMENT '跟踪结果', + `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', + `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + PRIMARY KEY (`id`), + KEY `ix_perf_result_task_id` (`task_id`), + KEY `ix_perf_result_tone_case_id` (`tone_case_id`), + KEY `ix_perf_result_tone_suite_id` (`tone_suite_id`), + KEY `ix_perf_result_tone_job_id` (`tone_job_id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +-- 表 test-lib.plan 结构 +CREATE TABLE IF NOT EXISTS `plan` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `title` varchar(64) NOT NULL COMMENT '测试方案名称', + `req_id` int(11) DEFAULT NULL COMMENT '测试需求id', + `req_title` varchar(128) DEFAULT NULL COMMENT '测试需求标题', + `content` json DEFAULT NULL COMMENT '测试方案内容', + `status` varchar(16) NOT NULL COMMENT '测试方案阶段状态', + `cases` varchar(256) DEFAULT NULL COMMENT '测试用例,多个使用","隔开', + `tasks` varchar(256) DEFAULT NULL COMMENT '测试任务,多个使用","隔开', + `reviewers` varchar(256) NOT NULL COMMENT '方案评审人列表', + `owner` varchar(256) NOT NULL COMMENT '测试需求的负责人,多个以,隔开', + `report` tinyint(1) NOT NULL COMMENT '测试报告是否已生成', + PRIMARY KEY (`id`), + UNIQUE KEY `title` (`title`) +) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8; + +-- 表 test-lib.plan_review 结构 +CREATE TABLE IF NOT EXISTS `plan_review` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `plan_id` int(11) NOT NULL COMMENT '测试方案id', + `reviewer` varchar(32) NOT NULL COMMENT '测试需方案的评审人', + `status` varchar(16) NOT NULL COMMENT '评审状态', + `desc` varchar(512) DEFAULT NULL COMMENT '评审内容', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.product_category 结构 +CREATE TABLE IF NOT EXISTS `product_category` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '大类名称', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- 表 test-lib.product_plan 结构 +CREATE TABLE IF NOT EXISTS `product_plan` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `test_product_id` int(11) NOT NULL COMMENT '测试产品id', + `plan_id` int(11) NOT NULL COMMENT '测试产品实际复制执行的plan id', + `executor` varchar(256) NOT NULL COMMENT '测试产品执行人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + +-- 表 test-lib.requirement 结构 +CREATE TABLE IF NOT EXISTS `requirement` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `title` varchar(128) NOT NULL COMMENT '测试需求标题', + `outline_id` int(11) DEFAULT NULL COMMENT '测试大纲id', + `outline_title` varchar(64) DEFAULT NULL COMMENT '测试大纲标题', + `content` json NOT NULL COMMENT '测试需求的描述内容', + `status` varchar(16) NOT NULL COMMENT '测试需求阶段', + `owner` varchar(16) NOT NULL COMMENT '测试需求的创建人', + `assignee` varchar(256) NOT NULL COMMENT '测试需求的指派人,多个以,隔开', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; + +-- 表 test-lib.task 结构 +CREATE TABLE IF NOT EXISTS `task` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '任务名称', + `status` varchar(16) NOT NULL COMMENT '任务执行状态', + `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试任务执行方式', + `owner` varchar(256) NOT NULL COMMENT '任务执行人', + `plan_id` int(11) NOT NULL COMMENT '测试方案id', + `plan_title` varchar(256) NOT NULL COMMENT '测试方案标题', + `cases` varchar(256) NOT NULL COMMENT '测试用例,多个使用,隔开', + `desc` varchar(256) DEFAULT NULL COMMENT '备注', + `run_result` json DEFAULT NULL COMMENT '手动用例执行结果', + `config` json DEFAULT NULL COMMENT '测试任务配置', + `device_id` int(11) DEFAULT NULL COMMENT '测试设备ID', + `device_ip` varchar(256) DEFAULT NULL COMMENT '测试机器IP', + `workspace` varchar(128) NOT NULL COMMENT 'tone workspace', + `project` varchar(128) NOT NULL COMMENT 'tone project', + `job_type` varchar(128) NOT NULL COMMENT 'tone job type', + `test_type` varchar(32) DEFAULT 'others' COMMENT '测试任务类型', + `cluster` varchar(256) DEFAULT NULL COMMENT '测试机器集群名称', + `tags` varchar(256) DEFAULT NULL COMMENT '测试机器标签', + `tsn` varchar(256) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ix_task_plan_id` (`plan_id`) +) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8; + +-- 表 test-lib.test_product 结构 +CREATE TABLE IF NOT EXISTS `test_product` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试产品名称', + `category_id` int(11) NOT NULL COMMENT '大类id', + `origin_plan_id` int(11) NOT NULL COMMENT '测试产品对应的plan id', + `desc` varchar(256) DEFAULT NULL COMMENT '产品描述', + `test_method` varchar(256) DEFAULT NULL COMMENT '测试方法', + `test_requirement` varchar(256) DEFAULT NULL COMMENT '测试要求', + `need_config` tinyint(1) DEFAULT NULL COMMENT '是否扩展配置', + `owner` varchar(256) NOT NULL DEFAULT '' COMMENT '测试产品创建人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +-- 表 test-lib.test_suite 结构 +CREATE TABLE IF NOT EXISTS `test_suite` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(128) NOT NULL COMMENT '测试套名称', + `creator` varchar(64) NOT NULL COMMENT '测试套的创建人员', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_case 结构 +CREATE TABLE IF NOT EXISTS `tone_case` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `tone_case_id` int(11) NOT NULL COMMENT 'tone用例ID', + `tone_case_name` varchar(256) NOT NULL COMMENT 'tone用例名称', + `suite_id` int(11) NOT NULL COMMENT 'suite ID', + `suite_name` varchar(256) NOT NULL COMMENT 'suite用例名称', + `test_type` varchar(64) DEFAULT NULL COMMENT '测试类型', + PRIMARY KEY (`id`), + KEY `ix_tone_case_tone_case_name` (`tone_case_name`), + KEY `ix_tone_case_suite_id` (`suite_id`), + KEY `ix_tone_case_suite_name` (`suite_name`) +) ENGINE=InnoDB AUTO_INCREMENT=603 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_job 结构 +CREATE TABLE IF NOT EXISTS `tone_job` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(100) NOT NULL COMMENT 'tone job名称', + `state` enum('PENDING','RUNNING','SUCCESS','FAIL','STOP','SKIP') NOT NULL COMMENT 'tone job状态', + `test_type` enum('FUNCTIONAL','PERFORMANCE') NOT NULL COMMENT '测试类型', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `tone_job_link` varchar(100) DEFAULT '' COMMENT 'tone job链接', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + `server_info` json DEFAULT NULL COMMENT '存储tone job的机器信息', + PRIMARY KEY (`id`), + KEY `ix_tone_job_tone_job_id` (`tone_job_id`), + KEY `ix_tone_job_task_id` (`task_id`) +) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_sync_pull 结构 +CREATE TABLE IF NOT EXISTS `tone_sync_pull` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=76149 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_sync_push 结构 +CREATE TABLE IF NOT EXISTS `tone_sync_push` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.user 结构 +CREATE TABLE IF NOT EXISTS `user` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', + `nick_name` varchar(64) DEFAULT NULL COMMENT '用户昵称,具有唯一性', + `email` varchar(64) NOT NULL COMMENT '用户邮箱', + `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', + `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', + PRIMARY KEY (`id`), + UNIQUE KEY `nick_name` (`nick_name`), + KEY `ix_user_user_name` (`user_name`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; + +-- 表 test-lib.user_open_source 结构 +CREATE TABLE IF NOT EXISTS `user_open_source` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', + `nick_name` varchar(64) NOT NULL COMMENT '用户昵称,具有唯一性', + `email` varchar(64) NOT NULL COMMENT '用户邮箱', + `password` varchar(64) NOT NULL COMMENT '用户密码,前端对密码md5加密后的值', + `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', + `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', + `token` varchar(256) NOT NULL COMMENT 'api访问凭证', + PRIMARY KEY (`id`), + UNIQUE KEY `nick_name` (`nick_name`), + UNIQUE KEY `email` (`email`), + KEY `ix_user_open_source_token` (`token`(255)) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; + +-- 表 test-lib.user_role_op_record 结构 +CREATE TABLE IF NOT EXISTS `user_role_op_record` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `applicant` varchar(64) NOT NULL COMMENT '申请人name', + `applicant_id` int(11) NOT NULL COMMENT '申请人ID', + `apply_reason` varchar(512) DEFAULT NULL COMMENT '申请理由', + `signer` varchar(64) DEFAULT NULL COMMENT '评审人name', + `has_review` tinyint(1) NOT NULL COMMENT '是否已经审核', + `review_result` enum('INIT','PASS','FAIL') NOT NULL COMMENT '审核结果', + `review_reason` varchar(512) DEFAULT NULL COMMENT '评审意见', + `method` enum('APPROVE','UPGRADE','DOWNGRADE','DELETE') NOT NULL COMMENT '操作方式', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; + + +``` +
+ +### b.TestLib 服务依赖 +### c. clone test-lib代码到~/tone/code目录下 +```shell +git clone --single-branch --branch master https://gitee.com/anolis/testlib.git ~/tone/code/testlib +``` +### d.增加docker-compose配置 +```yaml +# docker-compose.yaml service下增加test-lib + test-lib: + build: + context: code/testlib/ + dockerfile: Dockerfile + args: + APP_NAME: test-lib + ENV: daily + image: test-lib:latest + ports: + - "8005:8005" + depends_on: + - mysql + - redis + environment: + <<: *common-variables + # db + db_url: mysql+aiomysql://${db_user}:{db_password}@mysql:3306/test-lib + # redis + redis_url: redis://:${redis_password}@redis:6379/10 + # app + tone_host: http://${server_ip}:8080/ + tone_token: tone_token + tone_user_name: tone_user_name + main_domain: http://${server_ip}:8005 + oss_url: http://${server_ip}:8005 +``` +#### e.重启服务 +```shell +docker-compose -f ~/tone/docker-compose.yaml up --build -d +``` +## 7. 独立部署 FAQ +https://tone.openanolis.cn/help_doc/12 \ No newline at end of file diff --git "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" new file mode 100644 index 00000000..b09df7d0 --- /dev/null +++ "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" @@ -0,0 +1,70 @@ +# 一级标题 +## 二级标题 +### 三级标题 +**粗体文本** + +__cuti__ + +*斜体文本* + +_xieti_ + +下划线 + +~~删除线~~ + +上标:Xy + +下标:An + +> 引用文本 +- 无序列表项1 + - 第二层 +- 无序列表项2 +* * * +1. 有序列表项1 +2. 有序列表项2 +--- +[链接文本](https://gitee.com/suli01/community/edit/master/sig/T-One/content/%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97/%E7%94%A8%E6%88%B7%E8%81%86%E5%90%AC/test.md) + +链接名称 + +'''python +def hello_world(): + print("Hello, world!") + +![示例图片](https://pic.rmb.bdstatic.com/bjh/gallery/03e17cba710868d9153176b50a5fca0d1090.jpeg#pic_center=100x100) + +| 列1 | 列2 | 列3 | +| --- | --- | --- | +| 单元格1 | 单元格2 | 单元格3 | +| 单元格4 | 单元格5 | 单元格6 | + + +| 左对齐 | 居中对齐 | 右对齐 | +|:-----|:------:|------:| +| 文本 | 文本 | 文本 | + +
图片名称
+ + + + + + + + + + + + + +
值班人员星期一星期二星期三
张三李四王五
+ +- [ ] :待完成事项 + +- [x] :已完成事项 + +
+ 图片名称 +
diff --git "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" new file mode 100644 index 00000000..d0a3a7f0 --- /dev/null +++ "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" @@ -0,0 +1,2 @@ +# hello +![测试外链图片](https://up.enterdesk.com/2021/edpic/0a/13/7a/0a137aaa28f48af0349cee1e568c0a57_1.jpg) \ No newline at end of file diff --git "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" new file mode 100644 index 00000000..e5d110a5 --- /dev/null +++ "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" @@ -0,0 +1,2 @@ +# hello, 欢迎来到聆听 .md +## 阿斯顿发射点 \ No newline at end of file diff --git a/sig/T-One-copy/sig-info.yaml b/sig/T-One-copy/sig-info.yaml new file mode 100644 index 00000000..316584cd --- /dev/null +++ b/sig/T-One-copy/sig-info.yaml @@ -0,0 +1,40 @@ +name: T-One +en_name: T-One +home_page: https://openanolis.cn/sig/t-one +description: T-One兴趣组主要目标是建立OpenAnolis社区的质量保障基础设施(包括但不限于一站式的自动化测试平台T-One/Testfarm,Bisect缺陷定位工具等各类测试平台), 支持OpenAnolis社区的各类测试活动。 +en_description: The main goal of the T-One interest group is to establish the quality assurance infrastructure of the OpenAnolis community (including but not limited to the one-stop automated test platform T-One/Testfarm, Bisect defect location tool and other test platforms), +to support various test platforms in the OpenAnolis community Class testing activities. +mailing_list: t-one@lists.openanolis.cn +meeting_minutes_url: https://etherpad.openanolis.cn/p/t-one +maintainers: +- openanolis_id: yongchao + gitee_id: yongchao + name: yongchao Zhang + organization: AlibabaCloud + email: yongchao@linux.alibaba.com +- openanolis_id: suqingming + gitee_id: suqingming +- openanolis_id: jacob2021 + gitee_id: jacob2021 +- openanolis_id: eeeeeeee + gitee_id: suli01 +contributors: +- openanolis_id: fuyong + gitee_id: fuyong +- openanolis_id: woohello + gitee_id: woohello +- openanolis_id: maozzi4 + gitee_id: maozzi +repositories: +- repo: + - anolis/testfarm + - anolis/testfarm-front + - anolis/tone-web + - anolis/tone-runner + - anolis/tone-agent + - anolis/tone-agent-proxy + - anolis/tone-agent-front + - anolis/tone-front + - anolis/tone-deploy + - anolis/tone-cli + - anolis/tone-storage \ No newline at end of file -- Gitee From 996d4aa8bfc3a0a9c59a2dc13dc6448a45f07a79 Mon Sep 17 00:00:00 2001 From: WB01533938 Date: Mon, 20 Jan 2025 11:31:21 +0800 Subject: [PATCH 101/135] =?UTF-8?q?refactor(sig):=20=E6=9B=B4=E6=96=B0=20T?= =?UTF-8?q?-One-copy=20SIG=20=E7=9A=84=E4=B8=AD=E8=8B=B1=E6=96=87=E5=90=8D?= =?UTF-8?q?=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -将中文名称从 "T-One" 修改为 "T-One-copy" - 将英文名称从 "T-One" 修改为 "T-One-copy" --- sig/T-One-copy/sig-info.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sig/T-One-copy/sig-info.yaml b/sig/T-One-copy/sig-info.yaml index 316584cd..879b0bd9 100644 --- a/sig/T-One-copy/sig-info.yaml +++ b/sig/T-One-copy/sig-info.yaml @@ -1,5 +1,5 @@ -name: T-One -en_name: T-One +name: T-One-copy +en_name: T-One-copy home_page: https://openanolis.cn/sig/t-one description: T-One兴趣组主要目标是建立OpenAnolis社区的质量保障基础设施(包括但不限于一站式的自动化测试平台T-One/Testfarm,Bisect缺陷定位工具等各类测试平台), 支持OpenAnolis社区的各类测试活动。 en_description: The main goal of the T-One interest group is to establish the quality assurance infrastructure of the OpenAnolis community (including but not limited to the one-stop automated test platform T-One/Testfarm, Bisect defect location tool and other test platforms), -- Gitee From 84b84830d794b7e00d84a38f1afae01d0c8813fa Mon Sep 17 00:00:00 2001 From: WB01533938 Date: Mon, 20 Jan 2025 11:41:44 +0800 Subject: [PATCH 102/135] =?UTF-8?q?refactor(sig):=20=E6=9B=B4=E6=96=B0=20T?= =?UTF-8?q?-One-copy=20SIG=20=E7=9A=84=E4=B8=AD=E8=8B=B1=E6=96=87=E5=90=8D?= =?UTF-8?q?=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -将中文名称从 "T-One" 修改为 "T-One-copy" - 将英文名称从 "T-One" 修改为 "T-One-copy" --- sig/T-One-copy2/README.en.md | 57 ++ sig/T-One-copy2/README.md | 56 ++ .../assets/Dingtalk_20240614165831.jpg | Bin 0 -> 6459 bytes sig/T-One-copy2/assets/dingding_group.jpeg | Bin 0 -> 176005 bytes .../1\346\234\210test" | 2 + .../2\346\234\210test" | 2 + .../3\346\234\210test" | 1 + .../SIG\344\276\213\344\274\232(202203-3).md" | 20 + .../SIG\344\276\213\344\274\232(202204-1).md" | 22 + .../SIG\344\276\213\344\274\232(202205-1).md" | 36 + .../SIG\344\276\213\344\274\232(202306-1).md" | 24 + .../SIG\344\276\213\344\274\232(202307-1).md" | 26 + ...13\350\257\225\346\226\207\344\273\266.md" | 4 + ...23\345\214\205\346\211\213\345\206\214.md" | 63 ++ .../test.md" | 16 + ...345\244\226\346\234\215\345\212\241API.md" | 1 + ...06\346\210\220\346\211\213\345\206\214.md" | 282 ++++++++ .../\346\234\210\346\212\245/202212.md" | 82 +++ .../\346\234\210\346\212\245/202301.md" | 101 +++ ...10\346\212\245\350\257\264\346\230\216.md" | 7 + .../000000000130_anolis.jpg" | Bin 0 -> 47154 bytes .../T-One\346\246\202\350\277\260.md" | 30 + .../assets/Dingtalk_20240614165831.jpg" | Bin 0 -> 6459 bytes .../assets/jiagou.jpeg" | Bin 0 -> 366652 bytes .../test1.md" | 73 +++ .../tone\351\203\250\347\275\262.md" | 615 ++++++++++++++++++ .../test.md" | 70 ++ ...26\351\223\276\345\233\276\347\211\207.md" | 2 + .../\350\201\206\345\220\254.md" | 2 + sig/T-One-copy2/sig-info.yaml | 40 ++ 30 files changed, 1634 insertions(+) create mode 100644 sig/T-One-copy2/README.en.md create mode 100644 sig/T-One-copy2/README.md create mode 100644 sig/T-One-copy2/assets/Dingtalk_20240614165831.jpg create mode 100644 sig/T-One-copy2/assets/dingding_group.jpeg create mode 100644 "sig/T-One-copy2/content/SIG\344\276\213\344\274\232/1\346\234\210test" create mode 100644 "sig/T-One-copy2/content/SIG\344\276\213\344\274\232/2\346\234\210test" create mode 100644 "sig/T-One-copy2/content/SIG\344\276\213\344\274\232/3\346\234\210test" create mode 100644 "sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202203-3).md" create mode 100644 "sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202204-1).md" create mode 100644 "sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202205-1).md" create mode 100644 "sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202306-1).md" create mode 100644 "sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202307-1).md" create mode 100644 "sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232\346\265\213\350\257\225\346\226\207\344\273\266.md" create mode 100644 "sig/T-One-copy2/content/\345\274\200\345\217\221\346\211\213\345\206\214/ToneAgent\347\274\226\350\257\221\346\211\223\345\214\205\346\211\213\345\206\214.md" create mode 100644 "sig/T-One-copy2/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" create mode 100644 "sig/T-One-copy2/content/\345\274\200\345\217\221\346\211\213\345\206\214/\345\257\271\345\244\226\346\234\215\345\212\241API.md" create mode 100644 "sig/T-One-copy2/content/\345\274\200\345\217\221\346\211\213\345\206\214/\346\265\213\350\257\225\345\245\227\344\273\266\351\233\206\346\210\220\346\211\213\345\206\214.md" create mode 100644 "sig/T-One-copy2/content/\346\234\210\346\212\245/202212.md" create mode 100644 "sig/T-One-copy2/content/\346\234\210\346\212\245/202301.md" create mode 100644 "sig/T-One-copy2/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" create mode 100644 "sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/000000000130_anolis.jpg" create mode 100644 "sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" create mode 100644 "sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/Dingtalk_20240614165831.jpg" create mode 100644 "sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/jiagou.jpeg" create mode 100644 "sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" create mode 100644 "sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" create mode 100644 "sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" create mode 100644 "sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" create mode 100644 "sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" create mode 100644 sig/T-One-copy2/sig-info.yaml diff --git a/sig/T-One-copy2/README.en.md b/sig/T-One-copy2/README.en.md new file mode 100644 index 00000000..831cee37 --- /dev/null +++ b/sig/T-One-copy2/README.en.md @@ -0,0 +1,57 @@ +## SIG Home + +https://openanolis.cn/sig/t-one + +## SIG Mission +T-One SIG focus on building a one station test system, to fully support OpenAnolis community test activities. + +The main activities of this SIG are: +1. Explore excellent solutions, collect requirements by the community, design and plan direction on the test platform. +2. Develop and maint T-One/Testfarm to support testing tasks by the community. +3. Make T-One open-source, attract develpers by the community, provide testing services for community developers and cooperative enterprises此处有中文. + +## T-One Link +T-One:https://tone.openanolis.cn/ + +Testfarm:https://testfarm.openanolis.cn/ + +## Members +| Member | Role | +| ------------ | ------------ | +| [yongchao](https://gitee.com/zy_chao) | maintainer | +| vosamowho | maintainer | +| wjn740 | maintainer | +| suqingming | maintainer | +| jacob2021 | maintainer | +| fuyong | maintainer | +| wenlylinux | contributor | +| zhangxuefeng | contributor | +| wb-cy860729 | contributor | +| jpt2021 | contributor | +| woohello | contributor | +| as461177513 | contributor | +| vosamowho | contributor | + +## SIG Repositories + +Source code repositories: +- https://gitee.com/anolis/testfarm +- https://gitee.com/anolis/testfarm-front +- https://gitee.com/anolis/tone-web +- https://gitee.com/anolis/tone-runner +- https://gitee.com/anolis/tone-agent +- https://gitee.com/anolis/tone-agent-proxy +- https://gitee.com/anolis/tone-agent-front +- https://gitee.com/anolis/tone-front +- https://gitee.com/anolis/tone-deploy +- https://gitee.com/anolis/tone-cli +- https://gitee.com/anolis/tone-storage + + +## Meetings + +## Chat GROUP + +欢迎使用钉钉扫码入群 + +![](assets/dingding_group.jpeg) \ No newline at end of file diff --git a/sig/T-One-copy2/README.md b/sig/T-One-copy2/README.md new file mode 100644 index 00000000..9c662bcc --- /dev/null +++ b/sig/T-One-copy2/README.md @@ -0,0 +1,56 @@ +## SIG主页 + +https://openanolis.cn/sig/t-one + +## SIG目标 +T-One兴趣组主要目标是建立OpenAnolis社区的质量保障基础设施(包括但不限于一站式的自动化测试平台T-One/Testfarm,Bisect缺陷定位工具等各类测试平台), 支持OpenAnolis社区的各类测试活动;此SIG组的主要活动有: +1. 探索业界在测试工具方面的优秀方案,同时结合社区在测试方面的需求,设计规划测试工具的后续方向。 +2. 开发并维护相关测试工具,支撑社区的各类测试活动。.... +3. 开源相关测试工具,吸引社区的开发力量,并为社区开发者及合作企业提供测试服务。 + +## 平台链接 +T-One:https://tone.openanolis.cn/ + +Testfarm:https://testfarm.openanolis.cn/ + + +## 成员列表 +| 成员 | 角色 | +| ------------ | ------------ | +| [yongchao](https://gitee.com/zy_chao) | maintainer | +| vosamowho | maintainer | +| wjn740 | maintainer | +| suqingming | maintainer | +| jacob2021 | maintainer | +| fuyong | maintainer | +| wenlylinux | contributor | +| zhangxuefeng | contributor | +| wb-cy860729 | contributor | +| jpt2021 | contributor | +| woohello | contributor | +| as461177513 | contributor | +| vosamowho | contributor | + +## SIG仓库 + +Source code repositories: +- https://gitee.com/anolis/testfarm +- https://gitee.com/anolis/testfarm-front +- https://gitee.com/anolis/tone-web +- https://gitee.com/anolis/tone-runner +- https://gitee.com/anolis/tone-agent +- https://gitee.com/anolis/tone-agent-proxy +- https://gitee.com/anolis/tone-agent-front +- https://gitee.com/anolis/tone-front +- https://gitee.com/anolis/tone-deploy +- https://gitee.com/anolis/tone-cli +- https://gitee.com/anolis/tone-storage + +## 小组例会 +双周会,采用线上会议形式 + +## 钉钉群 + +欢迎使用钉钉扫码入群 + +![](assets/dingding_group.jpeg) \ No newline at end of file diff --git a/sig/T-One-copy2/assets/Dingtalk_20240614165831.jpg b/sig/T-One-copy2/assets/Dingtalk_20240614165831.jpg new file mode 100644 index 0000000000000000000000000000000000000000..925bf2945891170613821e8e7dbc9e4206d17c8d GIT binary patch literal 6459 zcmcIo2{@Er+keJjtc}q$_I(>6*|%sYhE$eBSF)}kAK7wLm zVmgFiVPiqDB2i2zk`M@KBn1TxB_$0CP6tQ**U#Py06_&9lJh_zyZ{*j0!2Xf+5s*A zfKY(ik`z98AY@Q-3Q8CiH4QD;p^^b0gY0WhK|xLq_6`8s0dfQdBaehC9VnvwT-Qvy@R8>hvyA1Zy(>#u<(e;sOXraC*51+C^|Jfb;M<{h!z1rU$MA%i*}0GNpB6q7SJ&3RZG7L{`a!Y_0ziM6^~bV* zu?qp(MMh2zC5Mshf{=NE35p=6;E|wYRMmrBbv?{08A63rOMFz?Ld_?ozjDOVZGZ;F zFO3%_0Q?=KsmEKZgBd*BC$tg@B6(MF1y(pBphE@Xjg~{vqDVTWw=w4io~C zIwzBo%9r%@l}nz|NLdBaR81_|2ysI#Kid}<=hi%IcU23Ye82L9QtM>6;oENkva4*u z-1TQa9}mbLR&Zx8>k8JU8mE6@)6Z^gccgRCV*JPLOeefJL$A%o9)K`Ynlu?LO%*Xy zIo{+*O~WVea@ZZs-Fy4S?A*5HN?(!+pSNH8ScpnCp`;{knLX|97 z+2x7xXG1T=yy1uB9bZM&0v@T!9`+W{_~I-Cm4|UNoR^fE2_nbIEO9Ox5Miq(I z3&qEtT@Aob8V~c|(-a*z=jkp}&TuMNj4X$eoQ!NHf4E}DOJ`GmB*c?y`J49U^0&3z z9JY>-N&lfRLDRa^D2ej8n}4>(`lT#@{`x-Qx# ze8tG^I5|6~hAM}n@+tkY(z^1hx|FBYYd)x#h`aS)?D&GOlNGT)IHWidVQ%dG&i^w0 zr{6=I>6@jcYtoadzd(sC)*iUas9YC`FmP0Dfpdt3zF#wvB_GOZUgCA$ihy3&~6qLW^ zkjkVO!1&K3B$*`PUy_5*@)fffdb{b)Bh&c~{Php?GU1h}@+GYAqjFQFc==|pltt*j zV7Dfd`m8wYpKjNYU0B{ZMN7vtFVyn=^x@=}Tw|tmRwKa!Uvv1y3l0~j=Jy~gpZ&Q9_!kylGYz8V-sZ@%rwkXZQ;@y$%wUq4AEqM0K$ zgKyZbx>WX!@{{wdm-PoV`IO#s-v}yEDqc}3ohj-MuQPv?Umdo6v7nbPvR(&K zHr7jJOS9-sk$9OOe~KbPrtgatbJn5VnAJUiV{;FR`h{lenyO$25-~85X|2j@Xvd^BcM2- zjs*1f6Xy_M8Ke9ui!9_%)$b-!2{wEF!A^{F0nmZ;8^BPI{SAXZ?_l$yI#L(%EBWa{ zV$k0~3{w25`rSk-!RFyVfIx3#L6LgPAQ)->2IHT1u(|l3O}&JnMCVL_0R5-x?>!GT z>wG_lyaMXU3|cLGlE#<>RuG$Kgzce+2@)ax@B+5Gvq|D;oaQW5*GCTK(D;|blkP!G zsrV+=MOr6**YnO%FI)kGm+eZUdNGN~%Y|RX3 zBlU7HWOTsP6ogCJ2cfua6eY|8X2$8-zun&GZWiVwK6*zW!KWVZLEMOYKO3yo^(J}q z4S9-Dj5jY~xlM6C?#o*O$L=$N(&c4wF@Gt4(Gxw7W;?rGXWPi#p9?|JEjnjyvv6!q zaA$X}ut0%lF+9m%ENAqcoD|Z|)TXX7#{#OX;t~y!J;@%oDi|l;z-sl(1!gQz-d$~h ztnWPT5YM`ifDqR7Z-8LC4+N#6k`>wVeIVE#0HJ3e2#HS8Ja{5IpgU`Pi?ErjxkIV*gjWn31 zm)tL!+RP?=9XEXU?VPkjMBk*?(oE>{`z`k>z~3}Ty(QIaW9(huRfi38{^ldI zAhXzO*Ltog;{8zSra1Z&z(FKPw<#r7asywd@`zdXBX9+%ND4 zx!6TxL{xNoNV?H@+{hc{kSL&K%%***WvtD9byZT!>IG-{^p2F_pvS0~Ck`>`)IX1k z__{jAY)6IJ;_5yf7p3(4BGXL>d29l`qfTq;0d*wB7z4jtu`am(_6g$`KkPG;1c*2N zKx74o1pzStnWF#Z7wKe&9PH(kiUWv(I3xijc_j}76N$TWvr~f)Kt}TyQyrisRu6A%Ls^eoJwy-^k`HTT!bY9lMq-4MN^MES%)z2Zp zO$e_I4%63v1JP0!13*6jjzl8?yPafpb`Ws;h^$Bf^fnJ>u=f7><>X4_haiW5oG(q6 z)&l$ErPv}TC%f{EM@rlY#2Sl;x;Enu_G;Q|XZ3n`;yB8Vv)nAzJuj*Dz?bvRgCCh4 z35De?Ds-Yo^RP}ijBxjKP*d6+g@T4}J;Nn#`c9RKnY%0x}rJtJJ zY$3a>3l$cOn|*M|`_HT&f@S=AZMDor?$gU^Q$0kY#w9L`)7d`-lu!=LE>I!zH!vG* zb3I}?K`y#M;)z{b6}3Aq?@~uViK^^FWTtK0L>Rr21%}}{7TOczM%4!g(wpNNeEf)7 z6>$3TF|3_)fywym@=cf3CF`*4Zs`v=t(@xU6qNy5vMtlK8ZnacbAfQ;hjx0ePNNGQ zc-E1A zuB^Iuo$%sOtfc0-7g8w3n>1S{n!73$kVOL{ij~ywov076^&JbdjFZU8o_v#DXUaRa zVlMm_Sm(^Xy4>SW782;`gr6{&5+n-UvdL__!FntWmuOQHNgby5xgA0o0(Q=WZ%i_{K_4k%bp61tt1)+_6%CKh|%A&&*_REOo+B>9Ob!8L}{)X9!6F=`!tb^vtn z)3!)|HZe1bi{QSA?s{Cbll3}1GvOngujj*tev@tBFoaHHsmY>0ej2sSM3}TP84+D~ zuq@T?p_<H;f4FfUfm#?^u!2l~-~fswz~~R^ zLa_M1nV1A&q`od0iLp~EKmh*XyuVSlk7W`l)sZPc1t>{C>~GQ)69ABbe+H6->^m0$ zKn$#;*8Y1wZ7mE1SNPw9|2t)=)s;Y_e#I7`2l^!%k~s6y*={9#T`n!iy4wClQV_cP zxeNOed-}-JlhLS=>OhL2rS(N&ahLRoyUy7jM)yKsmT5M+=a0)B=gc)cwK?AYqyXCr zXO*4nCR@X9`S8KycD(ypJ}b@YlA=&I?+@)yFkG;0`w3{GPmXKXdE8HrZIRNr$)!{s zbWWLFPeN>A*Q9`(a!vmXhNTFfNgt1ti^fK-mlkWm6MkgA&-r-)+x60>bG6}+)a|1j z@Rkhtz|;APfoUj-r#5sd@Po?;^lQ{;XE9}QBsQUhdcfVn7dt+wU9Pk7g{u>>S@PbI#Cu3)qG0j zMpi&R&xXy@$#PIM49{)Lvro6lxNqe`6*1g5c{PIPK|(S(?2Q7R#BPB*7;B3H}H%Alw+@7qqrCDWx$30e_Yn-SXxM5^^RWR=AD-o``fvu;QIb=cwqW+{8%%dYh^brcc<=x%*cCDFvwvH3fO?u)_!(#k|HpLc!;w)8lTAEeOs|~zDq0p z^0|mdmT3}a`&lrW{=r5HeQ>;~b9`qcC+wYPoJrf81+Ou)xyGWd0Cz7t+nfGAZap%S zxsq7sdG{?*O8LprBH}GWPFVTyNjzg^ebdl#e(3qgGYySH#V%JPmrbLKpPK84f|m!P zqWL1JEb_oNkpRV3>PP8pwDz;rp)Y|;zp7r&A2S9(j>A&B>cyHf3gYNfV75mrk|5VY; z&_ECUJs=}R7f{$&&kH>AoH0)Urv*Nef;-ZUMPCrBg)cgb4l>;j=VCBl6rB3fTX=e4 z%H*NO^ymboZf;{?5O?WCpsDvghhs+a%6zM0Ktrjzjo)=aZ}!HGB2O<~Dr?5mQEQs7 z6N`dRJF5Kz{}AJm69{~zdC>ffB z!o0Aac5~Ci9P!A6c$?@D`J7Ty((TVO=(Fr;;ZbAw=UI|4P+PNViEfPWi0AvV2iUDWUZ@@dr+XdqoRLf)wBZmn|;Zt}#*)}TYIGp)r}XSALP+>xQIe{N#I_+dgP z?`8;{tE1?^M9oPBg`>ykTtm9m0WV+WFjm_%%FJuuCDpHmAWBMdYf?gX7Hn+2RK93^ zFH-(Qx=YFfH!ntkbdZIBnN((H+7x(q1uJGDfQ4`Dpj~D$$hd@faDf3g(p43VmlT!X zUMEreAh`Nj>;vEy4hA!p{u%9Mkdi}(V~JqVsNo>h4<5oHuGmK8!Ty0JlA;tWD2zOB z0qmoD2wWi=44Bc)6Z5`<;#C(lyurdeNBZ78c-#kSz@s=CV2?p(2SZ+FgReQDFf#ph zun!t04emp3Fr#$e9Q+At!2K=f1h{v^_0rF-eFJ-#f`@)2a7Z1ghXH2yqXm+2!oFZ1 zBs3i~BY_p21y$H~2mt>J2H$}Ua2BS5UO}H9ps-`$^}>Oj^fFMW$5+$fWVxRIHY%1u5<~w@@ga(9o1q5mu&z=L#Ut;elDjX49 zW94aMMcEqlqxE#?p6J(T$#XsIB{V^s%oKZTYpU~VCtLd!He(Bsk#GwP+$AClL4N+B z!K>|-Xl~fJNt4tGW+MtoLZ;9(H}{ah#m>$vgkz3>j*b8G$4Kqi+@W`~gk$}z{?7_> zJ3K<%!Q!1k^X)rA-2Ff~2i$$`fx)2=M7#>>wZlULh2>|UtPl()2+E&?WzX+rrm(zy ztUN{sh2XWTtszKs3fPhfZf?Pz5Hvvtw9(w{?g_@3uoRT%`0w!c2W9X(Wa;kZwgZ%N zKzXL0Ux2XO0?PW^e;LQ~m$IAN_Mc_y#!qEc#N4OTQ>_6l3JZoKRsVhw2dz3&dUr4Hj| z|6MDE`#m=1PH$WL@v?WQ{o3)eM~Kau@p5p$>YvZr8En0HyxuJslzxm8=DY4^y_bjm z&++$qt#ui1v)g;UP$I^j8{)g>=X~~hS^umL4qN?m{vQ5zOUB#p47UBbcE1o%`(qq0 zZ~LEpL%r568?SeF`)mFl{)_(_Gi1Zhx$W>+YBS#6!++h+^#+D6`T4BCU1PE_HfN7r zc0cPwcCY!_Hxw}B_&9-~&Od4Bxl<3vGn9Lhg_kaUrm~H)uks1yJmp3eQI#1gt5m{OQdG)RdQ=ru7pc0d#;e{_ZBP?Yo1wN^ZJ%1Y z+AFnTbq#ep^+5IW>Luzu8k04wG<-BpYZPjHrN~n(Dc+RR6qNE!Q&DrV<}S^1nx&e| zscKV~O%0oRdFq>~JS{z~by^3s7+Q_mQrh#icWR&3F4ku1P;?x1B6YHK8m383n?KEK zTGF(NX`{M&x-PnLx_P=^^rq<9>+RLc()*+@qYvu`>0i;WnJzwk{&e5zm!?%uV5a}fD>Lh6O_;TK*6vwZvs!0Qp1orBf!TSp`wVpq zHyNHVtT4pqn9kWX=jxn~b0^JRKKH=f$8!gaW*E5}T`;OKmNB+9MvNaCvrG(3JWNtd zKA6gzI-16r7Mt?T=9vYXWt)ASr!#Ncyo>Yd<}1v1o_}=yvjt)cmMlOPFH;c;_EtZ;=+bq*8Ti~g%8+-+Bv(mQOVU=Ok zwRrkspT)Np_br*TBzQ^gl2Pl0)=}0^mlBuSEsbCL#%7YuI-6vhCR;6APunb8rk$zX zKD(#O#FjZMJF%?JUftf^{)Rns`Ml*(%S#<5IIM96BBWvz~L1^OIHLtDIL|Sk<|D?&`?Z6>H?zP}kgCGqQHcTKd|L>-5)! ztt(znUcY7ijrF50OI=R7v}`ck5VhguMwN};8y{{WZCbx6W7F_vo6To7cWg1;a%fAf ztDb9w>+`KDTX$_OppvO>)cf1Swz+J(xear3a=YR-yxo5L#qCUYYxgAg?j2S;PVe~Y zVc~Joqid(d&XYU8cv^U#^8D%rd!6;_@wWC(_GbAk^GWp?^>y;i^cC!K*~Rda@Z0A1 z$bXW*uYYNPMnFWs+dzZBLxC+p3xm!CF@qg~GeQUav-#Zi}O1lo35F`|teL^`7F zqOb3l+V8vn^?^ADP97MFafx|+Q2k)^!S-0Y*sMbn4+S5pi(3?zdRX+Z_u)53jE|f@ zg2(TOe~~aJ;cNnS)cxp-#JP#*5(US09(zMKqo*7fKkk3L_5^(5`boKydr!8Xay<3m zwC3sf(?e&dXP%!mIh&d!l@ylLa&E=Bhv#+9A3u*JdnLcWu;c>cqT0nH7e_DcxKy2D zm6DyRo|=%#P4iCsaM|wigDbjM&Zdi}?@sT$y8dd#wfWa>WT<2$WbiZnGh42&zFvA` z-i;eK)o#+WM6$xNzTVn$tLpaB+Yhs6WnX4YW+dE!?u6a>c6Zy|+ItT7ito?ApPe%; z=VGpWZu|qngFO$Jd0u%f4>vx1`)K*2;>U{~=RTSJBr|_%{)Ga?0(zlT;lV-yx)&XO z8u+xQ$g`-um|Fa?WJ5_!>8jEbBIieAw~f zOZ~2TR>STF-pA-qVxQt0WgE{nsWn|`p5Dx8F>5JkUE2DpZB5(9cK7z~&mo_&j)R>t zooBl!T{pfMeaZi7`?c!Z=5HO{f!(~GL%njn7yI=4a{8_MUokf@J6ORi!NAc$<-yD$ zlcC~a=i#OizY*SOJX@K4oim?P!FAzw@xn0@c8))t{}^|`KMDKX}*W4t~1fTYx9r76lP({%Opr_V4kHJdko!9we$Hnw)l?3b@uyKcP; zfMo7FJa&3|dHaNfhV2fI*t0k0VC&$yd^^Udzb5e&go7`#HG} z@*X~VTwGFGR$lS!`HSjzHScTdKGZj~wzYrm=1*dn6yq~370muvj1#h2mY^C_H$u>t?MIX4T+3hL=h397?DU66Bh%QxCB63;^Gog z5@VOtk88r%HBoqxe_jGG2my>CDk@3>|7E2mrDgxym!J{2&PxOh&;%j@FcVP@f+0S3 zC0-x;|NIuYG>YwYz*}!c!MJ&w018EB)E5dM`bOlFX=0`Ts<=q)qjzk2N)}Z8FTDV- zh+G5odI{*|_g~TL?f=s2zeTU=|E1S|i(c>kmtOxZde!`$UJQtTt#H96+8Y5RHB32@ z_jsRAkax%8Sc;op>BNVo{llDA0VK9q0G+aD&EvgAzHE=SG!;N`A0js62UY2qGzIga zv!mi-(JxCL3ZSQ#1yFf6r}0WOe8rF*MUO@Ps=hAl#&*FE8qhH*&<(xxDcQ)2$kiGj z?nnLKhx;TP4*sX%gtPeG&0jd&atJ>xfLcd1CJUg;QtbjrBu)USq~jF#Rw`FE8)oVw ztebdvu-Ef6@|T3)tKrrWOT}NiF}lKak0yf=(LcWd1G=^Pqs;wVkQQeF)E?A9s$qpyR$}A#RFj-{uc1gPZ#!Pc4d^+4*^677e#QQ_%qEwk zGlTc++YN=ByxmPrr7*byNP3j1Sb>X?annsGa}&amjZ_vu)HTR7Mwia9(*(Y(04nJ* zpSd?;oHVLqD{-s9G+iic1(^LFS(N|wlojQz5@uOZj1EoxvB0$m=r>CME%`A#^-Z6n z0)a30d-Xi(b@(3IEAPQu5otnin|A0N7kIy{J+pB)&P3yjvk>_+{LKQWXqo`}T-S?s z4+L~sQLdj}WdluR7_i^6W|LzC(1ft&!=q*yBNmg$7MIsIZ1E>57gcN;-o#ln($YTS z!j7eLm;$K2HW~(O_~*uCmH=kG#muk1YW>uOvPcYA@ypG0P6zc(t>eaf?jsLLd=n~o zXya%Js$|z*De6TtjwkL)et&h|60LBBN!NGD@4vY7$#RxqeLk7(jEj!E?GZpjtLq-5 z*ybu%P4+?WLSxNx?!USbh z=6W3Vkwm)74Ljd+JOP1gyLtd;iiy2NefpJsH00hz8qZFgc2vY&`;`u9LA$C_HEI`& z7*mQ$IU(t*rm&LW}m0a>|6Dzw>KwlP{F(=D!CTUlT0GfeC zoWi9yw|X^Jv87sib&!gxUIDZ#YltyY2V~fjRl(n5flRI=DNPbUh0SlG;md5aC6}g@ zy!L3s#Fl_ovG9+{j6Von!|dB9KU7mE3B+JVs(JSOFT(;GtJ_+4*I z4<1)nzo;>wu6|Q4#kWiN_c z?`@SAvx3PMZaY7%=`=VHXklUS-k^j0Ap$8kz$^sN9Rz>#emDwJ0MahJgPJT@TWBQa z?%Qo&-R4PN`@L(4VyJbSG#Wl{!TpqmjdOH1j9 ziagAr17C+(_=*Z3->m|u&Kn-m28xr8S(X%c^|8gr6+fenu^(2vjhjWztg_VIRG)ir zQ^(^snme1;1d^1WR#KPa$}YE&os>IdESXx;?9{_Xhvcj%JKowTK&!yLUg=2gRc2RQ z?yS8_2VI=<&IYHo2Og1jXO;PDoGHRqS6~K+d>6hy58+O`PGr4Y12*Mt1a(D?e@-V; zy~OkuLmBo_>)CFMGa3LrOSNPu62%)K|CVzJc~`i3&{AP_ain?q!`Z~ z|J2~pbK<(!*@a1Q*J{xR>&_{hw!0sIiDk9@X*;vtAT1BfBj`_4hhI>;sR#F%j4Sgx zT=s`O{Rh78w)@%cFIxbl^jG!;wr~|-YRd1jD>NXH27h%D8W825gMAzq3CbV#vu^Oo zDf{oE{rZg1zm3*0``_t=0K#8}`t#c#w%_e9rSKRi1&yD!zXCu8Mpwu+;gA8yeW!{= zP7T_v>o2g3Uas_;J?bOdcm5J1+7Ty<&+g}Ii(F-ZkVyg&&*q)+5b$}+31Zv0f{Ez*D1 zW$ilk`eP9GEjLt%XilWt4e>ls{OBf#d*$VbG(R&;b-t;zlX&BEu@^H>+(|qfc1>gB1-{ShG@l!1x4z>uss`$SF!38k$iV8AYwpr{XE zU!!%+d|m)E9arb`)=)SnvjtH9M6(X>g}bdNXxEytO}x-Wnx;`|$N*mD_K6Bm)8_InkxH#tLKpnW?bSe%F6eC zHO9p)hX{|uxGtk%V~?ReH^dYdtfkd$)s(K_np1eD5G}~1ZxoY*aa%)mpo#R+Yc$z9 zVa=kyY9PeA=7-u-cz5yL4KfgrdDwD(7EX%PVaZ3Vsi5iPy$dsO?o{4lAm$$@p3lQo z0oK^0h7|kmgnO?5BuSG7z-g0u(nwaJR4H;9;GDF0thlMAJqVb%@DX-hXywPvC7Z|q zRd{;G#rKD9yn6QABI?ERV~}WX_v@hQYm1C$LAY_d0hMYWk<@+C5j3mCxfU4a`E^}G@xu1 zZyL6Es+~$?0a|a0dBdBa(7EQ-I;#@jeAd_K+D~=$O1*>j8nmfv)orehoEm0vsZCNV zEb-2Zy&7i*&e8?YR9~3eO93FB7sF3gBo|Rh9*YIgkx18q>qL(E_c^0O)0&X)92t+a zT%=0pdo$@RVrXoBc&2@Zk3)#TxvOF;Yt1!$`}=3ZfQO=?uVs*ByndQUp%ee19kv}U zHRO(=#=<*{)385$R^7zvcggf2$Bal7d0vvdVJg)-Gymc;O#&|h{@A$VW zh`$unZHe5$-pBN9%g(zUY5jhC_3hcaO1%c=IB)Q8PrXeWL`t5*9=C$pH^V$O+D+Vm)&=L$aG9Om}cqGt^bsO*^% zI@77s$D%J{=CZ3JX_CDgS9dDW6kY8x8Dt|>1oemO@0UV5IJ@wuVr##(B)3!n%* zl)yiYlpy#^>d-BF1)72KyC!fMS+4z?Vo7C(_xFMg`k{En z6w7LWT+f6HAlgUFfTug~j+Z`=KCXyB`(G8+-`nf`-u~~3i^p4o{5Aad=2yo$rIFjo zTlt4jZ&=2wE_vjBt7_K1S(awWo?aisY`!@u4$O>y)^l{u+T*k<=tHEzQ8rSXRrdn^ ztQhiEMHJBW4Nn>VgSfcG`rwK}W?&j_bwyA1dK?BTlzUI)@VIYD~N&?pQIA_YB5Esf+>j0I;~zYNn@OWP;Y)hoc?obG<#(>j&umZXeaSP8 zI0c-WqbBNlWg|&Sd0da0IpsR5H#QkTYTRVpA+iEzVPCBuO?eI{LJpzp`lf{~n9yTa zm3(`-y@j_vk++f`hkkyKYY3nZFi?;_+{cBh{#F%jPHtoL8Zh^@6lRK_V3A8@y`MLj_P&7HbPIIR7jV z@Sg)9D)@Klk<_Ui6S~c?vHKUc5w7Jt2Z_7EkDSZPkmbER`60&^=_4%PpEywGP zj><30v!8Mgl*ZrMf%H?}q?zkMs$(elOouGmIv zZ84&#JoV*u9rE&^6Jvr0;m-lcZ=w88g#2HxDL^=}X!u?T52%F=0ET?$fx4+I;s}d> zZkS5+<@%)__0viDR^F*!v+Qb8#0Ns%BU3D%8ryv9ok3dpG9xq0kj z2h&Sjhxfsl1Re9`05|YJVx&E*FNU`!BGvJ2ZugT#8;)*vKeqa&vC5E0p}YW!En_+0 zhY|!3533>YUr-bxd>=48LAX&4C?pE=bc8Q{U<6^yQP_3NIuH>|XiMVDC<&lZ4sbyK z=nNuDt6EdJ(!gN1EJfPwuxT1V{iGG7;-YrADQ1ckx3K}Dwzd&KeB1|a4T=P2@-mn- zE&v(0NN_6i6nhub)Yr&qaTjo!%GSTQ6SjWM8UMvow9rEgawL_V3epv>rsx)W7^i8z zYRcv3L|UG-$H&WxQ zZUHph51_|=XHu68tsg0pM?Y_8HS>cLxGt^VD*zz-QR7S+vRKzQdt2_&*CASED#MoM)Daq~otrOlm@(#N|GUubZyp={x-sNj%yzd2AP`LrTCyL0JNbwYHzV z+}v0IEgst!;GZ*EZ((liE0V-AB|g%1fA#N#f$$EbRi9bO7wZu~Of8s|k*W~kC4gRS ztpovRZ2{Dl#RewhSK(FFe32Mn6{1%PVcbrb~E&Ge2wacK##B$ z1C8_KsBh#^mfT!%w6xa((y3#;YIF==m|7};4ljIt`tj}?ZPG8Z zHkNBFm^Sm4g+%tGXp>MnM|vYt2S_k9mHKI3&oGD&t|ZmUd2v01`MDf@JGH)P97;}~`dd4h^QxiZpHbI>LAI$GaXrbH@s+C5!fsk>H`mlRC#)Y4i8>iyi~?wyB^j(#W` zw3B{3?Eg)I@v@(7lkX&etoBu6q*K7LVf5YK#Exo7m22dqu5bMUvL!0c&vd(>ao!Zz z4Jo7*;Y&}ZjCKHEyDk51Zj{Aj$0g-j9i;D_n=N>{tlPHLo2;Ryr!P*Tr89CH#70+IGVx#nT!TK!neL zBYm3%kh`B{#X5d^q_W%fr+JeHwrY9-GVY7VOL}qH$T?;#`PPJqYmt|VLuusJ5?n4o zp3aE@7PG}X6?3F86CzUa=uw1C2K1Jve#*qA1G0i0pSb~PK9i0s0OcZpxRYnX{V%FW zLRBP@cccO<>W7&cPPi@|kYy#(NsfSfo4~K=BPv_Sg+NzsxC5ln!0xxLL#rU@2Shsv|owo8?uCH7?VFY zux=~mZEp_eqMzrXIalc`;-T&t)2|&pH;~+Xk9{5n z*5;ccUmeSwkg2{njSTcN(AOIU(D5-H2~-|Xh(L!je(F$aNhCVOQokQz-{{AIE;;+! zUa6cCuWPfWEdiSZcK|Imx=QWtiUZ4Bci5^aE+92)Wiq7r$^Ly|VSl(-_w}4yj7fbHU6>ylC(R7d@=O=q55gt02bYx zZ=cQfZPB>2CynahwupM&P+D=SL3wJqm5$o6_f3GF z3N$V6^(Q`f7fvn6%RB6*ZNFg#-3?ezl2A=mVuxmqDNmrLfP>ARDU(}q*wQ$H*1q^i zuKwz>7>k?dPg9Z(tkHDo*v2kn*)gzbN_@EMzRQq02*6#g9s;t}ERox|xlQJ=@96QS zgZ2TWMgT%Ad?Q&V69Nw94Z6oK0}66J`k1)AkY^ zyA2^SRAxLo72mJ)qrc;+5}MW_vy*-^zRKBdOqK+1eVk$RQGet4xENu2!=VX&OV+Bc%Q(7#She%cp9@8PU#Q&=b!yT4U7gmA8vH6(-ooy)f1wld zLo58C)6ecdwDIrVTY-J}sfU?41k5B=8t9atR37g=uFJpo-q#vFrXgFsk$=BQo@G zgGV;udEFe%zgK<{nKxD8$sFeeIwQB7*!Gyw#EG}PQ=Kef)~)8lM)sur!}XW9A3GbO zxNVQ>~-ElsW;de`_T`lNCUfx-j4W-syM91i&uxo2p&?vAbc~ z=PRlfwoQ9fuT&TrQ_@JLnDOt}jQ0eWe9qFVNbc`-XiZ$Sp)R|B)>WgvWA+Zy`5(g+ z2z<9=XDTpj;1)`kA|n$Y14QrWnh0DOfGL--DEydgRCq+j%xptBDyDQU_7Jp4+@Og5 z{yP{5I6OsQ>7T13P4OX=tIVikRioxeOOgN@@U~PQ^+txYsh4ZU&Xt5`OFwSHY94Ok zA%FsF%~A!BMiBBCKC`PCsknvqsg%D1amhD^qjm$gw~+*O|K!1dqk%CG=HDI-{LO{= zvjW1qEr0h{${+T}r4DGaL-3+n6ofhNrjb9BaVfx$dY*0QEf`b{;;0qek^v9wrWtTc z1kjbUDE#x}gBVbP49xLv9&Uocf$Zo;W;?#rf{5n}Io<}5qNxIk$E*}U*+A!hS%N;U zjH3)p{X!Y;AmcGs>bL)=9>Gr+LFf=r)o9I>0UvxmIAmK4wAJk>`roP`L^*MkUVC9> zKt3&}0i0eZDL`VniMhNpJRojGmX1-WJ&xa5m-x|lONG(W@^IV<-TMtK9qd5ugI9-XCfMpHF zwdP^+(k+Gn`l)`_p{SV&^cqms8u?C{m?kUK%r~8VW!=3;b8Qt%gPFTiH$hnBsia+_x+e{X zZwxE)my_8#hCQF!L$*+{PXg$+NjtzQvHT0G93=bMU3@<%s*E@LVkCjN68@r29$?T& z+VdHmi^{1#oNMc&Yw#Ui z(_&aol?Ob&Jb%r+qRL|qY71u_v}MVh8)$yD^*kIKMF+8<1N;m7Dz77B%sa=ci194| zR~O@%382a-zz=V~w?MiIfp{ZcM2?4)m!`WZe>vDI;c{2&c|1g4++dYqjRvt{5ap-j@eex%}jK*{6 zC5Qbt*z%m*W2`90^U~*qv>>X;!mOOS;kguSlHN$bqeOq56af^Owt(Ni`!iq?p~!oF z7kMbkjYkHq%%KhJy(B&nIKR6Yw_quJC$2?nrcQx95EY+Ph(;;%)r-T_4eMu3`1;sd zgBV$X&f4OFS&WXH{IPFfcMUJD$r{YUCEIyU?9q`6%*l7#U=1C~5cl2N7EASt?T+F5 z4y{RsR-`)Jo*k9d#`u`kUJ0CBPx^uT5xgRA`EQazY8%dn&sG~OqXEbuWNI~N7C_9r zVJk{aU8`Ly_2oPvuZ%xa3h)>DD}T*><0U%E=t#viI6Qj_CwxpG7++jQHn7iRV^p?$ ztJC3>X=_~_Hs;u8$Q_;C>AX@5ijuTZa3)aCf$XPLj_IO)E-y})0Knb%XO#j0OG~L) zJ*rp}p>6-5E}xq2m2~iMK)>dGR^6_XV)HQ>D45;ebjDVKTQ@8Tc&tbp^;G3gF6Qn7 z%QR}6@_Cm-`NqYjS%42?_!ssjBn%+kx1p%HJfa%@0w)2zZw>T*Zq$jbAx){33iMNXOd0RUZjVPcI?+KuXzN$ba)90g&lot;I(DqvDsEoTeh^KWa@zOc#?-2hff1V-CZjh+# zIn@?03L=YDWwbb#t~gAQ1cJe(&HXlD-vEwYnuQdn4wwLsVVDyjfYK-5G5Dh*8U`5R zH^h>?sI?0_Yzd+|cfuHW{H7kDn1CD}I0rOfJ)6-@26Y%&dc&OL+??FtL;R5P&GNx#auj~iDIAb5ePmYG?`;H>G1i*jVO2^Rd)6{BI!eDeC zE^%qB2AphwDv+u7jom)N7J7&vi*GNPFXP*@_m3LjSH2oUFdcshm@MrEk^o8 zF5u$>4#@KxAAr~KshKOsc-Me?q1!9j`u!!~SU0cbeO^hbtXFt=U7(Xr#1r?Q6lqW+jZOxcvcq@f3 z#f`(kPPBCog^%pwrwti4IJEX4viY#btk_%k@|P^Q`(%0%?`jpPYUn3Ga(=BDKkv8z zf@X1?MQdC>+Z_V|uWWD_C)qyBvna1n6-|!P__o<4v_3akcgC`pJQrQ0@$an!{wDtP>LAr98QN?;Y;s7e$`uBt)j%gw1}XtpUkhN* z>?+n>jWQFysU1aL!uafHSPJ$rF z&0+Q@qFPH!@}PDZGz}zeQ^08-)6R)A-_Z##>c~M8Ee|X zhS-9#tR<5s_>0Ey+bn#CyZ*j?b~d!75z@F+D>JVm#rQ3z>e2dyomo43Qlt6r z_dampjN1_|ILNS~%$PX*4~WZaVq^Dk)(DwjXinzMjD%~jX>EQQ-OkC}&np<>jcF5@ z!6hL7`a1re1Jt{iKTt`oNjQ2Lciid((D@~{%|)`b4?LzY7<9ys&eqS1hP?w08bw+# z`{KggL+j*TcfP*wuOMqTARWoaY%jSub#en+z738u zci*GxD4rN4_U_8C$B`0Q<7QwJdS=!{ourH^an>bc8)9&2Q|2*!?W63?t6u1XT?M+F zb`5539Fq|rI1aes75YTh=8;w~+v{wAKY{w?Y1KU+<{fE6*m?*Z_VwF4IC7ZzAkRDF zE6pt6K~aEZznN+IE3^073$~WllCcGGZC!ksg$TYB_~oI5VFZ(l!|lmO;2texNQ}|2 zm#sP?!#|BV@C+g->zEZs!t_m*8GT2;Rrx;^v#NMSx)#N%y&2C74b{~qF7_8f=yu?w5A?vK;!!T872-p4%lng=f+Czxu*(~c8o9dXllD_mKb>;n%s3ZU}Ca~jNC(a%{#k>c+Z2BxT~@3}U&pZSEaD8->T%*e18&}oSo@JMK1fU9T2PlvzQ zf`CsW6xnPO1-*|EK{{dagNw@14`htLS!26FIFWwR}rZGPK;_1E$P_v2Ek?^7cKu2Bl=)0OKf^EdtmB-A^lzP9M3z1j*Hs>_gd$#v6+{808*k;_e+OO6X zS{27%?2Csun9Fbgm{L*&X2ib>+`H%KC1hdyh%FzuCf|1!S>DWCktz~#zqP;TYry4* zmySse=;j;eO7u%0C-G?5X8h%s8MnVsc3c!d@67OZK3T4Ze7#TD1|KEW0LukVdA#N6 z^sN>ET9kF+i9W1JzI~PS=6lT*uYKE{5=~tVi<0UlC+)pmb7I-uj*Tj|n)K@oz)pv3 z$2kn_@K*3n9EGhDQQ3n|M!L9EzL@Xu%s_*|1Y9z%1y+hQ=U>`hmG6<^aIHDvIraHD zzg@BqO}Q3UlthHN@tCC~d!KrLCD387iWV@w#o$s!%#Y;)Xi}l40JBq7*b4X`@bhu!jA2w0@d|;`@5TR^B__bNdR>rOs z`wLar&28&1>z-+e()HWgr_jVIesa!mMHNYA`Na8*bW|vFB_KpFCZb=F))UB25v0sN z+pf^SwfUTI~Zi8{KOfU%CPy&n6`J&W0>lUwCw}KKDJI{^`=-x?YX|3AZYF{acfYD_LQDqe z2fFqnmV^Ii!7l{6)ErmIU-Sv-$>j&s4J-!JW5BGW{~+|$@FVnfkJXV|HhN$<%VDjN zgXz`lHy55<+aiUVnfBKkjvP+iRCtymO1+o=X0hC`Xfnjv8UOFaG~i0%@!!lZh4~E4 z@#IT1#PNA)=VpoI z{aFzWXM^}5FkMcEP$8PKHsxv<43^-MG`M|Iq;X%h(9Zmi5*`2HZwQRV*#7Hd!aoul zHz-y`I3s1N(g9zNWj;dqH~jZg!u$iv%7Rex4mvJNnHX7uFRm>RKwnSRxp&&}TRBxC zdwd&h3_)_J!k!Z#Cz=-e;{y_=nF=#m|G7SfZKJURX`)>E{u9#JlyVcE;hK~3Yo+Di z!40yRHr4{sL6~a?R7W1yJzF4v?DBx%Tqh33qv2@F5fG!D8_|zHvf&#r4~^9{k5_;w znFiw+96$$$^J++48j$eX!iqm@qT!?ELd26fuL<7dm=Qhc;zAYVjNYhIhvUF!N-;76 z!n2W3^sEI}VS)w7&2MP~Smx%^b60Y+>0GLWv6o5bHuAB$m@&?>0|Hs(Oj zZ)2lppna1|@h{koCG8EDRt(ApZXot~5r)>7KLh#U@IvP=6;KSjig-Q!+Ppxu6ftOF z^5V+nPDa8h)5m^B%fH!LA%{q_eVoDm(E zZl2R;Y&&cr0b4tzkwH3u-wrB!CtdY81aGGWQOnBSQoK&_JMl37RlEVL$xmY*h>z+q z+N!&7%V`2=4|)l*2LTjHAX2v!w0cT=9iQ1^xIZ`@U%Z}=)-zi13LMr1gh&7}4{!_s ze?Gug!i#{P!d-s5 zM=ccuTc=hO&?wU=#GB{f zUowZTJ}dVk6oRa7;hSlHGBOehQmpIkI#!2$2BD%?bZqiwVtdB^XfPEe;FZ}^kLjZB zXv=-dfU60aCvJ!z-HQc*d`Rb8pY$uMFLgZUzvDQIh*wz0tTbAHYjdind{#RHpD~J_ zwb@?tVZy1=B(wnWYQDQV3xBOa`b5xrzMvu(nao5Oar_QIv}?37%D^sM0#H^5oDdJg zV?qd|aiyL@Y)zPElp~}!US)TlG8)&lT%AnVk9iS<*~(Wnz%dO z{KFWp{9qY?G7x`~2mb~>RZNGR2b_*U^{w9DvMyaDd$YGnc#{;iY}>4setY z04Mx;)n=fUE;heFv-U!)$_6sNjB!*b7l7lNU4$Ip&)`tOQ?yK4hFa|rBxo$x5Vi<*ft?ZbESZ}#lh zq2GO71otFksD8&B)04N&HDoPp3S@rHVq%balLgE&}3!x~5=$LoF zSpVlHy8l-b4Fk<{_bERcv$TK819*xz3)x&arYoUEYTMHX>a;r)`hOK`@+|nVK6pXt z%6BpUA?*LUcDi}4S}eq$9{F8yj59;v6ve+K*MyI;)t2zm1;B6~1X(w8z;1=rA>17x zQO_WPf!ikjcrjqTSOELCUm?V`ndtyf?vzulsXLRt$0CI9!a9Jcj7h2tQecQ5@*Oe{ z9m^mVW)Y9yQc2CMZbROoyE(wg7);>5#jbH}h90JoGf2Hhc+2UW>%vNyU4`tTHf+Y@ ze~fH82y21kZ9qWb6PkydO{th9!b-7sTyVSY%~(a~W0E^iiaJyZUlJmo?|0!8c`%(O)Dj&%D@Cy)#;h-wcEn#O$7x zwKKRKN<)ldxz}Tv{9r33m5%*9-)i{dH0xiUZ{_B-Ucd5?HSv6a5$Tx2xihDSG#@^@ zWee=`<|cV?M3)Y<1PDCL8sMx28Tfh1e+Z@#>_d=&XyU8o8E9>I^`N9Q*$qV>Ns{|I^0 zoHw_D0&-0UXeSm4MDI6K#3I$;Zxp40H1ZB@Q|tp$v;y!h^=R`%#49V2SY$a9tu|qK zOG|7!f5KYs`BPKAzRLiBcVb>(PH7MS4`*)z7t{X#k52|gYJ|$#pa>ybrA1>)8(GV6Ss zTa#{8Cg4nX>U;Du<_!95df7my+62C%ATnMO zp*gVZi^H~pjO{YYLLe0XJP^cl-esr5ul}QT*ys*H(hmo%X=l((KBevJo5#L`g{rTs zAE|7pFubzA+V*S5nDYrDd1dS)jOPpnX2({7fYM>Aa&+M1b9E_W3UqE`4Js_%9%M;oI z;kt^{ngDmm#Y>n28)))yuLMLg-hW-%5bMhzE~MaJXft{HT7+xe zSL3-wl10P;H8xzN6@sS&hm3&F9)=)Od1USXib-W;?Gl96=&U2Q#)qcgSMy1KoA%Q*8{_OYI5i;K4(Wc=KZj-TX$t$YNCzYoK1wYgb=Bi6oc)=5^0L8aAG`a)5^q@ zD)H^4U6f%G(%~iwoU@47%7R$nt)9VHnkxTh@?+mwTQlCIRXSf=JZ0>p=Lxy8bKHbu zvSdzt-P0<2L^u=YQe3QrbF&SBr0n6~fzqiw6q~5H>&#DnT((`bTvVryeA#$o} z4}?m5+A?#Pa58oBmIDT zDLufh7AEsXC_^Oan!kGzAWtI<-(l3Ym2`KzhjS z`W*tlrD5t%&btgD&E#M~ETlV)36&jvvjl+@h*=%=`kSyqh(PY&;Gh2+GjVY(Us>`O zo zAhp1@_&z1aZeDhZ*EE4Zb$Qs@CB;)Go4(X(uo=fU1^0Ue@_w^?!2d#V48vn8y_TI8 z&c2+!b{-#plFad1@%8F6Pc&uP&ME4DX?N{E*a{?RS7FQAp@H zbrOPVrK*?;2j4;&gVZi|<6S=KHsXWJ9|4X}zJPS!VArtao)D9G9uc5XAU+sckgZS^ zSCPJU!|s0{M%f()cm2)D)`9fQ z`PDzHR_eXjJgKv|{)?22y3|oKE)CHKhDYH7TLjuSGhWK@Dj1Ebqcr57(>}U@&fa&X z)FT7+8~^kNsbur&*l8@uv^h4=>_o=gz8fF5Vhe|_`Q2kfcKym$Px zZ(+5W*3b@wmP1C}9tB9>v@o8D%Az~TsJd#d`rm}r%Yl1DAVKtxI~{h&LPM;6a4SRkZ|1LkJiUvEY@oDgRvi?q~&p^nHK7Upb_K z$h@zV0A%RLW82iSQMWzm>%=r3=2zB(^sd4=uwlS}1F zs)G95p0@7nP`g10UfaetKwL4{U@e6|0a9~66?V-JIKT32*|;lgbr*3yNZlK>ePUxn=Cu$=*#SZg`EaD zhbfRv1yW~eSHGV80ctn%!H-i#{7_*!eZNhY2OMBF{65fHCR>H1wDelGvFn`+ZL*j0 z9*3z8Hs^PwSly5DDkUEf*TGbA&ej3QNCyOOhkvMHb!!eoK!{aHMVFKoLa8RPI%`}) zr;3W;PS!%zYwH?skhk8!o?qM8S0ZV%`exl)9=Kj5@&A(7(*MP4U;Zz6EyCOP2|4zg z*Utan@>&%A&VsbiO7@V$X&H%b?F>FK_a=36){F#S?VXViGOA;a&8h4sG!>pX4H&Ws zs@{z!u696g?ffPwIYf?Qj6hdJ!=c`i6_OgPRpAXfxv8S2TQIu~e>f zmn_v$h<=N)$1j9Jv{H>d`xtS!1qY05pQi(Gwqpd}!hT|1h-g!P z)U9p(n@|M|Ad=Ok;%~G`a06zkd^=k_?jQn%3C4C{6Q3culsTvaD}oB?iojdCB49|y zvxAGv==D;0z!HMVRN;x|22W)NSk>epDsK-nlsb_n`v{dcFIyuHJv4vbv{UA9Jc+gA z*-Ks=%bjzKD6of0Q+{F?L*e@?a8JO|&b8$A2l-iH%G&04+e!;vI?6nT^u)70_u1Re z>+^AD-mn?0`>BHnK{};hLWl}d^uwlb)D{3D%wck=8(`hS+s?Sul4?^h4v1a&QGtkm z^w^ngnJ1V#l&W$GmdrqJ!^{OksP$4{XPbb$Xz2i zMamo*z#O~xdTbCoKv8lzG;rp|kgByWvUz)`p_B>6YR8z0L*e7|zE*AyE{ZVMJKAng2~V0 z27pu0O1*cyi(?!mR)@;7)o@R8?)p$5F>-)1K0+RWGwiivT(wAAitz&w3aDUNo&Cn%#GX9 z5HEPi4~D|x?*}-cr^W8Z+m`4>=wyD9J4(_Q*%WE&KOFB*q{g?5QsiQ7pvcm~dSPJT z=&>CLH{lPWxvzO%IhQ{^7MSx(K{%|nl4{f#vw5b!u^MZ~K|UauPo9kxu6Ew8>wN$t%)(S0wFI*%!( z5v%{C5e{lng22RQ=ku)aONU_PHXCZ2tp20|S^}rvjvc-U zTNDzFXQF4iY>TzV6l&a^^{G9&y0_{NS>*q}b!Y!gS8*X)$q&q9 z6OAUE{Hgsy)TXc@M`)nRf0UuS~(>XWi?a^L87uC_c%2Ew9EriA46qLj><=C)E74*JUS1&9A8L}wx+xnM5%u46Hzu3}uRNxXt2bo+7nhqxM7yaFk;Ws6$@ z;*iB@P+w>dS3e=W`s2~7XWx;4^&Zy_qNX){jd$kt#<{GCNz(r7(ImZAEi{eQ)Q`?b zurRtI;H@=cLBN9(zIik-x!G*KTdU6%Y#jG~ymj^5fwtz8t6!48Q#S*x{Q$lrz>Hqm zwD}Bk1dz}!2|}2QAujGdUeIEj9Z}mOqJ?@cobK#k>e=6^C3^H6DTE?X*OuXKJsgVM z2LN8-3J>s4cH_zuX)_XwPHPV>vQK&0z}CKdB36&1_RP)pU+=aOnFblbN1zdqX9LyC z2^U~EIJjEN&-d?u_b2lN{q=#kUlTOu$zocXKHl zf5G4uN;;>Z&qCR$ z^jDg;D}6tl!+1~WhVnWC0?q|B{?$vlu_m+CrZXZg@3vjC#pVp(@M0ZF+CerCUlj4<$}$Sf|hW zRJ$|cz2DQhAVC_BH?;hdsQ&a%qS~Ooz(>ifNjZv9HWR;I{(U$W#7l+R- z59*7uSIElU-R?JOwkP#t;WQb^KKKqkJvsVQ4lz-fvu$pCJ$&K}@g{VtfPtnuwv!0A zXMT`32?~2Cdy-gZld}d|>te~g?WGNyaww@D1x>b)gqdlQmX&gBYVi!i&;&oS1=bH% zmOw_&!3Q=d{xL6sL7`ehtknHOcBen z2XrJGBBHSD|2(vDhwN>d126kwJ2j|TlNWtG@NB}q5)TzW56^dQ!dNCgVX@fC(kNx= znZM2)HTEoHCLw!v?~ok;Jc07jhO^Kipoq|P@m5^Eygrlmlk0JPN_Gln` zGtC4}gcvEvx%Av-O-1|pjk!o_OF$!sZs4N2eg9tVrm*`Z?|aT`HCkC9Z(j^Ow)g$uFcAJ3c6S}ha9e^Qca)cYu;zOpYND;$2-PbxOHTS{Z@XZ zhRr~?U6Zuuw#bi1mPqANhFr^JKko$FTEKQGzM|H)wpZ7}l63F%2~$4?K4+d7JZq_; zmAD59NA{>7{O_{Rqy4N9>fm6EzLOdd{A>f#vS~D40D$>7r0ptk5xJdO9R$nVO=4YC zycwR{6+I*7w)BoUux^*_-QKIAM_$oV#)J*`#bsZYniBqznE1mFw7Cto(fE6R*q=`i8%%5YFE`W(%X4tBKmC$27H|I+W&k*>KmF6AA6FlBIzsSqQu7*} zB_2IFUgE}|ZpDzA?p(kiVYcXSTgzoT)upFP?0UZj`^dVjRM#1NJdNYB?KIqCy3|G|L7Rcu$C2DtemHYkYQ~m(u?L z*AcLKW{72I?h+th@z|4IHWb?AG}I

zwM0;C`_GUjMVsB4h@>uOp7XRfx5EH?D~kot!e1x%B6QwQa62>#Cz+N%eu|x z_Wm)eZ3>zHk{Q7h;f#NCgp+@Agod9S0dQpw?dO*v^F~O2I=oSo0VwkMjWXBqX>6VV zs|VVm2Aw(5LvA zZd=^^h?q9DbDb6{VU>|VZ~?o|2%@LL3NMD#-Ff;~_2aK@)<6IIf8W{qU*!e+(ZvzB zpSnUW=gQKwg#Fsf=foCx&huI8S-yKJHAcs-tD;7rKCWZ2k?AwD2RCq8c&o{5t}Sgn zWpJ6RI^MKE>IS^>DT>%x(v>y09eIM-$j6_@{nhY+Ad_3P!0#ygZUb!O^!J0kKHhR?&VL0J7ib4T3uEfpUyMB;O^Bn$9VD47a68o zUSD4I;>w1xD(~mNE=Bi~NrMpDUI>e_3!Vsn54H&cM+MpHp&Yw;ALSYQwQdV-TJ_cN)YaD|*yMS3b*YxO^U;s=M;+C!zgvip&X&rG~#^ipdeL)5>qT$}BXH0E5BK||XvBcaPYQ~Qx~k+4b20Zu;kGI?lO7X_W5 zEmb5-M|h_1AMw=K?dDm>@x3*}Uasd`aSd-*35h!YlTF7xjjJ z95`Rs{wn;lgmBai-454|FK7WdiJxO5Ruw4l72kS`tjHFQV0+`kbXo(t8j z_&YZy-y#b>nYE0QE^KpLM46W~{M~HFDiBiaUQf=?ENBU~TX(lj^NORDV%H?rlP2Z) zH9O^2B~LeW3j${8!6zUe)1M-(8fBPlbYNg6 zOq|GpPYQBuF3*mM;=;WI+w3ZA7v~g3I2`*-pCpsmAOZIhz^bpWqgRc**w@JMP_5$% z?RSKZm>wylJ31gi1bPjUJIlM5w1Hn6=1?;{3pViFcjopNv;4`nac!%qWjQE=han$} zKY0zR*5VkLT-AWL3OdE;oFU0miEj&cje34&Eb}-$%plI%)D6%$WgN+uO&}#a<1ph z;#pK~RF0#%z4v&3BTZa6vw$p8875<6Z$Vq?(_Z>)U&)ChPQ0(NV_sj|mYB`%s~rIc zBA0oI()rJ`?j6i)o*~xga8U`AYZ=I+SdAPb=7ZJ*1TB0Gx1x(%?;Gx{UFv=!Y3T0e zn~P7_o0{&sq3pO+Ztn2-x1qQSCBI)Z<8(hJ53$G)R@;c+a_w-pRfL^>dRo=G6;Z<{0Gnxr1Qv@wgKjvhc(PKa|8{c{QCgjg>Y4P z9LX4D&Ajx>E?Ip{T*>N>H=0OAO=v49Uw@k<%tEdIISbdYc}dxGk+R>wcp6?L z)EA=QDhNsFUV_&(>1phtL3C?9U7Z?_V&NTJ}H2&a~`0~?t6VMy2S(A-INO8NB4j|I| zkMRD0g{iQ@S>vv0jgncGh`qNhXnVmj+8k@^wH(gNd!;0n^e;bQ@%3PFu>7l^KrVFEy!(+3|1Q@Id~;$KH> zc(CrDV0DGvx$G>kgDD7qH%1*EKN-PUJ5@}^bYw_L%@u&qVqM9U^BU;qO6O4*xDGi1AXZTIr2Q>=}8`Oi2Cf@Sx`29|8(VECa8MdV#+{r=V&R^ zY$y5N9%dc?kM8wjMDZoy6$~@VXX=-|OWrauzYRD5%97;KTsQd>6;n~q%U)PZU+R0x zUDfHKu{zx8H@;G>KM;ER-hhYSysU@76*Em{k_Knr;v)J_qJ zf`!mW+NKzF`&pOBF5F#EV%Mj&NQU_Fc8yNa$kA~w5mCY@hyqaGX1$Qy^oUQ6wmduT zvpVg#b@EG}=`kcWJhwecAPZ-#>7#t_)5e#)WL+^f=B;Z1<5OyAKm+nz;wt;1l$OUj zIjvklAk=F_M`2r-${-FI01}=`nji#ms5GBE#Ww`G96j@r`_3-2j;bW(sQ9Y^lM=3O za3wg07|%fk9!g!;^0_4&BKw>irHpC$$qkMB?75i*;|?R-nN^&cnzv&Ry*u=Xq8C* zs7Aoo(;>SJ8!ws8Wfa)dn6^>!G30%5JPf1ND31=ooBZCf9^;kGIw_Uf@o5<$onu30 z*sZZn_FHmw9POgft~Nw8$?oS&k}kw^ow7DOaBH5&Gdy-D{4E->*yrqZ2iZ_HWw z4{BJ=5H5_}P__K)8?BM8DXZJRzr0f#qp;4`f(fjQqsWl**nLV8{_zy1z zcj18gwAWoN(hl~XW-?=`yCZ?*mGScHmW_KZ$+ZSjn@kI=bzz3kolZFA*vZ<2QZ`DoQ!C(fS<49R1) zK(MzjD$dowBSJy)NYBJERPDGcDm2}eQzi?-I$9o=DMQO#sXytxFN~5NrrfTeE_lK# z?2CWU+^}KBt<%>U-(OxmOVM(Xvcwk2TgHtR{bIdU0@3&&=S9(#+cN@8I*TT1kqTti z&usgnNc>l^_^|XonT@Te6 zdyWJwBBB&D7?xclK=69hy&*$;;AL}^B%F%m8nPYN?G&|JXYptr>#D++hJP(CepN&{ z_ey6QyY(I=Wd~G-=o%y66I-xD1Vn9(O|9P?GjCve3}T%)Iy56>!~ z3m?cwa8D5bx;3iBQ{QV$=0)G0eJc0Z<>$(eKDFPPbT+3SgkjR@N=WW;O2wfuFr!f2Y@ z(<#+!1lp5g%@r%dPA@g}BZ!9SouXY&Rj0QlXPJ2G#05f~SVsMk%&02Ss;6_y##bw2 z3{;FyB#ZaDsOi?Gy&530gTtXF#o zi0CRUj(aPukd~@P{k4!CXH_R|jn6M_)Z)%2Pe+a^tnj^Fs5jM|*kriI`RMFL1&*c! zKbvZMd_ul>0le6J2P6z49w6?6`IJ-Z7?|OY_gh5~i?yLBA6&X(tK=HHb1MVKi{VQ^ zmwt;0vYnklhPT$m)=KUhIksz0@IACN{gCb_^TRjH=QVK6WpB=B|5Xzs-(ZRbC9=EI zM#Zeif^(1!mn!RsWeY)6#y!9$VE3KX!Qp|#K7D1ur9gNgqT~st^YFki14`(lOP>nI zT5CorH9U+Fr^!gJTT?j*W)%4ATaFF`EbW4?;x#Qp`V@%}to|}6QR}^>FGX^lA%7AH zdl%%XOFtb3@r>ZB^coKCyqMBoMa4{fN8XVe9=6+X4lQXkL9aj0hRo=ogqA>IXi0bhn3WeD{VsMzhY z5k$Fzo)aH=&Hmu8DTSBOf3Mz~h?T%2-o;L$;XFO=az+~|c;4PslQ?2D#E6bi%7I*g7J)A1^`S>!! zt?Y1EevBw$m6&RaGDI_vQ&%PUsOv1AF&0|zv5oX9WPpktN4nJY23Z7UNtEwh!C1*( zv_sFE(d&nJu?MLw?;Y=KS{mr3mNmZcD3bpYarlV5ze|=#U7yd^V%oBzaH`mO6N&C(^b84{LNn<{rEU_VSBl$9~wXU8bIhT z7C}V$BbWz)4kMp?6pW}jtyCCY67i70FN!!4utKzcD1mA>+jx zRCm?>Y0T#0D#l1B5f#L;UpyT};RBm{vK1NgVCo&xju#JOZ}F;T#WEU^Ut4H5jaTwA ztuk?W^V*|hGpb98n$Qe%_Te;sZ4DcczV$DN4CZP_P~~-!&b4j#fBm>Oy)}H!{aRPr zXIkPSBJb|BC`mAk9K|8_EbllnBA|lg4iP>!)Sk0t=#yx~>xGaTHh6s^F4LOxHSwC> zhYjtM3LqrVD9seW43+)Q4JyEqlHX4K=xudp_Rcdj8zp2LAmI zC(m~h#dUDnPs-|s@~EH;*XuGD6CbC z&GrGwBl|WI885{r@sW__+nN)e?iXJFuzuFvbBck)$LE#SkDJHJN6^Lnz1IAMR-1xw z(q`2Cc}A3rkHdnpS%pg$G`vp%D+(2fi5x{*6CPMhsXm&IRW1p;v&M z?~(h+qB5R~$d247H{siw$m=kALVr z$==me>xr8G$}#?nt#{5XLAFz&Q%DMs-I=snJX#VW$QHs&h$@2nS;!KyQ%eLj`tXLG8sJsoF@um zXAVDX`wr527o;<7BomThoW8?25wJ-x05(jtxCOYt56z|8akR%gjsV)5jY()q%R4%e z*We;bPf2+cYd+n-i9V?GNvo@Y(3Y(ZRqMel_}PsX=%D6W71$dHz-kY5;7;tf%eK60 z+>^|-%G$;|I4``mdf(v?^bY8Nnf5&JGW=}S+F9Rm^yAi)ueyt?WQ_~gn(D4M_#3Y$+`$7Wts&$A1%9c- z8z2`tOGV!@Ek;;@%rs_Ui+`jYhsQbKzSw)pq`J-Sg}}q=iBxO6mc@RRXfm zW2KYre;y%}8Sw`a+b`R@?LKfo~~C4~o+EzIHJxvIuIrH1{MySrGMm7vE_=g%fvY19t33KI??X zLw(>qY9Hf^t=|7=x!fo7-xNT9xUx^xtcbgDcCLm#lAALYa9B4VC!=ltYy5Vqx$({w zPxaCS_hwXF_+bY{jdt8OX~-5s=ceCnfi{B|Y;kk*p}n`c4uDh?TwLohAN5TGj&Q#$&OQb^8qgamp^W@z+9_X@Z1~+f{#FK~ycb`Nr6^6bWR$m7-Zdz?j>;@ACvd*Gk zO0Z7aKS=6VcBAkjeQ)iq6`Z9u=&kyEd}#1s24zx>+-xWq0xCE5CVa|WfC$nZlGUm4 z=~ybgh{D_X1gb?mf+o{+J>)Z<9Etie7#Q?v@SeTS5Jb6*vuDHP4?&@BC=_2KBOW%P zpQ0BsGehV#euC6kR&b-K!B+EyZMm5zH0%S;YYiQ9eh@8mbTX2w=D=qMqyox@*D zpG@1s8!7N|6O=#re74zaZOcF;17sUt&(z|n;$&dMa$re_D&}ei8?Q%hTe8_`V(Xi6 ze-rk-Errw0KY32(asaZp>v#);+I22AhC6+l#aeo=cW{R;Wm2u@k6P~>Ch8(Im8>m< zDX0VG-oqy1gVLorRd5fDZkf!vQftvPX498x%SO!g-^z%Ms8MXRF{7;7$w4TyjCl)V2xyfM&#D>w|X36>@%M$ucfm#?xm=ahjQYXJ*gI@V5x-}k09wKel4{_gd)#*b4- zcZ=7S9w12aV%aimu3&OIg%<#nBO?^o5uF#$p;r+Fu(a@Mzwqe3de4Z0?2Uc8p3$c! zz;}4w&FA3q+MJxEU*e{$x-RS#c&?8~k$f4YXCYg(9IDqGv|8AX<*-hJ$EFCBf`zpg ze57ioPzhrMlj6v9X`#Kxim)wgi)#<1lBG*5AVYc;3cEF7_WuR$`rGgJ!ysfIlHrU^ z{la$bpW}kBq)u7R5X`bZVZX?Bt2-sc3Z_4+i?c2JZlAzt%a*q98G_SdJ=J*m$+-go%Ia&sU0vrkAn=FUJ~z14a4S_ju@OLQk0iGq;oJiqStJUP zYf&(=Ga|N^$iIuWYM>-PZ+|r)@~HC)kragD^7|*PG@Z=T!a`Ifu7c_KFo7=q%=m19 z)JvsD*`v~PJnD%*($2|1Pcn+ zy4ZVT`z6em+jWd26B1f$|huHqHN zFxG3SsPnO*humG7BIkzsKt_{i*cdCrCqyCs+gJtCX^Y+&r5U+oat@tXn+2=b3C|89 zN9#+xzX*@(3C(QDKG`t$+mn>n@P#|GsGpCrVS{#}c$?(cex$X*_^0aO^R$Oz5;WF~ zw%#GqBi>Lh$L8(tGhPm>;#_#92kCSz#dOIrdOc(V)#){A+Lg5JMw?%o3eLX_JhHJq ze`>VMFe`)&nBr}0@B`%uw8)?M83SGfdh()>y~F5OW~w}ryZVYG_U>M_#kR;0HTl^M z%}?!T_9@{mkUVZ z@UxJ-$7)LFjnH_BZ0YhxreDFp?W$EV{WIHk;R~s}d-El%k(UFFfUdd*=fDb=3}bHp zLy7b&1=HVX4Q0_4V7FVr?yj)vnf_#XQm)m-Xf@Q~1pfK7;psr&lLG(Mj6DB!(d>In zbeR>#hz5!XZs<F!N8X*i7 zP?jI}eXrkHo?&Kvtl8jKZNq7kBwg8*)^z@9<8e|)3yBoE#M(}uH?=JWt>mR{LL-(b zT&|fvNW12hd2OZ0Cb?`>7<5!1^a#qZ!E?)W6pqE;7A&$ml>KJBCpDx_bug`6TqPr}^9#W#l-5Tr1K!b)0y;zaS}lSZMq&l3|GGKdm|lU*l;xC$ zG~6n9aP)M4FX3U4rlDtayDVQF1hbJ0q=WKm8m4X1={z>1|tLcm@^+B^vvO>k7R@dtrhc zk_NINL%v43kmN5N)r>p-(u2f1_p=5Xyz8EG$Rv%@^)@H*#<0X(U zq3#1iG-OCrs${Umqk9UC6gcCtdQ_+gj!>=}Ju+Cp6ezuh^?1_3fYt~KE7h$UIg*sSpoVeQL#|09 z(%{K3lpvb6Gf+*~OX-;}XJ1t!Hp^2(RdwfUU7IK;4G6*sd(J9LP9V8UN!U^CVBvR9 zn9C`(t*{~Y8$nVjcEyH#2O4|mCHQ+}4n7?(LdK=F1R}H3FY>;H4ApB~bJI^bw0En! zk>@AC`|LYX-SdE2AaZY7siJP}VHO+Vwvkg9$jrvUo)#`Onwc5>&_(R^ovv0%ae|e{ z#f+7f+ksBrk-gMeYn4va|JUqt~LFxGb?8Ln4zPc=(pC1y2f2@Q+X~0e4$%`T8!@eV_Pv z-A7j3jTP=rP)U61DWA+eWG;ZFsXns6qrH{l53v9e{5JOH+YI(9To!MprfOcIPxjrk zzJ_*W+}q(xciqR9U#&NdSdnOOMyHF(gC%mkDIV;G6ajrUZf@Mp3I;O31(Rb)6l-A7 zfI!v#f1cDDn+@sm;9&d%WysJL-zM#e$cK^D7R^b5E`I1`Ac$!fYObDUMP|(tpTtXW z1HLjdC`+g9{qo^iBNL`s%v#FHv=DJ^{eta+g*(QbD@6yHl6SCK5CyNe2%4^j;3|_i zQiV_D3d2T=&?1M!6ea2hO%A1Qwcrk)@{R;sC2rwe98od2^k7Zd`-$Ahhz+0#^VP}~ z2WV}LU=Da3i0lSvl!Y*bDn)8?Cp&yc?UGf)tP5?UTttqtFWsUlQjUdw;bpMBPt~q$ zEG=Ghd^@Qab|8`@vp8gQ>8sM5w?ElvbM|vGZ%2Q<<R4Z1X_1)aL3=QC+{qUXHgmARm|Tyv4?X_{_HC23>R^aMM1 zPo%k>kekhG;aX5yAGD-I&Lz!kymtPsbh93;y!QJ(<5_%_TWxO@D+>%}w|#vlTDf$m zVpvjHNK4GvoQGp>f>zO0K>dACIF`TeJ5b`70AwY#xCuGX!rNsPh)g!tp{c&$eakOd zIc$lt_U;W|p;#VqmX*UseSCUte?9wpGRZ0IYc|+Qun)Z&HuOG7cay3ty(l;Fq8X@Nki%1N$Z9I-NAu^*!Alc(|p+P2^xty-4Nl z>aX``H+|P1@_P9jc<_O)j59S(dZ*Q8BAWG$!Icb>EhJL*U^WS_QgT3w!`LNm1(4ce z3!ak)7kq{X*BP$uIl>F%u#;N~)6gXT$W~+$>b|U*=&d_Z7_osE22Jl0?beBWN`uk2 zR?`T6DQ4bJfxTod!6-`2Ur7oqYyg&nq(X9|jlc)J&+9LslCtKsJ<%R6oxHEq(ecEE zOiQCq>uC<&8X$17=iGH4isZD%SJwpqYb`XW#CaU(fX!r*ZVdsjPrghLB1{BsMixW-tE|^UsE6*5ZEX7P_MSck^F%%PZ!BKcWY2cxch%fXIlI%q zS>}bJzNnU^RwW}m2MBenU10Z$G9)Aovc9OX6Bwgn^u47L`X;PfxFv?P52tKcGUTW}H>^z7cAL>~yv+sLLCIsBgeksFt<2WwE_Yeove-8&cR`e2 zG*Gbqzm$bRa8(x~K4T|1h04*0Fic1(pizGSnljG{o8~Ndjgt6*g0pXU41b!X;?t)^ zUQ;h$o!z^0f)NxM`;aWQR;26ttFHOdweI_kFVdp&RPDN1@NIISnY9ZU(q*M+wIjce zbdDa8W}FlV3tikwaShs5UT~g={6XJhj^6ipm%SgK4H}=6KmC1(bqg?9>ZCnpHcIhT zX4s}6kRjs+*Zra=6|LOE2gY~hM<7-jGZVG*DZSssE74o|uWtnpA=5W_o`14IW5qk7 zV~1zZ9K$;}O$Xxj{k_|scG(yNF$0%t1bk^Qt5g26uR|^Sh79l0v7-NjYbJM7%bYQ# zO_cgb=?K$l>}n$t8EA4Q^udOl0HGn=3H?8}YxuRyK)0=OvQeKAW3_FMUQ$TAZj~XK6|05ksR3716X17MS zq?@!{)-g;##vfd>>(JKDQ&|c6bB9L~5h{B38W?^fQrWk#hSi0YS$o8 z@s7n_ajrIp%G){!P<@|EebfTXyI(}WNN^$$g7A`cnS|oVz(6;E@ao&0r zv)!++>G@2P5kAoZB^o(q>1E6ZG{j@^C}|Ce9P>)*r(2#J$!b^0CwOD+W1{D`+O%iS z*;rwDm~Rr^WwTD2!imW~_Vs26Vf*htuio1sQ!=l_;ZS#j&c%1l1A^%bX7~CK@GS{Q zo((qSAF%@02EYnu1Y+=lcsyWN!mcF3# zE(CR4s9;A|aw${2@sBUR;kR`NUiIJ2%ylw7xo`a{R9?QS{1&3|<@Qy7GbR}2rQI&gjt<~kp4hI862%_;J-`IbQH;~*3&fwxY zH9a8Csp4;-HjF~Va~ur*HIv`0brwDa)QJ_qD`8Ql59j%8+r^&o4=q>z$4|${)g57Wr_K^HbX*6#=*#w8c*MOIr94sWN zSiSQb@pZ6p^n?iAOlmT6DNBlD=)!aN4Sd@zs}|f@MNk`-+-&spP#Y~DSZEZo^1JEV zqn2$5DOY`y?t?M#a1MmPzC}b2wR8-UIl1;LVeL2}4vHb_izHein4A|``Ob`9EkrCz z$10)Bw5JdBSO&Lcl^u28IPQgsHlaDD)f0M+7(!MZgpt&@lQ>qB{eWF$Q2IN(h4YOT zL&50ygGfs%^#z${>aJ>2N!RPHXsItAGe^hYdE-OLQ9sZ|Ob)b@6!#L^I$;!Vke>M&`XTxmh~8qMOQTp;L{f}tbz{B z$#Fb>N{)4U^i@sqqY!Qw;U6PDh^dyJW5KZwD>-6taEqdz`gnrK)235q?Zfd;?YeXg zj?>RPFtCj~Ipe)G^J!u!YH6egxdTIp=cLJ$d70{zLNZ`K7et&Jr5FLl=)cX4a2hNY z+@%(;96<0J-jL+JX^qXw#Im*5bZ4*7m*vMy;NRIQQ*nKrO#l8{ubZ#On6fj2C=r>C?v2s1~U(->AW)Z5Gn0L_lUTGi5Xd z@n}%D#-QzP<$%SgZ$^~joQW}VWN}hsI8DQ%R?WN-`{7o=UMRZu5jiBV24!Co>Lg$brhpuo= z-h8>Td)(OAo5UyxN#yJ7!&WH8 zY#L-GbXasen22{_`hOGVE~8}jslx(#F}4EmpmT z@Xg#+*yGr(DZoM}EPT*ifZk9?Bm*wKR2HAf$%}9Hkf>Di zWu?|wI&;(*#cU|Sd+h3`-MftoiJ2Np!~c)DHxGxhegDTtM6^tbgqRkkl9WgZqs3N< zHfxzmWlP#g%q@y+2}K*DkP1z9N$wC*$!W%8}Tk<0SLU$b__Tss zFVtTvAL-H(L5*iFR(ic*qeMy_&2ZWZXCPYw=-1zWR#N^o_WRxdHWDi+wP`{47t8Q& ze196@zcLj2A*|$rqLhc!ckwDkb*q!I@{L31Y%8DJtus-JaFl7QT z*x&T{d$F)x7S{&Q0Ui>*#Agq7t-BVzM&JItSo}h<1oxTLeL3!grD)QvZ;{D2Vva8j z){C;(yR&z@bzPX_D;PKmUKR&wk1kv>d{0=(rTSUFhGA90WGqw47sRkOoq{L>IbAUk zQ}^Tt6oTj+Oak#SM+}ZKhUGze(kn(iFK4yc3JGkh;|LD*=gmz_3het=xA&i%`=e4( z7RGuMz^$-Dq|t6iuu13uu3da2Oo1?fw7c+)L4>aJaClkB=QiDJBZHq%nlY%5OY zb!Z`$E@?S#tF$i@4QZL(N+nNq=95KU6S^USl(%hZO9aeBpB*4Em6eq)^h?~4n`Cv1@S3#W#mtIXbiMH zgMaD2*K0|M!dPFeY-dK2y~8e#V~XFxZJ$pW)1Cm;BbC=)Etnod9&1NnmJOK|rAK{V z!^V+h@SvaE6e&hZ(y_DP*9wn}!htJt70wX9+DhVa(Ds8rd>>a1C(K&^zMXOTTyN5= z=QZgIX_+)Bb0ItClri08+l809k*pv4Pn(meeZ(BdEEl>o- zv3xjAr$gd(x``DxC)@i=2SsyLp6k+6FZ7OOx{ZgHA(p6+H%uqp0x!`3<}d1fIM}~0 zDLq`VxJZ^WTy^$AkJYGVev94wMoHy6Qwr>s6P}J)|8@`N3c&__>pyp zE@uYRB}b;i^}5Uz&+E|e*X{rK(pQ`REW8Z9#P=Z?dpuACUludaJ3{ZHjB3An*?>Bc#2uI)>Z{eG z=6P;Ba{BXKd}V*d#5S-=b0*W5=#eOizG_z3S^P?z!A+5o-LiZpoGpd#*g>DgKUSlj zt!~v>u9~5ewnuXc)!{W`7>O=J*3me&v~l%#rLpH8f*3#Y3OE*5AL9i?X$p~dg2}e^ zMz8x&==Q!5wv9hL7Jj_2V~J)LLyWP?XqkSu$jVD@_d++a3vwbK#w?bX-z61U6JXg9 z23rk^?JtFmmPh=jjt_t2N6xhP)KzRC%~kDVunu}q>eO?l^Ij?qR%^KqZt^%B<5)?5 zgtS}vfM%PN5mn4Oh+5i3%B(1DBY%61bh}fmPmXGdgg(U1Zsqi8cs#Hvb(|ab;dz3g z#gi$y5w7b@FG6}cmN_|`yp=Y=2RO!HIHj?gFPlhf_Wm`UGs!)HcnFga(?RC*7rCDa zUA2euCM`{Kn(703zs`2-Ag3q$<$43943$zaX_n|0{SChY%EdzavF z>!X{)Y)-|suV&}_HQNO2`Fphvzm=%hu00;cvy=c2?C-iI0^5(yLb?xRz}1EO(RTbs z)J7SRl7FffXwmd2rTw;Ko_?J%ej7CY@s~0*PO8Cz_@V{BK8U&7P$o^QSABKUCUpa` zJpV;kwkhs6c`kb)WXmb=oTlT`)jO)^dU?E2o))pWq3gM= zHiO-NUdbh0CimXV!Hfb7l}@Iznex3c?uS!*b*y8mE3ezy-o(WiOLkSr+!Sf?`JY@u zL<(vkUwv!Hy`v<-H0v?@_Uds$4t)?63-5U6`2j%zJ4;scH09))wK7oSr+SvQc4pTVv zAjlL`htGKVB@pU+g@6&a>)vrhz_( z2|E@XPKQ7a24d>1{(vjg9sFpUzECCpYkAH~8)aGWu^mlF!(HIBKWxei)*@u@IUe&5 zKUCsZ)>jltA&m72G=SA?e(b+!b^ur7+9imUyQzeoaN* zlV{Pmk_Qjs#+v*#W+6bXtv@qoee{{yUd@xR1MeyM+52R|#p)9DYSA1_pVdni^;*{2 zcX$8wcA2AHiovQQ+T9Jpdth(@>*Z+(o2MQ;59&A`@4+x%`k>UkSdU~k{t{Pm=Pm2P zjUbDN(gdyog@=CRjc7aknt2%R@_BTi3q}`2VCT`kyX4M;9=!2C2u<|byE}(~x394Y zVcjNWhChnDc%B$^=V*xPF$1S95_RaU2nCnX0&=Lf@5-tR#V%)6ob_exr=Tw*q=yn* zMe*Ba(08*Ri<0CHTqAnqR)MNhAatCi9OJ79UKWx0b2-QI{P>b-)6JJP-eHG5J4KQ2 zGHB%90vaYrK@hhK($MZB6y6xvd+;lQlJF+V@EW=Re6U_dmpZ&l8{TCmNJF|0|9lrc z2|bEp%T4-~xLeuPSNU^0s@zYWtJ=;!TA3xUXx0lPvHObYnaH6-CjAzy0BCSD5w`0P z@DFkcDSI@&kha?qmX86K2gYNo_HE+KWz)k{xagai3))n$`?d~ zt~vovW`XBW!)gIbOUnVm=4?8qN)1Z#qK&$Rbz8SBie$Y!K0cOoNEUeYd_>`KO$BLw zAi`J417N=#P!oieLmFI&t;36crX;(e{-SY>$+3)R+0+pma9(2ymS=AtuC_m{OjoRY zUzlUMkM1s)Y|E+r>$PZ>x&E7PM(x`>tRhNj@C45S;)A}I9cZAi3Yngu6&pKx`n{S* zxowbs>i9V*4E?ia&frH{fENB_pz#eTc97C%i7v)79-t6|;8K|k#vA0_%j{9IjHHJ5^UJW^CleP28y%>IJ4i$Opg znpE`fq$S|c(zHjAK7Gg{@8*o*C{)vo>CwHtq)+FN@_jz=`tu;X9?qri`^MR(VL^#g zi0nPP4M|hH5^>2K-Wo6Tja@{DcAQ93QKRam;CocfL8TAg-gjXKg6#21ba-{15Ukp3 z-CcfqhoQ0&$Agt}nL5?WOizw8QQc?fYFgK)N?vyeQfURCEXeCoRx&A@_{O7opgl06 zgB&UzXrR?)v?Cn^ zAkAx#5Bbcop+5-e6dV2=Y&vIb6yba>lEuy*J#lV4Ni#G0e#U@9?fu<9*~%}fR(Qy` zwoS*(IuM!eJr}Jf+;2v2!9FUP$o4uVdlCDMfTBaRoH;t{-Z-@5=&SN&NuwFopeiKi zK!Gj`_O?!A^0f<6ZHo_(CY<0V&_CXx!rd%%$so3AGywS7g2No0CWtrC!bm1qB0Em@ zSq@XWHTlcu2iziCaT~Vm=Si8Xg#o8*63<1baUMawwLZenKoUgY9Qoa=3E*e z+BNFK8L1AWF0i?$sQ4u8W73cJHzWpSg{+#SNbpI~ah+G|e)**P1wcp)Dc`@ksS0Z( zo`AmTywd@obzFv1lpXJWJ>~IMvC8k)PZ=S*!8zsZpf|6#cTVz{wO-gL<+-GX@*%bl z(lSeXfgxHp4-|ANFCY^d1vZd-??SP|kQ5h%6t6~)cJEHMn3el=YS6%@h!S*B(HguJ zQ9_+4*Ssr=nSlkFpD>Tovx;sTw*Oe6Ff331uKN}5*p0sjq>4J~4%lE1Mc6$!J6*zP zJ2)7iBC=?h>0Vp_zCiEr-cb|Gvz?ADCkJ@oOQ?0Tk&|w^J4>1*W%^p>tLJy|9-?t; z)P6!sA$2&1DXJm1Sssxoc!TJ4T3P+#hTU?tg_^*K9{pH!*bP^X=Gh`OZ)jr!aN&TmQ*{*f{y{MEQ*mwt%FgH1wfJYUa*?i= zd7&&@aOhx9#NxM>%M6b7v=te40A|Mn+&a66tLIxu(#`|l+FS-Dk2rpm_g3JwfsI$~ zr--dBCS9{sah0JCJfE-BJ46?c@*^9g?LA}|I5@)$a;4C~FpQMeA#NHI^PycycpyWu z^2z1PMTedK%M*gn`QYl`o)Bh-cw6)z`@K}(_uvUk2=a^cea>U!ZY<=QLP1;48T%cJ z!r-yRu8&|MloSv};Q)>Iq@V1-S|S1mkq|q>vpas?-9?=-Q1Ozeq9~!qh*wD22S3t0 zx$Ac7)VU;FGdiEKhS@rFJ`zrXI`s@`3E(?{&c)lu3 ztlQh357&xk_&fD!9pqJWZeW5%d*`=4gCgs*TW}dl&9qQlqkxNs4OLS{49ufb}V5l!lS}VFT=nBCxqYcC|tfcer68b}U74YD2T#iQN7&ADT@T!!w5)IL zUuu?UaQ(_`WbM8ch7j#vYX%zz7TvXVy6K5@{+5So=WJ>&`pSw+Ag-Y1{^5ksKkiv; zW=Lwz>s!mUFZ+Wa4{Lfgw}QIig`9VK`wg>&^FKB%N%jpF`inazah?BHM!Nks?%&%0 z5vKVo(EBAg_Ewl%;=$y&#_=tgcxUWS)u zZ)xnDss{-fo-Y1qzK77XTZ# z2?&v^llhl0mq&cF+J3vb);%+5?vGZBg<38RKdLe7Zy;*^)jn|W4~}$GRrzYYbZmtx|1K>UVG2i| zl1vg{prx`0wu(}!e`ZJ} zH=s~HMrsDddW`)CA%HSpkIbFBk1Hm(zD2Liu{_~e;Is;gx8Tzw_Wk$~In{U^znANlU)M>&_0{(2eg>zQzCawK0^8@h9h-B@hRQuN_wAaTx*UJm$9;9|^L_3F(^Nuyv5crqmfP2Nlnu0Q7gxy$)gt5~?c^kwco@`q{o`ZrZaD zaT{Ve>eWtJtrEd|D(>pKX89D!uhQGJ9WwV;CU*pze$xP-|=S|Sr%A-dkd zgL|nsk35^I=!Vb8y18|Ix+`Z%p3$nccZXpT!+0KW!xG)fLx&Ucp?uXBje-Q$>%JjusF z3`R~`G~YWYcubYI!yKd;Y~BUNkCAfTksT6JPd6=a;x+O<8GBm~K~OpMb~S%>^(>Ih)e_*4 zCJ@s>P?<9}c^&B*BDYhFVazLMH!_u4$DGY*9}Rj~b@)t8Ve40wuoa?8`n}`J2ZZr~ z8F5^98roYf9HlC-5^0Mw0m|de4*>yMmhzttPiilzH3;98*a5y9;D|#hs(;;ddloYN zvlpZ6uJu**qtfP2cRgRC9Af{9inhYg4eGK3tz~D5RCA~7w-yz}0)5>EyC#V*8d;!H zc27g%kW&RFeE&4?*u#*CX$izGMSMXqcY_nYGSq|j6$z*A;k#q@2#3;f`~`=xKi@tz zea?l;Ume2sMMjQWk8S%xtYL6zJOp}}EugV*b}WQ{S|Z$ZA%nf|S)LrVMpvh=nH$3F zFnD=%tf_VjcRss!D9rk817LNMieWQpm;<@<*A3qdCY6SPE!tAX5DY^_;oi>LXhTvR zg>Qhg2MMOjQN|z~kRtz6FIW$`L>rqE5HsXYi*pcRnoJHMs`+UNdhrQ3n5swSqIB?= zV)05+u3RAMHeCs#fYO4a1!uZHJnh&T*P7aw72k*%feZkbN2F&3GSakC(559aSly3s zG^_*b^OH&-5hsy3rTEoQI(5yFIh#&+yPco7KdqCV81DD+p^{bM`xxfPFUC7yaFe94^B*sg55_torHI&>3AOe zeh$0!(77NmOC#7lZq>r5GYK;y6=IgqbC4bR9blfXIpWJTq=i_OUZ~q?6Od_l)1x5} zZo1FUNux^}B+q|BPIh8!?#P06jY-HLD8IF-G~lz%!zFzI$PV*y|C+fK@h39SZ4wz+ zMGg9WIsP<>f^f%le zP)Hdp0!M1R!-6;M3)0>6Z2e1(YsjF1S2SMovpq(sTXcd43e5?uPm0&x9vwjb2?%tk zYu^!iqeU_k=0a+uBK)Vq^oK?!+Muft??5GgZRGn}kIsafq9W`RhIyA<*aAAc8{kalnul8)^fZui1t7Q1Ix5X(4!wak(U=Ey0!2uX1P7MBZSXz!3YLuhd z=xb(>_i&Lsmlm3KE`8T*dDdOSX9>e9)-U4MQ7R$0-*^Xcqt7N-@GrH3`e_gmD8aRH z#y^&%Uluz`R{#ds z$&S!d-Ji%?D;j~>C^!jl*;S-m>%QuFyO}!3XB4es@WUE+ec5XKMPy-c{bWlCEEPy8TM@CvkatZ!0UP-;=k|8IknS zNcvu+Tc7@;|HMPHB`$_5U!R$Yko-oq2G(-JD_~$jzdf#KG74Jl;pImNv)$nf%i|h# zCKmmWeyvdY>DJVq4`pIC>%Xni4P$UFsGRIWbn$dDD_ReKKiaGkc~J+5f~XJ1=w%Vu zD!_Y0Y5bbFMadqSY={Bh_cyi>(sZf9yOFvc;f_lP&QZGdKdp-8Q^DsrC^rsxD&oJK zE$d*s3gmq=AM!VcE=^852uc=iHaI6tf98yl==OmH*t7Sh4O@Z+oo=Z0>(5dH7c#I` za2xGT__^CXu-hk(Q(CB$+w8uzoAdA_fs|6_+t4jqIIR7pl zgs@^LGx%pYFIm2L5c`X=ufoI*#`%!*E6dFESd516COcgJhW z^mA`VB1mp)oO91^2w$4-9`bSX2KiB0=6!a^WGDB#0m@}>@mb`Kc5 zW41iK+juV|^HwA77mf*%`6omc`sVO>P?5JGyAzwiy{Cl7GwT?4ojoon%$ENh_N zeK*ff`?hxKj!TOpRA#=|U*xcka;wOZ*g=k)!F#dHZ^;U?mM%X$-cKl4e zp?|xT!dA9D3U*r!NtKNLOS~0$jlpU`V&UlyjaitQWl=rd!?RTD^qlK2WsWM0=i&47 zM&m$rAW!}vFrz6g@nxz@O}_0KtgoT&69Ka8(s_72I&1-BEe3(=HWYOMUrg%{!d^J# zWoV9vy1v9WlNj0;(k&nxE7BF*r)u-HYb~z%oNnLrWr>BA)bV)D)aaVyg(i^XgxtZ$ z5c09!fXlSpt^IB2%?~vaPkp2tS7}*<8pt)~n8mc!)s3pg7;o5bd2ty^H(xjUQE+E* zefnaA)bk)pMeJg!zl=54<7JB0#R#x2H4>v~2yEvyFpkqDc7m4Bzly9R<)R_yhzfYU zvJO}0>cEl)t@ph>%JLl>P4>L;pXrm+Ngj*nGTr43zE<}X-4QehnNqaM$0j$w5WCd= z^3_SjE%U7MwiHWt&%C%4F@b3{ap^3g{8uNzN)kXRF|Zdi4)QD#jRNhLv=Guj@8en56`YQAVvW0b74g>l+7o&M^TVcj4v3yUT-3lr(1odb*66 z{R8<*`;Lr#WsHz`VvF}UM*$O0q@G(O-X%{s{!$Z-VZxWih(Gcefdo+T~M z!jrwacD*Qkl^eDEh}mW*&-n!69=CC76WNj00!j7#g@xIidC9BRZT}JWJW49MSeAv( z{7h5smUpcBst+(HSwRhUK^rfr|5%GZG-zuO;X8s}`b!SMNC&D5QjqSS+c28`EoIE) zo7v>Q5J{N{{zFP_QPw@p3ZAO1S3Gm{>S0!}cCd81wWXl;=1RZqUFp=Z+x5J}L3$Sx zpKd?ssx00-h<|sW4JZ%FHKu}d#Q{m!diw}0}*X3MGlNh;DdOime^Js_C-(;zfX zQ5`enuh{7#sD)}wsW5-5A&RB85A;2 zWxP43N1SUiT=R*uEDXN^YgPS6bYM&1ah> zoK<{gBkB*p$pV8`aEA3KC$d0)d0`eL796dooKtBz;Mgf&8UCslyAL}ag>iu9cvB-R zYBhzMP9sulNeeWz1)6mOyk#IEYC_BVV9rp`$zn@GCL4Dnf!;_5l*r{ETPE^3R!&M4^lDkWqBV1ag#JP=JO zpmB_lVGC)jx1aJte0c`?t=hs)s3!tXV$$&4%OYW1KqSm2HUe%a_XJGx0k*xD)!s?WCwTZvo`G_am z#pguh81(V=ZG7mAs|X(ZOn=y$dz$j;3&l99R5QqAPpLmq98EtAMLmfnKq}-Sfq#MR zkRsqDYT3m<2zn5<7R@9b`7H{cRr%{YUn3LJ!s`_==~|w|h`(h3av1RF{_loxFEg0r zcNb5C0A+WjTpxNObA=V}=;s9!JVuKNF!KH5Z@jGo^_H~L#9dO8y!M(0Y|q?dv(-bP z{EoiY0ZR$9|Mj#9YhilSDh*}-03GIw#O;3~bHh_(ey1NfpWIwN*x)mbvvA$QB_>(y zQ-HeLr zR>b3*8sREZAoC9+LUSORIT5uHap~E4a=vfi>Yyd5*5A_4;i}xAV7}YqI7(T;{fYD* z%SZOX3MMU^jt(8DgrO;!5Xsze3}sti+xcv^@8yfC^50S?4#~y%`d~viNBAVO_)FR7 ze6KkW{7QTu)7AeFnv;}!EAhDUH&fx*B+#oMFI#`AAmM``_DJrnszPX93Qr8&@9C!c z+DeS}4h^#pRVzNdVo-%w#aCtYP)_6Tp!blv+>6IXukcr}HDoBgx&{xvB`}=A8W|hJ^0r zQ$~d8Me0UqI46I-+D#grOA*K|rIs_;Ko8@Hn>t*EDw8%;jLtyKWwCeNp7`vWlN5M+ zgSNYGuoSCpJ+S>n$ofL?NKfg*mwTY^vDHnmC4rfu!=g*6xDiwCe!{XytYcRR1zufcXQJ@Dj} z&+L>YG~3FuR3g&BER`>T>CnHgb8TS+WWR5HA5dU+EGIlJ;)#l-1gCLSt$Ms&RWRtf zVo}W8;N3T9yF>7H0L0!a5{(#-{Amf*#z8On=VEfj_*ASk;gc8HG`F_DGjkQU)i~qH z5)YN-(7d_IZ3Hldi=bq`Sx(?p1wE##uF)Hqe-Bm&c&anNsQ#QqwPFQS>)!)BNp01c z9XyTCN!x7%naYGpFct4SKhf9X4=s3K8Dn=kkZE3S<=!r}{QZxLpEj?ZaU?&?^p4Uj z#l?jTT>d4CY=Le5(`5gzPh?UPofB#zFyGLh+ilZ^{8GK5OCGFz{X{83R`7<@jIs>8 ze(6@AVbtc|#6Nq_i)g2}1Xb9rzU(3!el=$}RA$X%)7q`dgasmoq@~vX9yM@=Xoo|d zj1|HhT;x@a7d^nu4N3U{$yCVL6x%vRQJSsB9ryH)=6i{f->40DpL^z3W-y1t3>z-5 zE&R3U!}*&R&(U3=1NBDvdukw!t0on!>L)t6>k4hGnEqo1wTdY+6akxYo!nDL=Ah^e&c2uTE|QN@W~-b@&BzZRtWm{M$5pkz8>qn8Tl;c_z1{K4xekd>ZA>>i zpIohMTB)QtzoRg}M#6=|#!bG6;^<+xm{7wNQYqe;1&OT#lU-W>BP5sLE*v8fl#Ylz=@sGAz20xmYBDd{cKo|6OaRakg${V~ z?-N4Fth+a=Jb2b#c4lnn8}gYS){q*417Tdem&8Q>5CeF8Mlc9nPV*bMQKf zGSYqNmka$Y?=>ZxQn87qh*8_v6$;srJCGA;>E{=TX@yMFo3NA^Et<9@#IBh0Cd$0M zYNgBV!YDh#4;4?AtufPn^%G$t)V+WEk<~!iO_Z^jjxKO7y5x9?<5pE;eDC*odzw2L z*Xt0L4_7u3kpD)GO0OnPqG>IHkzZ(95+xoSP9d6hF7hXs_E}H~ZBWZu0Kt&7XU;^QQ~Il%`E^CY!uCf8bcC2QR%gjqR# z6eX%Alq!@B7JVm47n;pDMR8raBZ+d(-7-;0U#-FfSZToM`Y(qx(bfv`$U8E?wTI`n zpfnF`aS;EC-dPZ?#7Sw}Y}4UqAO-J@LMoqn#R|G1qi@X}p?vPDAO^I^Rgi-i%vpT1 zRX08{Z`daCUOzj{Y(v*0?Nz9Vg{lo&&4XJ5gTOi?O1*GqJ=$A1$z`7f^CPZ#O9(D* z6*hD7pMX8^-|REJcA@W)R_h|o<`uU@9Q`ZbR%>(T!DCEy!J1i@dibQ2p7k1Ti5qi* z?-+MvC?&+}Le;1m+YK3Q*fC->HUi++OGGFFaa5n$b5sn>}r8X8hHTR`8SMwzI@X&GV5tQ(;1O}U3Zw{H^*L4<7P(m zvpz@Q;1sFaAlh(&-owBbv~m>j06FMLt_AOfW6|P-OJ3w$Vht1{()=wo=XX@n&t2OV znHF{-I)B#1u>|7lt!BGC3f(NWWk&37T6JQn%F++q@;B#8*NFRRc9$XB4TKTs7XA#b z#FcE{GriVDw)Fl*ajzZy>Jl9J4kIub_a1dh#CRA)2TWKH>?!=~4^c+t6C21W@4N@@ zsP@FA5qcMNko0SGFfmnP2nCp9cDv0=e9*G|h3(1m9-SRS3%-)3^ndbzBg&;_t^p4tp%GQ5b67QNO0)A zk!E%1Z4~pNRnR9yKOsz5P%yoP`6+-6|3RGrd~%9!$lWJx-&Q!d&1%ur5*mPLG9|Qs zl4NzY69WY~(ja@<)OyByX7)f|7K_;uQF_5Zo_njI>AB4Z)x9DMV+hwT0*M-buVYwk z83GY0r<3XTY6O-jtXp#T(Kwyee(3Og6lAO#Du0Hg4;C^+S3C}FucC<{-D?rB7&Lt4 z!+bcY4L;%_ZDw*d=sPv(A>~rRcLMGhzSLW%43)C=B6TV*riCcnXd!(X} z@LcKn=#K?YLI6AB{OYVaA68qhvavu00j!mHGY^KgvoeWt=5 zgNr8^h53O*zH}Z-!=gVFbk-CyP%B!)wrF+XG7hkThu4Gha-n48@Q3(^u#9x1SmS)Y zfizz!Sle93Hllw}pY=X?{>|4Py-K78N&h@}fJe114hzALfJ7mGlc8gqe#VuO&}pw%p6=6!{LR+h zf9A$>#*Z~f2_Pc(H$^IIjG$n;4$+3G=DB~Hmm^lCPBp=qFnZJ)kl$_y&1zEP^z~90v|}>(;p+z)p`QZrkSQr@*6D;`+R}fb)nJak96{Oi%mT}FG>`>W2{KvEfewy>Fr7n3x zuVeI($!=TkrC;w}4?l)17x{7cy0K`&>V&(E&}>{+r+ia{&z+p7a|94vXJDRAyBv(> zz#C{87NwAmeKux_a+AN6rFMURPl_^qd-BCs>q^RhQ7dc{S-~c_Xa-ZjDhqEK4=xZ% z_(s}K{R6Q8=%1>w($h4OGwdksXUje%Xd0xV%aL#X$RbLlZV-QtJuBjJpA$DQ?kUsk zY~rGVaNFQLwKHFn?zI#x%!lQpKIdvWeHSxLpF5{jUNzet_xKb!s0Ea>6zJyvzK^uu zDi{u%q2)>MRKrQCkjwHLC5^p>aMNvsh)eeK4r2qOsaf0w__{3r#_S-Yh)ROfDT(;0 z1nM0|7nl$kl+3AYTPfd9gl;JS8!W(jI38QD0nU&mcD7?zdsidT8+3IoXoMozKnDPqPN+j6ztgxE@=o0MrFnb3s0`B#XRQi1oA=9A z(o_$rejApR;2Z1^It{~M2)@DyR%F+mWcn@0e$&Do7Ghu~$fj6yhx3v=6kV-!WIp9) zWItu!te^3`&>jEvBeI8w>mU1raH?rN4ScoJNCElQ3Ff~j2M$U6@n2X^|C=AW6mLPr z3-@x_EQ2i0Kymrfh5@^Er2A!iza83TD(*)P^;R2k!<8g?yJ&2v-|@hP6BRQopx z1nY39iTy!POd!57y(cEYOz(81qh!k;5IdY?2{|K}^+qJuG)n_f}aCM84} zpIO{*W2FOfx38xhGP(0L0gIbZ>2aqheF>NxBL*t+EBU?Gst7!o= z&TdFTlN1ZjJAnsVvcsp~7H8><+QljJe=L}ou9>{-W@+Kft$4n$U27k9gWU0o z!Tp0kh7KoV^rilhCi^cdf7C6w7`^T7i=L>pRfwj821vd+wXT2}qHXR_J6t>U+ncCI zPNyzpysiELE0qcn*n$e#Laj%K{@Q_GuQ31IO9KBX6x!iKSaa+A(Kd1ImND2gZ4ef5Gl!1a9@KYCFO5*Er z&{#oA+V6GDZy1F3x0N}BMwH_rGb!Pg}U3&!zxogg+ta2?7E zAJ$ahCLm&7B|Xb-IO;jw3KKW77o;~bo0YvxuV-JTb8?h1-^I= z;^bU=v3}ZXjl6}YBt_A5g6D|c5UvMG?3p`1b+8aAb^so+b$kUH&_3WBcShq<-*}o| zjGJKMae<{JwOuz)6t{y^UmVXA+yq7hxo<6)b;#rjSyGN^1Mn z7TTX)mVA8Ktr&}C-@=0P#TG6g?LENc>&_j$|6}6UQVdBqv#nnMGF_5QZf-5_XOS0- zt3O_~WA&jUJvo`WH&XJFyp!S!VZT)Qv zQhX5BY9W6!}z~Sp|QXUQZIoQg(6kuAW2Z^(bDANuP4SsPJ&^hPQ7!{d8T0 zge#M1j`tA9{3hlXggIWO#DgBSWHx72FtgE8eT|ZM!upQEkHfo|&Syfim&}@GH3H<} zIo3>d>MFbTfEjm1ZX2sxn4~d=8?J| z?7Ih}H?42nxIug^;583WzB9U4ZV%C3Niewm#F>zk{3sq8>F$uRRTcbLb5Xn)-2Oym zbb;H%A^5aFYAFeVKNlp}+d70#XgX3?_tvnZ!`SMxQpC}dDZp_`34mHKNx5hm zM%#&Hbugam>ReSlxTViXO)Gw%s(Q8z;r=B?j|{@GrZh*jXyu-37~3|5^m&Ls}SHMnM3O3WT|gX(DrkJZK-1c`j) zp^qi@zJsy=JGY^J#6Biw(L#}2nx$j{ar(pf1W$T4*@^PWqhqXpZF?#zgNdZit9!S5 zuHd2Z*8HwV(yx|_cC-i}a{9a1no8qzQ(Dd;@6Ff1@FIv^+2=>A`xJQuA2&f9uB{rO zcV?8_{Qd-2S}bhf#kGp5a&>;>Gt1vTqBp&u&&N_MI2KoPDD%FzhQ~*GEd9_bZhv$~ zK8tkNP)T2Q9PA9oI-)shg~IxXz3=9vj7hfQEqjrF+md%4*d?YA^rHvp5TS*Mz%F(5 zl_1~ZQvet-_YcB#ONrOe6ge=iCS(tM4%H8!FbLr@2ITr@a(MQzrn_!UK!xKp7};}o z0p-YjSFsZO(9+B)66_h97$2FOZi|+)xHn+HK-FMh2*;4(rRdjgb+q>*hTAsZkJ z0@Q&8WPghF3SCiUs!les{nHY+VveYQ@~_g7-fY^0G`;728F1JV{Ydi*^&j&!IGL1i`!|u=aTzfx z`-W6{@`LoKvg3L1r(!n*kF*to&rc(n5B|9Q?nT^C&c}90&I)D{sFtic>+cM{F4%n0 zI{>GelumS$!7871416{=W{r7voRx1FcDXBG_;CBly#fA)3B(OTaNWa@(E&eXiqB!* zR0$If=2-LRxQ#~F=ur~gJfmES%)`IVtqi^&7x`8`gIAOelAzyklG;CL zai*4PaKnILuq{usSm2e>K0Ct@lg3}+NZT|#g41F}nL zow?BMD?)}3Qqz!PkjJA)Fq%0+3x0rIY5LHTnrJlY>C|p0v2lL_vEk`*`ZBDVd#M!W zUrQofVp*F@{W(sNQ`7@m=b=PGtFh;P%7{tcC;f^jcxLys@|(-aAv2B>Ras^ zG+5QQ&YoTs8lUgEYTbB~5eyta|J9c!bd13q@b6j#qHVEIGSr?>*8Ts1ul}#hszNaj zvE8%0#dg{@L)+kP!guE>b}s!6CK?rJ!1^IGkJD^(&5cKnq&;ds10#8>U9aIa%#?mSf#kG)3&Ei`Bo{9B{oQFbKsOYmxkfdkS!3=6y%DATGhAuDlbdrvd zU#k$16C2>amNK8%JjOl@=XFJGA9=KIScF|zdk|(RDSI)C)ug!>g3c$c>XH^bTBqFS zeLVkJ;IHWe1jLm&lQ?=5ccXlo|J@Dy3OdXi3ozm^`Zu=sQz)-ON^M>?%*;{*~@nZGjdtD;ahWIvoA}+aHl>k z>jt ztwKAh3`T!kI$$ERH+56o``1(a$dTo|ie7sh)Olp08GKAWGQ8Gi=2*Cgmj!O@s{;A? z&txJ0+K+&C4}LWA7o_^WwZwlo&JO`*aA>!KXNN{8d1m2~$4aVi+Eg;?HDsn7i9cpi zJP=?*g7r+5>?$v?sSxN1Hw-p-vZ;+I4*F@btL-f?w0iJm?Ix<(P60mZhdD9FxW}q) zy`gJ)pB`$_K9s*oE@1<`bSuw*@2-cG%zX-(s&ztq0W5tk58uUT9}`?zJeiq4KE1|z zP>wg>XAKqv-SJTz>(D~?_TDdY#`Ob^Q5`?NFAJG}W6k?@$^`m%GX%EQ1~y^xJZ{2y z5Jq*?Dq`7V#U_V>*#}p}Y!K~V(e%oye2}p__xk9&{qd4FHFfW&uIS#JF#YDQp>j&z zj7nx6P>G;#G$uG?2uzx^2a$eow3gAK*SQda5XhF=Hr~_t)!g>9(Y1QYckz>i^QuFj ztV{4J7E%)Qw_Y|z1(G#TVG&T^QLG{MiHVh(=j8`%&o&AFA)}dDp5U*a`UwiU2~z?>8!w|+G&`pB+^^1A&^WRe20QDW+ekPkxm)2Map6>U$fqcYjDGT$>#Hi z0-ZyroOu}=7Q!C_N%g^6TZ`>da8V&?`Ssln6;L}Ihw<)L;`TyioW@^4Zl_V#UoVns zBy;4!K>6ui2pQ40VA0Fc=ae6`u;IXX3m3u{l}y8TA^K+8-}=^^GM-7W&4hAxKDqZH zVAEO1@#^t~MN`3J*pK1?l+yk?(>+B_UT(mR(ah@RUN)_`e;p(wvISeq6;8;lak-%q z`Klz)YWiE@K(;Ued)^}%eE^a-$7Bnpv}Q5N|k439W*JkOD?+QTHzekUb4dAj&=!By4mNq zmY9^vM4lOoFV1BM{GXAB6>yRU!X88>x|tu*EaW;gC{ty!%CuMy1sZKl42oS zIQt`AB~z2N(hpF#QK9r^u)POj_nMLXbBwJnEEL3L_)~9+bYxp+z&050Pb{EKb-j<& zXIaO7Z!u1Oz0a8&uYeAkoOt2ZRjKDCnS@_3Lz|}^a{bELt1JRt3Y3x z_?Tn9EHvP*AR<(6vs3Z`Gas0pv9i33deRUW0q+u$U(=O9()_Sxy4dgAM)}8qfok(p zdjrt}aeN`JM;ehRgxt5e)lW(Pb@Ff=7j-Hu!kAKpW}Hjq3bQVEq#FRERZ;!w2mWpH zjbCF-!mjQYeWH39pqKgse5wVw?26-!cB3!pek6sjFYZJa+dY_E|9IuZeh;N!Nv-F7QbrY>KoRf`@X z!&B)k-u%n(+BQtJtVjy`KfJwrTul4>H#|v_kR++pY(kRCp@a^r915WvDnf&#k|ab_ zvq};r<5&)9A|%m>4(PCSoI;AqP&CbyN(aq!m{!f2weM?U+wAXtp6C1Azx#Fnv0wY8 z)2#LRT*voyUGK}0uZc|jsYd&MNp@X{&Lvh%)u5npK~5yS*pa%~+9D4qcCRT+(LP7;OS zx@XO$d&wK%_)!Ba)3;FR6m1;pg=pZ}`L5KQ_q{$gqLl{UI(K?axvV%|ebRoI^$&Xc z!;U;<4vhD=Cq|%xRQ)1SPKX}g9my@OwRm%JcHzvdxmRAveA*qdNJ9emczhL{>HEzn zCr-Kw^|j7>%pPmFfOY%F(E3_{mLJH}b8kf+=Lh)Q42+6UE*>9qcpn95mIob%;}hPC zlfJrI>#{43zcsVfJ=2@9Yx)XPy>qq>UP+=*TsI7$;M5qj^9#T_Mv^?~4t8GsfuWIHZp^%n;WP<;YNb($rRt+l& zl^S3WiN7pxkem1zVI=@Y@sC)M>v%l)p$i_iIa~SYf|vse?!k}s%r+hfPzN;PO(bk& z8G6s@d%nNt>evQqNuZ}|AY(+E9~-)Ly$@4ns!tPIX0 z&}5xWDxly@e;F2ZZUF$B004Fx?lCkh2x|l?{~8kf>;M1#uwa#h_@1Ll1K7X+gY{Ve zY7`j#wHKgOpDEl7r9Ijv;3b1&z6JPyIQNw45xYjNGT(zLocsJ6+LGd|ZTJmqNkO?b z&zYyLKr|{YLjPK( zu44|e=WFMwE37w*yxtkRZFmI~Ts2r{dv9-d82%?^Z#E!(LtnD|2rz>MlN>bJ75%U7uD_v9jzcU8)cIb^8<(G~Nr5EDdF`*J1jz`$4bG6uyF5FSJPQxRkU(`ddt zhIj;Qc)pX`{S*oR6l5xRf%J|^2Nz(sjeCqju16al^sCs49bNC6%@j|wP!dnY=33Sr ziJyVK=6q!lsww2!$6_)EQuWH^^zG1E@W~#ZDik|2f_57!U6XsTa7@KvR%^P8ON(R` z%AJbcpyI#pxZ1n;8U?Qq4IZC~?&>-Pdr}@45A3(fr|Pj9eOQK%{pL%L1$)f=zGhXS zx9SUg)EZR1V}z$HZDscJ#ShQTUj)O>MQDz`7?m&;smJq_W*p>)bBvITX5tR&$f{Z6GE`WX5_Dkc!&RCk~)D?_Jj zXliDxq6{FS>dY*A$SRs_5+tVwWoX4;%8HAyF4G=Xr>+Q4_KTiEOmfr$oyb`zUY3`A zeV}rUnSh^A&?f#t^S{cZ;`hIK_1-+ah2>C_q6%!1we3T%4V;fsPJYxvKD$FN<}@-02&;NaIDP`$F4=>SC z^Z?TzJ8{fe7%29Zqt$LH$+w~8(wQ#gyL~If=3$Z;V8z`+)=dJ}a8>w1i{%<(xv_lJ z#aEMx_H7K*IO8_?owD=@{A-8Q_m|^-7`9gS*)OVW0u=h;HAPGuyDp1I(W%6K%zweZ~o$psD>z-rRVv|Vsc+HmpE z;fKsjC&G0<8lWwapkfc+S}9MPyPSMDOfq7Y%glt4^)s8cJ)XIvt9-f0ZttIz`?ONW zYcpkw5l?;ZL%30++NMjUqM)3{TI^J`Yj^9OtdP|W3b#oeNh7VUzY~;UnsW&PD~|z? z7s9#^mwqz448k%EN{H*WUAvtSfe!7XZinLN`SdbODSo4qTT<}_8~e|y#GZRvDPki@ zhz+s}i-3Yir6ugvaghIj?8=ZT!oVo?@Sfc#2`OIl~hIkX&oN>^r?k9YqGyW z^O#Haql0CsD*RYTs=+dTSkML127~isT=jFFYwOlT#5GC`efbF2q#`Q&0{T9y+1su7 ziluJN3MgH}TIu`oeQ z=sX~7N`pa9!SO_IQmqVNkv7q8 zBxZ>8x;ZIW)K_4a=X1OHHMaXj^?z63=sef`=t$K zRP28&n&17Om2Phe^5?&>l}i1?ea-^mwmLiS#ox}l&n&Fjw4J=X`$CB2{5(l0>RxUm zYIMjJoba`%j-DNzowBIR!tB~Tv>_gtKbeTordT=z(U;P>qc>5zTBevlU@nq&(o!P} zW|?OfpN;im8cr!yUxd8LUazGzRsv2=`29`>brN3Z4u215P(R9ca zoUr%v^HwRXd!FWMzlvNTU0k9w0wj7{Bk1xFeG}4TEx_5tvqJD-k(2?H)Dntkp_MnN zl0KjtghiRZ{u2l+Mj;JAZsJUsHHtQLHMD}KVFAx2;dqgJgu&QJRIf+$(;06&yloZNH1%ShaLI!xZQ9rcj$7|uC;w1rg1@W^o#JjHs z?_cl9u-SH-^QuN<-!TS|8FaWCNykL6%tK_b^ zKK}--(1jW`EzJI1YIA1R86$-WhU?T=?!%s8cz}H;1g%TYF#93qbIo(dZ`%{I8B*)> zW4ZliW0_WLJUJ_%j^A~fR-9*nEk2t(b@;qT?3Xz*^*KEc=S5OP)Dv7S`ivmu+~?Jn zllPS0u|Iax-Cg~YS`vD!pYhjcT>9}DGZJTnARDmVSZ!FNeW!vjsSp{Nr|(_y0H+l> zuk;P{EF88eF2s6~MKrygMX1z?)8Tx2W_3ACMCp}qa{ZP z+Cn8%dPGjgmt8~TmuV~*J@#9JM8CaUX?azS*&P?pW2;@4-?+4M;W>2F+2a`kSZffe z2c3e0oG%fCs%GPnA{1C44jIsRZ|>J_`&=$KYrF1(v)g2U5v!W-E%YE2L5ZhD6v8H4 zFcS$T6uLE9Sb*$#jg~gTGzD6c%M=AmQs@f_f4q>#JORzKK~{rVCxezB6b05fO&ZTm z&r~S;CP&}iZN_;|{m$`UAs&f#!kp;WDpIRU3=&^?{ij5B{UV^Oj7NIFQq5=JN7x<7 zkX{}_`#D2Iy+^QL|DDHy<&q)hTwZJeOP2UU(1ve$p>gc%bI*f+L?6|>o-EOSC*?Vv zgEZWuY0#$zO~4&*d1GV!ZQgb5Ga9|GZT{tffX;SWm@PR?Uh%7cI-$5VCpOjcw`ZVJMnpjLi8D|y+ztuu2^oeKL`s%a7 zZpp1XHIUu-l~%@O`zWmzRFqKF0#KV%)^0oQRZN(PgsVPPmAtM;*>~8IgT77Pc#z}{ z(v%y}P8JN2Xa$7-)w~|4+acyjbc<<|2t8is0c!dt8g2RHw|`QOu55CSKAQnv_Hh>h zKs;nWA8e>CR@9oQLmIeXxm&}BZrgrr5QgyKsFUF6_kKV6ytlAGaKtPr9P&({l zeB3~u_+crif-dx=DfMA$rEs#oLssx@(sk1lI$mfIi5X{oe;Eje@mlk%r6lqB(~y^YZJ zm@Xq`L6;gXxs0@~VUW;_+3u7XCLTq9U9a)}L5_7IzILHe`hb(?R&B@1ChhnPu%-GrD7z1J03w@p#k>56Rf|C>N0&ldO=08EYAdJ`3uz`PAAa%KYn{ z<30K57uJsUY`7p#v!+#y^&VURG0kixJR!#mpeP5pM*}PBVE|ov@w+MvA4M%n0H@MSkg zQ3wr0;DFXX@*wr~Y*5Ik+BwS`puHeTbVW#uOlOSocGbVoXkTN<%Y1rN$&tFv3vwCH!SPafFBSdbSH^dkkwQT#Djarbqc;tz;gAW z7A~G#?|A3&nNwAs3n!m#&M_jj!A7B#UvwoPo1FVd76;a*M8hkzqOFQFjiyTZC&X4< zEVOMrBRYbN&p27*`a<=@qms&FgPb#G$EX`$k^w$1{BomGxTS7biS~%R#q^YYch);L zg?vUY2hT$rZc;O(BCK#Gj09KAVV(YZ0ET%{JivCyW&W^^Ki%73E_7xY_&3WBfa{&0 z*W9o_vrAem9_*9Mp%+>rfT&e`E_BXv1|H&_Ss~ zlxW`sD;!xF0gPhoBbSG;6=pZ#7ZVNdzo(qCo9r{ZNo3NAPuT7tUp!=M?8y`Gc?g+t zn5%@jNx^(x#A%x6Hz#4HhS74cWlI?yp*E z{h&-x7-WVYR|=i3XdmhIHs=l(|a@TfOqz7>gx6X1L*BvNKd7)?t{-R_}AKP z-x8oi2ox+&`?{+$kyY=0B65IREtQ7oK33FlZ7BR5f4yh1+9?x@2?5gs4)`@eP)=ge_ZMD!!&A2Yn?cSDpxzA0D^DGX>alV;Gz}!;S z;D~UyM5E&;j=!96ifWdce}=>JY`34iqL@Pe^?`sMZp%Hi@(j`?p^x&Ym9Ez4+5~U@ z^U-Ky=(W@=)rwA^Bu^(5PaRvb#A9y+7xSkFHDAg+7D@35q`p8SeFanq#tVvYt_#dtHBtU!=r~^+gwm9}bEgwt_e;fi>syzra_d9K1uUgqBqYS%@&{IwqQK zAL{|KgGBZ)BCtLZ=^X)NT!z2oaY|5d+e`cC!WBIbxH5U_8NMB%ZhkFCLyxp9Yy=hA z%fzR~UuVX$N6Sn6SoLQP#`W03YF=YP4K8cVhoEUdsuyI%C~g*}pFWYdE=n`4&P1#` ze!%b6*ux>ntfT7vw*X)@|u^b^UOKnd^d410#BqIyq?l}!69lkI2yEqGMv@scNYK$B>@V1s3K z4n#6t&Y%+Dx}+)raf`yq}=1nEk?XaV6pTNRrUXS@&t+Xh~DY5qN9p@yD-#ka^^sfm77>TyN2Vx%_RCS|5RDaHHhxwv*F!RUHx#K&P`AAL*{#ua)qj2}%se*`OhjV&zg6F!{iA_C7wTh6^c1arKdA~% z58VNFJcn{jNXH$|9pw2mHVxNT?JrP@B&XtjYGK9v)+5?0u9uhmNx3w+QOKJ9t5u_2 zfoT!q1_BKXLrclLX}T={8XW^S^YcC-x>b5u4ZY%2*yJELzY}n%_2^?GV#0+k(G@(2 zTKJ5ZV|?d=TI`!1Q@8DJ=F%Q~WPQ;m6=vHLCUSX5%TRmYLyBKLB6u9onExC*5l@@q zZ+9dlZ+_O1AZLC!mr(Xz`#k$v3#oFzyv2ikvC6NUE>NvFw$(wt0oau7*Mg8i@WQ=@ z@LnD}B2khjq3zI`{m=-etBzxWFBWEGL>P1_dh0s~qtN^rSIyPkxBDD$+==NA7DlyVx(9e-XbZ#iNEbI_M|JUe3by12=e z@+{&go~&EKh}7T|c^Oz1)aF1V+1Sn;nKPtnV|BAdu3q|IV-l2gt46GySxk|=$?DJ~ z6|z9E?(i7>w_#lyyR_9?436`-k8}(&z)kWMxlk!zpAP*hsy)!uB)o4g4Is213TNpn zbxy2WLe)L|x$c7ztt2m;1t0;gw;%9Bd*QlXWwf<8K?#60aFVwcLMclf?dk&~&=pR>Gl zSU|EHNeJLkX$-uGHJa%Z3yvLH(-!^@;Isdd`t!Gy-xP8JIR&u4zo|bhYyvqur13(< zc=Uq}XsS(y-wOfsqWGRf9x*#rg+~gU;!Op%5yj1y1DUgy8n28SuQd8apK2>r&|zQO z_y<}r3&WL_po^cD2c2ANlm?_LCucy=@{mS95A$U@bW`#b7rcVU(+AUW=AALddzL*| zcz)U^t1|Hk&YNZ|p#nGX)$k3)+8;2X9NzM}FJU+YN5cZQc=;Oc%m~?c!D&?D-IZTy zN55i%HNLf&Q&ne%nUP{d*7M~T=8I0*IG(ir(nA{;;7!_$F(b3ta6_=ol$;C+M=u1t zYaJjapBjQ(qT+{*IzbnfNc*amA;h-tuRw-_jeKzm#h;V8Gog@cL~5NDZ$&Hb|9CH3 z!c0X3PUog0Dws+o4Kda#sI7x}jMz!%Pf@D zv8%cm^iJWHPfFaO(QD9MebPw|c87G3qYp+qV2~pwU}4IF!xw4WmU`?nwKKavvv2nP zS=qsjeW_suKx!QP2U=A<)T5Ts%fe@1om(D!jd`BIIH}snnz}O4*HZb?{!wwh-^RFp ze;n8w_}Am~9sEZNTh8QWz>$1M8I2l0wJR6PHeMM=w7=a67X56X5=U zj7Voe-n%je4?-?xtvUex2%qT+kB4Ov$lAq83Z^16lAycOh^@mvJ}f4@OEzLxCXUU3zxu zmw0RQH5szQ*2=2T-gWn~?-=FISX552HBTOHZyuqb5rbHlu}+#V2M?kli3u`Db;Sdn zg=Wi-?$B92>*)9!4{~jm9HjZQ0a>R4K(?v#(AF7P1hZC!5lx>e8JSrGb?YTMr3h)t2AmC7F}1jbe}AEp@ADuUf&#|2?Myp z&Sv!L0=cWN60sN;H*{$P+(n;wxj1sKn_n@=I6UW#+O$4aeDX&T)bXoG?So<+wDLU{ zS2F#RqHIf;w}@;&ejZ{1ZC`RKb}ompY95Sv4)(&O#gV1lUXv_R7LbM_FfRXi#3m!1 zcW0m`N#-KF7UZ$1WDHolkRDVB?K*GJUA}`FbpXdS!#onuV3eO9y?%yTJl$RUa&KGw_bJu+Xc;ux|4B)bk#;%tzO<2}9H1{0 zriKan3)M&?A;`k+szXil*33}!S=S+BA~XX)V-0i)hwpsI&nyK~$vB#gzR-V<`S>xR zUOE7PrY=uE*@S=r{VDEkDL!>Sbzc&w&*$$Wg><{JeNL`Hnh~ zIFcH)T3{a$(_<~1ULBjcLH*Ve!OH_l-g9&q>u6VFwtmhBm_lWM(=R7pfR@P#j3mb& z0<(e!g>=PuAFzxH$*2_QKLukf^zW`HK|@hx%VBt=kz&w_M;i2-#ycIY+6FdoXRTm; z+k?eo_-qd%ZU)%k?Y-oZ5M-)cpnX0X!c-;^Z;rMm?wu5EGgzx*d}`ZB4BfC0E%LvjybsI__V=e5Cw&^pF<6pN zO8bWiVc>^#f3rlW>m|Soz(|fQlB6Q7jx=H<=w1{c`e2FCIk|N8MPKd=RhgktM9RHTG9c@LgQP-?`A zFu_{1_F{o66%!g}@$Q^tuRVSDDuJJ^UUwnj81A}pZs}W7IR$y3OgbgG4WPy-O*SeT zB@NpF+ywPxlmWVth%Tnsp*S8P`2t%R?~uhvw~zKnNJyu#`0u!+R={`KBiJxLHrQ;2zL2>-G^=lCU1T3U>@( zd(=l>6*zz~kX=^-uar~~Z9x(5f&Dk<63c^B;F!iq(n%TO06vx+iwCA^O4g+&p0n9; z-qK<0QFmArLAfSVOc}o2IXP&&aN<=S66HExI3vU8qTAgzr>fVu?jGAeX79HMKkD^I zAwVF|A%-@r5AF$y{SrQ2NiT)Bk$3_ zJ1{lTGd2A)ZaK7JIAok|}WbR?n#8Fy%|+nqbYlF)SL0&cBRah`gO<)k)`^;uO9zpT8H$UeCt*Z_j` zQSli`owVCu`!#N~gxCC$X>-1!cFICWb%aeD@u{xN%RJ`EX!F$@8B6rVxi|yB=!uYy zyB?JKt8hd)&U=s{IdXB}8l_lk47we{9oB#e0zGq(CYO2RgFn6qk3T61IOQPt;64;8!mw5o$WqaZgtvULrKun=z{A<`{X>NXvEY^iOX~ZGrD(w$94zzF z8E^-oaB{+p9Q>+Kp*j&~IBb7$e9UXu#niA-hQ?QX5N{?_DOsxDrnXGEl3|i^E@`FC zD;+zXiHE0MI65u9`6{%?^%E-QXvqxxJHx&h=e&R%8!YCe8$9byDe1nL=mC6eJP^nA zTDWbh${A;zqL=#8&ag{QvGI$AA1&15Mf`lI<4tdo44?wmw+d%ig`Q)j>|egPo>>0! zG=K8~iK*-+n&3g6_7Oon6Jm$7A;Ln%ti16;%NzUlv3j$w2RNtXtiF$o*Oxh|KL|O~ z@yGzp{A>2Gd(rIk{H0IQZ)~1B&0*>s-t%$5udny@UsyUTq%57S)E_LJ8~)!|IyERA zWe+sFR0DihKV9(rY?80foVE+A?iUJXJRj}ceHkpWIV{yO1`1l&w09XPugne|AEpy| zWV!n1k1L=t0b;;{gALrlF|{bS2}T*-RrzH_#iX|+vA(L%1G<3 zYD6%LM$W?agS|OJ>IrpE1ubnn#PK(~-WNGDQ{ju(f)*`P6)S3`T#%nQ2rWy&8_8UG z@??g{;`cAWWW#RLdc>t3W(A`)>?Og4;6@_zeRJp;xjbY*y_fm3&#&@d`uu*IxUL6J zpAWC;BEU{%*wXOI3@uQNPSW{*In=BYF-S#KER$oQTg8Q#h3h?E9%ojwH_(0egqZ%*YNC$ zjYfmRwgK)D0}(@cb&y$VtMI|KhbKglY?(XJ=TvY`|2p{2D_)B|ZUd1sAqVF3G>c8e zXCo(wxd}nKf~LV4m%VrB?4iuJ9%ZxQ!>92HFl2qjOK)Xk`^w)qz^IS80vj5v(gsYO zB{LNJmeXEW5X!NnoyRGx{RP@lBbo0Y{}RhgV|To5Ll8^OjrUUv=Mw$?> zAnv9C7mg$TC*^L%-EFr1ld38wo(`kzH;W`HsVaF>7z0;Lln8~3&|#43>&)@LajapR zw{sP3^$6M5ojPu9Mb{{0tPcQj=paO_{W$c)T&#DOKhFCe*`fo6@qa*#)(vefh20-M z_dMb?J+FCvveg(J;}#+G%WDKSpf476DO^(L7YRv6P%aESonI-twYD zI~07@!`EaapNjp)6xo@NofciPRIgO0TH{)duE^u*vs_%c;nnqLE?!Lg6HlIfDr!ug zkqfZhRipoy&K8-GigN)cuCju6*$HVso5hA^uK+MDQ=u>6+DO zwFPwVvf9*OwL?;;=4cLe7~$tTOnq9gVZ*F@WxBrBv|`nk(41ZSTJ&#iW8T2NL=7_c zkb-?a3E82Ysfn9+p7YtY`CUSRj2YjTB``fxT(qn;D_}J8 zCF+<&Up!oLmRQ4+=!gyqTyNZOa}vcme7u!&p!8mwRnxe&%Y&7XLi>nU!%qYpv>&bq z?FF6^ra#~!(1r^!6J0HE z3)UV>ldLs|oAoP`4cek2*7fYySW^Tc#KDTt91o6od>2V%;p@?YF@Gs8xcE`z7l7P0 z5x-fbSW-2%uwrmxZx`sS^hCf5pHM5I^$v%y1~VdI$9Y)5D>5Vt?T6nkz@9O2CsYY- z-BN`KCL-jFi~sz6j~~A;_v7~yU*ygE;RL1jk|zE6x3Gq_9`s1+?}Wx^!4n*Ae98B( z07INik8g(?pQhx=ePSAtUhcduD?K|a4W@wL4(jTT-)?fQrU~K#%*Ze&X8!X6-wlJ;6I|t?I^*5#G(ncfaFajS6N-r`5h;Yu_Jw zxO2gEyX?p|lZ6H<5tKnc7e|~Y4bg-nviV9U>ZdZdV)5j%>J?7$Hs?aq0$!=m9#4>2 z0(%M`y=yRCe7V4-Xsqdqd>i`RN9?mfS{(77DyUoN;+z&Xp}JvHO*-;1zPaBvC+4N! zk&!)94%?IjZ;T|jz%}e90GGNMJ9M=OexE`%BfLcdU&)A0q^nyx@D+!fl3|CxzaQ{8 zZpOf8x=VegJuCy9=v!nzsP3;sjFNIci(`E!;|tH4q}YoIW+SbX*;&Oa4|J6z2L;}5 zeIC@Gd64_^ZTaZEt&M*9qeqNnU5@4Z79oS`V3S6HTtu?kw}`X^jBsL&*a%m15stm+ zoxDfQX>NL!+PK?~ON(u1zgEy~hg7*tU~~o)R{@+5okmDagr-zdvWFxE8f8F0p5XA! zC4U7oLSv>hxVSl|CdsHC;*qQL7u@bWq&zqh>1k&KpABH0MYj76nEaY)0NSIoj+4G^@~t*b<;Sa* zt(OZtzFyqS{Y}K6Tknasp3o>F$GYKAWro=e3-`!v1qv<}ANp#S)3xEv-$+q zj`%OEJ9B&mtL=k>ysD5&F0(+%oV!E5eiVHgu=I%FZ*SucTqD~pbpR-i0Ef@HB%M;? z*%vXpwX4x~xQY2zlM>%S_ad%q8)ZH}iT=t`Gb69YC*iWj>XeuF3#a(yvzm54FGtw) z`R{zzv+X!W1_o8%*b}}*T8509DJ#CC{fiiayRekHi_bsY1yd?{Mj$y1;M)xPsS7D{2PxjTD^-O)rC&I7R`by4 zV6ZI18-$!QeT-UWfoO5+v%n*Jo437vW%fMI=Cif2jKtGF)r?OiPPxK+Kl100k$XC9 zWmVZhOTjrP!f4Cb=K!Ms{cQm=5`rYp_egtpBj7+L+nqqXfBy<}<$i{b!w}(VOZA~v z*^!)9e|iAW+F`$R)DHe+6#k1@_`lz1Q2C#;JpV!pN_EeE#%B(YZ;7$40Fu$5S^w==hi zkDciX2Rb@hr;H$?U}F48!R~aQL)ixPTir7Go5;Jlic+A|Q5)gu`1Zg=Zr`Ud26RgZ zbmm}tlp?w5(_11N@$<==eN~CkH!F4mA<%X+2l;%OV7)yg#Sn60R8Tz23dm5QJQqu@ zu?NJF4fDy2#7c(|oRe@T+y9+&lp_EpnEzZv77Cd-7|T{;nOaUaT)Uioi|Dy<1kzHk z1iUN{3oAM7KPeND9o!I1!+eKdBXe?VL675eN85A#ig5sEk#o~%*_dD%ffm>{-sHZF z0!FG>!c0@N5#-kgt!Q)=3rt0uaXYcawmoX-nDqSZgXbKtoaG&JkbgT=8i4B7UnEbQ z5C8ni-?UF|yN{op{5GO)+St^jx0jlL`pHL-%{WO;qW1lm zF8YH0q2WwSxGqX~n_jnV2D@l>jL2`=I@Ya(QCPx5CHyF-(-Dk|Cdz~~B6U!IU>u;+ zH|RCA-nm%=QbYX9KV%2HZeizt`yB>;wBpx4&`~+od*HU@JmQPh>hjS}g@!*Vu;pW` zsfKIH;qz;#{g)nTUzQjc`dze|U~({eRuB0UV8MiIq&DX1N;kpT)Lww?IsH23E6t6D zhw1$>%l4kmh&&ac8le&^au?b>3*>8UDdgK_4~%}Cl_F*8Ja&fD=L>olyHFDQ5Hc)g z8Fu3cBIrP&r7^si^@>)@YGg97okpiG1Wm@r1WKZL_inCyFY~cU-3>^9l5**@(R>fA z>3o217O~ov45=A_Kc}=<0`;QSohE!l6Y)mRFw;jcyl=uD-!*-AZs#5HYK4gUAtk7| z_CjpN51eYPKuVaw?xns1KmtO&&>(}&wO8c{v@{p-Awr*g@cp^O$9II+Ss%-w!) zB1~N9!G7Z;s;0EW;R>5R(bXSWg}!x)5Ga5gZ?~8G`X>eM!^0cxu<+OzSGVSmu1ReC z8c{n`L6F{21_fP#WnzGpMgzK9){bX9qkaV?$${xN|SL;2bJ_3tLVd8pOof}kNzh#}eB6nC; z03K=oC#a(2VBbu;S^PTDhelDX@F~=4T3EZH$Wh+njdoL)kvcn5moRTOzQcCGKJ;Qx zF}UQDgSy3Cr!}lFq1q{)n%Y4okeR}bIV-V|11_+0x9mp-a21xo7Qy$15BF!e1fX^2fb4->TwRH{^!&Db<9ofLRhdjWH2w?${PWi~*H^qS*Zk;_M}#{ zRF*T-WqNc8cx#fD8}9o6?ruwY3Vt!<>ze=zo5R$ z#b8YUXsetjB8>Uh`gDDt+f;&Sl@N&SZQ) zU_DbJSCPr&95jCsx*N(aa{+}iW-2{!j#+TPPUYCVUK8SR+q&s_H~ok0PkY&B8G0&V zR1^$0Um;&0-Cn2?)Y(KH=+cdXVvX$s3td4NuQcI5sP7 zSXyisc>dSeKf>M8uRz}N&#+kfxdM=sy<>xHrGr=obmaz)=%cW3$RjS<`n4Y&e<%%| zaqZ3y-OO(p4KzWAuhej75HNewD}!$V$z?T)vf*z?0zaW084_P-Hd6tr4BQar2y=Je zMwV>rtqR9Xr)7R0Oo1_N$0!P)gkbJx5IY9_9^;aU|6PoG>1pB})D}%cI;M+}pv}0< zO}wgP@yzV%F2$o4v~gKTiv|jBVJs#5uxZCVw0SG72Y)wI69l8KrbYlk1`*-hszj)m zk!#rn*k-hMgL78|VWu_|5%@_Xf-pg$NL9kjQx3?hDybj+RxUN!{b>n#J(T)B#PVgT zDSrw(L`odBy`3eQQ1c-&F?rLLwoJ9fKKyUTznMl_x1Akzen5jlj?QsH_{o0tz2l)}xWbqlCj%(YlTDlzDw+MN7Y|Zyt%nw!=X>n*{9@O+Uqn}KolfYob(Y`Uh zY%%?hDX>j4|HfpRI5l#hUvw33@fDi|&8p7R{p?kK-!|#e2sxkdtZ|DQD&;F3L;1H5 z-XwUpHxO_y&!B6;8F!>B!!ke8ml#DQmP5s(;qf5#w2YuFVC<&r8%I)16nL zy0e;NPgIXY1(N_iI3$Cctdc3GccX>{FpB}5@c%% zbuwenUAp3SP{CpheVEq*RPc3J?a4{7$^a&q zCWR&XkNh6WrWRoCFhRz`XE~i0_VZ>W3*K|{-+4XWBe&v4(r7hLi%fE6JSOD)W>TTmi%hp6Jq}agyxpLy2+n(~9S3Pm zSPD=Us8>{iQvQAY{#bHyY%2QJDgv56?4kF{mRMx870x?Ui5$ix4MFJdvFd5~0oP}s zF~g{Y+)%euQ|>`B64qajf?g+zcs{8>Wp`vxL|X=F5;^Za!#sNl1Dv2f>thtpCCDth z#^zDGS$WH>z0^6flgfHoDQsx)T>!Nxtm!l!NMdymWU-n()L9*|B97$JH)tn>0OV_) za{7Dc<=&bM^U}8ip`q+arM;|I@E*h0aKKt$2%U(u0}c&JH4rUULCanT=#sGCEd9DK z-XA5YAszAa0$>N$e-NaDGj9f2UoS~>y?cJ~%N-NH*oD@arHGm*bT_W35Zr^koj`N% zFiiV0k%#8Hp-sH>3bDLyFRN{IFY8MWsi+Bo*qFQMhegO83VoT(wV@zxzED_IBun0m zh8m>~i#=|?cPH{8MRY$Mh$@2b1(fvI_;~p~T=O(~T6gIyeUF7OAu74FjuwUr#1@L= zX@ZN72ikN5v{vnJtreI3ttz@bXu}FH4xV6SKep0(?VEq7PNjU;bXDB+p9*w`D%fH% z61J)iDGyvIIQ7M7zB`+s{YpIAiPUWY{%lD~P+$`Nvckqkb@s#M*rj(z!ymo=_(r}z zh5zz9(7gyM6Zvh-?+qJavZ~U|tqQ7HyTL*!I*q*|WjKCsZ zad9zIA|iKVPZ8+CUSS0BZilKLBxD?c6e_14gy9eF>q=Q4DDLyA{g9c7E{i9?M?JxH z$easU)Ruqk$O5i0HLB`G-v@8Zv^ipp+1 z41X5($}_0Es4?!F_9YqOcIX@LJ|j{=n=8BsgNs362PJlQjy#qYbgu+#$NO@2lZ0A zHKi5{4DnBswbix=nnq?sHFiOe5%% z?HiJPZ&!8_Ve>x8DfOtt`Si24{FhP!V-dd@SSxDICFch2?`D?qyGfX2i+F49*AVSd;D>8$*Gv?AOVm3ASD=Z7RHY(6|ri$A7LNxv&5kB_);GCI5Wj^& zL=v_Sdcih0^Vz?j2ADooFjj|PiKDk;rP_-FMgE$b9~K7R*2>$XTJag^e+WIH2b6Qu zAgPkF4s0C^=DE1!3ab0;a;-Ob)ZV>dWnmh}e-ayJMg7R=7&}+2k5kE9AiAp&Ek_ps zc^#n|xB}M~Fs*T4By2hstWBNy`bqeYtNm{c!2jOWatK=~Fi8X4Sr6+~p%o;ZViWcm z)WI&@9usjPpN7wF4rk%0!&_%~bKmU&Vb{+si3P{bX^2lcoK+iM-j@1ye+S9e0|JH57`umHXvR!-T>FGE4*3B1jtDp}sFnYWqSIIKd|HN*&UCN!cE51Q5Mc-e> zkUIGDV*h!i{}0CS-_FA0UySB$1dOKqPjgI>e7ThuB)OWmC||rRXl4~%cZ*l~ox2H} zMk;pcr#Gg`1DdBngqa;&S(M|2 zf=pFhW$z(FA=pi*S}yi<2{^zJ?f1o3PkTGC)3gE2F`&1u+GQfPRVqySu5;MGgP}M4kMuIS-(Llk$@LSgTDo zxHNlw-9LUQLFuf$vGWJ6l$AkfGrgs`p@p&} zV0bzJC~d0NaR z0xaU&g}}NpYlR7WUc^ib{ovg7NRo@WZ>Inf#vj^UY(;f}Agy~;&M#fk6IvQ+XV8u* zMm?MWLQ4y9F_qlU+2ukEYTckJ`zmduW9M8dW$UL&zaavpOEa zA1P0g^dcp(q-LE6sxmj5f4uU}bu?+t7)XD~?KS@{>u|;*$z`ndDAdXGB7m*+!zE`n zDyZi^&XOoC_`V+%;lbJY4r&`9T{j_@7fn}fVUEqy#dY~_Ld@4S7_2c_WBkm1fu#+v z+WDqTBxT{9udX|UNTYmVMcDI=i@8N>Tr6h1;SuQ@1hT(<^3;Y|_3&AusvgYw}-i$d<9z z6|gS#VRgPDPeFa!k%V^3c^R2`Y3GWK_ZH4-uh#aIZR?@EY9S`hXV$8%25i#4Nnb>e zzr7pbFUbLG^+fanPxKJViUJ>@s;vv&r}$1UfBN!4RLI6g2z>E7b{AR zQY)Mni54guSFPB{Qy#I>{MabUfO(}}x1P5*YrDl|G%tFtHvs^=I^e+_W#Ng{m_?=1I0;X+v& z-+Q@F?F8b+sMTTTX{QVA!*iw|48B{Rio09wFI-r$>g!Lx^ld1B_&?~E-f=!)|FGOY zKkTOyto&;P&y7^KD@3|h5;53y9 z4mi*#@}&x{*xuB+!^<4Vxw~_Pyn2VHtYF5O-FYR*Biqgmu&&_8E%=d(CFk>iLR|2L z9Z7ibwnUq)&d9&uEU$PmG#*y2#qErppmHtC&CBoJ=lmU>*S{HRxkcLw=TDY_C29YQ zwKtE8sek{+CrK(bqL9>}5<<3$R43dD$qkinr6filS1Yhd7lpYXO+`hroY zHedy2-5g>;eg7WPf0C{zERsOaJd%cs^l%X|{+>^lpN-9lev;0q#_$8s1U@)-Aw ziyEc>D_K$qvE#N#)2d$sr5z7MWCsvy8e>nusgljdwJxTYka^_qp`<~L#OlFBmqGD- z7XLg0#{psl$eXbtrG|hgvDXAHbk}4isaq!C4{u98&Abl!bK9oG6Yjt3z^)~=vdg6m zKXeMWX86&s2&bMmVn!-dj|Ir4#$Q+|h5CqcT$7PCp|uY^1$G)7=k#i$h|q*CcH zN6!IXp}jGJc`ZFN&}63gDt6=LTdHmHqZ*Bk$xfb9hTvCbRpo_W3bzCF}6QNy;z)-JF!AKP=8C*_Es#tQIeFb zbs@Hs%0G*vVBYR4t(e?9w~Uy|ju_IczK=8NbHTK)M5bK_2Eh2qLaOar4sjc8j-d5>7&FD^XhK*=cMn9&j>E*K zY?tEdn{$Z$k}$80RVT!c|0qEJT9X9+Tk-U84``~+aKTDAmrKaITm{KSq}(@5O0LS= z0`rgiUYi=fm*w|PVl4D+JF_{`@@kPr`1Y_ZPsiWLzT_!xvCBRWzAg(^`RVBWu5z@;* zBYMy>iEap1PyJ|Wi$I*a>{ovEmUr3xs=6!04>R=7~rgFh7AG3 z4YMK4j_%XvGVO^rNu^W|w1w|CWo_GxilFEZ5b;Tu` zd7tnPa61PV9-Slj)bcHK&Siyh9ZQkmKt#=F^2b;)$l=-bH;HO)&@0gdtir7yvZYf; z^0O{Os@Ix+8$LQ`UsNUkR;a_>#mRLC)o;3M*g=!W!*Hx!wH3)Y%fjcPnlq$8Jx^Cc zS+586_+^3|=ZP#F8?3l`Wn0UZuF{yzB~3fPoc9DCkHIh=PzjYw^^w?zdiKLqOthQR z(@*(g1b6pnfqn@7A{%N1kcX^9_sh@(2N@yRYEYm-iFcodPD?57)@mhTA0N% zv&4&zjwS=0M=dW^)M2Nc0G<WOxz`p`C(`%*)=KaRq zLw{p7KU8jt-RuQ2GowYHz+|+|?RR@3@L>w5xhomM@zAu?@hQzsWDJ{310a((c@Lwg zT)l+X9u6xuwki9woVyUf>WV(M_IzY{T8 zaVL%zjkpow}1iC}gd9=}; zLR?Ze4Mht!p=~|5-B1Wv>V^Jez#l*dg0dyCMiY)dZ7V#AHCO_$mI}dWsYDo1W{65g zE7$V9p(KGmArGc*PBM(WjMi>Hbm)m>!1n!Z9sHn+)Q1;kvtNa{&3k1Q{PK{5IcS>u zo%J($M{m#Y419P821xcfT3W@D_+$Z%4K}I6^CQy70|$Rz%wrNE8fys{{eADfpf3h8aXUWCSd7mLdHx*RS`_KY_+im-K zZ1M3hpy?T0C8-SW)YOeypS$XzmAdL;)5_fMWwr zsn13|Ly)f6Rsa`C4g;d7r_%{Y-!$KcN(iClOXWvpSK&sj>MxDo+pqD@J~02eR+^sB z8=9F2`A<+RUF`{(h-0G+mR=H>J#OK@?>@@r&{8PejpA)v1?4<_$13{#-N?nB)JK~l z*ZKQ@wEL2HOg2xEu0`G`hTl26I2w+@t2l_bT>;NAl|&z*1k%PK9b2l?VXSPOe~IXz z|1`ml+r(SKuj-#PSZVQ^^KW zkgJ!WOBg`(SVkGXbkLGu{=|sg{ndorEXaoZf{01b0lTCXmGz~S+CDhgnz~eD^Ot4M zZ4M|U2nTjA7RYe-GDap3_KEuS>VRD4RPZ(6va}5en38-~;8qjtD;kz0jDV*K{l!xyBVoL>L`IBmSrLU~yaLtV zkKLzA5>jzB01Ed35`uAQ|` z_uer*iK0T%3N#hg>Pj^A%~k+2?nrYq44%ytlyORvk_CyhoR7U%OX@6_pZ{n`USS~C znlLP>!jHB?Dm+9b-H@s1mMc=5g>PzYGOrdAI`IwOb2~V*t_+Q}yNVVD36^fqEf9KY zw~N>JIbs%brC%W}Yy8z_Fl0OP8N$7K)fq4KHh*}uzxqVniOkGE_x11hZTFM1r=(Ig zk}T5Hi!ntL8IJnhJl^K>ZVxJ_HLy(fz0wRaX!>BTX+|gEYGwFEAu1kG9r+4|ay~aX z#B35#`P7%$a*s(4G1%%eT_Mh(KdE8$tIw;Zi;t{O9RWim;{h#y)oAS?@)}~}r=u3( zCi=Dov|_;V30IdxDIrhtcjBH5V)4^#6#E!-C`r?Vi+qM!7pC|fJlKfL0!Pfr8V ziVGB&Ba)nV$EO5xPi$?oZb8r)4B-!<{PZZDzkZpxgxCS} zON1%39f#5;;$+cpg4)6_$~>7bF?SCS$M1RhXp%~(c3rZ3V!~_IO|%8Y|FoSiSMgiG z86*qNH;NIc)Y*@i!5Z&MfwpD1i5&+y?>IY`XZye`dAZ-29j87&S9s#9#;WDf!Vs4tGcoxDoOfTNx7tR($v8pG=JITP5!a%eK6s;C^IsH|;I;4pl_GyAa#su3L|zCHn90lhZ+uRP+Hxsj z30TNVK_*YHgqCS>{;qFWv7O)fD^~}uhVHVOrFC?vp6~{%ErgKUSJvwdG9ny?xS`%n z_$5IJX`RsD=&Q9m`%LHtjk|9jt(bY-|{NO zXZ=wQa*>&VhWP7pn)Y+{R4uv`@19zHW46CV@j>cs)e$Bw0p{?brA%L5djaw%)x%D!U)1tGH_mc>U5a#An|g1b(vn>?Y_4Nm->gvREI zN?^HnH)s&}b zwW2C8G| zB1Ds*(EL~MjzpCt(^MC|e{83|*;iXxX!m4mC<%|Ea4nhjxl(bxc9fw8gfQCChcrha z>183kiwwF~HEsHQ_;T*ePl1=i?-R^{#ZVsS>CtFM4GVi!L843Jr!yIZoSPCefIC&Z1h?Phvv#Za z`v=Nf!=Czx_@M!4dsOE~LN-xRpAc_=W>~#0vS6VP9+ayHf%^e4KGvvNTsVnd?>}Gs zG*5^4?6@RT9G^Gep~1ly-BZ4a@A7(aeSX2AeYj%`A838s`A4-GSzVx@X-_0qC9!;G zk2n+4(~EWyJk@R;L>3%z622W&!R`OFoc0hhOC(xpJw%&e(!dfE&^r|lQu04~UoFTM<-}%tv~mvi706+Ku@ zl#Th&y%RP)OYCP2HWqrIr_tx5uQxzL(77~#!)|utmW1}1{o^HL7zZzedQ5XXDvP*a zXQ!|y<{tD8m~wkTzr}A#53jE=Z+<{{^PMF}@6pZgwFAIo2^+Y&!O)$BW%3VpqP3sd zLSlo?^Q@>*7(bM`Ydm_TV*-(x%b{NffkDsYcOr z^jCv{i*2Y5t6h6gh139@D9isV^lrx;xC`4~%83{7`#@;dg26_-+3{p>%>J}Dfu>in zD-4029ezs&6sHJJ5oY}hj>lhUxbYK-@!*AYyo#B8CCT2-*6eOtCM*b|z;bJepZA0l z1wfaiZ$Ho%N+B=z2>mkVQyxWd=B_oeE9~`^;$tnx$zy{$I~{{8U;?i#8DGiaAB6|| z>vX!*83L{Lo)*>IrwfS(S8Oc%oVs9bIjeU5C~l4hCt*lf0Q;OrSl-lX9CmdUf0kPEx;k%ij9O=%U0i@(BYK!JqHksbmsQdZ1Sq`uBoT*y8V)}Q-zUDAE1x%p zyC?Nh%^2G_Bjp!{-$>p{rg}|i3y+c!B9wXZI8G>&amw^~`;;a;bAloWB7VlT7+ z^Lhn3sZ8h<>;dsZl-&V#uj!NrEYH=k%qNrZMLf!-<)@oAu$HH6m~+A8zTNRlmjcgX z9&Y)lD;&fW*;2@pB*0`1$sZwt_Tf4Za@)Al zWe~{0lU8&bwsEMity=k2ZobTfB9nuPehi5KxSNPy{IZrJjK2qp3Np<%L6(duUmb+l`d6nYTw;BpD|os~{^KWA*cp>@2( z@_~|`a0VDo#woN3()J~+-t@BGWkBU2M%&FPd%^OxBCvy#TZQ#~99;na4`H!ui&2ph zHi9gK{NZLK!r_R)uu%x_8m{6|k_h|#E+k~UKVb1ffA77OK4pO`_j6_l?OGC8A7Lk1 z2!3lUZHS{k0O_;Uqh9d^fe!6PYj;W>+dki9Lhc6FsF@LBKnaUi&HZ@b6RsoOWt+16 zg3~ew>Dl9?q_ni+*U?M%=TiA#t)rAVm`M5y+Ho&|+)k$o7La>2j`SYAI^D5u!)nn3 zV|{7DejCyP2q5Fk@1*PW7?_|3k>$jU7@Y$1Em1<~TeS}~m2G7dFLZ9riWovKXwKYj zy>{2NcULUNo7YJPZWv^lCB5$40G^YDD~AvpU>2-r_Rr0q5(Ksw#CR4@SA32Na8$I_ zTvJtK?mw2x=v8grWg^Ad;2c`GVal4lds$aj&baK>%oKQ4_IyTvI@VDaCU(_Yo*^|d z4;tHj#c^1>=$8;tf4Qe*v7{3{ytexwOkU~!dgpe~+R^Wz{d(t5M^@Xt2j2NF-}y`4 zT(MyxfDu~i2@p)?FAKJfAV#H-Lv3Uda$mV#{1XB#FP=hyk6l&Q#L5}_oFjKFE>=3T z4z(B>2?B9D3_;a4KuoMx=pYnL-l%(?fqnLsBl9#NK!1Eovdz9(4;x)7pj8NYn8_J{ z{!+{-pZmZHwC$`yyCFG8vK^QZp(k6&>|byg8R{kzfqDrEz=CHzyfbp6I-y5fnTDJ1vFt(+XDG3yL>b}Pgl&O&$9Pl z&pmgn{K2loI}5sYEf!Rg7#qdXU~7tqD#}1h64Xo|AcC*-4O`7AtXLW}zVgrTo+Y`r zDB6~7axmS$F7wLW&FTk|50||=^$lC=jy6YP>3LaW{VG23AAI|AKPLaG$x-@d#D`Yl zTtxQ|NI+|Q5aC4D_w*uWzf^UZcro>>IVA?;wlnH60?nj~L{Riorrkkgh>5;l%|3yT z=$ZoC4F{?pDX1))_|C`a0ZHjgO!tYsTcpidk;q|YT_eCeE5jHgMsm*i!I*<#J?~O3 zmzjLGWwBfU`}`?fe~3(~g#PcWyZ>atRE~&zAztML7QLlFqa{ zgt5}nv2SZKUKym$8L-UJUK=ps@^i-*2W*llXHtO(wjWZ{gq(tCrK?fx)B&37S*shG zwqv%Jw(l>a=)MGr4KX3WTEiMRlnusL&_sU*35iwQWzA*5K;nozg^dGhI@dNoUaXup|nG*M_o6B?w11B>SXAs3HwCg;u@ zjDwn5COyzDAK`BLoiy?%-7g9R)*<+m7sTo><3Pl!B&2rC%|l`tkXbjZO{3XE*efB9 z8X4>}r})8(h7pKsC6s7$VEVyLB*Wr#6LRU0huj6+cG{9X^}1d#ucNX>+M0fxcu(Ql zpy#mk%HpufV7guvE6t-PQX^jV&BT#XWWIPt395~7caTR`rTU}QFEOIRobnLkj-Y{- zX(10ld?{jA{4+f8b3`MBjJQ_l7M;|Tf1HyZFsms^w5D0(OUww(D%xC*c0e+^c!C%Y zI-UsL(!k&SKVBlChpdJzs~(%|0tUa*RLGh_kT5Q*_B$i#7fyx1@x3Amoq(u94ne>q z3hiLSU`mjNq7U<*uaHnXjJv^O#9$RgD1ze!qP)|z>&PE3;XhsqFsFo||A8b`#p-B* zt7I{lvpB#S+HY<~zuzJ)A@llBg|sa^2xuJc;{AE_7(2ZdkEF_uw(WnV6}^l6m$dS# z(X=uNhBR!D=2Tk$iK&#Kc5*+f>&xHK=6&h@9&c6ypguAlBcYC70r93AEwo9GpG=G| z8AY2wnc*Q;bdeTrlf<46Yni-u1U4LfwRO#G$4^y4Hn1zzV@1kS52$6`dPip__Y*X zxTX=vhc2tN21=khFjkA*B5AKb7&F^3%^a_wr}_d}xegC2i=SBKfAC(n{R!KgmpQvF z(gb_cmP)bSq)-HS5Rs!h!1}JhKLWm8p&5RDOA0C;7l<&~0xzWOL-igA&-!wNRxP@v zY$Z^a#Tja5^8WkJ?s2fiE`PauRr2+~~B)cBI>rmdWwrn2nP7`Kty#3YjStj{H7Ua|WPYi$Qt-fOD@xJc!C5%T5SwJpO% z6tb_;_79nAM+f89H%CS;O}gT(+KEbZP&;tBK9fDo z~01@m$@z&gM5>W-?LREe+>mO@T*39W-{N}^$(d-s*`au z=VnUjz+GX-WqL zB4DnmSVo9gouzOTPFTxZHpLPzTaJmoztnHB>*2IwFmZd)4wiXmd5=rEV-ftmWWSG9 zp5yAWw)TM$2GAhpv=`OQm0$vV3oNxK!-u@}21PLaSlPR4KhpWmLp=7q>^-#T z2J~4ldYeFOpp6))2?@D{ycaF}M0ZZAm3?(m#(N#B&KSzKC5@CNfy0HhgJq%3^m*uO zqhHfeTV%hw!+s7Z23m%=-+6y@aF6x9>g^6Iw~tu;W*D`iGZM~L@=(zCKTkQ02hTP% z(UvkeY(xaR-TKF^K&I=58c{{9*!7$(>tQ?vf(`B#R)YxIjt@O(dBK+1wYxs;a>UcH z^98GN_G1Q}$2~(gj&dG#;5rW*I~;YY4dP<-Rbz^eKh{{kEt*!PbPZ%7Tp;IkuVL5g z+g%4+E^f`++yQB~r2@X48HoHp&-&K|f}X<#!t~h*klwdA zC`y86GAPQ{zu8CDw?&|hw-Ct>ARVLj0~pr-dLUsScFD+Jq*5O@b81%Zye*MXbjgY5 zkl;T~ArXeY0F4D+`*^yATr2l|^qsReE#@39V7dKB&<^9VmcJ(L*TOC$`@f7N{V$N- zzcAlQ-0UO$No5PZ%=onLqLs0oV6SF(DggodP`8LKQoMTHoudtb4N@50V+d%6;R^baP+%m9;q7OW*E1SY#+H*|o~`cVzD={$Yt#lhzdiL**`2ZYOX7WApQo;v z?3&W#p*SE?On?n(TgaWmwd&s&eRrx?am%>$WbiesJFLf$Hqb{AbCJS46LD^8bC&oj?y+21 z`{=Wqs$0g7)ZW&ZD_twwtH)I#kt0r2io}vFu&6Tq15;Z6grdc}>e8Ge>DC_eXUjc5 zba19rnHR0N+I4FEitNi?;sL_oWs8HThG%#s)#RM|ecwfB-dyP>VkW(krtZz0;U-MG z(OhBit?Ik5b!XE0r!4hXZyzc7O+2o5nUYQ|OG8^jB)3z6x}Xylq*7WcgVho)Mc->U za77Ktp}Bsq2xt5$8E*h#BH_3W*N*R(&UG$vwt9;bvq81idhcmvs2EV451s z{}jjIh1oHOoyREOzJJLSt176^U=I4ijh!I?xtfFJUhaPyF6s|e0NpS%1!Ncg^NUaq z@YGKsVf*tl0m0=&066SCS)g6xQIhBtsHW4$o;FmvYoD#l>p2t)%^~q+T>eRJwb?|$ zHtNS&E{pa)zIY%!SZ$}$Y8Le`3Y9Ydwy&cMY2FIfHwQxg4A;3eIUIB89Ad}`_QQr> z!$_$G%HMaNc~ya0@7UG5Fv-2DFd|^rYGBMl$>1(P=F0F_e~4!{hEGCTEQ?Voe;c06 z@TFW+pSup_$uXAM4A*oIM_B{0wD{~Rv^*Cb&Ihj1s8w#hoA+JZhBR$KVo27pZ)yx) z>K6%*2urh$Up;A9p114nir*Y>%*hN8+Py)ZbwcgrAoIe4OWVUHoF!`whnZ^(8&_}+K&;6*biOsEY( z!)^@?sJ;C6@n{h8Ocg{I#ZSUMF0ZiMmJ|P_b#9jB0-N<4pWf^r-)0ws{^J=DC8)EW z)h@HK0_86%hm1|*H*DEpX47wd+OBTFFSVp^LJL;-JGaozqNGG_NJ+R2S;5W9M?1J` zB=`BriHqyngJ=l|w~8%=cKB8!eM9I9jB9%_DMOrm(8}3mThEexTVg1uUdZFmMFEf) z$0gzjj5(TyZ=pjMn zbduFRnUF8whP3)H%vK$4U7LT^WnAD(+eX&LQ9i`sqd%&eF!t4S+|4np`8 z!WJB2Fwj9QS9G`?f;7v&+eB6`H0%DdS&YZ^Xys3NA`vrDiB|#53HzxzTR)=Ctnk=% zmm1<9G&fn))HGSW)+#x_Lu12A*7s#SQ~of0xnzDqdO9`G(cr+@#TK`WX2~YQB9;q< zi|3IlrBkgIebAcVbFZZM;t=#97<=>#^H@8dglwzA)$cdif1c~xw*Kj(r%hT+-1;3O2u-x>eU?djjuDy-R3alRadT~^H=*l0z zdo;N84oQDq&%0tiP09C_fe=u(;zI6JB4pGT!;WV<<_SlA(XWP7J?-X~Q zPPt)sgKg{Sm6Rrr zW=-ZsNp$PJD&;zQn5J$y;oSv&nmi10K*QkBWAv~`AU0^y$s88GBo{iGaM6ff?T;pu zl*TUp2gA~+rmXuOYiR|2jj*{cSE4{nXlOu*@%78o@yR@eO}(?Ga{4BrFU=`WMk?s` zXn_MHdTSwQWObm?c3nHCy&f8k*?jQWLH3ZC3^5zA{SU@Zq8j@_8iDb_9@aPHrLnFc ze}9Dq>HZgldMM=v1CumPLaTf$Z6P%fgbWDPez@;Q&bo};Y0F84wgBtCF@ zwUX7n{nDqC>6s^+wCBF{i%I}XMZx~z%l-qWU|9f9|5ReLA~<<79(Yh`3DtBUATAdH zShY2V0Q%{$zgB1f;e4JzpJ!KqWK_hbw_+0#eO$G_-ff4IQ?L!GI{LO6=eqJp?UfPua7wQ3uL3aCl{1c%NJ{`Qk-|*8uL0Gd#Nu}K3sBXtO+*E#?laf)za)+&6`L8QbFLdvp&`Om{ z!Bx_#YV_;ZmTbO!=kd-{^6(UQzU+X7aVFbqYO42CYGmfz(1|&FC*o0Yvy|ZDoEQ2b zfoS3Bmi$w)TQf&%MH+43B+E{ze-e>c%QTuKnes%%B4`x+K)|Fp>S8+G~ocXiX$wC!|3e3psyoG4rtWR1B@ z=qQSzaMywRbrF1BuQd!#MbbW>;N@t^t!$h7M~#()GsD2f5Pm$7K9^ zNwZem{cO6<-(BSE%Pv94sI%$m5>4_)?P`NnhgQ$vEwS4j{2ibsh-;CTgbHHI5LE;* zFb9ZdoG;XG4!S>qF*FITS2a&7g`(+(Qv~8TNu6NuWTeQQ_-GvQ;PAdv9P!4Ti?p|& zIQ%)-cE!vAT9rf|oRIqDV$G>lLoc23{k$uBhjP8BdgkZjE!7U`&WLi67BtlbkiXJu z+VM$cU&WFBrqPVSun43tmd_CEW7Ruk6}^PpZG@VkJgy^tMqlP{C5|;S>0-(gvfZ_2 zlewvvwwf4D+3a*)Z6N!+jqD1@qFQ{XZMA5*spKYr%1-b%@xvUnut*Y!i6j)D#b|-9 znF($WbHKiZ>{iQ*i-tZvjaW85JM!kN74Me1Nb`xj72-Uk?Gx?^acB@k%l0D8|9FW+ zEK~2Jq@K{6OyOwf$ecSKQ^to(Z2tkdB;+> z^UI|~7s1;An2m(qRVefhxDw%(+i36XaAgO=QqtjC`v|E>5gKS%lZ;_PWo-NMxZq>! z@vf`)`=;FT)^>KgyE$KUeg&(|jpNbF6m9CDOflJ-*lA|^(LHsc{(*?ORX*|$$)pMI zWrx~9g-AhFSQt}q)C0ItLg#?ZMcKHU&;;DM8@`^GRia{dB0tz%VCf!oZW0 z4Pp3cx*T7+X1SBEIasw?~L^Q|U!-Pk*f_E1$VEAN64Dc5G_Gk1Eu(Z-RA*HnNJQaa6 zPru|^&Tw#MH){_6O{=YMGQ-WV#%6sf_|}muNDQC&6lZ|A1qBgL(Ce(80b-i7gvsO1 zsU&dd=YUnsRh?0Hn!hVpPKVL*{kn$AW3x2}CN3S{8fdD|KepFwtS?#HGqE1jGKuB> zCGQS)nHOzu_S4!8PT#Fd*NyF}~EnR5~KJnZZ~;n9<#v5R&no39{|NUW7VWtDNk z?}zD0Am2lqQw2x{ejVxOOeM~J8ad!=(1foRT;q6z`nB+M8QzC8!#5>R%}y?8v|Jq> z+bsOWOepi>M~MeWRlbvdmUw6)8Nh}e2DsT@BO>(g5m5r!T~{TpcE!7S)~G4Q-A-$; z2J%2?tPyYSpqJ*{w0z5CA1QtK^djUSvMKP73(7m zgbWbA$KpH0GJLn-WvUCNY_jcCYW?cuj0dX4kGd#+6Plyz-UHF2qqJztO@9*a$xq&8 z;ZuVq@t2RQ_ySE`{C5qCgN32i;JQrtv zWHvaL;%IsIr&s7vq~Xp68$&_JgP21khN*D!5UV4E?=8MT$olUStZKn7V3SOA4yFmh zc0Jpb*0*T3-POZn+e0(KQjg4&Kh;d^5HCdwrmqm_w9dMOCbNhN+A*|f0`Vpr;dv~7 zhjyMt&!2WKLeDYDX3CvjE|}7wL%^grEqGZ((-=LY2c*;QWfM=9jD{&#TkXAHQOduB zDAKxPLWkIa4Tf>8luPkS?}x5W`SwP%Ju}qh^T9ou>n4mJR*`CZF}_PtoeJBTg|++{ z;;Wi9Q_zsuT?;~~-zR4ax3jrL$Wu`3*i-i?A|E(>Ic#4Kqu!}ySnP}T^wR8Vkrq^; z!*Rm^=oQ=mu1 zV|y#b^tE{Rh(!X~SsX7Ad}{7N->=b!T~(Tw%f&GVU%?&~ii9;_UX?+(<(iMZL*a8y zKFiHG##gewrDTz+WPseu-6MSHbIoNWs|HVWI}<_=?O2^LgQV#H43W4Ptl0F&ZNhYH zaO#WXHtM+r(RU{qn!O+a{1dSL^crc@Qg)_u83c$qV~Hs|<|WpU z^`dUg1Cuwt4G)UEOoh(WTNlby>-|?rP(cxsuRMzScYCJT+GQCBd^UO(;S}Fgv%c=w zjw@}-gUhAF9ll$y5y}A+z%H66AuqPj%|9oi6${&m93?kI)r{{=1zdbsWxn$E&CN1f z1C9Brv&3*1(Z7=nB(?qg5J^de_)swRfK6=?BweYfh9JGwvZp%1H@P(DN>18?;|C^D zmrXfYG;yhQK*8TOrOBvlHCNTgI5o6kMW@5ig5Ew=lsIBr@gGwJH6--k_?<_o@?`N? z>cwAFd5(&r_5MoLn2X2x21b#o&B$Pf!I-;m!k!0L$KL=4gYX;(mED3wOD*PLIUVV} zQ#&{x2A1)LeBUbs0)HAYI`;ccN(ppKpMB$znQ{>`T*adr5*OT z%z!Y+n?;1$_xKv%9aN}2o#kO?+M^4u5=xobVXK|?N2y&{^sKCWg2lTQudQfNx5;V1 z)YcNMMsR4Uv$(nCR4aB969hOj(2flmplI#zSfQ1|j#FKR&jOk-98Ls$u-efIGt3Ct zM{e|>iBlKlt{#_lXWd;z4b>}UbHt4orXllNvGqBJev+VgiRQt+IEdz>?RbL$(D(#8 z0~56m;6=fY7lCN0;h#GcS5kPZJN~B|7DcuFmT<$=Y2q}HF5xhM=tHdTW55-iElxt4 zZ#YgCCz{Qp`EUMYLiN1&+40V-;1xl0>*GZstRxaTFHu$W5}*T|S!7rlJ#Ra$>Lrbs z@t|25cK>9u#R3YxC*XmILKMYQ#8IrF6!FwOadz$pckH&(%)cFAcBq0B@D(!SY{`O_ z72sl4OGZHh82|AS2~`UpX4C|d?IlqDuuF~GgRUAsuV)2b%RQqzGy*F~heYyAO5KE$ zVVp`iD?ffVH!p^@fwSs9duwKJ^Zmey_qI>4WcS8)pe=9c5NY3TfURU?2?6rWLh{Bn z#?Ulf&VMbA&%o-Lt>UsGcipW4Hscc_XolW?WciLUOZ&0+eH#Gn^v7kF~mYP{b` zi@;$SvN}F`SD@38r&D_aQi<2l50vVXV`BfJ>x1@@r_arA%dMp7`PH&fuCP)Q62{S> z8))SydGCj`b!w{k*MG_rZ34m*6%3HKj4FS5vB6jb1q;<%*O#0q!fQ>cF;hHLa z`?h&kGYd}M&$4{8K-a`$#B12JyRHWoDrzbU*v{mVTWd?M85+UE%-S&KH#Mijry7)a zOla`FwYoNzfK&iXY4*F-lo8B1g!e!nzH(bWGPr6Fz-fT&CABvMiTt=vSaYoLHGCO% zet9--eQ-?JZSP~>bmtuP3{+2se8_Fhv)B~aO_hv{mk@^U11W&6I8X(03a^hUSOb(} zBa%MUT3@Ty9ksaX(QnjX&85$1a*Z7d{I9WfBX4`mtnW^|>Hkqmpmy`LT@B?43E@IK zNPgaVpDdp8Ni-hx`wMBTGRN%+OnQQXAMB=ZH=`5iuVRltJM+=7)(t~pebTJP{TWwh zUR>sUsH!n;h7qtj_q6S>Dk8#0`^sqVSh!hw88)ch0MnVkRc^x&ETk|Ny~;F`&lq!L zmf0ze4`tvT>{b8U(*tTRMSAa= zxjtwC^@K@bLZ2Gx*|IZ(DJb_VLV_pW>jU{jSt$FMQ{LI0{!oHiVE_CVVCAO%^|as1 z4#bqqup5M2ywWxv$f!J+%S)}VE5JS~l_6|aJvk&#IVj(8{0DzEwx4>1C8?bA@iQXLi%1zUl-Lieg}NHF3`({vE9ck)z( zn`*e@$9k5|n7HJf4|yYr*f36yj}YUlmhdWRm11diXcV=CiI<`n6Hv`R?(TT}0>L`S zCyjmhl))hfu^dW#?5h<`o3k}HK76d7J&~3Jxx2pLb&J-aD`{LIrpXwI`XOPhbD@Ky z#&?)F7YEr9Q~=qZ@D+)(|J6e8;;@C2{`i=*aCvLAN$tQ55V=RZKC#>%mYc~HvNYq- z7P&ucdxDY{p|CKBS6)P5^FbeB5l3W_-DW!$897ufaPGLHvh zK3Ry1qi%i`>j6RxneRImeft-=m<13+V;tgQO|2D~f-Plr$%f*Sc+Led(J1G4S75s&3q}@=K>KIZ(ElD`l!> zhlz(IOV{Zo+Gx=-ftD=Nu>nGrr=isO>pXF7${Wnlj11Sl%fy)**YbtIB`OPTYmap* zkGHYC{$TH_NHCDbB!YP{(E$I37Ioo&^_%pE^dc;C^AnM+FWH87@=22A-Eya6vy@9k z1+pgX3Q*MX2pX~bnvAQyAguj7gha@Q0X->#8UCwu02RQ&ZHk^nxuJ^t_~4wFRJZi2lomJo>z zKPz`OeD2`9N5Iwb1&54W zRAh_S@1(7IRPpr80?kis{~xcRBDn@sGGhMS=daTRr}8?5wq(HLe@-BX0;++Ug=54Y z;qa4rm^gq8n{YV(u_7%#So7#VUxIQ~2)L1pI1F8&LpA!Hv=^Czb)dkTL8O1ZltF50 zGVOHxMs8^5q}>*+z^B17k4{^;2fKH^p0Qs|-SyT;AB>RE!bf%b?;aClD>o8zP0>r> zz$?IZ#S*Hx#WI%bG|q58x{UU03V>F--$^rk`+adW&*tu(vuiG79Gm$UK285%L2*<{tFxW=JZg;a1G8Z~{P6#|*JqRc7JJYk~S^C3wuOa99%Rn~zdl+TVAsB)+%fgG9-|(~RE6(--kZ*Yb4?sz_!2 zS8D@jW9Jb?xUYg_wAOc&kEO|@2C8OtBMrP~BhUU^Tn?s^ z3XZ2^|6}!34*`|12-o_tLkij%!N4eZ0-|6SQTRW%2!7K$C)vcL{g;>OS3p-CG-*^z zCN}~gV}A_on2jyAM$OsWE&6qC9A=pZ!_ILfSMz4p^aEFU7Sr1M=8~W}ncJ=3kTCdx z(+*MnH~tDvrmn$|ZW*I~YU^-Mck)hGrt%}(8pYK&X3vb@$U)xaIjl5+{A#p?wT_BZ z(&%g~GSGm4r5sienQ{mfRuBfevieyq?dzevH}jhKBm?3(RdEq?i}kNFp+MszupyF8 z&yhjrAzWL=$V$;ApY)IsyP+eS^|%NjFC$X&KOyMjz4MqZAaAw`H|V`{X^FP~o0XvX zwKr>fEhQsy8{03MTHHiog-v`2KB=64zY;$Kd;%S;vKB&k8wW+YP>w^B-?`Q@9V&@dj`e3~Q3$MrPeRfy&zY(CQj4aSKIDDrjP=gUEk9FKHqExLORt)N zt1jc)Y7uLf($@qc>sKV@vnWs>XBAL1O|xI~ zx?d|o>RY!x=r-Py|MCVUaQ2P^x{QNrj|hDnbb*hmtHECEKB+BBoMNlO&0XSyEAmB1xxFl1dsm zmSmiDP(%o2W{~q?#$haG&FcLP?Vi2&eZSB1y!RjPAN#XEYqhLd*LD5QhwsnAa1^xP z)EC01NV^=l^|0I+71%inRLxd@B+)$f@)IO8PUh-zbDyvo(>qm_YN|fuRvmOppjbG| zdaZ63A3X;4nt>NUC_;o{ytiTLIZ8On-H49NhrTG`g@$oh#dNU|pc08tkV9vy&Z0&6 z$W53qsKEr`k7?EB*^+4$6saXSn%vQEdsz9tsj2tgFQWv($CKgX19&1}A>-rLlbCBv zw}FDJ1!zk$=c7f@=%?$K4<-~;mF3-=KFOMfZVobbYY2RJ9-=(Aj}yPYk=2>Tz@aaUGHDRurbO?lf>%_tG4$KN8 zKBS32c1C6FLC=e5<8{{z+S=S1@Q>$dup8nuQ$JalV<-M)cH0)?EpHV9%y!7qp^rDv zw{N4Hn!NWR&^ zYE>QE&FTG#=99#axd^E&CZ~fA$nTTXaS;}Lhs1owCpqkl>lncX!@bIJ>h!AJjlPA! z%U*Qu&L}`Rd+qg;M7atImDswJI$SQ2AfEUXtc$CQO8Clcq2ArlyZ`DU@!lt`OmSPr z8In6h(?k(93Dg48$mqzl99MV&h+hpxn=11V!j6S}V`+h2T|)tFVP)pya-8t^zMD`M73Cm#O5F`u2OvVX%B_ zgU7+M9tOdmU9RnBt}!Qn_qkAxZxf-}tOGS9&GN{mMUOGrm%!$q^1ydI%{fsh6Ck#0;C12``_^edG`mGe){_3Dlf5S3eBK{2^AywelEX_lgJ(w8)w-1+{ zS8{Vf>pG9esnLkd_-EK^HsqPoCIu%twAa?ZPX0un;rO03*HZezzLAh@pcZCoiZbyv zsvr98*DkYi-p7q-VqVBK!1Sw1?@8bJcG&0Qg=1%XRv2~+{^!Lh{{|;p)GzVq+AVJd z(pKZm4(p&wL=#siBy0+ckzLF|huS>xWMDGb^JO4_Q+am7u#teFNcz8GC<=aAoQ&TV zr#V>ysMHd?I^2rD(RWGM=xT|74|?r92dwAwHlWve(9{kht4TiT7U$anokdzz~Z#G;CIH|U3uwC_U@ zHf+>Z=wAqaT1Z<`9QTP#lhdM`Y?;S4D0_bZk}Y?U*>8=*cI_RnvAA}N#|Sbr;yy&D z=ICE}+7M)IQZc<%Z{qq~(SY;0*bjJ?R7>dq3lu zu}6n>vo9^&Vl~ak*wjvPKz~_d%!2GRHbtq8TxX07cQ6Ygur+?5x6E(T1$-9Ad~USX zisxy>G>Q`JkVYFJ%)++(BuVLkbCZY&?0>3 zvLpohGj>N@1B-Y&M}`A5I!UTmYI0C6xXvx$%9iogtMYYR{dj3w1?7&$%+TPIpix2 zJ#CjCxa&(+?cUL*x=W{3lavWvVJ;6|*YX*M0c^i7r!r|=$GHb+R^{EAW?`;oQ>V`b7aDH+NTBM>&bvj)fDv!`YZN%rV) z^ky8P%*78r-gUUj*255g7P(;N&WYSL6LR$ac9hUadl41`=0KzpSjk_lnS*=01#>76 z65(!2>av~er&xP5$8vE;Rqn&GCoB8EGH#roHy8R6Gf`lpxd0S2&NGrbHy)XVLmZ770?^l_xDsld~7OUz?`Ef zswC+8b7sk}23JaPLKg0~fxsY`7)6wrE#-bp?EcPvefF-6REw4Rl;j10EBYW86nmb2 zgm8rnf+V5m8qDk(n*tb)a#nJK{YBr+z-kBX0(YNE&*u4*Aaae^A)_yGRx_t?Cv?hv z$kzsse_!((-3{J!k*tcqu74Z&N&2G!UmSFwQ0p# zASi6H+&sxm?1WZRwiQLv_g?>Z-Q<(+egv(F_P%mS?Q2uwm}me$ee$28;k~DYV!{)* z`bQD-Lbqi^*4;cHxiyDoc+)pd;%&*IbTHc#4eYE;lcp?o`o+izDY>(j&7>7OxUyd@jDG8wp>BL$`czGy$cJg)K^qrnm^ZT6Z0(OC}U}PMf5sK z9#I1;Uw1^H60{L!vVNUISX1&qWwfJ%MvNC9NvJ8{cukR;?ki8cvJz6cp=y;(KhWT5 z*;8LU!$R|V66&o^&RDdj|4XLHP%&*TS|HN|vGVb62@n-t2igw^oG_Gl(BPo&k#z{l4t)fqKRz{vDfD^Bh5=~In9 zo>$gF>xobXyXG#>La`dOjSLisj!ygrnJ-W&(g;U_hYBYgL;D(_|Lw$`GxmcZSSQ*+ zJ1hGAhN$=dmfX&|lKlz7HUABGy%>I~kW0ZcmSFD7&#bcYk#GdlT@pPMPP$ zwPomR%VDNf#Zhl}+>nZj{IvEQ%nr$1-uSZbk{>2hbQ%uQyOsz!LMPdpddJi&8vy587VxY??*F86?DXdeb{U zt0YTU>HA@?lm$lllQx=q?xOsaG6IliaxmH%lJ7yx#uzws!_j#r_H8U&UcX?#8s?oE zQ~hPuEKYy5bK>-YdnHWs|GXRZix3xCQ~&Z`)Pfr@bMK*n7#{c!Bx;gLEemAZHuA_S zMA3hrC|p4yNt1*iqyn`dingwlGW1>)+!=&~6rF-C2*xj%oE;^g`oUI)uR58rvwnmMSA2^`sK^N%`K9 zV_WD)9X*A%<)EXAs5d$l4hBYvfHu=YVZOS`ednQzr#a}<&TY4o*I8%1ygqbTZKp?B z2N)%h`2WFQ!)mG3?=TL&^+}%Q%jg_XW*oP{+@2Bf6xgWMkUhUpX2FnCr0PFgS zzI_Fw&wKQSAfOZ&vS;>EH?hSVPCPWZGkwcvbCtEw%zo`bsp^YUPvb}v%Shr`4iwBf z2c*H8+e`s5^kIv+iaoBWx)kW>BTGo25CoA&mF{JaUp(I#LK41(pE3Pt9O~!Ugqhm3 z?F^sewpr)hz}iSh^<$s3M`cu{x#4JwEM%)`^0@Yhh+VbOw}NJ5bSQWv1Kk*(O!Ctc zoW`~l8X>7M5xqwTU%MR)FWCD0+TxTE+qDv?O81FPjP61{lpVnwdeB*WN6^8UjOG8s^fQMSZ(UPW@8?` zF2Mgd)h2}WBRJ4hZG4}h2HOIkZ#E77&M;AkZSHi7o9akR8)K)L1nT>z~fkckfe07yt|t?4|pb!-=AWQT<~knSG@l*y~1?k0_^+|GS^ z`(@rcz9NhHLffN&b?NQLfQh(jPewZZC=jzU}4LqaR7WBYL*XK+0?w)|lAtN67+UG-r zF=KJJQvB*0aiV}KnpOe;o^6D@hf>7I6=#$MN?^9!6?`w+y4(j!BhV$=YzS}7i5El%WvWgV~1C|zPF z*$t6ixuP@tB;c2==eK>)%)WHEckMg1rJqDd*M?KaCQz#&Eo?v)8Jn@ZCS2lwIXtfG zFT>+T#)rq*OU_!^;iSk6&9Oc_!?C_IYiZGW=_lGG$&^X2viE?e#N-(9d?-C26mY1! zpnOimXDs+sTZ~Q`5|qoY&wke7H{s3O87X9AQYLlezDn2VA=rfFkVl=)1B7&_88s&- zqredBkp4-c%=aQfaU>Y%oWgAj9%R-AYkYz8tQ=uXj+nQ1g2M-c8>F=K&AaaQywk{i z0zy@@fIK+%bCW5iq8Qx~i1eY|s>q;=eKox96U^{VzoNYfOXIv8{IDr`OFDbgc0!CN!>O_UIM$P4czT3#Mt@Sgl&U z`(#(D)I~AL_Z~<1YHy#*HO1gjs66-&Mtu;gFa-E1v&CYjwojjiiFq$2Teqet^+~sj zP^;87K0`ZtJ%m$g&Ek5;twT5wLJ~df!gFQMt0vM3YBoteGTAaU*HwkTP0<+){qlFf*+Jn;Xd_v085fNsI*>Nz1!i?yz`3#rOFL|7}oijLX=~;5dBpd z3V9v9AX8<|NQd=9<+pj&|K@Lbd8LN=~pGVRD9Vm1d>S24C(8V?gOuFtFa5vO` z9dg_l@gYjNWS4lc|6R&Ggu9(QVnCNi-zX75TH@S!qL3Km%OTYG_A^M{8xh!Piykm@ z)`8i@w4zMBmwsJrn2DRl^T8FqABVCM;P8T@i0V?}Py~JrpulN8P9B3+gEQsH~j1^;Z^v0ciQ`v zaIB617?**XAzbT-5tDLRGyW4XPiP?+{nWnhf&TCB*RBIrI`>W`^iD`9monfEnyM_f<*sL?W2D^ zzb#vso1uel7ADLgW~@Tx7Q6vlBB}qwkRSsiQ(m*U>mjH<3kQ|H=K*nDY}6JqVqb;V z(e|BisL2!qS}i>#vAcuY%$5wvp>S;F{A0FO^%NFs^q;z$carh76O!1Vb)$Ci%7te@ zqC+FvM~|Gt>8&u&&iePT9=UH|_-Ek}xuColyU^SAgGWqm5hs|U;u$lnoOrX3aHo8J z+-XhnY&7HQ1)Hg3+w8cMP#vN+;fUwWw$K&d9_|eb!5}Y{CeRw@W}-bw_Kkyfl6gvW zt_@P>P*Mq_cBZ)Bn0R>F$Q9UWNU#<3U1DZ=^vvOYD4ks%;HTLnMvZUxk#na`Ghe&@ z?j&o}ew2v^GLWt?It=IIwDG|Pj;w7a3#6c z7J)sOP8CRB21#6_UeixK@-e_zrGN zftgy(fdNK_ic$S(`mAq#v($-0Z)^Zu_BgCSj%_OtuLBZDU>qIW|FL*qIUokgp|v2? zAh36n(LpCTF8h)1Z)NMLuJ5vHmwg?mMTv#N zq-#6mi)WEsRJZaOfo`z=+k~{GU}v_zaftpb7va|7rrd=*y-S9OVpnaWdQAd+pR&VY z_`IHXhQS+1T78r+n)vi`!nzIEBL%2?IpxDwMyEU>1(v18z!UT{> z%_XrUrQq)I(2AWxlMvDfy;-R{mTTXf`AYHh{FTq)v>&vBgt^o0X+T+}4HC^snFepEy~ zBKagB!*+)PN1d%gy2sG&2F%HiC{rL4hyw6EBVv#oth$^hSwDzOcPe!~t#m^&c1q%u zSHp?|I*7)z{B8GUwZ;^ToK{$7=5k`wJI0UKd@9hz5St>9ZUDO2A!FQ7L6_hZr5V38`|3q+1jrLj+S`NTR(z z#n8plxaVR2XZz{;k(&j2Ssl-s)~RmBKUB2w7+X{pxrqbr@Tv0dc;G69EMol;ThY~h zQSgY^a754uc++Zx$_s%OS^+Zen!|NCQS{(6FWBKM(F65RSh^$Eg!oFC%XBRdAr@e( zxgQ*fPu$WVU9*oa9x28#suf?~4Qu2?{FN7L?-1XResA(LW|znYfQc(60muX9*F@Nq z9uB+57S@}7lFYr@S-<05Mpn!!qauZ+vnVI1J&duhWfibS6q7*ZU}{qlj-78*tzZ-E zy9_0LP>gFK(qwj^4T19)0ANc`M4d$zWLvby#93=%5%N`3HR8&?LM?5S=K{Za-<|rs zH~HYe{#&)1XSh*i&nA)Rw7b`hW^vJRK7oqsGdkdn3ndvr`l)~?}DFfF|vLvXNXbkJtjnr_ml8ajK^ zU042t_{nW6EXW~|+5->yf60p5REct?Fp#v~7MEx6_tczxy&6n}Le+!CEtUq!txLc4 zYaK#jp&kz?>mexi3yz7ljagW2J)r<3MS+6@eKjcN*miLRR9XIr;GYvd%QYlE!X&OC z)_In6#KH?$Z&x8(~;aYKtMJcv4gNp9|d zef5r$0|fcWo`Utb9VU3-o7&a1Gf^0?OJA~IK3%us%pjxY=~$pi69P@m%+W4IT5pBq z9ltG@BfBrmYz95wY-O6@SoDea<*J^MZ&u>e7I^!_I^lKXm)<`6*_?bgcOj69AFYh0 z$R+MKt)5f3aZZnsSLQV-3Bh2&F0{^H?Hv`&uM0gE9v7x(fxH{dNkI2%Qef zBr}6fdIQwz7z-aXxLG$Sylgo$O}l?8(;T{GSpBEW6i4Cg9^48*;@~j;vSqtO>kT|Z zlsPMNiG-%rYK6`__|YCZU*uYiKP=I5l4Eb6U8+^#$r0=Irh{W<0>VM$m}#D2;tG!Z zho3VXzpL5uj6OIndKkE{{|jfq{-?+5R$&tN>O(1`i1VnsBQ@y84@eFbx5K zkMAg$VAGd%!s95jJI?B8*v z|8q=f21JRDkk5q**88b{A(V|^q(IMv#7}mUogS*PYdE3P6yi=#_+k5PzsCt2Sh>&HGH?3jZbTl z^^<^80?iR+!%eL8fEJHoA<0ixK&2JGAZqy8im$sw;La|qjNixgeUs{yrO}`XL#Grk z2hwJxLt!m-xDQ-eOeioy^L3gq37(@h7MZ&w%Fe`hU(0p7shbA3bWj-Ityih0=MIWl zZA}-@=$;4f=AO}atx{9Ob~HhYnqe-J(K)*o*PKzz@3`mmTIovL3c;JC;Sfk`iW)wG zH9-be3>ymtwuA;$8~Zbba$e}KpXb9fAUlIK8${3OjXiU<{X7i1gRYf!sN%iwfsohx zt{BzQpOf2stX?QI#4N^rlxtpj%%K`e7nmftS;1CY-0lU+DuqQoCUfm}BkrceCp}J4 zMNA2~y`)Du_5raZz*6OnHg{6)d*L~>r2_{-rNFz)kB~(9;9$+XZ(!~C06z0a1PhVF zr<=%)s{R1(1*4>>wy)CvvrU{_o*s7MBzbVP6_~QXc9#>;!YFspUuRDd~u;cq3CJQ6kWHMb&7f7it3;kHd(Zs zEYNMe6ak-(Thq1>HO#c9v@({0I(F(-Z1wu%4|BaplfRi9mq4kC_(N1w@!x(7Ojx=W zm{l|<09+aK&bL==T5w|}`Z7;={K)J*6_UM3A&Mf*Z3B1P5K^Av|w(o<}D97abg{^3H;y!wB zEeGas!hsivHGlWXr}@+)FP^t#4#@FNyDBq!TZa)BI`Jy2-w;P=ke+tV@rDjG#|WWx zfT_8Cr&71*;Afz96wZ(Gb1{XMNiv~9^pA)3g|&rC0qoZ2QiD@*ax50+e}Of)pcn$s zU?ztokd?p->#`seS~6VYI>; zq4M7U6?huIPF4>$X(HFv5_(&GQ?0FY)QCGeu?my@o}Y?TPzBKu#}F4jj=*=3=a5H( ztpNy{CxD(F1N61oq|hJDLYIGc7HQ}+&)y@8NpNPsb6*BVfUK|y2Cu)x;`!VFas z;wZ70N%Ab#;=>fd5B%lArxboNSNDFivO#pEZ1m@>{x3HqrIYVj4lz=-VWy|?#$=P5PIgkleaE&-ArQYLbPU#kc}$Wp8se75cCH#Ce#ws+#;g-UCU^vc*0I$ zgz#YrP2BhI5pLm04=CHr1rP&jf^QvUVMALdqR(ic?-t{ZSRGFtpekaMadYaHL*A$B zJ+$Ut{NC{9^rpC`0ELsSOl!mi!L-zf_hys7R*sqW{Z7;n^y9|ZcrMcMjGul z%r~=J_FiCr9cUfgi{D&Nz>XE8FCw~Q$lY{~tW^Q8OZJ(6ZcF)_>$>`JE&;2xdzQV8 zSC9tmUr0`Q(x>@>Wj(nxFe5@LHusaEqtE#=qPKSl^FIw_xFfK$mrBQM4ysbqnm^b! ztt5JAqg&3IlLMd=QN}Z$_pOjQngPNc3Xv6N+kU-6uZuM`y48u1g%h1$>&NCWVor&P zLw>uj;dr7Vei+R+M_PJl^F4o(mQ4nfM3I-s6)3~yf+fGmO*lswiX4>`CL5@@I`}J| z^yq%Fb@kKYERTt8k^b6PTOZ{!G*awEizOg$I12q+BwAAlUH~Kln)BTg7L3S3AWK_S z|NGuk%J@Ang(vc#3w~Fhj@#MC*PnboFm`VW`l}!nnh$cp4*shpy`p%puU&Hi6rha{ zRczN1=h2%1wR-3t?(!-9ec&j|yo)K@|M^0NP{AgIQbT3l70WLscb@jvlyTdP7~D zY1%Tq1FGpkfCj*K&D0Y>_zI}25af?7*ct11B$eKI;CCgB%m={>6A4mIU|@n4%=A-I zWb#>~nm1M6*&6>SZ|u1R<7*6N_u)1X;p!0(s?DvRPIJPWK@u_wJx0hmNQ2ObEJ~8@ z;FOPufsP%50#g!A4lJCg9>9n70g;?Z1=U+gZtw@cih`AVsjx4y;`}7t?g=k@CcxSs z%5er6tZV{-S=EK)49aEnd&EcviFO_>>|WT%-t|izJSYRS!r+Ehgc}53sv?L}8^Kx2 zTi<4OE z$@_X-JJhL2`6y)VkVZpSQ-}MRppV!IfCJ(aQtCXvnW%>pv$#kv-DaMHmyYT0EpQza zQ%d1&pi2~c2;UIrTP62z>p@p5>GCa=kV8^RJkK7@r%#}2ThU4PlMqK%wb0pw@>ryE)Lmh!r}{7+kIKg0w%O9`Tf zhA)9#E&dp-6`@y4vu3Q|4PRPOK6-R4e%y7QP}LJG1PbVq6OP7=fgt?j2BVoSUK1t< z=r_gXxB`U_baB6iEEv)gnSR$;Fqx%(8}MVPyIg@0Yf45@bxT#twMSCVU#~m)>4zeg zP8y1D446Z)rIj|W;ILm+ky1auGX_ei&#vd0=yy*1sq`2XLtRCR1z5rn*p(KpV zE5$WZz+Qg>y}%UAm)Q+pw(c1++({u8FvHI*UF{|=0L2v?O1wh{O@LEr2_Pqdd;W0; zL|WcZyf~C%zliw9YyNr74EK|B0Eme`LOM!djnBq9*nKh`ELp>r>crHS(LZ)rI6ckx zyqkB%zDe7&c>c$QB!Bp*iK1$W3=EicpA-`Yb=L*7Yh&dgolx{$J#Gep%?qNkmhQZh z3Sx6Bmn=*Fbn3x`GJjHQu5m5u!L0KsbSQ4T_{_IJOAmlj-rw7kNY&d?(3G14apD$5 z&=PyVAAnLRIZC=7euFU!{km49Wvl79>EBL5o)W>zL}0`LB~!0BmZnXVk2?Cs6wb)I zn*8PHe<_~my=G)1%!>>sM_=nRpG_hPJVU37yo zIs zzak@1IQh>fk$>JGN+4w3Oea*z1rBIMw4P8H3RWt(7O$ApJ?PsQkt7`Zh?FA^2lCqXp(+g zgusq&tPo_n=^CC~zVl3Y>sp>fOUx;I8TBLTLF=OT%1qE-y@7VJ&ZXxRXo$}Mm)0xE zKT789^OK>Ej^T_!)z!1{Lvuc#|K}EuylyJZr(Z%R4!y+N;{kS|9!9_S4FF+?=HgP;`Uu)cB z;F+d9>!yzLRHj=$z!w`^NTj);8cMQsc`iAzv=x9 zAknt{3n_M3;PSvJASiVy0s*)rN|dh<`o~X_F-?n}Bg}z?@5h%(3xJodfRHj0L79}h zIx*C29(KZd`5%s!Y6H7J2eqor)rKOu`$zsb6hQJSJyXJ)^yZPT%Z4|+sToTH3vDk0 zEVuql17(+U?H2?Oxe_Wz-G1YWWb8 zo1u4sAY(UH+ip9cyI{NbD*GoNv=j%+ovU%6p!|ifDM4{r5NKV=j7E3nei6I&yz7id zutDe>AN%WTTn{SW*e&(xi;ArxuZ+pvg4CHPJ1d(WmU4Ty)%3}ka5=918=`{JzroMt z+)vWd4l3qb%{8Qc{ziFdLo+goS8rr5OZryR|~BEFx5n#Z;o=X&^@59zBfqi!?zW0yC|=t zaS%NDAVypKxD?@;GKBXdPOjSaANnfSPWXZ_z*h-h(5CJ2n=hmfZQvP)9MiCjtTa5Z z|I&$4eF^7#L->cQ%S#nU&w`A<0h;L<6qk;Cgp#^jq<#;~$F|4K2IWZKCWvAPt<*Yk zVIU1pu;Z}ViVAP5zDXZcG7^SzQjKpbNkuNw>^mb(yn0<(F-bF6Cn2@sWS7;&x+O+D zwTQJ(#gcEVXpK?0Qc)rKj%F-;i5%(+c3${~8xd-1uXy9h-Uf}!@mHe(@>3xMmd0uN zNlK*%r~awXiKB?eRfO}@)U!dT1?7B{IsZM?34DK>8>MEF$;!}fJ3vTJ791eTnM%l^ z@2>f@i9CZd;mKYGORhdOiBvjev)jCn@<}gcpVE$czj zfm=kzpe?3_cGIa3cRQ9h@7mFPQ874L&u%3lO(1I?fW3hJ-hVYhl<_RGZ_4Vi6s+)b z7Cz2hdV~%j>+K8%=D0&zr#JeVxV!ot$$7&nN&TCdqH*Vq2 zHK)P5_)QuQ(UdSAt>9GSyiDPv+r;!mrskdewYH6?p9Y8%44<{DYWr?1r<5~9Q}@=I zP2z`)#ko5+feZwr#}{7pds9{rUm*WvUqGq9&F*Dzeb|rE@6F@wd@kQzcS-nG z=xrLbi`aDkc<;AmrX=d<=toc1bfjf1PZeobftU@1&dpW>cd_GGshQUv)*ZGd^g~u9 ztxyZxzRW5*(onjv_tb)Pl+(mY-3`o9Km8}^D6n~x_Q)ijGs4mOuh=&Y%9R@N6<9PI z#w96b@nX&~VzyL1PgRRuLt?YJd8*pEjB+S^2KVfieGvMq@|paf!DrpP-)>b^Lvia<1`S`0t>G1x*&RrG$io2vMf08biLf28SECiIr z4~YyPaRHt9_8Dy>7IOB-Zlpep7t0=br5MoU1_{Z=~A>iqVrSZX!(qt)PRX zXHP*OI=KMNKj5dtAxi^j#0+2R#BIY$ zIu$EcFxpoU3d02vqw<4vd_pjoDF93w!I!D(>qd|Ck(`_xEGI5w742?W`!xP|r;P-< z??ZBX9$GqnhPm^FnK_f$3`ttqy%jvA3xji1$U9PBTw`aaXN6CGus2acMM0l_oI0`= znMEv_V1a9xFbPR(5a)n}ten(!%b35TZPZV4SRehcf#?`!G#T>)y`!2f!jz>Bnp}7} zuf@eMh&3x$J2l#4){!FBxJFP9#rAY3r#+3|EWLfStql^rUPqRdeu=6Hn8)a35R;K7 zhxx2D#dIIzE$e}IZ~ySI^Q3!G-Y1-LFfOuH^*vFs%T0AYvnu&qd5njbx+Q&hM*zUo zGzdI4Li8I$`Z}SHirjGPPm)&xlHdEUbp5Y)#wnfoi_$IljaMLJ%0*e=8_gzWAskN} ztj+s{I{^u?4!n_nxj`bpG|L?H82L#$FX~15EX*3`l_3$Y$o-u;{)JawK_l_UIRwfE zA1IVC2;TFX=O~48xGoY(9$ayRh0QSr^UmV$*NV_t{fDv9@S@iG_o<18*3P2sPo5e* z5)E4UDR0uNCfmBFI_rvNUl@&k_vZTPtQiK30HrHsmW(O~5)L&%fn{LDDR75{C|!7i z85=^x0yU>0{p<175wMoA`WywZC0i_)UuxRg?Ms>xh3$;tYh=`RL%L(E2WC`_Z(P-F zNU1l@zcKr6j?d1@#(BO!?Ai;zsmh}J_&-UKxe9Z9-*IVC!}i3U`w-1K1>;rb=qT+{ zx+?Et<_G4%4fn1=Mh}yJ%u)@T&UX8;^?CM=m-B|mIw#}VeFewYsLEBISP4byS}1mF zP{z@UI>)WMyJ^?Fi)$aulYSZ>M>;M+vhk{C-i*MOXwXp~!I}<+ySw^RgF)r>OHAa} zP^wBDS~AMP`zWflI@_c(p>*5JE$NnC?sK0@#_2w+kmQCLSi2H_ny~%AcB2qHpXeLp zq}fb+WAymSp(~G;$}a8yLf1Fb|JurYAct*ZN+a#Il_*!5OlU9{GucVmJ7c+p?AFUk z_=@zJt_BT<%l4o;m>(O162e8S_+e7#>T@wEw z%~+%vk&Mnkxi5(&Xhm}p9K=Z$zGLTWjKN!Fml^pXT-5M+jEhE@%@+LD&~YvjE%<-UMOg-a;i6v}=YP*dO24@XJ?6$70P+*{ zS~5822_ZD>6rp(VHOu-*s-3HBH{P#ShejTw1fdRL2r^jmwf^V}hoK9pL z4?N8{GE5*q&Cjpkoyp^|y!7h;a01rM3|eb_1OHyujiwD3%}R}w--@poG8Ar?_1I`S zryc17`}qnwX}0ktL)O$r*>&cCKK0zZG}c3HJ+?Y)(Imhl-$S2?wtIqH6si5i0Z1Av zB0Dn%$!937Q*6;+wQKW)q$ldlnX;(-XlC%U%p~7}f)i6Jy?$g3M`WC>&0}4LSl$pL z^qxXxhKGEoeWs7`XZ4hiK1;4;-@6}uGjR14bZAs_TzL)pv;)@)QdU{momL!l@l(OJ zoQLWyT2vL`cOUE->c~1_CVsk^GKr|Vx02g-A*10td2?#+wRsuoFC(QE*cFkk-ItF4 zDorACf_}+wk*#wV+Bt@PB(Ne(XS*M=49K|MyL9hL%4Qs>`yx;P0~BKxF==`nn> zid7dyuFSDaayk+*t-!FXe3_lU3?%E@uF&WrmlJL2TEgrSP35d@m7vkl@jK|)9YEms z|KpJK8IYAw%$5WmUNQR;9#z9h?ByR8a=F{ zzA++PZ(Mm8;^tUqIpO8y-g8qg?Y4dUMye^-%;dkUAMMcrVTj*kHggv3BO%9=3>nnc zaoP4d^Sfd7_Z+W}^S>1?>6MWmG8}RRE9wH2ooaTFF>y&StIWyZiSspHKurBlh2g`W znemrPqK(P15sBXWtH9&Pn+3%I2*(E3f*XjX=mrRV5-|%+$zY6d>4d0bU3f7WEr*{G zb*?gB_5GJTo&@qZ;_sIMNRapgse^E8h!?skZ{>iLLJ?sRUV*T&4z%xmvaOtr&0yqDFL3@;ZPk zS0X0EQZy1_)c8Zf3g(g54uI~Ec=Y1U>o0y&-Q8R0)2;4?IFgrjg%ANrv9&qM96g1b z<(E%Vt+y8!_&=R^+oQ@CkgwQS`Ri1`k*mJ$Zm`WJO;%_bv2HNL;S>s*F*vbx z;mJQq=h9H#j%rM)sk~T*HQUX|=iZWPjli>l1Cho#vC-8J?bc2BIxqY|0Enhy2cwim z&FZ?NhZcM2N-Z#IKj3ksV75jI`U8w^=tHJ_BM0S9$8}zETcb^h>6H&}SnX1deRh9I z+2=sZg{RePYJqxw+2j%;o7`M9OfrAj-g^yvYwj2O>FGAfdQ+CtM!KnkT05PuJ#ZV9 zh&)`ca^1xL8G1@fP2|RyD?a(peYDU2nsa%msgTic+>^x%E@q0GiFHw?`6+yU^yGlu z#sf|t29`=L2rzs3aj);Q2yCMvgn(>($fG(*BW~b@XA;%qfdLnAJ&q*z;flfhc;<_j zDfe27N>b9&RWQ6Ru37Uz#p*qFkW&P*s4DBl}+h12d=ep)Zw??TL zZz_)Hq(bGD-Ezy#CKX~Kn}uM81|B8e0kRr$IH_D=9dE(P7Nwx%E5S|V6eP@3VQlWh5tVhq5#@12-udN}c5)4?Qgker~x<~ywrD?u9 zc3L4Xi1zcEPK{6{rEF8G%;;nhDw=}DX!)-%xBmozE-0U*@=w9o1>>T|)!cNY%TErU zA`UG4@$Ge%*jpH=GV&Dk&jPSpt5P(H=}6H2!Lx=zEr$$ zk->G+*5t;?}#j=VJ{GbjkImu{~;Rl16+04W= zOT%xoJ@PC<pgr$eibR{;?0ki=k5#1Sh z+4K;B5UL`8Sal7%Jq$A=V0XEC`u8TI$4+wJ)p5GN*} zZzd7R!>1A?)eP}Ou+s7!kRz9msa<*gY||+_)T@)0Azbb^o3}BsnR1b)#5%42E|GjPIF6L%dnv)lDRv}>*Mdg0^!Xx5bL0DcSnrq(#U4n`yrq7PMcSf z8vu=MZhe<1>GaDwemi)woU;v^)=TYkI=@$aa5Rd7R7_|Jvu_84rVsoxT)7?<-jU$~ z^0dm`OXj5?zP`4>hI21N;0_#cT^No2g##>#XE8dP36({H#V{i97w>NQ|M1)d<~Eca zIT0^zXgoZHEqX1eq3=p%-<^|CN`r?L~rwZzLGKLDhtu@Uwn zI8b09XD_r}gSnJimpjQ1zPMZ1ybC|eHojuG;#&N+#l23?mck+SZd>_WzUi_ghk3aK zZJpx-Zjl4?Cg>p79ymC}NR9Yfb1V&H(=K7+&_|7djX5t--TKH2OGB zuDE}hQ$!)GTX8rT=~knTz3A~i2-ko{{w#JyjBaS$CH$btfJs^j;rk!@cP_EX4i@Xw)M_ji4(lW{k(&kS95 zp!;%&E-JPI858GZ-k*n;Rer=_M4qpX=kv^1suB)z200jUwOg87~NJ|lqq^WOj@ zkBvc*!*5yq*BBIvF6}EaF{8X*k{!cH~v(feg zkWI@4dmKWIVT01bo8vD7|17eQzz}?g7VNgZpPMAYjogK@!0QW%le33=aR04EsRa>h z0nbVkfu)=A61YtxigOKx*N^#aFb*|bU?N>6GjyON}wgo*B!y%yMpN)oiCp`DRA+J;UeF=BG5dAn|)x)1gmr zZiUJryI}Eg*oKe3DzLP!+hKo7MsgS?XPTLkiFQE}0klhyB+>UURfN+YFNe0<)gZl~ zIBzSVn&b`+KzMx}ghc!p01lC(B326~p6)XTn$?l*lZJ9Jj-+^q|8=fcBCz((`Vdy#j)m8qN^*jUDMr0X6O zhwgDHdUfSN*e>xTwLX0r$y<8a4^p3*7=+}Y4+0Yud!q0iyktUw4b6C%qS&yx3!aZ= zeJ1gfnX9HwXwp5?`;6!YKvfh2o(*y7)en-W2MV=F;x>?^=k6lvAK>=&zSRyNr5z<2 zu`I11#F=`H%$F@(b-Lb8?QF=A65Xiz0@=De15Fr9I>vnLw}@bpHq!!b+qMH|a?7;d z*ll?)_a#F+*bsd=VUSrn6RaJ$FjaMxlB-LWy;16eLnv=CNqh#Dk5M}ET5E}B>{y=3 zm_LV%)8+HQ2sz``%6x06!d)8Qx8m`z+T-$}G~sNV%2|hv@m>$ z{}4Dfm^84KaDcl#4y0r)1RXs%K&;17R#uJ7&TtdoStY&J3Z2oz;l_6|_$BO^+^U{t9| zVyAo9F;Hz3RQu>J)rKh}3@%kN=^14R-lPR;&6C|9u)0gcYa*qWZ~nY2RefpN;O@;) z)hE&Qj||)g8VVO`y-yMHgcXtwv%S;W-M;J1nU+>Ce*69Krufan-u}n|c+ar-zEd!f zHIO~5O58O^^-!KAGQ1k5kLCA@L(%PyP%f$R&a1cRCVecA&V+$mt8O-K%JI3S;vHoc zAxGZ=;UKx+aXn>*nwRVLKO#)oZuN2N2CKE8?F}lJ2|7`k=CII0ry@_;E3^6y1}xIt ziFkv(pN4Q^D!k#Z7$Z>;N_4!G zvfSW(yigo8%<2oJ)tB@zMTl33AObhmD`YEvE;{PD;O*(F3uf(~+xDCZQEaI=g_nru zzoes0BLQF4l@Ngd5GJ0wvSlbhyy&4<=FrQ;pW@$bO*jK-P zcGOktDJE`arWD4&9*ITKK$j@iWc{q3`(B^IF5b<5=+&n2db_MPvnD<;o@Y%Bj-O?s z;Y?A|KXC42L%9v(L+JdSwv)ok%X%EZsYn&7nwV-&7D3FFzgq?`H>ZC<3x6jdyIt}A z&<~O?g;+eIhs;0qaJ&337yCDD{HGpDUF-|yCu2`y{2-sPzLM#2OKf?NU%#>H(fHHr zukrhBTFnPRwpRzzCU8qMliEHF(DQ(vm=L=&K538>lgla?;-QG z0yhs4o;?u;TswEQo2wj{4`|m%Jh*wy1 zG?!SeRfzP0!Mm#}nJh&o0QRLsafq~BV!eS-{r`O^?q8U8?`!I3f54v>o6O>^V(48l zvQH^Y>Zow^?SH;;zcBKGsru4N>kG7X9B3S**DLjHKC*dr=+kJ4vZ5x; z4Q`PdWvEqqD!GHTCpc5^88b!z*~Y4a(h%7{e>D~1WFYXBl!2eCkU+k73hF9!+T3tg z>R;b-4;!DsB}08*#QqJR!Q-y4 zltxhza(m6vjAunaX!+^8I_aA~60%ClzrjpY6Ie?UpP()5POu^q z^uTWJuoh|4E4Od#FKbrcrx|L!Qq9Vg#MXmQ$UhBu?9&)8Xip!hHht86cvl%70x zil5@%(E`hV?!ki1OTf!0- zk53@aeU~&}z`TcWBA^PlSEwb#h%ulmQUo?BT4aepSZu#ydz?Bi@(u|JCoP$a&B4i zc5$D*zqU+5%QaS>bNrLu5{c8cXSG?FtV{H&=;Ke!=h>C+sl049R&P#lF5EmydUK=} zq~_<{OCPWfa49l4#vw8!L0sd-+)bDQ<=ykpM8D*_g(TMqqwQmM94HAeQNy_{<^wOC zE@ZjJLW9N^expUzGTKgM)jCB! zb6tbj-P0ZY$5|Pt%d%$d?5(-TI#C)1k-kJ^}c408&#IcX-lr3&Hn1{I6jH$P6$T99t^GS=>t_S7$->kZHkB&`scG+4*d#l)`>ECx7oi5Igx-l>(xC%(|tci(B-TCFFvcv^2 zZiz5iOh>Sen7ABZMztwqhoynO5@v}iN#Y59a4iKd-MR&>F@_pGX6JP5Mm)ZN`j#vw zUW>P-xDbYQx&y9;kI(KqdBnEn8F|)W9ii@j+ZZ(@D}lnh>kD7_lhU`bie8UMd+=zV zu;TKDmCeziCeyr_1##2)VYgE|8KD3aYrZ2}Q@=*?P(*v7@@BBg9^mvkTnY(Q9E#q;vGNu~l zcPe9+7dvaqoIYN*Kzmk;Kay4c35|zg!yTieR%!?R=x#&_mX-Vln@E)9jjMQV#yzm2 zWP8?=di|+Q#hIbGVdHhfX`tza`-qRUfj=D)nBe2gSnQw1e#bxE3&=sy|IF=F5f!Mk z_82y17)p=pkXBtEh&@TvW*94}A7N&IU|nMUJV4K?1eq!edXu*NLTv+&BA zfjO7vRLBRh2HfGaW7GD=WF-WtfP>BkDC2%^*bkD;&mEJ*f&?Dvj6u7rIeOEaY3gm% zv0q$ll#H|NZcQ&=to>Wm)Dv1zVf%U6xJ9Q%91~Js3ST_&PsiB#n!@jI9%2l7RQRg3 zlp!`XGpA2!Y?>ct+Ii}J3~7*CGVeLC*!mjsO_27Hcwfw`jK(09LSNX}2)7ngH10F# z!-E7eC$K2KPu~TYJq&@yK+Zdu&36KPlOypf1N0K}#sSK3pHe=}CgVpLvY?-LVF?@Z zO5ZR+#}B#<8;o2`9l2PdrA&IRe9$HaZ)pK32G!YPiu75Z;#F;dK-R3Apjftq#+EIi)}S zLf$LM6_crAOMH>Y?6`&rp33PeSM>6J^RDg7mjYhCM(a_v*f+BCFF=ek+nqfHjN*De zMG}~a4eYXs{4e3pv?+lJ5Z!}5%^BWxtdf{55oL!?UrF;&T2iJ)k}s=)6u*HlNRFn( zW1tO)rU;j(jma_EI{ysL*b_IMJUjZ#lkn0xrJInbLl9<$Q`J}u;a@dT6*xopDedmy zFh_a`?7kI`C8~l=KPDYv_P-cV_Ag|_%yKjnoje3z$Lsf$-r^Z))Mg`Dr&EpL)pCFN0k)aV@Tr9*ksins--A|Af9$FlqB5)3T*N{jbRE1lI7Clc*xS#u=ejGa@}m zL(H%GvhA+I9N0ALN%Z&6*n`7{{R!mi@~8HYxtb4qV@^2+{~Bin$GG6QNKJhinP)jA zLNKa%=Dvv{w|oWqd&-nsj@vEbS+Ypi^t|l(GBj;^lNPa@)=~y;$AN zmSSym%o%7Y84Z%%0&3J70HSpc-=kOeUEH47z5LYb@3q6uv{W{4FaMPwK6*C9{^9I! z*MPq7AjAWr#Y#z2si6*Yr)nP($aSv#oF+UZ(#6DmG*PQf{{~Q&V_Yun3aoX!jC7pM zz`N(?^kt^xT-x?E)J&t`e*Tyn6!&eV2@27PlBuZh8@rUnmls(zZNoHt&yKxDsy&HZ z`9bo=avBRv-XTa|85Yju3<=;NBZjz`NTCUB-!0S9<#B4Ih$WSGi$0?}ucn)bYtC+$ zp@EA3z3HoqUx0xZlZM^;4*UmkRmcxCI>?E($6}<{F1xv^XFr=n^(H5Ik$d0;=F1mj zg2}gsA;_(+Tl?mmgzJI4b$-0R>3o`q)rnlG*%|oF(BVPE9N${*^8|8Fo4{cS8|vTQ zw!&d+11qk!_ccF;r&oW5;cqfQ+GmFRkvjx^p||w@#@!1D%k|$8R`}7gUuUKc&fZ0g zXrVnJG>}u4`3|dj;zK!~`zEDox%{4-()rEeTFJ|O_V$u6*{@o{Y(fdzHZMwIz+mQj z&A5ZUtz*MsnfYCzl<_#fT>O;w)s!qUfSsa>T6YLs(c#wkq0-bG1&1sd`TC3>q_zl@ zJ&*ApX{GjT{rp{f%(N43jKL9^6+Z*nezsu}`b3AO!oOIG0XQTN!)FvrEah(6`ps_HhTu0*H)9hBilGCs6VpZMJ zdO=c2E4~-V(uk5o6L03Dg$sQFu0HYw>U`jwB;LFIAQ`cUVHI&Znt$9Xhu;=BR_pz^ zy5D-ZFNH7#8D_Im#nThxHM~}W3fwCbgYHcUt^G*tRf7!?f*lzf9pfZ<*uCfT?|xw? z@5gfthJDStf+Z%fN}B@#eC<10B7Old02-HwO!r_;-Xip!As>+ho`gcST{a#yHWT^Q zgcSz5(me_?pr(v69WAX)13m(_a8{-totODHfDuo7J(?lJfKeU{fLOm5!(u{;t?f^P z^Cq6RvotY8K;`e+ctLGS-#D_cc7R#27Ro{3QGa(LX00nSmCglA-0P2APdsyqDjcyI z+Ap8ykK5ZON!)(0GSF0En={PMps?J;Q^jcUeB4#ifex&s-369aq&d0`c|sj+)Pcy; z|DsXn-`HuP6KF9c-l$j6FCnm#DniPC5z-DTW%N!eQYPkACEW6~)NNAu!&}9fH1E+% z)i1ncap>ALKS;^%QOQi`)``Mr2=+?in7%3r2b%C{TO#(Q>&AX6dcV@*eq{NX15{xB zl?I5`PloV69Tg4&ejp>QX1q2@UCJysqkAI9T;FnX(CI!!KN=+a*ud{MGV+uviG{kcJxF$Rk1AOIV9_pEMNHztsz6-O zhN;jDU)}9yI-T18T-m_;{6YVcGDM!?6Cea0Gp%(ok zIw0K+NS`rjV9|Ky0SL#KpPZYHl%)v`lx2paMJMSWX|k`iM9c9uAaf5qD?xTVeH`8r zr~T~ZvRwg_U5AaJZYrA2{zQ2~d#h)b{9bB1iIt712@{1om&8QfKWR8FW|?KmlGV&^ z!)7<&$dI+gtvCm$J9#Fz-96kLr&(zh-8^P&^$lZerNBIg^8mL%E@6`Hb6P#H{pJKd z{XsHq$D*V&65nA@uR|}Ny!EJ<4`SoJCOBRh|5 zA0ueN=A+H&?5VzWH1lCj`L`soO z5z0b|WQrsmJk>j3({*sEKQaw4R1#ga0&^l?RyDjzA6H+}{CV&9 z?jqgdIHMODNOZt?ZX_)zo>xc9Iyh6qqy`ii^xh8h#C|sYz~QS0T4-7QD~`*yLquE; zf_gzc)X_>u(EKNoM6{j$>vMUYvii?wfAcp9a%;c@*N$p`F{vp%6kzlP$fV_J4Xh=u zJD%5iST%h6-ti%#v~5YZcjRtV6^>=eGI0Y_ND1Ru-Kbb8p0G~-#gQdGC2KHBoHY|~ zYaxrq84}mR{E-KRRZl%mXi-`E9Rsm;pHD(q?0z`1_z&*@9qV}kW-vCxh*FOT&N`O+ zpZySr)}n(Qmff+UHDQ+iXUj!{aH414eWG2OFsV$(syfSft)kB69Bcb^M<*z6T9%TS zppx8SVRpY1+UDOu*zXw9`tmqMFo`CaIf!#A169tRN)C zzVqe&o)exfEt~Fdn>F+79M)@cLx~{7RK?dX)n8sb*o`O*vsd4Tfr_xQu9Svl9%V)QtQEPxpnk#1o-$iE0qNME_^nM4IeJ&}hLAFy+q-mdF9|G~%M z*QGhBGkjekf4KIrF0YG1BI03 z7C`9Np2cK4>R9Ju_B4fW3O^K8w{T8iTmq}9wgt&T#n%}c6k*^fZvf|ex7>?cmZWtg zlgkflUsV#fq!TPUpTWs**RyIE4H3(*+p=B0y<9wv@`h02L$BNnx4Zaz>!7`lRy}!q z+5Lr;EWnbR(hXlr8NLo1-Y?zoHefkjwp_H`UMLB3`%0@#=qh(14R=ZX<{7Eq{Ap0Y zZ=#SXnQ|5z{n*{UMNop)wo3%I(vdi#t~c^(!)cOCVwLY+e5+_ZUh)Q+Y-D{NLJpHV zW-t_!Lep;_x@>TGOiBq!fq2%at^@6V7(Az)=sO*1YWd{75?#U3hEx7>J38bt21nmgm4+xWS}E*O$#Nry24xo{*EL7@j2vOZi&`0)mXzpK)jn-7d(C!n{mh!Y&-0(&AAviQ}A3q zbF%BFb}10~iDtV-(X4d1e6;?RW^kv+9`%4yQ%ck!mRSo1+Y$&OFcKV- ziZXgoSkzwvVdW1-@$vs+;A!1|cSQWELZkkr3N4N@I-LP< z)984H;i+(PQGg>-BJ9UkjJRg^=ARcxFhffNEe(V*vGNe@Y){I}ePuJ3*H3JuOh!Mg z1!*wXg<;zGRgo>4zm1sd3u*Rru|cJgv6GK$@^6hxUgfBls@+lQqOF2xV+T0&isWP{ zOozTEU%0E>atH=K<=fOzpvnlg%9N7L<_T%gNxP^6A}K?VJ+%~@M7NYk6ueOaPMk$H zEupZ_2LNm*NxNUx$HBRY0cqg)e|(GFBoWu04kt>D(@8Q`;b^^9buuT4lAsU zCDEt+^9l*wAgy5oTe$EsmmwUG#-;K~r4em6;6Y~0Mp?)Kl1 z1R0U=(D(5tRB>?3ua%6?R+bq+dh|r=UD2%Mw^#Ety9CQ^4{V*f@o><0&N%t~tn&H6 zo3&*@d+QAaulSbTcQafX$}eY?8feuX-t^h&qw*rHYp}PTXkmxRU$&OM2u^@$h$`0n zkfucF`>te}sCMSfev*}4*L-~bP2jW8+8%8Tdd%O-87Mjejc~E`$(VcC~aVs{Bb-eE9+O-&n2W^PiFL=?!APEA_C?SLX0LoEp{_M(- zVA4UXu0khpH6Q-g5AID8(EO3f=_X5jZ6VI>Z?LGLq0#2KZQMrDALJzZKoNvj9Pq94 zH?-=l@oatyoQaeC|BT8<_M7_CbwOSNyZ zOaJ<XzN}nTIuB@NW^13o8y%_r#V;H zH|ldZ#Vrt=( zs|etYfHlsW_U9UBpO-RKKR}zWArqQ+E#o^RY(Wiqf;Lfhf5{c_#fcj0B$3%6@%|38 zDl$BD4GVMyt50f`|K52A`u~n$_ZkCC%JoDU(4Lbm$u1Ee$pJgl1$Gxm-~2~(xDDZ5 z{bhM+@$76`&yE&qLt@c06J7qo*m1WFt}RsAv@$C&Y@5{pGiq(6>EzOGok7D9s%kB> z84@oD?O{t!x&HOidug=qVP~uFd5#WE9XGV)d30Z%X%MpS!~s_C;y;qCD6t;(%D}z) z8snJ**>zQE9~L|~W`CsE_@m#Vc-~j+Vq$np#;E#%_`wce#u~_++@J!zYbILwnWQG; z+RUqGTJJN4em@}}|M9g0kbOS)0@~ZTKJ0jjjB9HrNwQxOh#h3g5w#BEYkjFLTaUGE zy;;!yCUx>M)9t5ElQaC?9A2Q)GETCCF35 zAgnniX1V026_y61XhSv*ej9;D**96{1jN8>BQ7F%@F~U z)(l68&G~*T@zmgN?0i)5Fm0+?OSa+E+}@{TJe`Z?%!h-AN1X(|lZJLJtTh6yC&yku znW-JF2aCN659c{?K8EwUHuJtlea;N0+>Ee#b!JlJM{=%r^8XA`fIj>cuF$nB{{@{` z{S%1n!IR8M^!HtC9+>#xnC~GziCa1LW34~M&3p6A^bo8jH%Y=}f1!GD71u@2IXC}X zYNhE!+H)GT3Qd#euuB+$-qg2#u5S%*dfHt$SZSVf{EbF}ki}_l|JnF~zDvcOBppZu zaBW!<<8z?h`f}MX-}K%@)4@si@eGQhr`)s^CuOiOkK3ovdu2b2_Rx&Dw;ow znAT|*T6b3~I9tv&)nVtjFB2ahUh7i}g!1eHs!(;1EcO)Z2r^+p8z=s0$s38Lz#BiB zEY`1J&dJ~l6^j_mwjv~BzgZL5?=>VFVD{y)ddP_-Ep-!}(8L*&r&9}-j=-gU0y9OLA0U0_=sLne$dBB_koI2_c4gfP(Y|HQ?7=UH zlqh%~j|=gCS>p9wI7_(VyLfEzHC0cECj*pHMN%h*gJ}3f@Yz3S+9sj%5g=q8UYCm! zxjk^EbRlwpwitvU1%3A!fZbrP8|1>a%eN`gd(r%9SnFY!D|$LaXu}!30ATnqpC!El zbIXlKgR`z0a2F;7XI;C4VYnCg4;b!MBJoD0FsIlR5NX=p=}*`P3XhULL{EOqtPPXf zS^6?XP+zP4lFO5wK8Gdk?n=ogsKp@ z4x&PT_Q1qIIEt4L29gcFy3&#n4ns7q0fn;raYlN3HEPj|c!;nhp?gL+!| zo*j*w11YdWd?uV-15ohk4PrR0{N#Fl3tX?_c(f2Kr3*tS2WJeF3#|(X2e50lrDRMq zoOk)s$h$3^S^5CjOiqwIMA}v4iLsW1fhb=j>r3V{-{=Lv(Cd=xOH^Z;taTQzcF$(a zzQ$_WJ<_ryL(`IuBy#ydf|*1hLQZzVf;_6^Ioeuh0wt6Haa?ps=yZ=I$B%e~S}rxE z?AkGs?hYhg>Oo??lA?g-FGrlwSzfMN`Fq13tQXj&D>ZH0(muh8bg0-*5rkyq@xz2a zm$id7GD}S9ud~F+myv_Wg}7C?49^6S#RV!kHFcd*b1?+I$r+=GT zp9WM8A`7uTUdxGB#TnZ!>mplT>^pk&)&vFP3uWl0>#3V|s6F&YHpc~%E?X)kZf;sU zhRUJE5)hjSkVfVv@>eBs4mjnfoMRGx#5rN|25dG^2&Xg4I_>`<|Mq*#Y9ODHT5nR>|zuHZRNExkcGdS?zP-YfXf zzWqDt+(DiG&S27ZcLxz~B6P$DiY)N3t^(NBjEELN)wFd%9%hfGtc~n-ko_~sPM-tP zGRmy_2lh|7fTnd=jzr?ZDU^*%hiIn5xn$VrAL;>p5-Es_|BACIpq&p!<>~A@v^J*# z7+D;-dJ3Ii>!sI z54Y8lPld*2kYy-MoOG7?wSQz9o0j}T^w-5n3Zyop11%>E^Yc_|UfZNEw^m;)A9sut zp)`&vn?d(@2Wqun64i1pG<#qEPO~2*%g7XDvq(!2i2#EwpyHqPim!eV<3I<}enhO| zCa}Gws#5FpJ|Iz|u?^yE;#YX8NI~o_N%Hl0D0ac!kE)ah`EFggzhP6~y_FW9C+s|} z)3>mZFqsGWSO8hh=wqt*HWGkzy@TayqwqG98xoN|g`d`>PpgD26~k_B%S5W8@5X1= zKJQCEJih30YPaKatvW2HkoJKMr?2=>Ivo3$<3IwA%knexzDlHX&$OE5i*d0V7drX2 z+V7jUBzXV#!{eLDF8IN!?ec?Q;K(#dRM6JFBl5Bc;dCQUawKw@NblQt4((kJ903n8 za2;}Y8hZ~&*_-o7!3{8mHjo6~RU!b$hm*B%n?6r-l22RDI&Rs-7S9r7hF4eN(xcS| zKG@pn2X{w(O1$n@95Yxhp>Gg(4O@&9a?9)CHUdWx3G7(X2xql4&(Gwp z@dg`wi~fez=ZwNUU&;&uPG#M};&Y%}5kyJ+45&%aQ}J@!jh}H+FUyOabamCR$}-zb z6TU{2Xd0wYw33MlW}@BG!jnJ@Mr_~^R$mS-{sNddvk)#;;^Xm%SCn<)WZ(KO9k&|? zeIHu&(yEN<2Vresd`e9(*7Y6u^0$u#mW6!L;=muIx%LbZAC^j&%fJ`Yy7M#eb@o+D zAe+%5{OF}QPJWiN=HhkUF~mM7-X_(vGC6s5y}i00567LKzpMMhrgRr+$IIXU$f=Lc zp}GsD^FK*rXeFfpzd!{3)^|%1Rj^u_V&!CkHJ%~b{26zkT^58lW!_RtZ*1M2e@yFz zijej5wGq*7#_%P3IHPSuxinjPQ9O@|GT3r?#>X9u`B4|Qcidb^T^@1du%V{R8|JgqqnIl=yCtI{LS$VDd|8kl2($azOL< zphq)I`dW(p_PQ^4%}_i1Wn0QAAMe^Tpn)KbuUx?2G#i2Z{lN+bzy7x&Q$ss=o-Mr> z^9;Q-%3I_E9yn*c>iJ^7B1+4-WP?NM$c!n-W5JLq6lP3a{9nwN`WK4Lf5l$^p9Cxa z{{&y=r~+LLHX(2uPmM0V9f4LY@MynhA zFGNNXbC{od@p+!&YYyw+yLO&eDS(Toh z3pi`mKqN$=;jq_!_>p}tCBqG;5*B{*(Q262F;hyT29t6lQ5eFp3WUO3*E1?#{7-D9 zu%!xY8CPCBU9G@Gi|=&7cP{yI*1N$)^IrV^{KCZR%W~bNe6)+)LI5zWcmVH7SH)h4 zZtGaTk!xDCBJ4uVDr9Y{Bq%X{*gcStFmV7kRw4!8MR@oGGPq)>bYw2(;C4uok?zjSJR=}7Kr{w3e?i}!?;f{`H79_P@ zO+OT)nH~OM`|hx}Hg4%;{Kgkp<5|eSG}>FY9=Qw`zW6xbdqMXfX(`tJ^M9L6&ytbE zP(l%fbvTm>fUE03W>Aanw71V3cU0&d#Y_eU^)~SQ*s|s@9K-mwe-#RHH-b1uG zk~PDS_Ea$|XGKD<&ot=M< zSqvp=8J|DL7a)qc>E#pFUV%C^Q7H63bb5-H#sh)Kt~YvwrV&ATe8)xi+wT0Au%dp`oizIPST*QkfOG>Dsalo8BsYpO7%= zVfJy;m;Q0kq0|2`tJ!@JTuUOooHm1)Y3nO)I{jnRiRYf;4p*iCi2j$pzvraU0Q)gTqYO$h&yR2EIYGAnbyl zisbS9^Vc68Eq`Es66h;E!R!3~;`vL-@Ao1)_eK$)^*(gl4$$l*8`ZUCfFiqjFUS{FCoDSV%UiLk0Hx4J`KEVX6 zO^!!q0D+2xY%VlhPLJo)IM0~pHR2z5MZgL7d4)!f`Im&30h5C9Qymzfh#oU@p8v`y^2A7!l~_J~c0zYUnep6it31K@`x}hstMw)wt)XlQZYe@R`FWOQhSXP* zc#lOVPbA*LvMAA}C8^No+vZ3pCl`hP(hWOIYW>40R`a! z7oR_>n10`C*RGR~I1io0Aygb1ysY{`zWi8sQ*|4uh|Pj{uNN{{?@ZxZ76e=aLbyJ6 zs6@Vr1x@hyd}I^5qrXjyu*<=#%rm;!AyQZ%PUuz(ZEfi`cd{ z!qT7@`DBNP@q923EFhx5*YV{q`I>XAFFoaJ#IA~6m)RV7cfDmw*_mvS5=a9hEBh(V zNm!7+NFjE)m-)mWBwb1s2K+sPZa|^Z;zste;npPqKj?aOlW~tc$ScS0JmvL{*>F4|mvE$hULx2rsJ zSTVox3n%Tod|o~J(vBuppNa?1zUArXE$=w?eG?zczdLDWP(ysQ%S%1OuYSX$0uy3h z>d9IAKBcO?oI*8_WbSMCUX$g2d*+1YOsEc}CXrC`ba;)C8m7>Z5;(mU*;i`+uI zr>F70)r-xK%H6VB_(a1+$M^Nrbu6ww%OEjQFkB+ZcH=WURubcTmF;r!-KLa3ocCpu zUbNz}FP2~0?e%5ELzIB{>1)XfE|eh-#Kx_}`ygIq1EFh7m)4Xc&2AxX$>nasvL0@?u)5^$hjwenX=I}T=bx$h=fi_AK%Qgv^&1q;Mfph(ncAm z#A5d<%e24rEI_ZWExKlRGn(_h>-N54$MCreY`p{b0%yr)U+L5Cl0K~>jYaFWO6=H0 ze~*%rZho9`?$Owrp;lTSPFfZD*+{NRpZ(g;X9on^e8Vm@s388bDiO_}$1z&tY0QsU z&7|J=a9jC^Yy-9r<(w63LpB6~n1n8!gyuUQiMGU_a-I()uX2xFJ@rw9e?(8sQaQT5 zx{qBCiby1GkOl6XK`0yo;T2m;V!s=$YgSyZj_z_zv9)hl9kD*4@6l9Q+MC?4`5EmLwt0^B{xn-ctTSin0j{TRwK@*n_ zY#_uiGWfpqyjzh5Uv!fRv^ZqTAEfy4NN)rD8s(EWD5KdgWptqhU@G}-1u;RAVHYAD zJ)#QUL9ktCO3OU+~qvZ39`k1z7Ex(}xH#%``F`S;pNy zDZkq{EQ?rw_wu&NGIS}{*uaMGD~C_0iCqWY6BDe?dp@Ms+}ta?QSLFLe&M9+PcIVTdORiI^A8Toz8@a9a z#Fx5n(}KdxvTuk2_tgpvd%BcQL8{3xOxd>Lz@)|3Wcu`ye9!#Zo;|g2QuNgHWvQNL zF3Cnvle`a$XW|+2E>jiQQHQQ?T;gRA#A}u1ewMMn?l!kvGN2>6#ru9W@!6&1NJn|$ zMIdl??SKKrEfb}W3a@D}@|xyEz6Laa_+!U;ZZY9Nx&~~TYF=(N=0cllZ@b^hZECvLrcd|6>>s@WA;0hIjPLlhT{okN z8Po#wr>n=fv_eb4pUA3M8vn}4#sJrVO*WJQ4S=5$lR1_WMJXKo5Uz! zbu&HJNUeSNV_TG$WU^#(p0d=A*$gc?YdkxmxOh^$@EFF~1dEdU)8LuFAt2zlh zdK8`P9P{=5O~d0=--Guw6n-;K>wUKgV`SM|Vm8?9PK4 zhJ9$0L1;3>Iq%TEGrrmzviV(lqRWr7AQaFaBB>Oo*~SR1Q-y!M3><1Dz$aPp5c?f`0f{hrWtf-w^OK*V&5TS|*H(EfME{BZ1}&CI>)9@So9d+5-4-Y=`8g?y<0Ml!=Sq zO&hl>JfCvO?`d+qz4OggLcfUafX{pNY34ipwPn};cL4`#Un{;2k%!$#>-WJQB;gR8 z3+hv3`!7o?F#!VgEeDYJ!d#-m8@oZxDBief_W$C*_-`Rg-p#_doJ9=Amb&8ZhQCim9+wr4TSi}8j>`!xNPe%1w2-_ z-n{5}c?xi^bH28GX0coS_v&H|<6J}Go#+*JBWrixQ4p2KkoI5ra*bgpegMCB&zFuz z^R)86%&ei$c5&JoCv4e$yV}J6*Bs-CWbF8Rm7xDD@!Oo4BL=&0ibPd!Irspz{^dUdo{O1~tN(b`9;G ztJlx`PJ!jPzNby%9tq_+24W+kg576t#S;RN0C?pMDd9evOY{m1Ij zD^PHgdjg6dBGI)Z$@*Se2*TUfOf8@&IuZezkWFxrBr{dpjSFa7C>&o)zHcnYlA0s5PWL zGU!P*(c;CpWiuntL{&qHr+B@3p!Uq1YiIfmY1GYwGEly*3NYs>rO(_5Hk}6U_9*k) z5!tvXNg153)p`BgxKQ~ZVqOP#$CGD~W#&eQuu|ro(c3oTdr;|J#pT4?W=4Z!{wzwL zlsLft7jXbXtR|X3|EMvBzaTpJwE-vlS3m23~ z&Pe0!y*=7wu^v+$(9Ck_v|sGG=l0GW#d|K3xwM&HL4q-oTd((Ivb`Alcz=}nrEIR= zGE7;SvkP7$^bXh&Sc&E^w9m~hT5^#x93zARi~QBtQ6on}38dmKp)$ZM&XCt8Wy9C*T?9?FTjJhUz9*rh%b8;77Iza-U*=H|`XP_Rc@ z!6l5p{vdf^QRsB`vw}#`7B6-KSXPMDhrPOy+HRrf>&eyoWGy(w?*+QIeJ#|f->*ByE$;+g$CZBwt1ip?yW;%_ZwI@9nZUP(YB(+p zvUmAw(BH^m@v{iy5{@3lH57f2eLrGmsphwx%e+NUQ?2fxCEA2a=c-9A^diuHmaXf> z?3oL7yOff6f&A;yh-_h5ub2+#RZ22ym+kX|L;(}UvLHNcJz(Qk3Mg}+N0n>_ItwoX zjqI7FgG}zqd^E?cN1X@nBG4f7%C9uAwp8zWA7Dg@I=yYJhz0P9JV%m-w7a;KLduZj z2MH9pxH)2bULDdt8yQ%|EV2{Ot|97#rr4u4BOALSyjpXz$FVQbv3LgPh8;f-&W$^O zlZD-Pb`|7*+YI}doekIx20ouDj+MhC=gY)t!km$)__&|{{8D-O~c;E%p*6t9=&IWeJ90y%V%sa8V5AhVGwWiZa?q1>E{M$}Ya%gW+Jdq1%_ z@aQw?V>-BIeB;-ZZ=yBtXx>@IRX+nW*Iv-}l zMGZR~peBhZ=reXsH$Zrhrb^@kj z!5dag&s){trz1?1#DSI63jpFtr-BpmEki|Hm0jW%vN-*j-zQMkwPt#I%Q#fQz&EhW zl)j$;g<+&r7cmm_NsWKXg8ZMqkbSWyPp!joD`Q94hGk=YKf#z`%}CR6ifYs(KR5-C zC2$&t9D-$C4sFI}?+fW!{B71PuJIo|;6dBVN3alJr1;-QFp?FamI}{3WXdIIhu~2! zp&oIw!52=3v(kP|Vh=wL{xX&?i9VawZlHrqd`SJRW#gLJEAE8V3d&w9HEvLUt?9CH zOv-?4FzIoV4POL;v~Vm@D=kYqhkUD*T<~GNqbZ?>(Rxu!eDG4ELtI@MH;;Ac=OZH4 z6#M12%i=E^Mq%1AG=DXEbPHOVGJ@Y|xF@+Ao^Aa@!ciLW=>sSyEf+bZDR|6ds(+KJ z2d%$v8!XHY@F*&ueOF6@F{j>34vU}hqXUgho_Qz5`MxltENwRHX+JL8wRwfS zomth3cvaf|jyR>dY_(PO#u-s>Q@&gae=OgxEK_~NyE43sR!X~qHs51s8{EWF>l^W; zo7zhsY@BJd_yx%W=-)xqdTil87gI6KQ53S1Rm6T|`IbGy*G>|vuQ$u9p{wU*Qss4{ zxk3Nm6`80n=5@SGin}+C>#Bd6%X)wC6F^MS3;aBgOw0&^GuiJROd{B>J8ihC z0%?9?_c7?Mvv37&p*4LK-&E~<+k4X&9X)njV&aYr7=;C+u@K+vkP_2 z32cFbZIE=FLr{$?Z9uCC4$owW*AM7e(aLFJlSI3oW*qC~fZ(~oPxi2DCNLIT8t%F4 zy@6J~9gM+WKZrJGtFk2%_$a#&z=A~K+clehSR8T+oZH%|Ap}9;!DQD?gG_=v@&iop z+xrWDv#%gOi>jXliKoZ!L;8O{j?Gtcj~Ty?D+s}1+`-z;cW2vj!}R-hf0sSx!-vX~ zwg0TG{#k8}Nb9drY56r2Ti5Jx0ICe%osrEY1))AI`l|}~175zBN~;z7Wf*n-#>|0C zA7CL_0xTpQhJ?Q>Pl_j;vmc?YqmTU%%EzWV+0_iZ&oIK*FA!~^YIw#O2CM{>Fw0~S zBuuUNmTvg11Mr@8nUl^MylC+|`r5KZm+Ek&uW|eHo6RY$WP|sPgXzm5Ek6hwI5L)T z*JH>qzr%neBe_-@6aVMMTM6VsHm++azG5=zS8>X9zckT2$rJ2|J<@=gRq4By?a6wa zw7GBGj@U+jbs}oG1!)dZrN|T0CSbi6K-!0$;ftlcy#Jg}%J?tXlFC77hk*;g;!U;@Ho8U5JqwBd8(Rgbp zwJr{_BQk;U8*sd99b3xf!2CMfgIU9_rxFTgsYDqv$q_$)g40?Pu_lhT{P)!1kM7dt zu{TGJX*{9dZ%}zLDz-E?dJ!cj@2+SMUbu@_R(CnZwz}tA^)}3MRp`>967)YK~K0f#B~Yw@K(jPbRAgkVUhQ| z@7&50vdPBAU48uog_^+_js(rgD<4s)U^^fX;S8#>eyN94517JfKQ&NRsN7{;g~b6> zkV~n1=i*02OtsJmGKy{ZT1K$82hOf8jWON@AZEYfI(8-yvPk1~C zU7qoMl7`)#u$3QC1(IkgHXChz0-LaYfGnE8Btjyv|Est6-NR5b!A`qmA1qet9NC_PkG4w8wfb^0`dmv?fQ`cI1 zueHv4_q)&ezCY)?_7AR@VxF1#%+c;K#yyilHBVFPiwh|s4x3_UVu_%UE?9G zL^cEmjw#tfoF(w%CCha=Ww1Oxs13MjHf>-S;cuS+Rs-0pF^V1_I3#`7V;!;{Ih8>( z2J;*%5VZ28@@~3rQV2ts_~1I1KRRZ;o9~AnS{Rx9RS$8n?`awB^q?hB5}D!?R`iAX ztz0$lptJiVZOh|&OMM?N3IUE*zqEvwd)p1YPhmSNw3B`i-^0J(62|t#47YfE zZ-!?DA%4*7S%WI#`YtHcGdnMHhO6#dLG{{w1W+Qy71ojLb~s?)1-jwVPl|geXP9Q^ z=?(w>n;ty>1mv8~w^)zXw=re#b$e`@Miq5Sk_~oj^J7$2J12Xk!D_&qA{7uYgUM2) z6YP6@OySTY?|nChRT++fUe)|ieK6Xf<{ae@O&0KlGN5E{_rX&I?G_o z6{KTZDVi+MbOCF!N&ANcQ>gKUF30BcDgZ)scJ^CP-#SP9^Yb+)XJfA9l@{fJ89wj&7qi!U zB0lS_d^q`HmMk~{;@}7#qT}J;mtmmm{O0~7))rPQ!mAuWJ%~fyUGv zqONV~qwYt|q&zd(Q$e8bp}PIt{oDn9*JdhU-Lexfh;f%ZJ@5oxH(u(%mQLHudCD;j zOdB@|JkAt;ezfz}+XIW#wS#4m+m$Yj28PBJX8>8UYwZE9R9G#NF@lZdz{Ihu>j1k= z^#nTw^t*Sh9K{;@<7ub29$wKb#rAz^K4jqp--s_%@7Qxr0kQW6Cwutj^1$nwiE*1kuB@b(h&Gx_cefj~Ka~bVqf}QuzUg|LAZ( z$vUE#LtX0Uyv^jEQI|PApyo_KWdPH*lPzZtc^&xHQH$4mdiSO!P@S_`%2=c0Yyr#M z3HFiSjtdeBI#vuEO*C?q2677=*hBbO4IZqK${$@FaKM4%@dxE;RXThh|4$;-w=`ci z{GXnY?S9Z*B4KIMb4&gBQSXiQcyHnp!2z z+}nOzPc59eT=dmqd+E|p11Z-9*e)Oef1e@M3aZBtHgW(#bYH!uBWEj+lCx8 zYhb3sP!ww;I8>K0J;O^oVGL#wxIXsZxIVC5Kdx`gIVvWKOaq$n56k-Vf=uA4%M22@ zEg&Y3k8Z*)f6|;nis7Igl5>Ikp&zRxbOYl9ii8RD#Fc<p@Njf49l^bjrTSE7%4G>ywcNxC?*GkMlk&mcvOWrMZmjw`u*do56)lo_l^YO zfzv7KxfrpsU6b^JN*+;RXH1Fw#0a@~a$JP13gzznT z6ktWsD>-!Q`UMeGgefgQ=@a|AnG;s;*oF5p9L(G=JAHp$_&=o}=P~5ayZ{d9rN=c91`(^$^ zgRHmUlR=?y=?s_v_ zf;lfdA^SWq*#)E>sERp#*rqY~avSz30UUxq9%TyvXmK~N2ufv<1GSfU{8U!o_5um! zVdy6_`DiMvkXZnDo$V>HPDG2+R$fyOVMC&{ZlYuY_T^Mb>#1j7`jldLrC0Q(e@2U( zP!~{R&-Ot(DGTeMkcgp<)lt!70bjDloXx>J34t?8I!0TlQ`dF3?j~Nd-IDLHO<-n8 z4+2i6P%VpqV}AO%9~_uFZO9iu&i=Hie~>V6pqH#C|0HK1k#g^cgk=H=19Qu&3DcrK z3wC!bgLwQ$4)Ph{1CSVQaG78P-3*+NzfA<03o%;W zj}pFsc9!U#(L|;M5+4%C#|rBK^4>Cr|5xL^)!hil{f7Kn+rl3oE=c@QRaMJ&&6x=@ky3o+q#-dxX6Yl`< zHo?#sVQ!$E0xH_&FaXYaNJ5Xt5S&b%9F#sq@*aSZ50AO;_j`2aWbl~Us~Twn@@L@A zxds-%6WPSn>3#+h1KeyUQsNtS8Db<8zX9N6fzW}g6z}l&sLtYz-V)X^`N&7YWIgEk zuZt#4p8ctz#&Mwh+?*VOomB%j>V@?xmooqWZeV-#02*9`23^&6eKB3eTcBc!rKkr+ za*K`I`!JnTZ1DLNJ1^$6EadIsyqvNtU-ESZO)Q7S zs;yD_!a*jF%|FU(Va;Sn4FP}md#SOhic$iy*ODowHZqJe-pAy7UPFTI#tgry{Csxf zD$m;a?>9Yu%yIi+5=w!_24-9dD8M^se#*p8+w*gI|4=kPtqxE$(rHO7zQ3B1Kbo>E zvir{uTw?#QHMl?6nx=A&R>3BvE_G1S$%&v-H2N%=dKZJ=h^cfDA zYIqU3egT)dlb#)h-m9^cdu+r|J0MD5qjkUN98&M6b^C`&1|YyX*fZ|aU^{)AoY_eY zEVb2}Bo#o+1$3@U1EFv982w^)gPIoO(rEU^7| zZG~9;-NgU#zWnN9{GSi%)WHT!C~)%s>6ZYHpNbAysHhze_A`DrNT882a8zV-%V!Arz|q-iY=44 zmvh4|B(#&E07w0rti^u=-#sArg|D1~d2*`hQ#s64s)>l?x-*A6tfo1L7Hx&UJ zGJDr^t|WzQ@-PGbLDYWNr(>Y^FnPej<6_5z?X2E`=K*44+9yXs*LtRgXJhFLw)D3x zBM8ZpUf#1040ZBr9wJr>8jqs&Wl?&OpYqAlCkTcT>$VxQD4oVYgH(-uCzi^T)l=s2 z@vB29sVs8tos!}L7dCEfZ5*-N7?$NH{!gC-qP z5=R%suH*$Ym1Z|99(n%l(yRRsZ>Vm#9<}RnLs#y*O&ZEJZTXze!Df@YTEYL>shY-< z{xA^$v}S)4xASNBcI`gJu`p#K(sp5PB79sqb(4hYz=KaWVXa+JAT{&$qQgNquED|5 zDAh*WrxcUr9l^WXY~NdDU4Cn)zVhs5;%)MShsSCj%cpdJIEzMYQ@t*#4Gy6f1>jt}Bu`P31&te=t7f7G#8Z`O1B>nc1uL=Cq$mh>2*M#a4^`0CIT=Kfw_s26BFz7mspV>dq@gY1uwa=HNSP!C`sSX|jJl znhJP~C#?&R1724bFZn2Xox7`DaYZ=PUI~oq6nhj7ZqSj>Z?v1ZvW^x5NUXBL{kbC~FVa@- zQDvof`wd8WdnU`}e8?j?9vrWNhci7t=c}J-=+C(WG8Ke#OF~MtHj>L^T`Xb?PSO0(H?d6PqW@*A@v2@aO; zMZzqA+LU`vf-eMG9Z(O3QfC{S_qpdOANzE=GIbsQWl%5liL7x(L_&G&k)rRn5gvSp z9eqX@q7i~@$=nR437w}ToR}5HOS!+u|J|foZ*uenVJGMiu%;w7ayrB7FY*hzx-}#X ze{q=It>v>!7@5yr=f!;{^r?)l*3LU7uS7T)CO>Qtq1Z{wuf> z>j>(#*9`xbQO{$@u-llerL>sm^0nr#vuvM9A8h87hUcQ6G1Sm}kkVVGFVu6HI>-BA zDpj)Ug*n{tUR>Xe34WVkgAJsMD)fmul3-TVvjD=>$~LECk=x6nbiRqpZroh`;Fy;C zSg|sklSN|lUq_6~f`<8xAmbKmZN^Y$Vxdv+ORM&R5uE7)8~tGX$GD=mHlV8qPDuxU zVDbc|4NFu>Vq5z_yf<A|Gz{MU9H@Cyn;hdddQ`#@ysX z9WY0V3ho+LF5F$~t!*0DASLyYEZ5WZ9v+KUqS|H>Y4gP{ugx}Yp7Aui`7U%YYR)RvL77+$6ozZ^UhOA1;iDU~U>& z5V3V+n&3_*&aRv*Us$Yhdhw;B>Ev?WEq6HW9A@47o-e459-jgQC?0oK_d7?L*T?NW zQP>*e-MPhxJ{9x)_uCKps`ne53oS00;J!6l`f`P99MRul2IbN|En3j6!`Mdd?;5DN zfoj{FH@{LU3?C_2Gxe?I40)jTinev39(xa7jK5pKna8|DqLgtOnjIYsoebP zESHwbx6yc{BD;gMnRFE?0L@f`l%r)-W~o^*LCwL<&)}Lw{;@o{y=$;11Nk~NdE^t2 zIztcje5Hnl2sM^OMS1!jO0al1PPOrqcDYp+Ikqd^QY&BT!alyrbG@nA0AnapY4B8| zWX~NO8IDTjrJvuQQv5MU$+3f{Q9|{5&bv9o4He^Mgso^78eb!Pz`1T^6^PPHgY*0Meru0iqV!JJ9e82XE2Wn>rJ^=N!+Lp(_6t`B%xz{=O8Q|q!;mVK!kUD*gbhp7p0_3gyiOoh%^}0zg2j)`es&&D_I1~ zzh3jq`Rx3Fc))fVuaSji)EZ)?jSjCT2{HM4Bq_%dj0t(uCw8}~Klr%Y4e_C!qYR;H z(4t^`72Ve_IosJFX{k&d#*y~DmQ)4VtW3KMD3?E z^RdRheFiOdk%mp}!$pKfpizjV!tBsnq;R%@q_HYZbiiRC{h4^S67Llixv`kdJ(G!b zmIH_pO`OoZG#ga9WKZ$=Blf3p|Kyxt}Bv1XSX8#NSgxD z^;UqogO(ii+y+j-)MVW?T!?7!?j_X|LBm60SkYIbitFkRlmxeqKCqNQ&#Gtz!yNs6 z&0f3=0<`WZ#HfF?ZVO;W?TNWWd(<6A_TNr>78XB34{naJoTQ>7R~H@k6SI{JL^ zyMnf5>08jZhiy+Cq?ue29z#p|JeEt0NX##Dby5^~OHGqJQ?3BGIG6K0PP3kp+|&g5gMvt|l^1ij1rK_E zNA0=yHJ(8}(ZDKSW_ZIr@EZ(8y>1Vnq8&odUb)Hn-8q)M+Tj<31N33|6SRogg;BFP zFOYCL)TZGSEuw)6do#jiwpYT?gS}~niob8X7t#r$V(;%~k?(t5>C#XiN%}_Af6U7# z-{cpxfRw~k_gj=iGBic9dws@y7d*s3EcGG0L=jd&8U&fP^ju!y8<@cSge3bT<%biqLp_Z6Li z#+mEY8Sg>AzE^!uKXMC`Yb2m3$fMybO5e1*_?2hYGrQ?e((*2`n=ZIq-5uzhi!Ns< z%-{vEuE+?<)NS2N&NSPZz*8@LFW>Q&NbxMukNlp7#t*8soQ7+#8<0d;?QjH=CzmNe zKX>6h?rhuq)i^$_qSUKIdE1W$A8J~Hu7lEl(!2H8mOO`1b|t7v5J#Fhq7@;17Z;>I!D+3!c<OkLnSJWA$OnzkZ#xA?e*U3c?&AekB#k9>-kAYCW*bJY!TcPT>& zH0@FI*7?!B?^@KSM|IF|I5s`>?GRu8=zKZbwM5v)?Ma)htzDjo)amW68Ogg|alq0D z4X{{j(L^0Q4qIgPoPv~`v3!ZvhJtSN=&QD#TzEBHe_Qc>o5169Oyqb=GJT1VvkY3rMkB)6yr^=jcdW52 zF|1gf-$tZ;Xx>M0aQAcK-V3OKkb%m8VI0EKv`Po{ympv}bS3wY_uTWD4^@4rm77PN zJUP9k9bK5dd{imxj{h8#(8N%N?jCrCo_b&(;ln(sQ_9})I#OPR;R`iipd)7SBQWVg z*#njCU}|gGgG2Q^Zk-2I4SiZL4F)beKG`3XPjM&j{w#caK2iB8P3?R0 z3Mk4+fJ2tJwYeAA$znqLf#C?YEcAlrNUl!R2pe?UUzOm^Q}5m&pj4d}eE#k}-PAf` zQC3++5M_oSj+XNjsF!HZ#B4ikaF=3wzIU*yqhkh{zJlFi2)kowRf18-Pj%aPAyz}_ z+BG8%j&YJ0=-spI?HIAF!`}yO#7xR&g0TU8A+Nx+8zWiMc9JVFwSBiw+b(pvd>v~nn6KV? zJ0!_UdcCZ_0?@V8zJGmITJs>F}Q4%%rsn_EkErj)LzWM3l2F1)4ulOpKXtcxHuS-XF}GSS*GhZ zVI$$ipq|0j7glS@(T@tPdqUe}G1znZNS{DiV^6$&+?}%~K0nID8j$_4Is(-@bXcN7 z&$yTXof;r_ESsVt&IaFAvQlq9`Ffe4PtTqMN)&acwmy!iGa7VJ31rr3?&j5kfHv z=mV_8>j)P(|1iqBf#gkZ7<-~P{ZUWy!Oq7`&+q#`mOY*ZHjZ_gMW{GVY4I328f^=; zZ&hnpcLMW!0wY(7KR*a56B>FE>WkE4gIz1m!q?;bh}G=P9m}q|!=flEwXwrWK(pmq zNXM7>XMr0IA`T-hhS;C+1uLN=I01XKmAQ#RNke9T@tWDj8(FnQxP;aqP=LgN)&vYI zBoAOlWqR;tpsZTtQ*FyqoifcHYmgrE@!KZ{-UHDt2~kJkMM!S%3Q5hn6u2pEFF~UC za^}IU8J41Jp`VZPe78g=_vH0Ng1Nr>HNd5W4Eva(alNjRI=bb#J4EZ-w{UK&@w&km zxbo==Ny_m$`20tf z$I=2Ho_R&;H?RfN5%FLX$1#5SM%M8Qj$dg?jq>8O#OMuByZ!y5^7tY{?RUGqQ?m|^ zSx3pmRdn7tID_mj8?rQqho?&9wKHMVoVVJq!w8#?8d1q#Ndl+^$`Rz{lGf!{^U78I z`Pt7adsCCI6_Q+$ks?e38qe1iyle~hw&7FpV>fK%3YyXgP4IB`fl{Dz2P`Ff-RRRg z{a22Q#hvyt9szx=tyoY?T6AX$D_F$X#(f&fun*Qbl#T5hy*l>LWFntRdQ^xLa39f$ zG1~9rcUh&!(s5m5Vrkr-T50HYCUPbB>}&C>p8kCVgwmqKG# z`m)~U2x0DAS3J2wcJE@0?(^~q+&HF-pwQDiTx3OHnA?5Km;`!lC^37m>P4m3g667c zapR3+(#I!|r@0!OJ*pI1D-7I;RSKQkI&zzNL{3q42Lm?~r3s5H_@o}lT zT=f@)u}{XYY>?Wbs39IqIlsB58JYhj!zBlOo0XO!ufLtmZ8= zAc%D+=lb`A2rT71l)B`Ws6DWWQWBe<_~~YO>srRQ>sKy(ygxg@-ZaWkhpjyUYPNa+ z$JVIwU_~=UDZ>%);?+iPUdU>&e=5+?>F(a!H(zb%*znm5an_?16fIJ7P9Z3kKWKJ1 zoj_}4@i%-vISxy?g6W1!8M?3%eKWA`s)@6SQ6ea!S@Qn7)$qnFBMwG3l{_0yvmW)2 zJl9Z#=-5%-`EVPD>-?4b*BwJQnh-z*ScEU88Nb8{sxYhjK&17C@#p;z<%Z(`-NiwfNOx~9x!^MXK21FNPt%;ov-XRmYaIl=P-uF}cU3WD%dkLiEP$Rn$i~fvFK`??fXFMOeT_*StSi<6b5M4 zmNe;##iF?zW~yaH4+k$t2?>NGIZX#C(ec&zf}W`1dW=&3`bcFU+B74R(34OL_plk z_WZ3`o^AMoenB?w)#OT|9XEY&YEI_<_DJHkqie@tXlL;PM_Fq09efCh*UJ;L1?9}J zvV;w2bu2x7dVE~oM!~uIqaIz0MZjJ^ZNN&M$I|xh4@R7wBs3!-kA(qAcI^DbFC1LX z8EhHG3V?4i?);FO-l^{)>k09Wm+28yVmL+sjp)KCq6+$Mu{5;5SuY&G^22T$TGy;& z=R6t6i|%`$5D^?23gK=Uab|+ER}^)ETYyw^Coxn;kJsbEs*fdjH?i_u?N1{SO`TNeG)Ge`nrLNQmHJ8tQd>p zcJir~jjJJxy9)8Gb8tCm~Q+}#!Gv_&&hJ;u`qhZTG8n_eYArfcBQ9AA*yO-2? z#CQuWF8=kj&VZ(fd4OO=uFxsWH2|1^%OVe&LYN zLB4?(iSEX8uod#h5E0AT#^L=Zm^(Y!s%Yma->RAlXT>e+ln8bv*t(3{mq6j)Z1qf2BEu}rt@uPtxB_Sy&JZf!o6EgZ6H zLM_EYPUK#E-RiNGi8JbzLtZ&mxRRQ_K3`4YbA?SX&<&NdAP|KN? z9Fl)W8}vWZ;BWBw%=m-N92;IqIqoC$8uolc&Qjh^!9_@3u=}Jf6>yc6hzQ--9m6N? z&S^W}j_nPW3hA}3zzhIsMYzK54GZN~nA4QZTS>HX(J0&`BS=Gv;Y5u4AC1a2*!eXJn%Y|i|`_=7_@CH!Mf zl}T03_QnLIqY8s@{PEK;J7zo!_nE|xxQ>fK@@m-Rmb}&KQg@o<+P}#rggws_q>=+# zM-C!fEMQg@ZG>fkZ)N$5uE0pf^GP0jL@+pilcNv+AC?1~kppi$LA}csYauw|tpo4RMoY-84 z=LU}>64<#LJU@Opibp@xRha6RZqQuMQgZGnB|T z_q{pb6lrc?v>~nxjKqmT6j|1J%gqq60zZg0IQvofM!V!#foW=&U3=H_1K-q(!WCSS z>Buakps@x@a#S)@wh<#y>e7~6;kCNwsqy3*k&i1z25M?T7F$vTUAWULVM$4?AQol-ft$v{L4KsrIGf9L;&9 zuyy&X%1RRy>f%k!^)*YJ6GizhJU@Ui4dL-mXAb(W650gdl1xcfA%@#gnYC8Zmc3C= zHTu4C;p6?8VYJe9>MJw20=pOf9dwp#0+X3a?tupMZju#RICO*n!>vdBn0i5ICP1n} zuR%;^#!5vCkH9v0SP_5WaOzrW_ON+TYW8iPUp+8XjA8Ku`!=1R~&D8saia+G<}_~oc$SFh-GdYF1${H zF#}1ST@@F(dt}N_XgA);w+(eke&PMu8pp0@Bf2p%sJeRmJNN9eA5cvRDb}uaaXG0NMAZT7=`l7+HrVODJKaZDOiW<&zh;3n~OBCz|Zi zoifiiSiRm2kM#LLb@T=V|LJ7#*MbgZXkfbgk2mgOsFFXFBSC#y>!@Vb^DZz zDfv(tA&2Sg&l3?=Tt1U-rFKX5nOq3|v6IscK9#78CJ-D9-0%@6R9gg6M?&NOH|HkNR{2q|7OY3_kV|qebeyul6kVWHuEsJgZ=~*o2-Kiv0q!%~dwg#c)X6Nx z+Qf_!^cL_1mNlB9kU(7^z*Zv*n-Q@U{;Cz_A_c}r9G+771BFW`XoN?83%#o=59xx* zh$8>UiW5n=hFFdBmG9c`e{~UaJsgzm65PvutMN|HS41IfPAwDd->RWIcY-S&A|F%~ zv^GzSRD9r57Ic1u`Y0S11{BF_M|H?A>mvmzbkS`K(t}96G3YLu&imfNnCsy)_SSmU zv0FK6n*A;-?zD-BT)#**$52+vy^8DJc0B?mdhiO(!mWj15<~yQ%FQ;W<_IJcFJLfyEiQ8zC`|G=S6f1 zeujUp@y_@w7?F9#pP_^Hq+!GL@KGMl+&cZaU5|5T+4c=`X}5WTcrZ872OuBDt|3ex zTo`SXyCWGb>z3VDg0C9g5|F$3nni5tDRX~9sj(zr&*ft4pk-+=FeegqP0;yFsOep? zCnnlTTv_NyTF1&cNHmu{fDmCzxjRbT^%k5=@_W?%Bup^gFu(qDwR4%X2|NeRr_L6c zWXl-KLWh0ab|g5BJZ1Bg*83tZB!(!NjZ72#IKk^qL9b&E8i> zL>tgEVBpFCRX@^LA3~16?pB-}+Emn~zN4zVGXp*)vT-Fuj8E;0y~?;8e_|;db?w0x z4+=ckQ3t|NyyJ|OA+AwxQDU6B?ttk+uAjj%FDH@BPqPiY09QkY`09j3j)O&K zYF(>Pwe_qDa}OR=ppAY3eC|IJuQBY+shB3fjtpm7z?#tUa4|QTH(#lcdA>Z43qXmKAvpcqh2@ z(-3z{W90WsRov=0-K87^aC6RvfW!uTm?JOLLBT;sj1_EUSy~_7&DzQgSDSa{)MT(dxppy)S^kdQeltY;`4#W*FHBHjES80o#Y8L zl1k&2U;3?qYqN8(#{?`2`!1pe7Avn33PLeqUD4OmT8fRb7G*YiA^bc|DHLmSnJPUh**%bJ|R#l86yYLB1y{ z+Vt#?q<&&cE2L^`$?rV>R^u2O8no5mN0k%0o?{3sR6i#jJlo;?)1c6IaDQ#J_$ z-Q_2_x)V1%zZAfSGv-GLQ1zpj2Szo;ZG#A>Y2^p{9yU2WA!)gSUrTkIOaENQ+_J^q39~ZpI)BkxXy4k! z6ZqDi=V&>|hyn{45)7@b+GwWKq2M2XB<3RVfW-BL)bUF14KbUY9&F@LGIHzuwcU;P zfHi^&6F_-1+PVX$+!!9B> zM5Ma4_}WYeYEU^%vl=fec_g~Ys>M$t6qVRLEp<=3sa0#Tu2Wv{jxmqy(E}k9K1>zp zQq&tmxV0T@4~d>2e&-q4(#y{Np5euq2p(y zcB=bUb1wW`h}U(36Y5%I_=VB<6Yt_D4>nwyVsp|QpHWH;;T{=wdC{IYjka{_dp;j( zwUnY}RWo@|X;DMU;oQQF!8{kFE^xi%yNr}Y)vXA!QkZ_!w+oUp>$=~O?q}CJ!pc*G z2VSgMneh7bSG6_l;Nb|!u0w?3h1f!qNLnm&U)$xj9J9e@Ddo(|U%y6PGk&(CR1=5g zXZq5yr{2*pkyK0Qc!j~O-mdx+f(@P0<6=%it#zR>K8+reG5m+hbm#dH6y#<%V?o+@ z3gsgIHeP&IZT_Lqcdyu2z6Z^ur$?EH)ryU2eK3>>660)Y2L5Wb?}tT8%Gdp7+m)Xs zwTsxKW%_~2=I7&x}I7|c4ALoh8=m}>Zl;U#r9 zJj4eBvDw8eF$W=c>?X)>=>T4^DZ9oy`=ZkE?OKgWhX^$k4uTGJ4#cIh(4Ol~5SH@R zUi#^`JX`cYxC&w6%HZgvklLV@YPDGKy@&dT9&&u>;}(8!aN1zbagQ6r7_Hoa)~90m z-2%Dy+WAL+#h;Da@Nq(N=7Rw;t>KOrk2(kX9EA)>TCdQ)5M2m%D7Sg9qBZXPwN-18 z^!MLoJwBWt9kgyA-clupvZP|~dNVnxGnPe@@56RTJ6XB1PdeWX6AoFp$mZG6W+Jag zB?pr>8+y>X2PhilnXhSG*@xzjgaeN^{K`$=tw0E(3f81lf6~QG>u_pzpQQCynd{L<{fpH#yinoRwj@?xBY6%o& z$``e7i{X5)+LYAGUW(9YnzjhM&7+}Oy160XOEe8n0Vprp`wjDG+mfrNAInQOZhneW za95*EOx&}zI8$k(nRYjzCBvX-a5C#iVuo<+2v(xrrM*}yTANqZMkzurM*fXja<}nD z=H4C*{3EU7blasM33JN=@r@FeYF^~!P{CyXFCIPls@2&y3`m<$NK=}1_^hFNTK(mY zrQRn}ryrh3Uy?S^n^=d{Ab22OYGWlGXBl^p3KOmolRWA0Xea+J4aqdharYIA^ca3? z&NoILb;i0Faup{u?0tp3!)$ihLOt4cdha=-%CBW!vRCe(A6ey7tQ?TaRFE%nfbm0n z7zh+>Bu1Z1dEs;Cjr(<(#WPjU<~8#6bf6zf?Bn3zpjLLC2{Au>>Hk*3`*-jEdu6?* zT8Ll%`)!n*TB<)H literal 0 HcmV?d00001 diff --git "a/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/1\346\234\210test" "b/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/1\346\234\210test" new file mode 100644 index 00000000..8c388782 --- /dev/null +++ "b/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/1\346\234\210test" @@ -0,0 +1,2 @@ +test +0228 \ No newline at end of file diff --git "a/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/2\346\234\210test" "b/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/2\346\234\210test" new file mode 100644 index 00000000..479dbaff --- /dev/null +++ "b/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/2\346\234\210test" @@ -0,0 +1,2 @@ +test +顶顶顶顶顶 \ No newline at end of file diff --git "a/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/3\346\234\210test" "b/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/3\346\234\210test" new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ "b/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/3\346\234\210test" @@ -0,0 +1 @@ +test \ No newline at end of file diff --git "a/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202203-3).md" "b/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202203-3).md" new file mode 100644 index 00000000..3bf59177 --- /dev/null +++ "b/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202203-3).md" @@ -0,0 +1,20 @@ +## 会议主题 +测试管理系统TestLib的方案讨论 + +## 会议时间 +2022.03.16 10:00-11:00 + +## 参会人 + +- 参会方:来自电子五所(赛宝实验室)和阿里云的社区爱好者 +- 参会人:yongchao、qingming、wjn740、as461177513、VosAmoWho 等等 + +## 会议记要 + +1. 对齐五所提出的方案扩展需求,主要是字段的扩展以及流程上适当进行松耦合 + - 设计对象:需要考虑测试用例套与测试需求的关系,测试结果与测试执行记录集的关系,测试方案的扩展等 + - 评审相关:测试用例、测试方案、测试结果 + - 流程上:主要对象之间需要进行适当的弱耦合 + - 平台输出:需要考虑测试用例及测试用例执行记录集这两块内容 +2. 讨论后续社区合作、运营等方式 +3. 后续yongchao会结合这次新增扩展需求进行设计上的优化并与大家对齐 \ No newline at end of file diff --git "a/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202204-1).md" "b/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202204-1).md" new file mode 100644 index 00000000..6bec3ab0 --- /dev/null +++ "b/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202204-1).md" @@ -0,0 +1,22 @@ +## 会议主题 +测试管理系统TestLib演示及需求讨论 + +## 会议时间 +2022.04.28 11:00-12:00 + +## 参会人 +- 参会方:来自电子五所(赛宝实验室)和阿里云的社区爱好者 +- 参会人:yongchao、wjn740、as461177513、VosAmoWho 等等 +## 会议记要 + +1. 我们演示了testlib目前全部功能,包括大纲,需求,方案,用例,任务,设备等等功能,强调通用性。 + - 测试方案已经跟测试用例和测试任务打通。 + - 测试用例跟t-one打通,测试任务结果跟t-one打通中。 + - 测试设备状态跟t-one打通中。 + - 介绍目前规划:用户权限,自定义字段,测试任务结果打通,测试方案维度的报告,还有系统配置等。 +2. 讨论下阶段主要需求,主要考虑两个方面: + - 希望演示的时候打通台式机的一个**完整测试流程打通**(大纲,需求,方案,任务,报告等)。 + - 有一个台式机的**测试报告**可以看。 +3. 演示发现的主要问题: + - 方案关联的任务没限制,用例管理信息问题,任务结果问题,还有方案维度的报告结果。 + diff --git "a/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202205-1).md" "b/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202205-1).md" new file mode 100644 index 00000000..8139fbee --- /dev/null +++ "b/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202205-1).md" @@ -0,0 +1,36 @@ +## 会议主题 +测试管理系统TestLib开发进度同步、演示、以及问题交流 +## 会议时间 +2022.05.20 10:00-11:00 +## 参会人 + +- 参会方:来自电子五所(赛宝实验室)和阿里云的社区爱好者 +- 参会人:yongchao、VosAmoWho、juexiao、wjn740、zhizhisheng、as461177513 等等 +## 会议记要 + +1. yongchao和VosAmoWho 与五所同学演示了testlib相关功能,着重介绍了与上次demo的开发重点变化,主要是测试方案及报告,测试用例的优化,测试任务及结果录入,以及系统配置等模块的优化。 +1. 大家一起交流了 testlib 以及 t-one的相关问题: + - T-One相关问题: + - 文档指导类: + - 升级debian相关步骤,涉及toneagent, tone配置,tone-cli等。 + - 同步本地用例出现故障, 以及系统同步用例相关的配置。 + - 测试机器:内网集群与内网单机的区别,如何配置等 + - 测试工具的管理问题: + - 不同的脚本都通过git进行管理出现的问题,离线模式介绍。 + - 测试工具的管理,版本管理如何做。 + - TestLib相关问题: + - 和tone的联动需要完善。 + - 用例结果:测试用例 及 结果 通过excel 导入及导出;关联任务/跳过任务 + - 测试报告:需要显示测试设备信息,后面考虑软硬件信息的提取及展示 +3. 目前系统已经发布上线,可以给五所同学配置权限即可进行试用。 +3. 五所提出的5月25日正式演示时间点不变,主要演示需求点还是: + - 希望演示的时候打通台式机的一个**完整测试流程打通**(大纲,需求,方案,任务,报告等)。 + - 有一个台式机的**测试报告**可以看。 +5. 后续开发重点主要是: + - 权限管控体系完善,方便社区线上使用。 + - 与t-one对接起来,固定ws、project、job类型等,自动执行并同步用例。 + - 手动录入用例结果、及设备的优化。 + - 测试方案报告及结果中设备等的展示优化。 + + + diff --git "a/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202306-1).md" "b/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202306-1).md" new file mode 100644 index 00000000..4274bb1b --- /dev/null +++ "b/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202306-1).md" @@ -0,0 +1,24 @@ + +### 会议主题 +项目例会 + +### 会议时间 +2023.06.08 10:30-11:30 + +### 参会人 +参会人:yongchao,fubing,ylsong, zhizhisheng,suchunyang,T-One项目小组 + +### 会议纪要 + +1. T-One最新进展同步 +- runner2 性能优化 +- toneagent新增日志自动拆分、自动清理功能 +- 同步用例逻辑变更,不依赖同步用例的机器 +- 用例管理批量编辑字段优化 +- 时序分析中性能分析、新建 Job 提交、消息通知相关慢接口优化。 +- 新增接口可查询某个产品下的 Job ID。 + +2. 需求反馈和意见收集 +- 物理机迁移的方案:主要关心数据的可迁移 +- 版本升级原地升级的方案:升级的便捷性 +- 社区版和开源部署版的数据节点间的互相同步数据 diff --git "a/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202307-1).md" "b/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202307-1).md" new file mode 100644 index 00000000..e59dcd0f --- /dev/null +++ "b/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202307-1).md" @@ -0,0 +1,26 @@ + +### 会议主题 +项目例会 + +### 会议时间 +2023.06.08 10:30-11:30 + +### 参会人 +参会人:yongchao,fubing,ylsong, zhizhisheng,suchunyang,T-One项目小组 + +### 会议纪要 + +1. T-One最新进展同步 +- runner2 性能优化 +- toneagent新增日志自动拆分、自动清理功能 +- 同步用例逻辑变更,不依赖同步用例的机器 +- 用例管理批量编辑字段优化 +- 时序分析中性能分析、新建 Job 提交、消息通知相关慢接口优化。 +- 新增接口可查询某个产品下的 Job ID。 +- [这是一个链接]: http://www.z01.com/ "这里是链接的title内容 +这是一个链接 [这是逐浪软件官网链接](http://www.z01.com/ "欢迎访问逐浪软件官网") +2. 需求反馈和意见收集 +- 物理机迁移的方案:主要关心数据的可迁移 +- 版本升级原地升级的方案:升级的便捷性 +- 社区版和开源部署版的数据节点间的互相同步数据 +- 测试验证 diff --git "a/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232\346\265\213\350\257\225\346\226\207\344\273\266.md" "b/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232\346\265\213\350\257\225\346\226\207\344\273\266.md" new file mode 100644 index 00000000..1732d313 --- /dev/null +++ "b/sig/T-One-copy2/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232\346\265\213\350\257\225\346\226\207\344\273\266.md" @@ -0,0 +1,4 @@ +### 收尾验证 +这是收尾,验证同步作者信息 +### 验证history +2023年11月16日10:49:13 \ No newline at end of file diff --git "a/sig/T-One-copy2/content/\345\274\200\345\217\221\346\211\213\345\206\214/ToneAgent\347\274\226\350\257\221\346\211\223\345\214\205\346\211\213\345\206\214.md" "b/sig/T-One-copy2/content/\345\274\200\345\217\221\346\211\213\345\206\214/ToneAgent\347\274\226\350\257\221\346\211\223\345\214\205\346\211\213\345\206\214.md" new file mode 100644 index 00000000..0949b8e7 --- /dev/null +++ "b/sig/T-One-copy2/content/\345\274\200\345\217\221\346\211\213\345\206\214/ToneAgent\347\274\226\350\257\221\346\211\223\345\214\205\346\211\213\345\206\214.md" @@ -0,0 +1,63 @@ +# 1. ToneAgent编译 + +## 1.1 环境准备 +Go 1.17 及以上版本([下载地址](https://go.dev/dl/)) + +## 1.2 下载ToneAgent + git clone git@gitee.com:anolis/tone-agent.git + cd tone-agent + +## 1.3 编译 +`-o` 后面是二进制的名称 + +### 1.3.1 编译 AMD64的二进制 + GOOS=linux GOARCH=amd64 go build -o toneagent-amd64-v102 + +### 1.3.2 编译 ARM 的二进制 + GOOS=linux GOARCH=arm64 go build -o toneagent-amd64-v102 + +# 2. Linux环境二进制打包 + +## 2.1 RPM包制作 + +### 2.1.1 RPM环境准备 + sudo su -c bash # 使用bash + yum install rpmdevtools rpmdevtools # 安装rpm打包工具 + +### 2.1.2 打包RPM包 + rpmdev-setuptree # 创建目录,会在用户目录下创建rpmbuild文件夹 ~/rpmbuild + cd # 返回用户目录 + vi rpmbuild/SPEC/toneagent.spec # 修改创建spec的模板文件 + mkdir rpmbuild/BUILDROOT/toneagent-0.0.1-AMD + cp ${二进制路径} rpmbuild/BUILDROOT/toneagent-0.0.1-AMD/ # 拷贝二进制到RPM目录 + cd rpmbuild/SPEC/ + rpmbuild -bb toneagent.spec # 构建rpm包 + +### 2.1.3 RPM安装及启动 + sudo yum -y install ${toneagent包位置} # 安装 + sudo systemctl start toneagent # 启动 + +## 2.2 DEB包制作 + +### 2.1.1 环境准备 + sudo apt instsll -y dpkg # 使用二进制打包,只需要安装这个包 + sudo apt install -y dpkg build-essential devscripts quilt dh-make git # 扩展安装 + +### 2.1.2 打包DEB包 + mkdir toneagent.work + cd toneagent.work + mkdir -pv toneagent_0.0.1_amd64/{DEBIAN,bin} + cp ${tone-agent二进制} toneagent_0.0.1_amd64/bin/ + echo "Package: toneagent + Version: 1.0 + Architecture: arm + Maintainer: alibaba + Installed-Size: 100 + Depends: + Priority: optional + Description: toneagent for SUNXI devices (A10,A20 ...),example is Cubieboard. + " >> toneagent_0.0.1_amd64/DEBIAN/control + dpkg -b toneagent_0.0.1_amd64 toneagent_0.0.1_amd64.deb + +### 2.1.3 DEB安装 + dpkg -i toneagent_0.0.1_amd64.deb diff --git "a/sig/T-One-copy2/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" "b/sig/T-One-copy2/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" new file mode 100644 index 00000000..9dca95d4 --- /dev/null +++ "b/sig/T-One-copy2/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" @@ -0,0 +1,16 @@ +HCT密码计算套件的目录结构如下: +阿斯顿法师打发斯蒂芬 +44444444444444444444444444444444444444444444444444444 +hygon-devkit/ + + ├─ hct +  ├──pkg +  │ ├── hct_1.0.0.20230224_rc +  │ ├── hct_1.0.1.20230512_rc +  │ └── hct_1.1.0.20230730_rc +  │ +  └── README.md + +\* pkg目录:内含各版本hct密码计算套件。 + +\* README.md文件:有关HCT的简单情况。 \ No newline at end of file diff --git "a/sig/T-One-copy2/content/\345\274\200\345\217\221\346\211\213\345\206\214/\345\257\271\345\244\226\346\234\215\345\212\241API.md" "b/sig/T-One-copy2/content/\345\274\200\345\217\221\346\211\213\345\206\214/\345\257\271\345\244\226\346\234\215\345\212\241API.md" new file mode 100644 index 00000000..6be2fe13 --- /dev/null +++ "b/sig/T-One-copy2/content/\345\274\200\345\217\221\346\211\213\345\206\214/\345\257\271\345\244\226\346\234\215\345\212\241API.md" @@ -0,0 +1 @@ +参考文档:https://tone.openanolis.cn/help_doc/7 \ No newline at end of file diff --git "a/sig/T-One-copy2/content/\345\274\200\345\217\221\346\211\213\345\206\214/\346\265\213\350\257\225\345\245\227\344\273\266\351\233\206\346\210\220\346\211\213\345\206\214.md" "b/sig/T-One-copy2/content/\345\274\200\345\217\221\346\211\213\345\206\214/\346\265\213\350\257\225\345\245\227\344\273\266\351\233\206\346\210\220\346\211\213\345\206\214.md" new file mode 100644 index 00000000..67b07c6d --- /dev/null +++ "b/sig/T-One-copy2/content/\345\274\200\345\217\221\346\211\213\345\206\214/\346\265\213\350\257\225\345\245\227\344\273\266\351\233\206\346\210\220\346\211\213\345\206\214.md" @@ -0,0 +1,282 @@ +# tone-cli介绍 +tone-cli主要用于测试套件(testsuite)的调度及运行。 + +# 代码仓库 +https://gitee.com/anolis/tone-cli + +# 测试套件构成 +测试套件主要由套件本身和集成脚本构成,其中: + +- 测试套件可以存放于gitee或其他代码仓库,也可以是一个系统中已经包含的命令 +- 集成脚本由两部分构成: + - 适配脚本 + - 测试套配置文件 + +# 测试套件集成 + +## 测试配置文件 +测试配置文件位于`$TONE_ROOT/conf`目录下,与适配脚本一起为测试套件服务。 + +为了便于组织,当前根据测试类别分为`functional`,`performance`和`stress`。 + +测试配置文件主要用于描述测试的参数,以netperf为例: + + test IP runtime send_size + TCP_RR ipv4 60s Na + TCP_RR ipv4 60s 16K + TCP_CC ipv4 60s Na + TCP_CRR ipv4 60s Na + ... + +第一行描述为变量名,后续行描述的是变量的值。tone-cli会将测试套配置文件按照配置进行执行: + + $ tone list netperf + test IP runtime send_size testconf + TCP_RR ipv4 60 None netperf:test=TCP_RR,IP=ipv4,runtime=60s + TCP_RR ipv4 60 16K netperf:test=TCP_RR,IP=ipv4,runtime=60s,send_size=16K + TCP_CC ipv4 60 None netperf:test=TCP_CC,IP=ipv4,runtime=60s + TCP_CRR ipv4 60 None netperf:test=TCP_CRR,IP=ipv4,runtime=60s +在后续的脚本中,conf中的变量会以参数形式传递给适配脚本。 + +> 注: +> +> - 没有任何变量的测试套,仍然需要创建对应名称的配置文件,保持内容为空 +> - 对于某个参数,如netperf的send_size,在某些状况下不需要传入参数,则可以置为NA + +## 适配脚本 + +测试套件适配脚本需要存放于`$TONE_ROOT/tests`目录下,创建工具对应的目录,如`$TONE_ROOT/tests/netperf`。 + +tone-cli将测试定义为以下几个阶段,可以根据需要来决定是否需要对应的阶段: + +- 测试套件获取 +- 测试套件编译安装 +- 测试执行 +- 结果处理 +- 测试套件卸载 + +适配脚本需要最少包含`install.sh`,`run.sh`和`README.md`,其中: + +- install.sh: 定义测试套件获取、依赖包、测试套件编译及安装 +- run.sh: 定义测试执行过程,结果处理方式 +- README.md: 测试套件必要说明 + +其他脚本可以根据需要决定,如:将结果处理脚本单独编写,在run.sh中加以引用 + +### 测试套件获取 + +当前支持通过URL下载或git方式获取对应的测试套: + +| 方式| 参数 | 说明 |举例 | +| :--:| :---: | :---: |:---: | +|URL下载 |WEB_URL |测试套下载地址 |WEB_URL=“https://gitee.com/anolis/tone-cli/repository/archive/master.zip”| +|GIT仓库 |GIT_URL |git仓库地址 |GIT_URL="https://gitee.com/mirrors_HewlettPackard/netperf.git"| +| |BRANCH |git分支| BRANCH="netperf-2.7.0"| + +tone-cli将根据提供的`WEB_URL`,`GIT_URL`,`BRANCH`等信息拉取对应的源代码 + +### 举例: + +`netperf/install.sh` + + GIT_URL="https://gitee.com/mirrors_HewlettPackard/netperf.git" + BRANCH="netperf-2.7.0" + +### 测试套件编译安装 + +tone-cli提供的标准安装方式由以下几步: + +- 执行安装前额外的操作:extract_src +- 安装依赖包:install_pkg +- 编译:build +- 安装:install + +**extract_src** + +用于在安装依赖包之前进行必要的准备,如centos安装epel源: + + extract_src() + { + logger yum install -y epel-release + } + +**install_pkg** + +绝大部分状况下,不需要重写install_pkg的方法,而仅通过设置DEP_PKG_LIST的变量,tone-cli将自动进行依赖包安装。如netperf/install.sh: + + DEP_PKG_LIST="automake gcc texinfo" + +**build和install** + +通常状况,build和install都需要根据测试套件进行重写。以netperf为例: + + build() + { + local configure_flags=( + --prefix="$TONE_BM_RUN_DIR" + ) + if [ "$(/usr/bin/arch)" = aarch64 ]; then + configure_flags+=('--build=aarch64-unknown-linux-gnu') + fi + + export CFLAGS="-fno-strict-aliasing -fcommon" + + ./autogen.sh + ./configure "${configure_flags[@]}" + make + } + + install() + { + make install-exec + } +### 测试执行 + +测试执行被定义在`run.sh`中,主要的步骤有: + +- 测试准备:setup +- 测试执行:run +- 测试拆除:teardown + +以netperf为例,netperf测试可以划分为: + +- 启动netserver +- 使用netperf命令进行测试 +- 拆除netserver + +**setup** + +netperf测试中,netserver启动主要逻辑为: + +- 判断是否设置了$SERVER,如果已设置,则认为netserver将在对应的server上执行 +- 启动netserver,启动netserver的主要逻辑在netserver.sh中体现 + + setup() + { + [ -n "$SERVER" ] && server=${SERVER%% *} || server=localhost + echo "Run netserver on host: $server" + + if [ "$server" = localhost ]; then + source "$TONE_BM_SUITE_DIR"/netserver.sh + else + ssh $server "TONE_ROOT=$TONE_ROOT TONE_BM_RUN_DIR=$TONE_BM_RUN_DIR IP=$IP server=$server $TONE_BM_SUITE_DIR/netserver.sh" + fi + } + +**run** + +netperf测试套的执行逻辑,主要根据测试套件配置中的参数组合,设置netperf命令行参数以执行测试 + +> 注: +> +> 在执行命令时,使用logger方法将netperf命令行输出写入对应的日志文件中,以备后续进行结果处理 + + run() + { + export PATH="$TONE_BM_RUN_DIR"/bin:$PATH + + [ -n "$send_size" ] && test_options="-- -m $send_size" + + opt_ip= + [ "$IP" = 'ipv4' ] && opt_ip='-4' + [ "$IP" = 'ipv6' ] && opt_ip='-6' + base_cmd="netperf $opt_ip -t $test -c -C -l $runtime -H $server $test_options" + + # check online cpus with cpu_affinity set on multi-processor machine + if [ "$server" = localhost ] && [ "$(nproc)" -gt 1 ]; then + check_oneline_cpu + # the last cpu is reservered for netserver if test on single node + cpu_online_num=$((cpu_online_num - 1)) + cpu_online_tpy=$(echo "$cpu_online_tpy" | awk '{$NF=""; print $0}') + cpu_x=$((1 % cpu_online_num)) + [ "$cpu_x" -eq 0 ] && cpu_x=$cpu_online_num + mycpu=$(echo "$cpu_online_tpy" | awk -v n=$cpu_x '{print $n}') + test_cmd="taskset -c $(echo "$mycpu" | cut -d- -f3) $base_cmd" + echo "run netperf on cpu: $(echo "$mycpu" | cut -d- -f3),"\ + "socket: $(echo "$mycpu" | cut -d- -f1),"\ + "core_id: $(echo "$mycpu" | cut -d- -f2)" + else + test_cmd="$base_cmd" + fi + + logger $test_cmd & + logger wait + } + +**teardown** + +netperf的teardown阶段,主要通过执行pkill命令杀死netserver进程 + + teardown() + { + pkill netserver + } + +**结果处理** +tone-cli当前规定的结果规范为`key: value`,所以只要符合这个输出规范,对应的结果会被收集并存储。 + +以netperf为例,其结果处理的`parse()`调用了一个awk脚本: + + #!/usr/bin/awk -f + + /^Size.*Okay.*Throughput.*Demand$/ { + unit = "Mbps1" + next + } + + /^Size.*Throughput.*remote$/ { + unit = "Mbps2" + next + } + + /^bytes.*secs.\s+per sec/ { + unit = "tps" + next + } + + $8 && $0 ~ /^[ \t0-9.]+$/ { + if ( unit == "Mbps1" ) { + printf("Throughput_Mbps: %s\n",$(NF-2)) + } + else if ( unit == "Mbps2" ) { + printf("Throughput_Mbps: %s\n",$5) + } + else{ + printf("Throughput_%s: %s\n",unit,$6) + } + } + +执行完毕后会输出: + + Throughput_tps: 91336.30 + +# 公共变量 +tone-cli提供了多个公共变量用于在测试集成时使用 + +## 测试套配置文件 + +|变量名称| 用途| 举例| +|:--:|:--:|:--:| +|nr_task |设置使用的线程数,可以使用百分比形式表示,当设置为百分比时,框架会根据当前测试机CPU数量进行计算 |nr_task=1, nr_task=50%| +|cpu_affinity |设置CPU绑定| cpupin| + +## 测试套适配脚本 + +|变量名称| 用途| 举例| +|:--:|:--:|:--:| +|$TONE_BM_CACHE_DIR |测试套件cache目录| /tmp/tone/cache/netperf| +|$TONE_BM_BUILD_DIR| 测试套件build目录| /tmp/tone/build/netperf| +|$TONE_BM_RUN_DIR |测试套件run目录,可以将测试套件安装于该目录中,而不用安装到系统目录下| /tmp/tone/run/netperf| +|$TONE_BM_RESULT_DIR |测试套件结果存放目录 |/tmp/tone/result/netperf| +|$TONE_CURRENT_RESULT_DIR |当次运行时的结果存放目录| /tmp/tone/result/netperf/1| +|$TONE_BM_SUITE_DIR |测试套件脚本目录| /tmp/tone/tests/netperf| + +# 公共函数 + +tone-cli提供一些公共函数已方便脚本编写,公共函数主要归档于$TONE_ROOT/lib目录下,在编写脚本时可以按需引入。常用的函数有: + +|函数名| 文件 |用途 |举例| +|:--:|:--:|:--:|:--:| +|logger |lib/common.sh |记录日志 |logger netperf -t TCP_RR| +|set_cpu_affinity_server |lib/cpu_affinity.sh |设置服务端CPU绑核,会将server绑定在最后一个CPU核上,注意,需要通过server_cmd变量进行传递 |server_cmd="netserver" [ -n "$cpu_affinity" ] && set_cpu_affinity_client logger ${server_cmd}| +|set_cpu_affinity_client |lib/cpu_affinity.sh| 设置客户端CPU绑核,会将client绑定在第一个CPU核上,注意,需要通过client_cmd进行传递 |client_cmd="netperf -t TCP_RR" [ -n "$cpu_affinity" ] && set_cpu_affinity_client logger ${client_cmd}| \ No newline at end of file diff --git "a/sig/T-One-copy2/content/\346\234\210\346\212\245/202212.md" "b/sig/T-One-copy2/content/\346\234\210\346\212\245/202212.md" new file mode 100644 index 00000000..88250c90 --- /dev/null +++ "b/sig/T-One-copy2/content/\346\234\210\346\212\245/202212.md" @@ -0,0 +1,82 @@ +# 整体进展 +- 发布 ANCK 4.19-027 版本。 +- 初步建立了龙蜥社区第三方驱动的研发流程,并试用该流程集成了国产化网迅网卡驱动。 +- ANCK-5.10 内核产品化。 +- 成立"浪潮信息龙蜥联合实验室"。 + +# ANCK 4.19-027 版本 +## 内核更新 +- 版本更新至 4.19.91-27 +- 重要内核缺陷及安全漏洞(CVE)修复 +- 在 namespace_unlock 中使用 synchronize_rcu_expedited 加速 rcu 宽限期,使并发启动100个 busybox 容器的速度提升19% +- 调整 Trusted Platform Module 驱动的缓冲区大小,避免上下文切换时因内存不足报错 +- 默认使能 mq-deadline IO 调度器 +- 提升 NVMe、megaraid_sas 和 mpt3sas 三个驱动的稳定性 +- 全面支持 Aero 系列 raid 卡 +- 修复了飞腾处理器 SMMU 的硬件缺陷导致的问题 +## 自研功能 +- 支持动态开启 Group Identity 特性 +- 支持稀疏文件映射使用系统零页,减少启动虚拟机时的内存消耗 +## CVE修复列表 +详情请参考: +- [Anolis OS 7](https://anas.openanolis.cn/errata/detail/ANSA-2023:0002) +- [Anolis OS 8](https://anas.openanolis.cn/errata/detail/ANSA-2023:0001) + +重要CVE列表: +- CVE-2021-33656 +- CVE-2021-4037 +- CVE-2021-4159 +- CVE-2022-0001 +- CVE-2022-0002 +- CVE-2022-0494 +- CVE-2022-1012 +- CVE-2022-1048 +- CVE-2022-1184 +- CVE-2022-1198 +- CVE-2022-1462 +- CVE-2022-1679 +- CVE-2022-1729 +- CVE-2022-1734 +- CVE-2022-21125 +- CVE-2022-21166 +- CVE-2022-2153 +- CVE-2022-2318 +- CVE-2022-24958 +- CVE-2022-2503 +- CVE-2022-25258 +- CVE-2022-2586 +- CVE-2022-2588 +- CVE-2022-2602 +- CVE-2022-26365 +- CVE-2022-2639 +- CVE-2022-26490 +- CVE-2022-27223 +- CVE-2022-28388 +- CVE-2022-28389 +- CVE-2022-28390 +- CVE-2022-2978 +- CVE-2022-30594 +- CVE-2022-3176 +- CVE-2022-3202 +- CVE-2022-32250 +- CVE-2022-3542 +- CVE-2022-36879 +- CVE-2022-36946 +- CVE-2022-39188 + +# 龙蜥社区第三方驱动 +建立第三方驱动的社区研发流程:https://openanolis.cn/sig/Cloud-Kernel/doc/721476448598622343
+ +网迅网卡已经按此流程合入 ANCK : +- 支持ANCK-5.10 10GB 网迅网卡驱动: https://gitee.com/anolis/cloud-kernel/pulls/540 +- 支持ANCK-4.19 10GB 网迅网卡驱动: https://gitee.com/anolis/cloud-kernel/pulls/709 +- 支持ANCK-4.19 1GB 网迅网卡驱动: https://gitee.com/anolis/cloud-kernel/pulls/1043 +- 支持ANCK-5.10 1GB 网迅网卡驱动: https://gitee.com/anolis/cloud-kernel/pulls/1063 + +# 重要议题 +- 讨论并决策了将 ANCK-5.10 作为 Anolis8 的默认产品化内核,详情请点击[这里](https://gitee.com/anolis/community/blob/master/proposals/Anolis8%E4%B8%8AANCK-5.10%E4%BA%A7%E5%93%81%E5%8C%96%E7%9A%84%E6%8F%90%E8%AE%AE.md)。 +- 讨论并决策了将 ANCK-5.10 作为 Anolis23 的当前默认内核,详情请点击[这里](https://gitee.com/anolis/community/blob/master/proposals/anck-5.10%E4%BD%9C%E4%B8%BAanolis23%E7%9A%84%E5%86%85%E6%A0%B8%E9%80%89%E5%9E%8B%E7%9A%84%E6%8F%90%E8%AE%AE.md)。 + +# 运营活动 +- [浪潮信息正式发布基于龙蜥 Anolis OS 的服务器操作系统 Inspur KOS](https://openanolis.cn/news/726244284765327879)。 +- 于2022.12.24 举办了“[龙蜥走进系列活动之走进浪潮信息 MeetUp](https://mp.weixin.qq.com/s?__biz=Mzg4MTMyMTUwMQ==&mid=2247510368&idx=1&sn=95a1d511b32670f8388745682483046a&chksm=cf655a12f812d30494be938d7bf8a46b7244711c8fb75f44e8379ab261b1fd4aeb1c8bb0805e&scene=21#wechat_redirect)",并成立了浪潮信息龙蜥联合实验室,致力于共建龙蜥社区的软硬件兼容性生态、标准建设和技术创新等。 diff --git "a/sig/T-One-copy2/content/\346\234\210\346\212\245/202301.md" "b/sig/T-One-copy2/content/\346\234\210\346\212\245/202301.md" new file mode 100644 index 00000000..85bbb428 --- /dev/null +++ "b/sig/T-One-copy2/content/\346\234\210\346\212\245/202301.md" @@ -0,0 +1,101 @@ +# 整体进展 + +- 发布 ANCK 5.10-013 版本。 +- 确定KABI机制整体方案。 +- 浪潮信息龙蜥联合实验室的工作事项更新。 + +# ANCK 5.10-013 版本 + +## 内核更新 + +- 版本更新至 5.10.134-13 +- 重要内核缺陷及安全漏洞(CVE)修复 +- 支持用户态/dev/ioasid +- SWIOTLB机制性能优化 +- virtio-net 打开 napi.tx 优化 TCP Small Queue 性能 +- 支持AST2600 PCIe 2D VGA Driver +- 支持FT2500处理器 +- 支持动态开启Group identity特性 +- arm64平台默认内核启动cmdline调整 +- 添加 Compact Numa Aware (CNA) spinlock 功能支持 +- 丰富arm64的perf mem和perf c2c功能 +- fsck.xfs 支持日志恢复 +- hugetext自适应按需大页 +- 支持SGX动态内存管理 +- 使能wireguard模块 + +## CVE修复列表 + +详情请参考: + +- [Anolis OS 7](https://anas.openanolis.cn/errata/detail/ANSA-2023:0002) +- [Anolis OS 8](https://anas.openanolis.cn/errata/detail/ANSA-2023:0001) + +重要CVE列表: + +- CVE-2021-4037 +- CVE-2022-0171 +- CVE-2022-1679 +- CVE-2022-2585 +- CVE-2022-2586 +- CVE-2022-2588 +- CVE-2022-2602 +- CVE-2022-26373 +- CVE-2022-2663 +- CVE-2022-2905 +- CVE-2022-2978 +- CVE-2022-3028 +- CVE-2022-3061 +- CVE-2022-3169 +- CVE-2022-3176 +- CVE-2022-3435 +- CVE-2022-3521 +- CVE-2022-3524 +- CVE-2022-3534 +- CVE-2022-3535 +- CVE-2022-3542 +- CVE-2022-3545 +- CVE-2022-3564 +- CVE-2022-3565 +- CVE-2022-3566 +- CVE-2022-3567 +- CVE-2022-3586 +- CVE-2022-3594 +- CVE-2022-3621 +- CVE-2022-3623 +- CVE-2022-3625 +- CVE-2022-3628 +- CVE-2022-3629 +- CVE-2022-3633 +- CVE-2022-3635 +- CVE-2022-3646 +- CVE-2022-3649 +- CVE-2022-36946 +- CVE-2022-39189 +- CVE-2022-39190 +- CVE-2022-39842 +- CVE-2022-40307 +- CVE-2022-40768 +- CVE-2022-41222 +- CVE-2022-41674 +- CVE-2022-42719 +- CVE-2022-42720 +- CVE-2022-42721 +- CVE-2022-42722 +- CVE-2022-42895 +- CVE-2022-42896 +- CVE-2022-43750 +- CVE-2022-4378 + +# 龙蜥社区第三方驱动 + +* 提供主流GPU在AnolisOS的Driver、CUDA、cuDNN安装测试与卸载指导文档:https://openanolis.cn/sig/AI_SIG/doc/721423765456666646 + +# 重要议题 + +- 调研并讨论了KABI机制的整体方案与实现细节。 +- 基于浪潮信息龙蜥联合实验室,讨论了关于整机硬件兼容性的相关事项,后续长期共建 AnolisOS 硬件兼容性标准和生态。 + +# 运营活动 + +- 无 diff --git "a/sig/T-One-copy2/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" "b/sig/T-One-copy2/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" new file mode 100644 index 00000000..30020428 --- /dev/null +++ "b/sig/T-One-copy2/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" @@ -0,0 +1,7 @@ +- 每月的月初总结发出上月的报告,并更新到 SIG 页面,如 2022.12 + +- 月报包含内容: + + 整体进展:SIG 该月的亮点特性汇总。 + + 具体进展:SIG 该月项目的详细进展,分别展开细节。 + + 重要议题: SIG 该月讨论的重要议题。 + + 运营活动: SIG 该月发生的运营活动。 diff --git "a/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/000000000130_anolis.jpg" "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/000000000130_anolis.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..25e606c9c5d28fccaf9f6caa351e3720570e4162 GIT binary patch literal 47154 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 literal 0 HcmV?d00001 diff --git "a/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" new file mode 100644 index 00000000..74f3dbc4 --- /dev/null +++ "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" @@ -0,0 +1,30 @@ +### T- One是什么 + T-One是一站式的自动化质量协作平台;打通了测试计划、测试准备、测试执行、测试分析、测试报告、覆盖率检测、智能Bisect,环境服务等流程的闭环,为社区研发提供一站式质量服务。 +​ + +### 平台架构 +![](assets/jiagou.jpeg) + +### 核心特点 +- 一站式质量平台:平台打通了测试准备、测试执行、测试分析、测试计划、测试报告、覆盖率检测、智能Bisect、智能巡检等流程全闭环,为社区研发提供一站式测试支撑。 + - 支持多CPU混合架构(x86、arm、loogarch、risc-v) + - 支持多操作系统类型(龙蜥OS、centos、debian等) + - 支持复杂环境测试(企业内网、独立隔离、弹性云虚拟机/容器、应用集群及多种混合环境) + +- 质量协作能力:通过分布式的业务架构和独立租户空间能力,支持多企业、多团队的质量协作模式。 +- 数据分析能力:平台提供了时序分析、对比分析,以及聚合生成测试报告的能力,在大量测试之后对数据进行分析以发现软件问题。 +- 开源软件包CI服务:社区开发者可以将自己的软件包(可来自代码托管平台如github/gitee/codeup等)注册到Testfarm, 平台会监控软件包的代码变更,一旦有变更则会立即触发测试,并将测试结果通知开发者,方便开源软件包引入。 +- 开发者资源服务:社区开发者可以reserve测试环境并登陆,方便在测试环境中进行测试及debug。 +- 缺陷定位诊断服务:对于发现的软件缺陷,平台可以提供了缺陷的自动化定位诊断能力,可以发现引入缺陷的commit地址。 + + +### 应用场景 +- 场景1:OS发布测试,每次AnolisOS的发布,社区测试团队会根据发布测试策略进行大规模测试,保障产品发布质量,外部用户可以在Testfarm查看发布测试数据。 +- 场景2:开源软件包CI,社区开发者可以将软件包注册到平台,平台会自动监控软件包的变更,一旦发生变更会立即进行测试并推送测试结果。 +- 场景3:自定义测试,社区开发者根据自己的需求可以在T-One平台进行在线测试,或者使用命令行测试。 +- 场景4:离线测试,对于网络不可达的测试环境,用户可以使用离线测试模式测试并上传数据。 +- 场景5:独立部署,外部用户也可以在自己环境下独立部署平台,测试并上传数据到Testfarm。 +- 场景6:登陆测试环境,社区开发者可以根据需要reserve测试环境登陆进行测试及debug。 +- 场景7:缺陷定位诊断,一旦测试出缺陷,平台会自动诊断缺陷引入的commit。 + + diff --git "a/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/Dingtalk_20240614165831.jpg" "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/Dingtalk_20240614165831.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..925bf2945891170613821e8e7dbc9e4206d17c8d GIT binary patch literal 6459 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

}E@Hj0_{W?|f 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

FG!grkAXdJNt$uIvKqhcJq z&+Ed1J8vY>_8{Fg5c<9FexfVv1a|A-3HPVumUvELTRMnOCTF3^tDOgg?v>EG_Ai3& z+*77Z7S(6V8ueIr)1YO(L?*-MFv%C3HXHjFMc7(Y)Kml(U)@!AO|C1? z^K~GL>qcF3wZmsWBy9()XihGz$o^;{Vr+)<4ycM#Bp% zs>98(vw5>jTjuwoth#~bjg{%I1tMiNVx?xMM!EFX!|-NIZiB^obSsz6c_fp2Ee{*6!?+IV(wWT$iPripV(D;B6K&%rp@}f=2hHTos7uo5ug`!}b91qOZ@_l2DcW0R8c{-&Fh7 zU?-0}omXI%W09OAfe=vTLmx0Yod#9qX2Rq`*sg)47O~)EgDsvz1t$ohMAO`eLyQs_ zk`w0}m+TSbGx4(5Il<5oqxUwOjIf1;4qk!eNfS{_-A&$DLJ z#cvos@wjI4lBHC0r3Q)js6Xw`QF6p;Hk!?G9lu9sJ67 zN;XqmHref|s{oGUTdTccmCJuwBS@R(Aqdn;IwC6-_pbnvAXv$+d1D*XIjc+={1$`N z@aUYGN0R-8SiVgsxk%j?ne%x>`&y=vl0%KN!SG&BF@-gbZa zDrIL)a7kxbEP8CV+OMyO-`&!f7{(;DY)CdAAn*A%jR*&xrneu`XgHUlRyptvd2dqr z{pAcKAK(&Cs`0+)tD;#uv8udImNX#OdjWJe{jvBWE743uOrHCHhbg+nr=SxX$u!Y_*5KqMc8&`Mk1 zH={0aB1|zOdO8ZPPsbgB%tH-zRbAtz!l)bRZs#Yb^#-x+KDXmd-x{m0rxCt`Yp_gS z;W_o%#shd?770J!*Z(YYrxtD383UnKR(Ka}&yOhAt%o{esce*sh@7vD`xC`gUwe%X zjn#$k_Srkn%ppEzk|a~Z=?6($^9x1(hDh|TMrDPc2nx`oPU%X-G$cKte> z7MkuEATclvW}`Ojf2){;^#UBCU@dlx={T`gjir)to?kExg5_zvBE}L}fL3^MlXWAt zB<`1<YInXd z7gu031%xSlVX=hHOf~C#5HUSWDq_>) z7$uqKLwBzQAOS297A|LOiC}oFIMx@;s})_1H75NWjx3$3}-&^_iLeKEm=sARLW*FWy9o)s3C@x4ZY ziuMygqUJPAI#g3e;@t7u{#*@p5+y|%`Uho_ce zxD*U+oXXUbM@C^OvK=>$S{!qsxkM{u#1yZ-jD_h`g7x?BQ(@Qgfvy%=ey{w+=klEp z&(ecp$1;-HlX@tA`KIsn0Fi!}-EWI0zW2Ppmk|yf1Ju6Sr;!C-<_jf((%2Zle%SSuBULEI6Qo(&}xL237|E>bXgqS{>kz z-`xI}j_>q);Q*Kk`6noVokwd zz<`B+x!Q|hzy!mFa?Sn8`BKR9`VTGSllv;2W-M_`v-@@N&CsUIyDeHZ)pBpuBHF)x z`kV&wO2w9A+o}O5po=PI`@E(VNAun1A?Z)3G5Oc~=h*lfrtdL+*0*dqFKY#S+ss;z zrjv+leth)k5o;A0{gPf^fK9;>_A5 z5`fKNGAzfxPt+?kLE#?oJ2QwJja0QiG9r&Aa_t3uJ5%v}-_HRk>pt80+s~LoOi^*1 zD{Ge>zS%+Ays0}G_%UfoJR^jOLu?-Cqk&Z5ahtqPTb3<&K#Cx8L3W5nFJ^+?1Mi9z z*%0kgz>&;o50w)h%@4V1@~2-~A0Zu$n&M<)$Oy62Pev!#Vd&}KCYe)veZY=0BULan zpbp13mUgtHd8PT>E5s|F{riH^8J3Oqkz!z*x}r|T#N!_j(Pm0C{QIk_v#J7#N5&|y zUS^K-h1sGs#!PD+*TO*6v?tr!h3a`X_8IRPA((J`uj9LGUKo;V3I=k!tFx1dz9^(e zRpr?>&h5W~n0q;@mj(XU*8MH1?|Oc4mE%2Stf+zC(j;mW^d54g>7sQ<4`{B zE`Uh>awLA-vQC7iZNp(G-)r30=hc_kahxz>`~aoUpBHwaF7L^-+sPq?mVb^;EHqTk z^~udk?XRiVQKK-Xs6Pj`2L03jiSvRYEAu}o^4yuv;W?+K%OkD|J5VLCZ&!9Tq*w`n z)volPcBp^r(O84~a-fdyX8%$9tslm(yOPTnVwmxqpa@siFXjqw)o1!%{htH zrEV{Sh^M%yn~Bfk7WrvWzC7of@0r*h&XJZ47IDT!=_hFhX`ZI_Qu6GVn8Sk0_93;u zQSRLuo|Ylg?yFmkJCx9e@z&rVYBLYpcXEKN;-AN$fuJ9dB)eTEQ60Yr)oh@}xR0sB z;dzc}`s$C+SQy9a0(-;K!by~&Cc2H+zIT+c_s1w@Zq$5ekAp+NYDg9M82OS!eDdi| zxlPuw=?9I*q<*-=zn6xf8ZWM3`^W&~g?o;khp4N}ce?o$)FgU2i;Pq_Oj^bwuhm0U zh=myKP&FZl5%GeYbV1XS_l00AVnH#_3er7o`>0H?na#`F1+@ef%ctQZQ9tR6&oHy6 z^~=eN&sibxb?pK3tn_q^O13Ir@SbqTX`Yya2?24(ZLk>Wu0iYSg~ zIQeHG%)WoPcQVvNz3RE+4Ka=23h09i@YMW%UlC~jtq9u=>lfqonua#6@^##!8PQ$^4`?p$ z>&7VrD1CoHdBe8RwjEi!$P#Bh&4ZM37?nHCPL+ge;aPU-jBE16l$7I$WS=*%@_mQS z#bOpztd&|b;T^ZGs4EQP_(ZF0Ds6x!X=p{lmbi5SxC%{6w3AxHhWLDweUOTM6fR^e z)*%w_c`Q)K_Bqqs4#wxzSQ|x_Bl{isQVq~d0x-qq!1Bb1>Qs%aWE+44npO9ZiPo^o z8kZgO*C*uf-R}@`T97?PJ@I!DuB$_Y({G)7MSJr7$CGJqT?suxb<3?zTrl+Q&jzv( ztvJwSk&7qwTvx7N6dZhzKQYBSSm>XrW{vfuBOHUc(=hfi{M-Du!TJg+Xo?H!`YI_M z5{a7(+%`73e#et97M7ETC*YGev{QcL60+5!trMF#J$4+61)T((F;rKY1z+xIml=i>lu!8`mAhaNB9 zTp?_Q`grs8G4L$uvT7lSg!(3JGuWPGiiHgmr$t~SPCcqENTtxi`uB|PxjW~g%F8w$ zvbuOpZ((gthJU%HR<#>vy~_-ii(gRv(9_G-n(kPyLkBMwoq}kM%71K`yI*{cSKtIz zxiv=;;`5m@fz8~2QL01T3RyifWZ0wtU2@#+e8uE4eaaAb|ICBh>aJIuN?3P%yC?#6 zREZ2tE4%;4q)2I=3(9XTAq8SGh{HM9P2q*#r6cacftYf;7(mK`s^&a!BvY>Z`Gkru zNQPuoDm>{jj3Ng{3J)v5$ODMrhI80P92kzX08OFeVrK;ZJPr0ToR~EL`}()N2GvMf*aKHQDv)4m%W0F zIGjoG!AfUBGWhw{NTyPm7Fh`fC}o=tRiJjM;3e*b_JZE0WKc-Qwx?%QFh^xFnuRLm zEy|M~Gq!ohT+FWh@=(OfToTA-h>a>@njC@Uea8r|*qi@_Wzh7p^I$m?g8)YDu7&OK zo4hgYHJyAF+&@d$qzqaA;O535RCsfY3&)^@U&5GRVWiMb&%xcq!qT6X#kVf&i)kX< zpC|8sBz`HFGCB9&pc%A%zFL;~PG+L0qwU95tKnrlgNxf~&MpP9WptTufFpA10ZiHE zf3v^WCjOmNA%{Rgc_foISP%BbK9dU4{u_egyN!#H-n5}v-;V&n3(WQS4TK)6oG@9Rwa3K3NUe1rO2td&M4|4`@Yr$ z5p{B|G)0C*l9C6my@QTWtm~$+3TyJ!$nj?D$Xzb!+B`<#ySJX=^!3G~j2MzsAh~~x zt&*p|k$O~F0kPKafb5Z|LIDk-sJp<-dEj|ZxjEw`JY=}I=lx;t%^Ypa#*cXgl5fNYQa#REAf0rsZlVj;14SCX`8ls{6$ZF3rmb z@+)5i8W>{*Aff*G4(a!{ov@HA7yD@Orw7I&m)))R)tBkrhjTSPvg00oi}voBm*csB zcQl)>`bin|{jF(BYVaF;+t}`KhD|DykAc|v&tP9{^TU^VTEd{qsHmyBX_m(t4-F{koQWgW2RpPee;Qi%uXoje^i^p&L zSYp2(@6iT$1Ib}x0Bmb*vzl;?058%-ZX~?W1xbN73@~C}ThXLgdNJnqn{a^r*-{;NOY_8fX7QL6<^hO6)h`E;tGA|PmMWgyZpgN|> zLTbm+dlXjWc)SI!5I-@yxW2f)G7D_ktRY}2-p%iMPhuNqtXfMpS+R@nyrfy7y>73l zX$!eHL2dKmrLy;ilw0oU?do1Z1*iu?$^;e0&{9ly-(kTp7GE?pz7 zLTsMJSrxgbNv^P0Me89Vc(G%j;YO>;`K6^U_YL3YS&u!QY@{0G%z#J)rdm{(We^7$ zPpF})s_oi0TsM4E!L%AH>#OeTcTU}9R)!w2xm;X7{gV?@)tzKbD<-a`z^3L{exr(! zf4HJEH)s@{cUf1z4ij?(6X_;A-NJ|9tEpl^tp5d&phBSVi)T6Gqr%zB(Py~`EA1lyc~I_}2l7r$k3crD`eJN+FS4kK5| zM!uvZRDQr;EX(vTi$P&mT*td84N(>(OsCtrOkUG$jyqwPj%&D1DHaI=T4dlZHIbaq zGPqNG#i$II?fvME#CHoVOU3-z>UPsmspZ}wa;}L7Kw_dICV(YJQu&Z)<_o3=At@Bo zZ~0g<`qbR}kt~Ifxc=~j$URo>-$v|-!3FG4=I3x!5cqa=5MxVtudB3#JPm5heaI%; z^c#1kyskQ5A~0#qN-M~q)M2RK%PVR+p0?cCoR7M>(>6X`9v(8uqk-ZwuxgDPK4`Wa zIuI1$0_KJXIR&ILNYCs@oM~s`Wi^v z3FnB;boIW0zvN&)s0|ckot5DT-iF)`B$>9JKrlL&C)LzW)LuNU4y%}7Kh&C1W^%K% z8xx>mh}Dz9KHTx2E7=H0lIpnnq+KFuEAR9dmg$pjWwQmO!S%nojZzF9!Vo-yw)Iyr z$FZupb=`y+M~t-HebR2YN`i=i7S2rHcXs-DG?T(9MG-UL%P0<`7LEkI5nQhr%BhX# zqpPQJp|rJ%#(}kMJ~&<2P>3Jr9lLDX0_>4(Z;o;oizlN}1Dz^s@e4xw;JM2bopSQB z&8E~=5&;V>>+-tD{Xuyy#~c(yT=H2U3K<2H3oWzy61*B>a0BSd7{|7 z)?a-ojm=%Ufl+;WDxE#h-BLcDSWti2X&GJiYkSE0cSwF& zmED6fhcx>pB>FO?BFI#q(8Bc)JLg{1Qd>c@%P$}xUuHd#+~fo7Da%vBy8$vSr`$&y zkQkG4xZ;9mzK=euIz2B_Tp??EK2RsDOb>q(W>(x|oThg4M*aaKWI*42`dKxca|LOm zaIa&F!NwE+$%Ia`>M05$ufC$)zoqT}_;d8y-SDV(K1q!zh@AxXgBiy&zR-nt?%Ssz zMSFOAhb9cL4Z)6A-BO1y574SK_WT;Wf7$m&6vTQqc@uzzB*#oH4%S|7xUV1gI|=y_ zLDV$P*LPkn_z!gd1Asw)zM;B{+U5-j*~S&;pMPOQa<+Iw%*)vrkRK4+L1>byX7d-!pFVwBaNXFh z`H@)TfO&>vnUyl(n2`4X`|SVwZ?m?}&h(gS`mq2E#z> zS>|rQY--U)fCB9|CI=s$UPT0f`8j9q`GtCI@_mwSv%|D$?|t_>XHK7iXO5pZ_QbD$ zU0Y7tY#h_?ql=%hOOFX%^t3U}^-nzcEHBEPcA9bE ztbYcVGtd0Bvw9&C1Wm#5HD~%-^xy+T+o@A`aG(T_8>>Yl*Cctck%-_lj_tRfa>5Cp z`PHw^Rw&G2sne&wh-At}YsTOk-}r{Wh6d|LO-b2Izv7!;`{F|nFV;P*G;M0Ez3Oi_ z{QT#qS#H$P)j^ljVNN^k3_a?=1NJ-l4={c#SoEMz&b=%5ncw~HcT~##_j|>sKmExhOY1yb@Ne2@pEzyy zO>a6}=|(}E1$p(W7kr-?6<&Z=z#}V7??HP3%w2OA?7Gu5w%h;tpHpJrJc|+QVgwZj zkz3n4PWarH=Fhv|&)2=-4MuL9{WB+g(S}sV9P=*opT9ZhY=TJgP49H%^q}<|JI*$t zJ$ZDuVn?=0F}1~wVa(X(70XNu^u}(hHae@RunKw5Oaw{@Bt#0*lLP@hnQuLT7<9Y@J?tYSdB z_o>HEKKYD!Fs4;YVvO#sEz9@X>)^h2uS@Oz_~W(@$+95LCy&P(U3cJ#zz_firbe(; z(&oVj9}MC7xY%g!@cap1fXs5?05*6hntbpfVCI#(K0{amgDknqJU{nT^-P#J!Tw|F zV^1Av2{f#?V5b@c+08ef;8z3d%%oKOF@?jC9Z}> z_Pp`Ekm=K>A9&zD^OZgO>|f2D6I&WcMaO1G0wfXOr>e3R=rk^rSjza}4TG#T7(aq!v>D8o3lPt6+ zpO7oe-aPqq?1B?sZ1PX@5;(9-^(j^JNtnGXg z40cRQ+IsHXdx>5kCS=8mWel=A&fGzZs|lqjw-l&5wxP2p<`S^Od+we4(T{#yAl|DJ zKs(lFRBUf=11d#OqDYT&V6j@TAOwj=9$3U6#iu~3t+t*ral)9aD1xXf#SERzb4^uR z5fdJjq0Z3*|Ls5iLn<8#EV(6%{=t3C=FFxs%`5?8GIao`0Y39Us8{-fH^VeH$H90JQcg&f0-+Y@z+DoOn zx|Yw4n6mo$&wqaXwb!x1n2<5|!nUDTu#@GibRn6$3;(ktTdp<%&`1bLm)*+>C&p(>N(^P!-gb)%0~{03@6mK9e3Oznc{dKO+4k4 zpPY5puP(aiBK5Z;*5Pl8B^)H(>Z(e{JXY}AZ@WV#rpkS|IG%~H@>Bt(_w)uU$AH!0 zkV6iU_78u!KyPYpjJa!9#Hr{rPD^X1E{Es7K-e;PB@o7JUU7{U1+-FvO7E$spTXcd zX|sv{{%;?*TDY&>H`nf`oONby_Zsbf#G68mfg}7NxBG3kN4p2?t3%y_x{As$sCnR& zmBj8)Z$Q+1g_roG$e4_xGa$vx$~ojnC@>2ssUQ_GD-u#dhP147pOk-x?I`N&Efjgk zR0+W)j)%bRy1Iz4j=r5bb*kc?e3Ek`@t}(2Q`yz$@h*py5Bt=U_?~1W2BiQSl#;Nq zYx{7U&zU%JER(Z3%UK0%ywHN@e9PyX@qP%qqX}jjz9d z-Xh_od8OZa>l}RnC$yAk_7zu2-qIQihaBjv+C=sQ(a1Q1kVNm>O?}V>T)ZwOa z%rWoTe*3Lw%{uTefBCEUa<-t3-A}pk8O1ev6wnf+qZ&4zYHkI@!tS@d?QQl<#vHsN zn`!;M_YTd94IO5%TP>pPsA@+Z`DW9-9i3f9RS|d!w1;1IFi)J2Mq_swVrPIq9Tbe^ zN(&@p*WGs8xwW;ETId;ghFKQK{QAJrw9az zo^aPZ^2oO`_?q%1lN@{OG5jQ!E^C1$F~zrlA}=H2nZ;+`hXfj(bVWl;%Qs}@G7k>D z5m-@y`M>dvZ+zR^k7DM)W5p-_=)&Imz!W_`$5mB{e)d8QaC+;mP~q;bTGCSb*`P41aZcXfmlj`R zL3WtY`Y0sQOzzqUk+q`-VgVftk)zdn!&(p9HI8S%T*<5)Su5>_KIJo?{*+Y~3l={7 zo8O%$txRm{U;=rsJ$BiB_g%jJ^{;>Sv!8!>@neHl6#})@;fKGT06|Z}uFa~+8M_NM z$P&v$m(G680{Wnt2vkXsbA-IUv&B}E-}k=v&74VRtGNA+Tdk3J=}VoDRAq))hqAll zVTT>eKt`4&Gns!L(^&th|M<^y&N-L#ysSO^i}WM7a_|5;j2jaMKl(sar#JkC%wRn8 z?6O$HonT1>u?7j`3@JjumDmKyo>c%DRnI+EhhqBSs99X2M}g`pD~ap1drRBqleg6F z(|4R<5B)p)+Wn=tSbw{}s#N#_5(i^UDPjI`NQzc9cN6OG(pi1Kk|@H$ye7@ zGla=XaX53|cJN_Ii40kJgEtcElS^BmuCmHv65o63si!I(KZeYt5H62;CW$=XOO2rp zNz5n(6c6i40gZy%+7~y|b|`Ef;JxpCS5k^%Rf6U2kmJG$p(TgE{`H42o6ehep9Zq} zAb3&I=kY~qTZ$e-s+nYScPU|m$-1dl>rS1z{j_OYZZZC@x%blpLGh474|~_U->&s3 zfIfyep)z$1;kjc`WlKvqIAqv=`qQ6gurM_(f9MifZACM%{_&5$he`TAe#rNMDR#Hr zKBKCq{oMJn5v93=nEdK$oF<2ISHNqpii{V~RL1S&?+k#27_5;D7^mnE7IY z`-@(*h0mOS|NXb!b_*75R;0P9!QCE%4?p~H%kpL0Z?~;dVBEd9Mv(&86lbf%k#N!Q z7<}gGXCHg)sjau#>{FjIc}4ak5AYJ% zM;|eN-hH><8Aon9QB$2|MJ88a9g0(rKA3=7@w(R?w%4A!FL>b5SpJZ9+2y+{j)V{{ zTddOmeuiWmtU2UW(zg(`iVs%Z{)dSD!o4NbUxTP@=RsM6GC53R*#Dvv8<`WRtcDN@BMh^e$!Puk#=i zcbUi`_ksM$3i2St2dX(KSu~gUIc*Rvb#HMz=d>~@uAwM^qzH&;89AA}Lh2J%`CDat zY6}s(^%G8B^~!zzjhUslB~4w-dkeWl9~5j@AFHbIu;LXeDB3 zm(RY^u6?+AG+cGx#$ukCnzbGKF8lQ1Z#XQX4sm%EF)J(i(7*Q3L$=&<(vl@Be*NoT zU-h@yJV31Q`ImqB*C|uBCM&=A#XEA+`TqC6V}+8cLaa})?Bd<;emnVo_SM(1j1bLz zpdQ8a_?9CMU%tE*ZYh&Jo!zv)@#C6*dFHRpW+NIRs1bzP99hlP*{)VuxIrs|O1h_W zY!jG={D2|8s|bE>3ao7RBi?%0p|iH!a^jMu%e4E|SA|c(jOjaS_sLsN>2LRnAAbM4 zsoguY`|#bA(U;XEQ-hc7pr@0JZ zq}tSFP(J+d!(kiO!r|%j$T?e&T<= zcM>4kut$Vrk3WuW`>}@~kDY5rQvIBqfq@VxEoQlcpRK z2bNC^8RC5O6Q7*C<+!V_x|XFm=6WiEVG0LYca;&QGVw>>d2T8fZ`YOrFaR*XAOp_` zZjVPK#~Ijk%x3Vc0RT(ZiI}eT&Yll`@EAIbW|Bnfm}Szkzzl>fZSCx8!gt?ww-;@< zjm>Pg+h!}PDmL3}ydm0F5DOPQO6_6LoHuVCVfq8d9`jGH*c*y4Qew1(PPJx<ohD)1aS}I@@O&xrQIqkfnY2Li~tiw)%*=^U|zWBv2e(5V; z7J*NuZ&Y#lceI9~S#seRxzFEjn<)z2Y32+cK_vgshdyB2kvVhjJO6?|u--0R@^k`c zH{87Z+c06{x)X-S0X4@WTv{!9Xf1IK-ZO()aF~bFWoiq}+f(C|JR5 zYAXXj!EAyB#RXLR?z?YiXOE4VMT0afOFo(&<1#r+VAc`*6lly%+%LqBl*39zsJW?m zn{Bp{VU6uZyLxW9Y zojQ2-_Jw+_MYjxQlrI}GS`|ZNgtR!Yj2SW)=}$P$Hb|YWR9D!oh|R}Z+S`ooecRSl zI)N>sh%8M!Cl6h-c>-nS9+_2z#Vf9Kx>`KMOkJW+{9vkMAE{xkuBoq6ihjs-x!rqL z3@u?cpfqNPrmcsK4VE5ND<&06W=(s$(hM!6tEgz}>`=+5l0m|5zurc_j=hG$RF+<~ zcgBQ_uHua)L*7PYJ~~7b6szp3JQkpKibgS4?hNq|`^?HMRV^)0Zi~IyBYAv$x=KCA zul(HiVx9j`XXTMmWcf%bznH2w&j@x==b&K19#X`=98KEvDe)_XgR8gb8IzdWCP&*S zcU&eD3Wrk3Tn8bJhO(lD+z`)k&SVd{!NV>)?PT!YW#<{3Xa0P_MJ%$U6En1|chR^N zl_qRY`rZ$S2#vM8Uc1t_MY|37I_FwwwI`l=X3jnLDA(Wt7>P>3D?KRJecP#1+gP2) zj<2Z-69#DjyZ2xW2q0Be8Q1wgIAW-|sc!M(PoMgWUlGKq^i^gAt84CG@W3_KU2lW< zU3T5^-uo7EiR4!-IevQS>?>>P8m-VEkTf*a9y)9PrB6S>k3ya`wKaeI{r{(vSfb4! zKpI*6)YE(HwfhxUTyy@PV{Y6fQbsAy;an3HMkSwVdsSAzhNcF4RK^fwQAcN6MQzA2 z&$kQu0)PXrup`o?6F#f-=Yj7x;BWLBwB5IvJgKkUo9n1mXPnX3?gmkuwAAjq?z-cB z1Ka&_3pI1QJ5l|0haL3HQ%};^mD1VX{mrj`&8uB@nPFuSzO|iYx0My&{Pwq>S+WG= zNG6&dYvSZ{{q@%y(GB?k3B7y_-u&h_Pv7B1>|I2FhK4vdg)Nr{gDF8i$a}wJ&tr}` zW~<4YU4F&Y#8VvG)@${glxi!lyZV|bTTXt(%lA$!)3i#(?8~oOvXoOj<-e|lV?#|G zW2t1`aB1_)JoykUgQ@DL+=gtDR@YGX>I3)Rf8V{Yz3#>z{Ld-IgWOQDvM9{k(bT>j zMq|5qqh_qULR+k@tP~Kf-6yatUtR*e@3J`a@sG8Yo+ zwL0gp@#$w`CkdS^&b+F39$;HjqtoP;nb81`SRc{vCgY*Du3oecee7e~Pv5?+tK!sO zoJkt^>CaBHX~c{jr+w~oUm(`cyZ0W|(-&eVC%R&1%;{N3Y{M$*W!j!60LX`qH9_~e z;<~^4cJ|jqqDK0vEvc@&`i8w<`U(rL}+S~To=jA+Sk38yav#gZT8P|GlBU z_S2vKFJ6?FUV14uQXNta0#Le4B*cDl#GNfRn}`amT6|R~NY8 z$qjWijr9%NZnG_+ohkOrvwq#bv^e?{JB!Yh`-{(yLEbu5GZ>Yz4=M`>sK4dtcj^vo zF(TwKOF|Es0|*>&t?%|N$)&JJl%^3;gn9#J`CqQiV1xgFiazJhwNTrhGr!_xL4oHx z1^QX`^Rk}CR6}agrrb%N6)$?xw(oxTdr7p*mbIOKf$4`!9((K&I!@wi5mOS}4I?vm zL7Dm3M?aXk*r4Bsqb*t5#vdJLuCK3KvSiuVv1W|rfJ@?aR+sV2E}El!k{E1Loa^oNCj>)OXZOuF-|}7WI{MjXW0zrdrViN0 zuZ>``$y^Lx{X)dXu5)Vl@YMmB)b5+$bdv}llar-uyM?p(RF`|_4$zkkW_$S$$ACggV#WPNOp~7lONT?Ew7pm+dw8 z?s+zLf>PmR*bsB$5Vk4{k~vJi_Rz!L^B%jQR@`{Q&E#OE&?LE(GlVN823XdiB;NJ6 zNz}xCs{|byf@f<@k38}%bhaP;=*RtW2L4rlx#f;2A&82h&$8kTj9UC&HwtJz0x>0= z@hcSjt}Y^DqJL}(>H*WhJY4~*?l><5AG1M-n3kXAcJV4lkON87ek3QH@SiO$-PrGC zmtBU_YC%>iE;+Mi%}NfvxF3djn@JK=YKpdQ&2pVr@Beah6rcb6=i1xDTbrW_km5_8 z!Br9A>{AolPB_NMHt=wpn1AqMMI3wVvHR}(G9Wwk)YG|Ws=s+c6JnqJ?5AhUnEJI7 zzi|6)cbV(6)0j(rB%y^Ka>#+SM{+P8?jY~kvu9fjZ#kUgJyo$<&y{H`=O9E+FA`0f z@R^-=-hqg3QqEgZHrs5o2Nv7B`h|7Hd_r{Fe3ewY{($xSm&T$1B=-OSSnGcK?Z-WJ z+_=V;*3Q#TI}H>``_t0i<~(rCf9|~V%+}T}8|i685dGQD&iKFwj?uXMP+ZVx^#N2s ztW6Dm^n)LGp!`gpJc%x(#ozIcquAHP@eJw^r~+?(^P89|0)fdp9bDC<-X6Ts?%`Br zX@)>qsV7bgS9*aXpbmP~%Xivoy3G!(r9AcnAJCu9JMT}{D4BmtSGbg`r1-5J?SS{v zJ$8KQOZU_@KJu{-9r&6{)HBM>Aorj?%a^a1G@;pa@CW@b^%-;NzWG3NA4ALz4HVagPUWnX>m z^|#-7=Od3;Ag3s95gc?)6`OgjU%I^Ix*Kk~;ij9YY8ZMl%XKw0jUmE@uv=gE>H`kq z%l_v-U9kA^N3CBn!(f#>6B!4L=CR|fqE^sdbMN`oe}9Imwq*GdI}>(U-QyU%Uu#+&Bcc+>UCghdLs3_E-_Vo_dC z#RV5#`rF@}XGX4NMO$5cts}g`=c%~XiUNjS!zWM~$c?fFMbis6-*m&WrFPr1Dy-VQ zQM)@SsHL5w9CKFY=qOp>(c0em{U7{D zZY!3z?(*WD=G-~gL_n-Fo{S+BAH7O$9gBamTe11K?+0aRqgbdt`lW zy=@_=a4}6*Q3aMKeEw?-7TgcUN{15FAte~{TU%F%?CbvW*GsmTywy!N-N0Bt+&6s< zOxES+QDt#OjYwu=+;L)_meYhL=}B^yBE*Uq`z?h?XB}KUTF$$xrv^n%(NwyB@|@9DPSGL_+q$=#es~`fRINV!9b8f}V5;@|-*F{O-v=v`E;VK6~u>;@$Ur zF)ierbI)TAlh2 zx2e%n4YN!`lc!99x^JCyQfoev z%08<+y1OfGxbY_XA+C=9z(Ce>tXY^gZQIm+_}FxqlH{0B%ST8Y#gS`PB`HNF)clP<*W8V@+Y5MqAQ_>BLvV&WVL$u;m7&-Fp=ov z%pBB6lYV3goOI_MXK>Lpcc;!)xl=(iUtPU5OUNJfhV9P~lvcA8hvt_5^~YMbziXkk zty_Ub>Vg8JN&!Pq?ux^=6(j>&?$IT7J*stDhs5vIkrv6 ziniEjySt)^qlk|&aZy2Y6pdrO&HH#ecXrwgQ;0KamFK&=D)?uHBL@}E7)BYxnpd>7 z+N6hPkpeh45unfbP*hhP+plK~UvkMM9#l`Zz~9i&=m8W>K79Gh zUp2tPEv#zF9Dl-uN$Ci9ONMKK$MAo~>A$Q6!rm&$>+2ffHqF|Fy*VdLgKow`pCsT& zI+4#h^VbA#*FE>#C#Hv?@J0?Zd8mh)fl;w6Fl~5rjYf$jS!k$l9gRZPHV=d)@S(E| z@G&seC{T)nx#Mz)i-s{m1ekG5r1>$6Gnx6{_x|@f?d^seZ!-<6HE|(vqD_;ePbOm6(*?AUnh zd3g=|kYQCarp*T$RyHJ)1rn&BdzfKc^31cdXV2yZpfxp3#+&BbW6#~~c{^#+#GC$p z>-iU4ICsunRBmg)Y&~b7!$|4p3m;hYAD{g9haY|9muLLq{sr@+X=|Om-OZ22o@B5w zb?VfsufFNkuip0?-#8ib0bRJw^Raj#1lnXS@Q|!>9w3CJVEgU2#q>}Tkb*h$r>%%C zqi*8hrHl?LKc;!?pZ|QJ89Zwr#!ob@7p6U&5DyOsrXx>eVzIe7w{Lv=TW>%59cP?z zhI8aaLxIRP&FMMRmR9o`r z35CtdV|N0mJB7_#tdA7Z(-YoY)I1|Jh8TiK;;=a5poI~*t$QbNiix|4%sGPOD%UJ$ zxJzj2ikc*vpY~%=C_dZR7)qmA2s!xaA-j91B#tS*LgUDoV49UR^|hYcu-6V^FlJ!V z1*`5|-qlu9YkQq)Mn@04->k{!so_(kveT()8TlJLNLmfm;p4>I-OEVWTiIbIM1v9N z9kgxd;)bS>fa#XuMP5-;-{2egzp!>upu3AOWV_St?S?XH!@A2W75fGH?L(Q31{_Shua z#!0^3?v#wS5;#%NJc(_uSs5H?$@I&5VM=z{^5s^Ez#*hVT)a)2ktBS^PJoKwDC=i7 zaOfR?04FUgT5IcKcc_+jTR^4L1FLGm@?P#s6sclV%VyRnGW3%+Dz^8xaZFz{f zvEQ$$LO54#LmKE)fJof09zWSAEQ+IF-&!kD4 zLr86v(|tm3w4(@x&HTW^g$sEKm@%L|&YU^Z!*70b4{07kz*ub)zYT*LK;~X42?N&l z(|1q-dL}-d%>lL_Yia9P-r`i)9xfP4vEd0;XqwloMeP8cC05Eu6Ux(lMQfY$$LGww z+p;AmebF$VZ|$p+t6l@JnqLmYaJHso5jv#O0iaDnevVU)^;HWRonIUT90+{brI*jX z?23-|)(k}qDw-zt506p)&_fRU`%O2SDdkh$X)AvlP6lFCJlI8hdmA<8jyZF=tN6~R zo_IpzIpcR3w#K2+7IwY8-~ImgU|<28k?Iejk60d9tfPYKZ`6WSM`k{ zhtTE>#1B09&`IAp*??|8RjfOXVoS?982)^9>PnqVl`YP8uc&j9WttdJ=!Y#vA=eCRJ?y>vjie<|bDmP@*3*6&N(}T);&aGJvk@bydW6|IeXCHjj z$iD&j>w7o+KkG$p8-DRc%z^^zOo8Z?*;25ktor+J=FlOXtZy#8rW&pG9uFc+WI;A* zQ(-;D-7urzlIZ{m3{iwU+~RtYcxCvR@*$U^aKX&L8o<-N6r*j+(N3E4foDR{6% zh^+j~ujD2lAL#Raoyc-fC2w;aLb`ltXg-8s;j8^rD?73=;>8eRxbQoaL>i-~P3!7M z>Bh$ApzThx)@r%kDaINF@wGK<4At%$vDEGv44PY@hLc>&YGN&<-Ah*oC91huhH_R` zXy9S3h!HweG?HivkExI}PJ1h7zrY6S06xThT)7fBoGq-w6Bny93(uLTy3*CLz<7hf5AdRb*@QQ~D;02Oyi+mxs|g~g zjLPTc5mJsc&$*KME)M@<6K(`_#m0JE84o1+Mq#HEHxafc%K!GP6p z{`~p#=9%0>L@!-6+$lwtiMJWs!BiU>pgJD%K9E@I}!P~o)jdt7`FvFcYu^|{LgMh^_yj!^16nPXB7@Pw9@x911WBscsgpi*?gzCR^kC4(!_{`zi#?~Ka z<=@n&NP(l@saBRT@+X!p42Z)aPGoZh3=7M{iSQ$QoK%1(CWa`yjbPztdKK&Au`mU? z2h$yBQS7S<#%&LhoJ#({m6cy9MOH-bh+|XQ>R82u zM|+Det7NpWbM1OM8=LA|+Zc#j)L*!RwtN@o1Y2b(ICK6497&%)7u*g@T!B{Ok#1!BG83PgJ+&=0?brN_?rr_b})M|FZH$J^@O7jxHvxhe6|SDuKhZmu9t+ir|> z@`{S(E%8iKB8!rPwIe2D#4%x;@FPV?sM+Y&*w|o!G3yvbi@AvkW#7n{C{8l*b*g5Y$>|0~x@yzdW**DW zx3$58&6fBk{{~DWmLL~WL7xneHirn;jFskE3B67%Bc)j1cn+<_v5?`aYG|vWHSt{t zcM`4D?>z`pqQ%L>bq!p^K_&4PMk~j=#~D$s#J+;103n!g(FG!TP>ia$Dp)sLXaBI4 za3!p)Hv1a>icUKX#;CM-PB~OkhZF?Eimz{M0!4}wU&!1A6r^a=TnHFzF44;FVKHsn zrXQKU(@AK9B4ghU&a|DcrR?6iasybssVtwP141+Qi|=KFoplq!c|*ubzN!kQ$u7rk z8|~uj{EoLNn*QZ&zQ>oQGv8Xx^*MSjc1jC_OK8Go{BoYT2J$JB2qWM1dBJCpX+2+g zs2hz!Qls`uB$+ttn?$2g?IMp&i2@~D#lzZSH)R5@eTaR2eScP&NOu?(o@_wHa6J<- z6DN(++w4Uq#FAg~N9Jp3ViF#{yY#`Y0*oK6;EAq})EtJttt zPH;{$=y9HVEp0T8%@n<}%QwswX$8Ajbo^DX6Y7P9YK)kVuj`p;ji=g-YwL zL?L2U@pen$k~;(_G{e>y4oLGpin6LEsgyq5QvR}4ag`@H=bF2hE_u5AbS_ay!@a(@ zyS}NB5||GeD#hHiAChhs3~V*QVSTG=<#fx`jv*7*0E0kKt-Ce~=kTiVCJl*n?>%I@F|2tG&Ttmn9k9O&pfel5G?gnPD@O;@-WkhwsDCT9fnR-$ub%ea#CL6 zGcC#?(T4cgL$UGTLn$X7e40RdORl(cuezKi6-frWzkQiiA;msz`N8p>6598_4T1aVz1wzq3~()8%^0m z^utVCLK3#AHj?0w0po}O%%Ls!R)${Wt#J38#Pi1Dr7Zfy6Dt-~CZQz#34Rhk^Ie1l zY%}&D=8|H~7`XE;^P+Uc3_>_#5Tj#BWc-M2DIrgk_~i7^7hQ6~svpQ8Pp`5JjUC5S z19H{X$0kilpo|_x?B)?*AH2vdc1(>0pYn`C`)bQ@5-;-=1x8+`maXvY`vgCOX_&iH zM@E*Iw{a)@%Sp^&o}ueOng6O%NX|!g5tj2z-XEWM= zeOJmdx%qhP`>7_mZbH!9fTqVqJ*(~W5ir!kzDJA1N9cyp;sLo7F2q-*4KsrX2AY&@ zE=y!3qEeLWo^hTvJ&VOm{pmIMnb|BYuH6$ROAjd%HQ^5#qf%``kpd$t)yoA1O4K`n zMMw%%o@g<3rbnQEY~>m&pi|t)ijyQhBY@_XBll55wyDm2)lRuZ{nJAf>P7x270wmY z&;oP)(}(&MSNU@eS+94kfcRztS=+n2V$0C1WR7m3BUal66c7C_t)+f88Zi4=S8riJ zcCZQP#edQB0jIbZ6c{lDGIPzke=sUN7vOqhHF;x$eY!)m%}cNv8)HW!W7q(Q=AV%$ zMC7ok+xQD&>2G11iQexOV*|brrcn39ZZ;xr6+QfazHg*d9e(CHrbh5EtUG2N%vB2w z`;PAB#fE<$e$HaT%*g38QhE*&AJvncn-FrQCHqK z4&FvO!VVvwYzhgVAgO(V`(|F6fE~;=|BNT($bwb=u~F`QlPVjf>_H2~99;Q6XoQu4 zP&nc%F}MWk4DB`DM_jGiDtYGgblr^WxdDrNL4lD|AX%OIfF0H(sG_{tVyLl!ZHU6=tXoU5n;T-= z1Mybp^*M1Edt#T14wA+AapR6W;)tcomeJo@J9wZlG5bGwB&=rK=KD(aGxD0RZQ4*8 zM-{>gc)_iwO#*UmH1xRyn{XRUgFZn z=bz_M^OP+&b5sL4*j@$Z)3Pa!`IC5&@EO}7Bz(RJFNM#R=NUfZeBzPea|A7$F)*V1 zogXlw_A zjJK{r(XwyRFUnxI^2I9sW%c4$3(5F2!Vh|_9=v+Upb6JH(6%w4g*RHf&5a*EU3rvW zEl&jSubg_TMHwPs#A;iqKa?^|T_C7okqkR>bAyBMTDV=!giMCQ^P=U&dYS2oNlPei3YBT;MyvZiZQ zkT6EmWQTh%jR^fB8k(%U*4?0#{n=LLxTdF7za__hE((PCa)f4@(TWdCr4c`QO+-!X zEn9Ds!tm1$e;MO`LqqHYYo`n$0O=~H0a+A}9n;jn`_J-h>{cv(>Di=~423II*woY4 z@AvkVST-Lu2nKv-AJ54n(UAOS5WZCY@xyrbwaMfgysp0{D-CUl+pp4#6CMWUo9Px( zQ#fy~dLLRXQS|E9AYZfwDd@S{YY;>5dd72oT`b;fcZO{^jo3&awly}mul}X$5;9`7 zjkl_~iNJn;4~Yr4s*3UB#w=a(jCwjuy{fX_Ty~tDTUX!R8%M1VLcZZy){C_N;1pOD z+@&rW`WOL%T-#7zYemqQ=0=>H=|%XeN&0?4YjRGj!R75jw`7SG8WmCzIXFdH+$$-> zrj-oAwl*qmOAK_FHuRD9uaV|Ig7||He4BDR?)UtG((ndP$Cm^C5c(-BaylRkV3=Rz5749_Qgj#O=1-%Z~yY7Dcds7~e~ zxnAUrfmdQ5S)vFL*ZP<;fo5PS{fSq~;+x7yw5E6oIOi$8CmHOiwU;PfA^V}|E z{qg(MHmRs>{ejQxzeC{@I|W5=nGE0)_A)*p5K3L_3zm4R9!*~o7)fb|e~+}z zu8LZj;_17WkP+H&LLoX4=+@%?+%+HMt#4SxjNVs)5`6}ktZewZfm<+9dR5E>_05*W zhA?)|Ku|LS#7kZ=F02*j9MJ1Za&GbRdw=W4j#UYtF=G|1hfor=N*d9y?unnpSLAP5<2_S==BDI61SSfUdPg~K z{$rb!6H=i`Iz4Q5n&m?SYI2x|8q>!~na^({s zeMN#rG|&LVrVR6fr-%~L;&WZAybXn+Dvl5s{x!nt4?p8I$ArBcDSW+kSX5E>HcWR) z!$@}yDIg#r4bt76L!)$;lyrBebl1?`(ug#Y0s;yW-$9>WeD8I=?{)qXXXfm^_S$Q& zz2d%Sbo#6$cG4_=+cR&?%f4sQ{Wgn8Ts5*t6hp>+Q`XXXUB{4nWbKZz8tL$7_}7sC z%0iZ{@>x}DZ;l4P7}=832o$y!K$Dd$wva>hd47xIQM1g< z-|5_p{KQBHAyQVc$=^x({hutjmzT)jMAX=OW!va`v~jrMY=KPVJ09M_VI zD|FEA^o@BN9jEFtH;FgO>w5FCR;A2giJoNijoa1NSId`=IUfs@LxR6pmH7pF9jVEMxk$fWsa#zEUO(qG;z2 zIlKwq=`R%l24xPsii&2?Pi3$%;1!ClAC6eP+k+PvS#+cDa^b3LNappueuTDb)`?y) z!=TfX@G0!&yf4WnsO}{kN5`2fL|iVR2Ploan(Z${PGPnPbPz;r{Idg}*XW~flb3FE2bjEwr(o9R!+MamawUkH!_?kvUk9+XTn0c7?$YHb(29MR z^`=W2H7Z}#KBbUJXvL89gh>=Hs8xH*3}I95Rh{<}pLsI!#QYqC7jRwwP0v3-+dp2? zGXgdAy4f^+B7NmBvGeJTp_U$mh>;sD_K8aGLup%9(YveCb+Esdw3*Iv4N^-Lef4n0 zY@FH|y!5DsUHxTsQ+M#9Wtm^R_YAY+IFs_t>4PuCLMNDzhZ5%-36APxLrCN$^!l#q z?R`U=!1{;bXiPOYEkl0LS8?g8W|bkAmo6IWQzikJ3o*nvqh=?qX)`i{ddd@PDm541 z{ruzC=;Z=o4BKV;cfVGBL_Lq|K{+2_^3CS=Yqz>3E?nvm`ruyOIG0RKgpG)}7!S91 z{__Ox-3JAsLY~k;%oYVvECTkOh9Rc*WW}cI!092l+~egJl9#=VFdlR_Y5Dw&B8Xw| z=2=V{vnyYzP?6B4i*1ozwgya`NnL+=CDpfy2=%@4CW+zp~P~UaDO}Q^Gaos9k-hR6@)-0!6zK>*e z!W18+%SA&T)LI4TurUaSW*CsmS%WH)K)Ft=^{=tcNSR%54V8_nnP6H?$-b@fw!kExJ?6e1!+OBw7H;21+hH z5|=WSrVMIXq3WVwIiy0h;_d$aoou;$61kjnWH?aABN_PO=2GH}pcpD9&onrSVF1Db z%(j?~20|<~q8!eorzHq3KlfI{G8s`sI(}bLv%eIY_j@9+(u#VWQOSCrTNVY$j4N_b zJU!l$7M=C?(NPhL_+l)aD5AUQ9-NRzgAvwmi%CUe)JhURIi`H|-KvWCoCXfBz=`^i#2+mG1&}DP9=*m?ztk`LU^;{r;e{lL*8u+8IG!tDIlV6Jb z$fS-x4Q9t%#!o*%Is`SqT;t(tlj3!-Dx$lDR^+W{aJ<8YR2}HR=(y~$;j9vwS|eIh zwL+Fmo)^l>#xI#*3<3^<6rkgbh|NCLX8Xmvg?Y_;o$6nL$J$c8beU*}na&UqrJ~^W zh{rus8g>@GrHoDDu=S)G5&+xr`R~>sm7KkiiD?=+!?(a50HI-oPQN%{9X9l1r{i2a zz$uWG#lPW`R`&8--BK@!P*XOBLF7u&L{5mqiTp#<_$R$a)#XjGI}yXTh75)vC#RRp z2dY?u5@Lbw`JzbXa5fam^41f}EEXc0R!lxI*o7s{dkHSWa!o2<=YEn_s=j4p1p5H* zWQil=NmRXu#g*F%E@6g4N2@|d%p2#0aS66$)WxE}X~P$>uAr{XgSIPE&a^R$AVWE< z0D;W0U<-tZ+UHaYO|`3+$ml5>$KVHa`B+p>G|9V4y3^~VAaF|G5ApBvHK?wxLhah!E?L) zti=(U%6V@CCompZFZ!d~T^LiGw8_&FlP;OafhEHRCZJ@IJd>8MCtj|lBZ`{)7 zpie=-et92W0L_DuZ`B)YVUcDjRbYCzc+nZ8x^%=ju0}8on8Z*xn3P1T-^rri^RH|T zE>qw0EHqyV?!~H**T)jDB>*w5Bsja6I*eJdpR9mfq6rblOf>s!52;dB$xGGG@&b!n zp2e+_FDfu0SIa7#6iJLjt?^D9ZTgM;1@b*>=wHJd3rC_-xl@6!8dPwPxbGBLj2Z{( zeqT&f4h)|cF#uf1`E5xsSG8|eeN8T%5YP=YG< z(ZJ~#$=iZ;K#!9%&#QX4BD2u{`?I2AfkANp^JT#5DVIU)6x*py{{R1xm-nAf@*yCi zH9;hl+ZYS~>reml=D(i-Hjy|)&u)$Y_5bpkS}I21C1gQkk|h80=Kp@d^RH>!q2b%E z=_Y=b(FW%8e~j_(A27uNw_yS>#r6uKgW&p0M3o|S9F#sDbmM`v#*6CnyVKF( zIsC2ZkMvo#2W=hRt+s3EpEL)F2!I7T_sJ8@Zx*J|%`XF#;02;)3to7hvX0lA`fyhB zs+@xn7ba7pzYDo}s}vYN(J;8w*wUi9R%V`^ovqIG)8?yimqi04d4K!9s=AtYP0C*$ z&!L~XU&fBBN+C+-S)lj*YI$)7k6TpAIR8s{_d6;9q*7LP5X`;mwl)E!D)$f98UEb; z`=z2aZ*d^M1=rq?Q$=yG15-7ISIJ9*tcixOM>0K|>@t1GM?J?qCsq!dZua6+gEgBD z_ZpvgVEoUzv&fA&cDv;SBK2Uo{si!tire7Z}Z;n+}UH(F>v2mbP z=qX>MSZK=W2&^t5>GALDNUC{RJs3V(_s?(sU*qkhWHOeE@v`KaT;k>By&cq<({0Yl zLBsY#yOKkged{OoBL8>U^ZWUz(C`}|naXAa8V}NWqRmA~Ye3Re=kZENYq4W)wf+t* zvNKpmpjb1vki}n5=s&^@l?hz%JRGYzsmAEm)zC@)Kv(A#<1l1VUtRsM?&@ctvH}pT zO26Xyf^KhLw!_V&+p1WSP0KRQe?A7e@o&7d`M`?CV7-jeM?$H&MZT-N}JGbtpcsPy}S{kG93iRp@3H9x$(vu_nA}NY$)2qb1aj!3;a>VM?)+y zMk!E(bzqdcRIj++Yaf(7UzI!%A}u zE|&|VP9;?h3@Wh*8-V@e(6zAp5pQ@+s=mEMwW8BX_MM@DPO?9e(H_t>xmjGQHCX*` zr@%9v4|4e7BKN6wQZ|^-!<$vz{An}A`F(VJ>?~N$ItsC|>D{@UUbtj}d*1)V1Zd`V zXL6YiXU=DYx-%>F5w)h0b`okdY!0%=kqpm_!9el#(@F>S@3AOb=gmwI{K)oG*+s|K1Of^`)tx%Z0A=)YgU@;qmKz^;ee%txE zKVP@sigYldyK37s=8G-FUt`xhL{>EoKK@bJn4GvruQ69C+yx$Jfek~_D?AW+EBlx$ z5C=T9aqvSnSE!jWh6NJ*?V*~eEDlub1>KxlYo^P{G|1>gs1k*2k+eM)Smsy?gvbRu zjzWJ#_&<%iM5QP3)alvTI@q-D?e{$VLd^9$sbj$4udATSO?98Z z+TyBei6udd37_&|<<&2ed;8|w`F8*_wIbgJ6kNtBP%Gw}?Z~1NSVWbWApjQU#{u$} zeE4kpln{l6>N@4XC<1HKa!#Q?+{j$WB{}e;_GHAw_j7hlLynWxw?~!!m&qJPt7@{Y z+#upp9*jo3cS3%-zBe|X7l|ETv_rj)fHGBcVAjCA)v#(Sh;1HZqf+{Q*p&Qf>FGG^ zL+5b2GozgJS|MNIn#ukAsD)8e4Y5HlURqRbIK^PdcAJ}e?XWawI<3OBAtcce=AV%w zl$Z=i92_H{+_G{+p246#qpkkQrg>I#ZpKtLodhd|v14~g`jsZ1fY7suocU+$Z<-g) zUz@+=?{1{mul)h#YfAEJ{{w&`a6ADFZ9LXxgwnf{rB|%qU9{YbS93LYS9No{zI6kj zls@um)zyl4e4S>Z6jdebJ)#zzkvI^8;v32lj%!`@sfc5MW@;w^m$0S*!V(-RH_M=5h%&V2})sDgzlLD2) z?i>FKwb1K5N6tq)V*f> zW|ZBUZm=)94;>o~Y-C;ZC^Yj~nX6V9y<+CQzR`RH*4bwZ-KZ1j`O&H62_7r;#s3s%tL=0Q#Rb2R`~phlq`5m z%S?m#^N^LrHKVqh)noRy-GuIq$TiBZHk$0E3(bqMSn%kRLW=b~8oa8Odd@M*T(=d; zJfS{Um4=?1fyiiX%ru!0c|%?Si{~l29YDWZl2t&MtilXD_mWc$Zg|@{u>!72>^`iq z7R_d{doqU!qH8#D2HAer5br3lV_1_mrIaO4V5 zD+a6(2*I@JathY`qGD?uqwk9bNR|1&4P?WQ6SX|6zx9zY6G!vzWU3rfJyUO7V~sjf zK6$_7Gor82-B_ysMbvSW%~uyCBVAO-iXwTryUIh1BN-w*K6TMmIQ43gUv1MslWQRz zv)0^9Q4?Eso@=*6RU;w^r?yUODAxwj*L!ZRTu{PaYYH~tSAJR6D)jn>bqJC6VWBm; z$a3%`2%Y0@p~i1vMSxq;y{TyDuGnOaEVl~O?Je8X-ke&u^tH?Q*VhmJr?L#%<*sbS z610$Fa}bsxtj2Os@uKOEyTts-i*)$sCu%g%zL|}_kV|_Xn&d=z(h^!`2XEucW}vaC zZz90^>gjk(+CKVz`1HeanZ4F0i&ur1!ASBDi(Fz-v)kx$OAnKBOyV_#1h(eoZ2+=s zXXtpsr1tvyI`!o!<2$$7hsbp^c_qFzLQTn=XNzBD403u%P^xR9%eFN06#Qgldvsj0 z@!<&`Xhs<7q40CNIa&GowJVhRR36*v;nX7AcWktksqqAvAcc*dw zot}S}`*?J7-&+MW)BSIE$hu!Uvk$s*vdT%QpKTo+XvA_2AuU;q8<{=|eh_Y{kNvCN zvZJL-B|I}ME8qsK8iSx9rEN&{!H`kw35S zH{trGLdMBtH`|wss9f2wiN8jcI1zruo-C19fZEkqP5^pVZ%rR1RaxG{HM2M;xOu#i zysGs1&tY+@Pg9FORJQqsBzrS^Dz50uy6w3MG=2zJ_vn3UKEm%X+#6Z7sVc{!HT_q} z6!)EhfhD$(b6Q^-*g~ptlYi>K0)t$YLl<1Z>)Xm$J}$SXc98AA6Y~nI)wD(b?CiK$ zs9ZU+Zm_A7?NB5EHJLe~2t9Yq0xkXQeWJO)qmjIwP3p@JUh|n7Fi?8gqowzgMIm~G zXGUqtQY8GqssQVvj%D5eQE%RbP6S#Ez|tq;hD{mzjS|~Iu0Q7GJa)@>yBxYN8Cd0- zJKp)sC`8#S+Pq&D%;K;vHTzYk5i-Mn1&Xq8-)c#hVS;uxj6e6S^pdy{%6(Nc4F!W z4stGJ(?EGEM;KUluH}h|=Ef_{406w1TrwKRu4_$Xx{#Kp4<*Yf3Gz=d#Iy+5Y4S3J zw-d+W)bn3lKD3BQwKo^_7)kA?2xs5do*->mWE1jEOh89Voogf{Mr@~xG)Uz=}hI$(jz zFldrghI6F|9v=L=u44iIt6%xj0L43CS0V5^enE<=^|mL`OmVH61j{+ z`@&5t;eDmBp%|2)_jq4*ZCwj9VuZytjm)N)O0()uxtq-=2kZ3!GvEUL^Y^3>#R3nN z$;nOI7;bp}Ja_|OFn*@W|3&WIw|0MP@U_MD!-ni0`-<&aNv3`MVM*px){21le$~SM zM9zXh|21u8b@S?p4mYtoz9SB_2kw$1@p)~))dF#^43&C~Z=3J9CkIQ$`Yh$Y zk-|-6xk{kwO~v)qZy*Ciw3RiFb-bN*=ey_sz1K}R($UR|X1#@l4XXG*SF)_wp||hD z=V=KaLX|(_F=x=eAe4DQnqsold3zbDZ>^Q?B?;q>X)iv)?F2|3kbR({E?(8RkxL7JJu!vxEq4u>0s#DQ$h4XAp> zA&jtI{Lc)1P%N2ORPFsg3zOym%99MH%_KKt2*UZPssBo?x+gbWu4sK=uBDla|9D){ zty_*+pm>*Ul7Ng}{&UGmqO6s4WwfqdhK+&Tf+mVGo5&2;+qBLSvUx7yXG_9DjaG?KIIX_ZIl^C`W3ys!`rKa@aoqM#?{@JuH%KLefZ(^!y%2m;^YFM zRLT#8+mSVEc5oE@1ntfQGFc7(xg}|u>$T2GA%8xV5E5sh$=H8cD=7EbyHZ+~E6dIUjHaL1w)YmBb@iHTEE6G7d)+Q=#p?^l;<%~b zOWvaA6V*fvn(9@rFABOYM#sipPQ*^Rc-u**Z)t`l3TS1?zH23Ail5)kpH}{7!j<}f zxd@{MySVK`)m`(PgPKRiuc=1m8t@5U6L;NQag83qC-8(~aOqf>;Slksf3P7|VJ@bU z5;)!9Yz>%~ZR_1a1nNI8SZiYfS&^;&URbJNKzWOdJo|WiHtZA4PGmjl>Zg2itIR70 z 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[WR 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ⅅQKHz};_SkLL8?V2PS1YROEdQ3~XQxay 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ċXdTaw*%m;m5ZDbWgJ_XqbT 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�R;g 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

ddeE*SWKS`wD5C=M^ov`A=E-e{k-D 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 literal 0 HcmV?d00001 diff --git "a/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" new file mode 100644 index 00000000..bce7de80 --- /dev/null +++ "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" @@ -0,0 +1,73 @@ +*斜体文字* + +_斜体文字_ + +**粗体文字** + +__粗体文字__ + +***粗斜体文字*** + +___粗斜体文字___ + +*** +* * * +****** +- - - +------ + +~~删除线~~ + +带下划线文本 + +# 一级标题 + +## 二级标题 + +### 三级标题 + +#### 四级标题 + +##### 五级标题 + +###### 六级标题 +[链接](http://a.com) +![图片](http://url/a.png) +> 引用 +* 第一项 +* 第二项 +* 第三项 + ++ 第一项 ++ 第二项 ++ 第三项 + +- 第一项 +- 第二项 +- 第三项 +1. 第一项 +2. 第二项 +3. 第三项 + +1. 第一项: + - 第一项嵌套的第一个元素 + - 第一项嵌套的第二个元素 +2. 第二项: + - 第二项嵌套的第一个元素 + - 第二项嵌套的第二个元素 +水平线: + +--- +带反引号的“内联代码” +``` +# 代码块 +print '3 个反引号或' +print '缩进 4 个空格' +``` + +> 区块引用 +> Markdown教程 +> 学的不仅是技术更是梦想 + + +SDFGSDFGSDFGSDFG \ No newline at end of file diff --git "a/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" new file mode 100644 index 00000000..12f85c9b --- /dev/null +++ "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" @@ -0,0 +1,615 @@ +# 部署说明 + +> 此文档以开源版本 T-One 最小单元部署举例说明,不保障系统的高可用及性能等 +> +> 若期望大规模集群化部署可以联系SIG项目组进行具体讨论。 +> 若遇到问题请参照文未的 FAQ 文档,或进 SIG 群联系我们。 + +**组件说明**: T-One 包含多个自研组件和几个开源组件,此文档以开源版本 T-One 最小单元部署举例说明。 + +* 自研组件:tone-web、tone-agent-proxy、tone-agent、tone-runner等。 +* 开源组件:mysql、kafka、redis、zookeeper + +**机器要求**: + +* 硬件要求:推荐使用 8c16g 以上规格机器。 +* OS 要求:推荐使用 Anolis OS 系统进行部署( 暂不支持debian、ubuntu等)。 + +**部署说明**: +- 主要分为安装环境、项目构建、项目启动、数据初始化等几个步骤。 +- 该文档以x86_64机器为例, 如果您的部署机器为其他arch类型的机器,则需要将docker-compose.yaml中指定的第三方开源组件镜像更换成对应的镜像源。 +- 可以自己指定安装目录,该文档以 ~/tone目录为例(推荐)。 + +# 部署步骤 +> 后续步骤以 Anolis OS 8.6 环境为示例进行行详细说明。 + +## 1. 环境准备 + +### a. 安装docker +``` + yum -y install yum-utils + yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo + yum install -y docker-ce # 若出错:yum install -y docker-ce --nobest --allowerasing + + # 启动docker + systemctl enable docker + systemctl start docker + systemctl status docker +``` +### b. 配置docker源 +``` + vim /etc/docker/daemon.json + { + "registry-mirrors": [ + "https://6kx4zyno.mirror.aliyuncs.com", + "https://docker.mirrors.ustc.edu.cn", + "http://hub-mirror.c.163.com", + "https://registry.docker-cn.com"] + } + systemctl restart docker + # 建议使用国内镜像源。 阿里云: https://6kx4zyno.mirror.aliyuncs.com,网易: http://hub-mirror.c.163.com +``` +### c. 安装docker-compose +``` + pip3 install --upgrade pip + pip3 install docker-compose + docker-compose --version +``` + +## 2. 项目构建 + +### a. 下载项目源码 +```shell +yum install -y git + +git clone --single-branch --branch master https://gitee.com/anolis/tone-web.git ~/tone/code/tone-web +git clone --single-branch --branch master https://gitee.com/anolis/tone-runner.git ~/tone/code/tone-runner +git clone --single-branch --branch master https://gitee.com/anolis/tone-agent-proxy.git ~/tone/code/tone-agent-proxy +git clone --single-branch --branch master https://gitee.com/anolis/tone-storage.git ~/tone/code/tone-storage +``` +下载后的目录结构: +``` +~/tone/code/ + ├── tone-web + ├── tone-runner + ├── tone-agent-proxy + └── tone-storage +``` + +### b. 集成前端代码 +```shell +# 下载前端代码包: +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/tone-front-latest.zip +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/toneagent-front-latest.zip +# 安装unzip命令 +yum install -y unzip +# 解压到指定目录 +unzip -j -o tone-front-latest.zip -d ~/tone/code/tone-web/static/front/ +unzip -j -o toneagent-front-latest.zip -d ~/tone/code/tone-agent-proxy/static/front/ +``` + +## 3. 项目配置 +### a. 下载 docker-compose.yaml +```shell +cd ~/tone +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/docker-compose.yaml +``` + +### b. 设置并替换变量 +执行以下脚本(需手动替换`必填的`变量): +```shell +# 部署机外网IP地址(必填) +server_ip= + +# 账号密码(必填) +db_password= +redis_password= +tone_storage_password= + +# 镜像版本标签(非必改、默认latest) +version_tag=latest + +# token(非必改、可自动生成) +toneagent_access_key=$(uuidgen) +toneagent_secret_key=$(uuidgen) +admin_urls_token=$(uuidgen) +pub_api_token=$(uuidgen) + +sed -i "s/var_db_password/${db_password}/g" docker-compose.yaml +sed -i "s/var_redis_password/${redis_password}/g" docker-compose.yaml +sed -i "s/var_tone_storage/${tone_storage_password}/g" docker-compose.yaml +sed -i "s/var_toneagent_access_key/${toneagent_access_key}/g" docker-compose.yaml +sed -i "s/var_toneagent_secret_key/${toneagent_secret_key}/g" docker-compose.yaml +sed -i "s/var_admin_urls_token/${admin_urls_token}/g" docker-compose.yaml +sed -i "s/var_pub_api_token/${pub_api_token}/g" docker-compose.yaml +sed -i "s/var_version_tag/${version_tag}/g" docker-compose.yaml +sed -i "s/var_server_ip/${server_ip}/g" docker-compose.yaml +``` + +### c. 启动docker-compose +```shell +docker-compose -f ~/tone/docker-compose.yaml up --build -d +# 注:如代码有更新或首次部署,需要加 --build 参数才会自动重新打包镜像 +``` + +## 4. 数据初始化 +### a.初始化db +* 进入`mysql` docker 镜像中,`docker exec -it {数据库容器ID} bash` +* 连接数据库:`mysql -h 127.0.0.1 -P 3306 -u root -p` +* 创建 `T-One` 数据库 `tone-db`,`ToneAgent` 数据库 `toneagent-db` + ``` + CREATE DATABASE `tone-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; + CREATE DATABASE `toneagent-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; + ``` + 也可以直接通过 mysql 可视化界面初始化数据库 + +### b.初始化 `T-One` 数据 +浏览器或者curl命令请求接口($admin_urls_token可在docker-compose配置里查看或更改) +```shell +curl -s "http://${server_ip}:8080/admin/migrate/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8080/admin/init_data/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8080/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." +curl -s "http://${server_ip}:8081/admin/migrate/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8081/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." +curl -s "http://${server_ip}:8081/admin/import_access_token/?token=${admin_urls_token}" +``` + +### c. `T-One` 关联依赖配置 +**系统执行任务还需对以下配置进行设置** + +- 配置 `T-One` 测试用例 +- 配置`T-One` 测试机器 +- 配置 `ToneAgent` `token` + - 在 ToneAgent 系统-账号管理中增加一组 token + - 更改 docker-compose 配置中的toneagent_access_key和toneagent_secret_key + +## 5. 验证 +使用浏览器打开链接查看: `T-One` 页面:`http://{host}:8080` `ToneAgent` 管理页面:`http://{host}:8081` + +## 6. T-One 多生态使用 +`T-One` + `TestLib` +### a. 创建 `TestLib` 数据库 +- 进入 mysql docker 镜像,docker exec -it {数据库容器ID} bash +- 连接数据库:mysql -h 127.0.0.1 -P 3306 -u root -p +- 创建 TestLib 数据库 testlib + + CREATE DATABASE \`test-lib\` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; +- 创建 TestLib 数据库表 +### testlib数据库初始化 +

+ 点击展开/折叠脚本 + +```shell + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; + +-- 表 test-lib.case 结构 +CREATE TABLE IF NOT EXISTS `case` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试用例名称', + `creator` varchar(64) NOT NULL COMMENT '负责人', + `type` enum('FUNCTIONAL','PERFORMANCE','STRESS','LOAD','SECURITY','COMPATIBILITY','OTHERS') NOT NULL COMMENT '测试用例类型', + `priority` enum('PRIORITY_0','PRIORITY_1','PRIORITY_2','PRIORITY_3') NOT NULL COMMENT '测试用例的优先级', + `suite_name` varchar(128) DEFAULT NULL COMMENT '测试套名称', + `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试用例执行方式,手动、自动', + `run_model` enum('SINGLE','CLUSTER') NOT NULL COMMENT '测试用例运行模式,单机、集群', + `is_available` tinyint(1) NOT NULL COMMENT '测试用例是否可用', + `tone_case` varchar(128) DEFAULT NULL COMMENT 'T-One测试用例,当run_method为自动的时候生效', + `device_type` varchar(128) DEFAULT 'unlimit' COMMENT '设备类型,可多选,默认支持所有设备', + `device_arch` varchar(256) NOT NULL COMMENT '设备架构类型,可多选,默认支撑所有类型', + `labels` varchar(256) DEFAULT NULL COMMENT '设备标签,多个用,隔开', + `desc` varchar(512) DEFAULT NULL COMMENT '用例描述', + `pre_condition` varchar(512) DEFAULT NULL COMMENT '前置条件', + `steps` json DEFAULT NULL COMMENT '操作步骤', + `custom_fields` json DEFAULT NULL COMMENT '测试用例扩展属性', + `parent` int(11) NOT NULL COMMENT '测试用例分类节点', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`), + KEY `ix_case_suite_name` (`suite_name`) +) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_label 结构 +CREATE TABLE IF NOT EXISTS `case_label` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '用例标签', + `creator` varchar(64) NOT NULL COMMENT '标签创建人', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_label_map 结构 +CREATE TABLE IF NOT EXISTS `case_label_map` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `label_name` varchar(64) NOT NULL COMMENT '用例名称', + `case_id` int(11) NOT NULL COMMENT '用例ID', + PRIMARY KEY (`id`), + KEY `ix_case_label_map_label_name` (`label_name`) +) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_tree 结构 +CREATE TABLE IF NOT EXISTS `case_tree` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(16) NOT NULL COMMENT '用例结构树节点名称', + `parent` int(11) NOT NULL COMMENT '父节点id', + `level` int(11) NOT NULL COMMENT '树结构的深度', + `path` varchar(128) NOT NULL COMMENT '模块完整路径', + `children_nums` int(11) NOT NULL COMMENT '子节点数量', + PRIMARY KEY (`id`), + KEY `ix_case_tree_path` (`path`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device 结构 +CREATE TABLE IF NOT EXISTS `device` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '设备名称', + `arch` enum('X86','ARCH64','RISCV','LOONGARCH','NOARCH','OTHERS') NOT NULL COMMENT '设备架构', + `ip` varchar(16) NOT NULL COMMENT '设备ip', + `type` enum('UNLIMIT','VM','DOCKER','PHYSICS') NOT NULL COMMENT '设备类型', + `sn` varchar(16) DEFAULT NULL COMMENT '设备序号', + `status` tinyint(1) NOT NULL COMMENT '设备是否可用', + `label` json DEFAULT NULL COMMENT '设备标签列表数组', + `owner` varchar(256) NOT NULL COMMENT '设备负责人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device_label 结构 +CREATE TABLE IF NOT EXISTS `device_label` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '设备标签名称', + `color` varchar(32) NOT NULL COMMENT '设备标签颜色', + PRIMARY KEY (`id`), + UNIQUE KEY `ix_device_label_name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device_label_relationship 结构 +CREATE TABLE IF NOT EXISTS `device_label_relationship` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `label_id` int(11) NOT NULL COMMENT '机器Label id', + `device_id` int(11) NOT NULL COMMENT '机器Label id', + `is_delete` tinyint(1) DEFAULT NULL COMMENT '对应关系是否删除', + PRIMARY KEY (`id`), + KEY `ix_device_label_relationship_device_id` (`device_id`), + KEY `ix_device_label_relationship_label_id` (`label_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.func_result 结构 +CREATE TABLE IF NOT EXISTS `func_result` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `sub_case_name` varchar(128) NOT NULL COMMENT 'tone job名称', + `sub_case_result` enum('SUCCESS','FAIL','SKIP') NOT NULL COMMENT '功能结果', + `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', + `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + `current` json DEFAULT NULL, + `expect` json DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ix_func_result_tone_suite_id` (`tone_suite_id`), + KEY `ix_func_result_task_id` (`task_id`), + KEY `ix_func_result_tone_case_id` (`tone_case_id`), + KEY `ix_func_result_tone_job_id` (`tone_job_id`) +) ENGINE=InnoDB AUTO_INCREMENT=479 DEFAULT CHARSET=utf8; + +-- 表 test-lib.outline 结构 +CREATE TABLE IF NOT EXISTS `outline` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试大纲文件名', + `title` varchar(128) NOT NULL COMMENT '测试大纲的标题', + `owner` varchar(16) NOT NULL COMMENT '测试大纲负责人', + `tid` varchar(256) NOT NULL COMMENT 'oss文件地址', + `remark` varchar(64) DEFAULT NULL COMMENT '测试大纲备注描述信息', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + +-- 表 test-lib.perf_result 结构 +CREATE TABLE IF NOT EXISTS `perf_result` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `metric` varchar(128) NOT NULL COMMENT '指标名称', + `test_value` varchar(64) DEFAULT NULL COMMENT '测试值', + `cv_value` varchar(64) DEFAULT NULL COMMENT 'cv值', + `max_value` varchar(64) DEFAULT NULL COMMENT '最大值', + `min_value` varchar(64) DEFAULT NULL COMMENT '最小值', + `unit` varchar(64) DEFAULT NULL COMMENT '测试单位', + `track_result` enum('NA','INVALID','NORMAL','DECLINE','INCREASE') NOT NULL COMMENT '跟踪结果', + `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', + `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + PRIMARY KEY (`id`), + KEY `ix_perf_result_task_id` (`task_id`), + KEY `ix_perf_result_tone_case_id` (`tone_case_id`), + KEY `ix_perf_result_tone_suite_id` (`tone_suite_id`), + KEY `ix_perf_result_tone_job_id` (`tone_job_id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +-- 表 test-lib.plan 结构 +CREATE TABLE IF NOT EXISTS `plan` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `title` varchar(64) NOT NULL COMMENT '测试方案名称', + `req_id` int(11) DEFAULT NULL COMMENT '测试需求id', + `req_title` varchar(128) DEFAULT NULL COMMENT '测试需求标题', + `content` json DEFAULT NULL COMMENT '测试方案内容', + `status` varchar(16) NOT NULL COMMENT '测试方案阶段状态', + `cases` varchar(256) DEFAULT NULL COMMENT '测试用例,多个使用","隔开', + `tasks` varchar(256) DEFAULT NULL COMMENT '测试任务,多个使用","隔开', + `reviewers` varchar(256) NOT NULL COMMENT '方案评审人列表', + `owner` varchar(256) NOT NULL COMMENT '测试需求的负责人,多个以,隔开', + `report` tinyint(1) NOT NULL COMMENT '测试报告是否已生成', + PRIMARY KEY (`id`), + UNIQUE KEY `title` (`title`) +) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8; + +-- 表 test-lib.plan_review 结构 +CREATE TABLE IF NOT EXISTS `plan_review` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `plan_id` int(11) NOT NULL COMMENT '测试方案id', + `reviewer` varchar(32) NOT NULL COMMENT '测试需方案的评审人', + `status` varchar(16) NOT NULL COMMENT '评审状态', + `desc` varchar(512) DEFAULT NULL COMMENT '评审内容', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.product_category 结构 +CREATE TABLE IF NOT EXISTS `product_category` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '大类名称', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- 表 test-lib.product_plan 结构 +CREATE TABLE IF NOT EXISTS `product_plan` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `test_product_id` int(11) NOT NULL COMMENT '测试产品id', + `plan_id` int(11) NOT NULL COMMENT '测试产品实际复制执行的plan id', + `executor` varchar(256) NOT NULL COMMENT '测试产品执行人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + +-- 表 test-lib.requirement 结构 +CREATE TABLE IF NOT EXISTS `requirement` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `title` varchar(128) NOT NULL COMMENT '测试需求标题', + `outline_id` int(11) DEFAULT NULL COMMENT '测试大纲id', + `outline_title` varchar(64) DEFAULT NULL COMMENT '测试大纲标题', + `content` json NOT NULL COMMENT '测试需求的描述内容', + `status` varchar(16) NOT NULL COMMENT '测试需求阶段', + `owner` varchar(16) NOT NULL COMMENT '测试需求的创建人', + `assignee` varchar(256) NOT NULL COMMENT '测试需求的指派人,多个以,隔开', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; + +-- 表 test-lib.task 结构 +CREATE TABLE IF NOT EXISTS `task` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '任务名称', + `status` varchar(16) NOT NULL COMMENT '任务执行状态', + `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试任务执行方式', + `owner` varchar(256) NOT NULL COMMENT '任务执行人', + `plan_id` int(11) NOT NULL COMMENT '测试方案id', + `plan_title` varchar(256) NOT NULL COMMENT '测试方案标题', + `cases` varchar(256) NOT NULL COMMENT '测试用例,多个使用,隔开', + `desc` varchar(256) DEFAULT NULL COMMENT '备注', + `run_result` json DEFAULT NULL COMMENT '手动用例执行结果', + `config` json DEFAULT NULL COMMENT '测试任务配置', + `device_id` int(11) DEFAULT NULL COMMENT '测试设备ID', + `device_ip` varchar(256) DEFAULT NULL COMMENT '测试机器IP', + `workspace` varchar(128) NOT NULL COMMENT 'tone workspace', + `project` varchar(128) NOT NULL COMMENT 'tone project', + `job_type` varchar(128) NOT NULL COMMENT 'tone job type', + `test_type` varchar(32) DEFAULT 'others' COMMENT '测试任务类型', + `cluster` varchar(256) DEFAULT NULL COMMENT '测试机器集群名称', + `tags` varchar(256) DEFAULT NULL COMMENT '测试机器标签', + `tsn` varchar(256) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ix_task_plan_id` (`plan_id`) +) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8; + +-- 表 test-lib.test_product 结构 +CREATE TABLE IF NOT EXISTS `test_product` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试产品名称', + `category_id` int(11) NOT NULL COMMENT '大类id', + `origin_plan_id` int(11) NOT NULL COMMENT '测试产品对应的plan id', + `desc` varchar(256) DEFAULT NULL COMMENT '产品描述', + `test_method` varchar(256) DEFAULT NULL COMMENT '测试方法', + `test_requirement` varchar(256) DEFAULT NULL COMMENT '测试要求', + `need_config` tinyint(1) DEFAULT NULL COMMENT '是否扩展配置', + `owner` varchar(256) NOT NULL DEFAULT '' COMMENT '测试产品创建人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +-- 表 test-lib.test_suite 结构 +CREATE TABLE IF NOT EXISTS `test_suite` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(128) NOT NULL COMMENT '测试套名称', + `creator` varchar(64) NOT NULL COMMENT '测试套的创建人员', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_case 结构 +CREATE TABLE IF NOT EXISTS `tone_case` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `tone_case_id` int(11) NOT NULL COMMENT 'tone用例ID', + `tone_case_name` varchar(256) NOT NULL COMMENT 'tone用例名称', + `suite_id` int(11) NOT NULL COMMENT 'suite ID', + `suite_name` varchar(256) NOT NULL COMMENT 'suite用例名称', + `test_type` varchar(64) DEFAULT NULL COMMENT '测试类型', + PRIMARY KEY (`id`), + KEY `ix_tone_case_tone_case_name` (`tone_case_name`), + KEY `ix_tone_case_suite_id` (`suite_id`), + KEY `ix_tone_case_suite_name` (`suite_name`) +) ENGINE=InnoDB AUTO_INCREMENT=603 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_job 结构 +CREATE TABLE IF NOT EXISTS `tone_job` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(100) NOT NULL COMMENT 'tone job名称', + `state` enum('PENDING','RUNNING','SUCCESS','FAIL','STOP','SKIP') NOT NULL COMMENT 'tone job状态', + `test_type` enum('FUNCTIONAL','PERFORMANCE') NOT NULL COMMENT '测试类型', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `tone_job_link` varchar(100) DEFAULT '' COMMENT 'tone job链接', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + `server_info` json DEFAULT NULL COMMENT '存储tone job的机器信息', + PRIMARY KEY (`id`), + KEY `ix_tone_job_tone_job_id` (`tone_job_id`), + KEY `ix_tone_job_task_id` (`task_id`) +) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_sync_pull 结构 +CREATE TABLE IF NOT EXISTS `tone_sync_pull` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=76149 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_sync_push 结构 +CREATE TABLE IF NOT EXISTS `tone_sync_push` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.user 结构 +CREATE TABLE IF NOT EXISTS `user` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', + `nick_name` varchar(64) DEFAULT NULL COMMENT '用户昵称,具有唯一性', + `email` varchar(64) NOT NULL COMMENT '用户邮箱', + `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', + `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', + PRIMARY KEY (`id`), + UNIQUE KEY `nick_name` (`nick_name`), + KEY `ix_user_user_name` (`user_name`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; + +-- 表 test-lib.user_open_source 结构 +CREATE TABLE IF NOT EXISTS `user_open_source` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', + `nick_name` varchar(64) NOT NULL COMMENT '用户昵称,具有唯一性', + `email` varchar(64) NOT NULL COMMENT '用户邮箱', + `password` varchar(64) NOT NULL COMMENT '用户密码,前端对密码md5加密后的值', + `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', + `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', + `token` varchar(256) NOT NULL COMMENT 'api访问凭证', + PRIMARY KEY (`id`), + UNIQUE KEY `nick_name` (`nick_name`), + UNIQUE KEY `email` (`email`), + KEY `ix_user_open_source_token` (`token`(255)) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; + +-- 表 test-lib.user_role_op_record 结构 +CREATE TABLE IF NOT EXISTS `user_role_op_record` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `applicant` varchar(64) NOT NULL COMMENT '申请人name', + `applicant_id` int(11) NOT NULL COMMENT '申请人ID', + `apply_reason` varchar(512) DEFAULT NULL COMMENT '申请理由', + `signer` varchar(64) DEFAULT NULL COMMENT '评审人name', + `has_review` tinyint(1) NOT NULL COMMENT '是否已经审核', + `review_result` enum('INIT','PASS','FAIL') NOT NULL COMMENT '审核结果', + `review_reason` varchar(512) DEFAULT NULL COMMENT '评审意见', + `method` enum('APPROVE','UPGRADE','DOWNGRADE','DELETE') NOT NULL COMMENT '操作方式', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; + + +``` +
+ +### b.TestLib 服务依赖 +### c. clone test-lib代码到~/tone/code目录下 +```shell +git clone --single-branch --branch master https://gitee.com/anolis/testlib.git ~/tone/code/testlib +``` +### d.增加docker-compose配置 +```yaml +# docker-compose.yaml service下增加test-lib + test-lib: + build: + context: code/testlib/ + dockerfile: Dockerfile + args: + APP_NAME: test-lib + ENV: daily + image: test-lib:latest + ports: + - "8005:8005" + depends_on: + - mysql + - redis + environment: + <<: *common-variables + # db + db_url: mysql+aiomysql://${db_user}:{db_password}@mysql:3306/test-lib + # redis + redis_url: redis://:${redis_password}@redis:6379/10 + # app + tone_host: http://${server_ip}:8080/ + tone_token: tone_token + tone_user_name: tone_user_name + main_domain: http://${server_ip}:8005 + oss_url: http://${server_ip}:8005 +``` +#### e.重启服务 +```shell +docker-compose -f ~/tone/docker-compose.yaml up --build -d +``` +## 7. 独立部署 FAQ +https://tone.openanolis.cn/help_doc/12 \ No newline at end of file diff --git "a/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" new file mode 100644 index 00000000..b09df7d0 --- /dev/null +++ "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" @@ -0,0 +1,70 @@ +# 一级标题 +## 二级标题 +### 三级标题 +**粗体文本** + +__cuti__ + +*斜体文本* + +_xieti_ + +下划线 + +~~删除线~~ + +上标:Xy + +下标:An + +> 引用文本 +- 无序列表项1 + - 第二层 +- 无序列表项2 +* * * +1. 有序列表项1 +2. 有序列表项2 +--- +[链接文本](https://gitee.com/suli01/community/edit/master/sig/T-One/content/%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97/%E7%94%A8%E6%88%B7%E8%81%86%E5%90%AC/test.md) + +链接名称 + +'''python +def hello_world(): + print("Hello, world!") + +![示例图片](https://pic.rmb.bdstatic.com/bjh/gallery/03e17cba710868d9153176b50a5fca0d1090.jpeg#pic_center=100x100) + +| 列1 | 列2 | 列3 | +| --- | --- | --- | +| 单元格1 | 单元格2 | 单元格3 | +| 单元格4 | 单元格5 | 单元格6 | + + +| 左对齐 | 居中对齐 | 右对齐 | +|:-----|:------:|------:| +| 文本 | 文本 | 文本 | + +
图片名称
+ + + + + + + + + + + + + +
值班人员星期一星期二星期三
张三李四王五
+ +- [ ] :待完成事项 + +- [x] :已完成事项 + +
+ 图片名称 +
diff --git "a/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" new file mode 100644 index 00000000..d0a3a7f0 --- /dev/null +++ "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" @@ -0,0 +1,2 @@ +# hello +![测试外链图片](https://up.enterdesk.com/2021/edpic/0a/13/7a/0a137aaa28f48af0349cee1e568c0a57_1.jpg) \ No newline at end of file diff --git "a/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" new file mode 100644 index 00000000..e5d110a5 --- /dev/null +++ "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" @@ -0,0 +1,2 @@ +# hello, 欢迎来到聆听 .md +## 阿斯顿发射点 \ No newline at end of file diff --git a/sig/T-One-copy2/sig-info.yaml b/sig/T-One-copy2/sig-info.yaml new file mode 100644 index 00000000..49d584a9 --- /dev/null +++ b/sig/T-One-copy2/sig-info.yaml @@ -0,0 +1,40 @@ +name: T-One-copy2 +en_name: T-One-copy2 +home_page: https://openanolis.cn/sig/t-one +description: T-One兴趣组主要目标是建立OpenAnolis社区的质量保障基础设施(包括但不限于一站式的自动化测试平台T-One/Testfarm,Bisect缺陷定位工具等各类测试平台), 支持OpenAnolis社区的各类测试活动。 +en_description: The main goal of the T-One interest group is to establish the quality assurance infrastructure of the OpenAnolis community (including but not limited to the one-stop automated test platform T-One/Testfarm, Bisect defect location tool and other test platforms), +to support various test platforms in the OpenAnolis community Class testing activities. +mailing_list: t-one@lists.openanolis.cn +meeting_minutes_url: https://etherpad.openanolis.cn/p/t-one +maintainers: +- openanolis_id: yongchao + gitee_id: yongchao + name: yongchao Zhang + organization: AlibabaCloud + email: yongchao@linux.alibaba.com +- openanolis_id: suqingming + gitee_id: suqingming +- openanolis_id: jacob2021 + gitee_id: jacob2021 +- openanolis_id: eeeeeeee + gitee_id: suli01 +contributors: +- openanolis_id: fuyong + gitee_id: fuyong +- openanolis_id: woohello + gitee_id: woohello +- openanolis_id: maozzi4 + gitee_id: maozzi +repositories: +- repo: + - anolis/testfarm + - anolis/testfarm-front + - anolis/tone-web + - anolis/tone-runner + - anolis/tone-agent + - anolis/tone-agent-proxy + - anolis/tone-agent-front + - anolis/tone-front + - anolis/tone-deploy + - anolis/tone-cli + - anolis/tone-storage \ No newline at end of file -- Gitee From 4496ea6a7099adee37aec22cd3ffb5acaa586b14 Mon Sep 17 00:00:00 2001 From: WB01533938 Date: Mon, 20 Jan 2025 11:47:06 +0800 Subject: [PATCH 103/135] =?UTF-8?q?refactor(sig):=20=E6=9B=B4=E6=96=B0=20T?= =?UTF-8?q?-One-copy=20SIG=20=E7=9A=84=E4=B8=AD=E8=8B=B1=E6=96=87=E5=90=8D?= =?UTF-8?q?=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -将中文名称从 "T-One" 修改为 "T-One-copy" - 将英文名称从 "T-One" 修改为 "T-One-copy" --- sig/T-One-copy/README.en.md | 57 -- sig/T-One-copy/README.md | 56 -- .../assets/Dingtalk_20240614165831.jpg | Bin 6459 -> 0 bytes sig/T-One-copy/assets/dingding_group.jpeg | Bin 176005 -> 0 bytes .../1\346\234\210test" | 2 - .../2\346\234\210test" | 2 - .../3\346\234\210test" | 1 - .../SIG\344\276\213\344\274\232(202203-3).md" | 20 - .../SIG\344\276\213\344\274\232(202204-1).md" | 22 - .../SIG\344\276\213\344\274\232(202205-1).md" | 36 - .../SIG\344\276\213\344\274\232(202306-1).md" | 24 - .../SIG\344\276\213\344\274\232(202307-1).md" | 26 - ...13\350\257\225\346\226\207\344\273\266.md" | 4 - ...23\345\214\205\346\211\213\345\206\214.md" | 63 -- .../test.md" | 16 - ...345\244\226\346\234\215\345\212\241API.md" | 1 - ...06\346\210\220\346\211\213\345\206\214.md" | 282 -------- .../\346\234\210\346\212\245/202212.md" | 82 --- .../\346\234\210\346\212\245/202301.md" | 101 --- ...10\346\212\245\350\257\264\346\230\216.md" | 7 - .../000000000130_anolis.jpg" | Bin 47154 -> 0 bytes .../T-One\346\246\202\350\277\260.md" | 30 - .../assets/Dingtalk_20240614165831.jpg" | Bin 6459 -> 0 bytes .../assets/jiagou.jpeg" | Bin 366652 -> 0 bytes .../test1.md" | 73 --- .../tone\351\203\250\347\275\262.md" | 615 ------------------ .../test.md" | 70 -- ...26\351\223\276\345\233\276\347\211\207.md" | 2 - .../\350\201\206\345\220\254.md" | 2 - sig/T-One-copy/sig-info.yaml | 40 -- 30 files changed, 1634 deletions(-) delete mode 100644 sig/T-One-copy/README.en.md delete mode 100644 sig/T-One-copy/README.md delete mode 100644 sig/T-One-copy/assets/Dingtalk_20240614165831.jpg delete mode 100644 sig/T-One-copy/assets/dingding_group.jpeg delete mode 100644 "sig/T-One-copy/content/SIG\344\276\213\344\274\232/1\346\234\210test" delete mode 100644 "sig/T-One-copy/content/SIG\344\276\213\344\274\232/2\346\234\210test" delete mode 100644 "sig/T-One-copy/content/SIG\344\276\213\344\274\232/3\346\234\210test" delete mode 100644 "sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202203-3).md" delete mode 100644 "sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202204-1).md" delete mode 100644 "sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202205-1).md" delete mode 100644 "sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202306-1).md" delete mode 100644 "sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202307-1).md" delete mode 100644 "sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232\346\265\213\350\257\225\346\226\207\344\273\266.md" delete mode 100644 "sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/ToneAgent\347\274\226\350\257\221\346\211\223\345\214\205\346\211\213\345\206\214.md" delete mode 100644 "sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" delete mode 100644 "sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/\345\257\271\345\244\226\346\234\215\345\212\241API.md" delete mode 100644 "sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/\346\265\213\350\257\225\345\245\227\344\273\266\351\233\206\346\210\220\346\211\213\345\206\214.md" delete mode 100644 "sig/T-One-copy/content/\346\234\210\346\212\245/202212.md" delete mode 100644 "sig/T-One-copy/content/\346\234\210\346\212\245/202301.md" delete mode 100644 "sig/T-One-copy/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" delete mode 100644 "sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/000000000130_anolis.jpg" delete mode 100644 "sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" delete mode 100644 "sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/Dingtalk_20240614165831.jpg" delete mode 100644 "sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/jiagou.jpeg" delete mode 100644 "sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" delete mode 100644 "sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" delete mode 100644 "sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" delete mode 100644 "sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" delete mode 100644 "sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" delete mode 100644 sig/T-One-copy/sig-info.yaml diff --git a/sig/T-One-copy/README.en.md b/sig/T-One-copy/README.en.md deleted file mode 100644 index 831cee37..00000000 --- a/sig/T-One-copy/README.en.md +++ /dev/null @@ -1,57 +0,0 @@ -## SIG Home - -https://openanolis.cn/sig/t-one - -## SIG Mission -T-One SIG focus on building a one station test system, to fully support OpenAnolis community test activities. - -The main activities of this SIG are: -1. Explore excellent solutions, collect requirements by the community, design and plan direction on the test platform. -2. Develop and maint T-One/Testfarm to support testing tasks by the community. -3. Make T-One open-source, attract develpers by the community, provide testing services for community developers and cooperative enterprises此处有中文. - -## T-One Link -T-One:https://tone.openanolis.cn/ - -Testfarm:https://testfarm.openanolis.cn/ - -## Members -| Member | Role | -| ------------ | ------------ | -| [yongchao](https://gitee.com/zy_chao) | maintainer | -| vosamowho | maintainer | -| wjn740 | maintainer | -| suqingming | maintainer | -| jacob2021 | maintainer | -| fuyong | maintainer | -| wenlylinux | contributor | -| zhangxuefeng | contributor | -| wb-cy860729 | contributor | -| jpt2021 | contributor | -| woohello | contributor | -| as461177513 | contributor | -| vosamowho | contributor | - -## SIG Repositories - -Source code repositories: -- https://gitee.com/anolis/testfarm -- https://gitee.com/anolis/testfarm-front -- https://gitee.com/anolis/tone-web -- https://gitee.com/anolis/tone-runner -- https://gitee.com/anolis/tone-agent -- https://gitee.com/anolis/tone-agent-proxy -- https://gitee.com/anolis/tone-agent-front -- https://gitee.com/anolis/tone-front -- https://gitee.com/anolis/tone-deploy -- https://gitee.com/anolis/tone-cli -- https://gitee.com/anolis/tone-storage - - -## Meetings - -## Chat GROUP - -欢迎使用钉钉扫码入群 - -![](assets/dingding_group.jpeg) \ No newline at end of file diff --git a/sig/T-One-copy/README.md b/sig/T-One-copy/README.md deleted file mode 100644 index 9c662bcc..00000000 --- a/sig/T-One-copy/README.md +++ /dev/null @@ -1,56 +0,0 @@ -## SIG主页 - -https://openanolis.cn/sig/t-one - -## SIG目标 -T-One兴趣组主要目标是建立OpenAnolis社区的质量保障基础设施(包括但不限于一站式的自动化测试平台T-One/Testfarm,Bisect缺陷定位工具等各类测试平台), 支持OpenAnolis社区的各类测试活动;此SIG组的主要活动有: -1. 探索业界在测试工具方面的优秀方案,同时结合社区在测试方面的需求,设计规划测试工具的后续方向。 -2. 开发并维护相关测试工具,支撑社区的各类测试活动。.... -3. 开源相关测试工具,吸引社区的开发力量,并为社区开发者及合作企业提供测试服务。 - -## 平台链接 -T-One:https://tone.openanolis.cn/ - -Testfarm:https://testfarm.openanolis.cn/ - - -## 成员列表 -| 成员 | 角色 | -| ------------ | ------------ | -| [yongchao](https://gitee.com/zy_chao) | maintainer | -| vosamowho | maintainer | -| wjn740 | maintainer | -| suqingming | maintainer | -| jacob2021 | maintainer | -| fuyong | maintainer | -| wenlylinux | contributor | -| zhangxuefeng | contributor | -| wb-cy860729 | contributor | -| jpt2021 | contributor | -| woohello | contributor | -| as461177513 | contributor | -| vosamowho | contributor | - -## SIG仓库 - -Source code repositories: -- https://gitee.com/anolis/testfarm -- https://gitee.com/anolis/testfarm-front -- https://gitee.com/anolis/tone-web -- https://gitee.com/anolis/tone-runner -- https://gitee.com/anolis/tone-agent -- https://gitee.com/anolis/tone-agent-proxy -- https://gitee.com/anolis/tone-agent-front -- https://gitee.com/anolis/tone-front -- https://gitee.com/anolis/tone-deploy -- https://gitee.com/anolis/tone-cli -- https://gitee.com/anolis/tone-storage - -## 小组例会 -双周会,采用线上会议形式 - -## 钉钉群 - -欢迎使用钉钉扫码入群 - -![](assets/dingding_group.jpeg) \ No newline at end of file diff --git a/sig/T-One-copy/assets/Dingtalk_20240614165831.jpg b/sig/T-One-copy/assets/Dingtalk_20240614165831.jpg deleted file mode 100644 index 925bf2945891170613821e8e7dbc9e4206d17c8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6459 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 diff --git "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/1\346\234\210test" "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/1\346\234\210test" deleted file mode 100644 index 8c388782..00000000 --- "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/1\346\234\210test" +++ /dev/null @@ -1,2 +0,0 @@ -test -0228 \ No newline at end of file diff --git "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/2\346\234\210test" "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/2\346\234\210test" deleted file mode 100644 index 479dbaff..00000000 --- "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/2\346\234\210test" +++ /dev/null @@ -1,2 +0,0 @@ -test -顶顶顶顶顶 \ No newline at end of file diff --git "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/3\346\234\210test" "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/3\346\234\210test" deleted file mode 100644 index 30d74d25..00000000 --- "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/3\346\234\210test" +++ /dev/null @@ -1 +0,0 @@ -test \ No newline at end of file diff --git "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202203-3).md" "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202203-3).md" deleted file mode 100644 index 3bf59177..00000000 --- "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202203-3).md" +++ /dev/null @@ -1,20 +0,0 @@ -## 会议主题 -测试管理系统TestLib的方案讨论 - -## 会议时间 -2022.03.16 10:00-11:00 - -## 参会人 - -- 参会方:来自电子五所(赛宝实验室)和阿里云的社区爱好者 -- 参会人:yongchao、qingming、wjn740、as461177513、VosAmoWho 等等 - -## 会议记要 - -1. 对齐五所提出的方案扩展需求,主要是字段的扩展以及流程上适当进行松耦合 - - 设计对象:需要考虑测试用例套与测试需求的关系,测试结果与测试执行记录集的关系,测试方案的扩展等 - - 评审相关:测试用例、测试方案、测试结果 - - 流程上:主要对象之间需要进行适当的弱耦合 - - 平台输出:需要考虑测试用例及测试用例执行记录集这两块内容 -2. 讨论后续社区合作、运营等方式 -3. 后续yongchao会结合这次新增扩展需求进行设计上的优化并与大家对齐 \ No newline at end of file diff --git "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202204-1).md" "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202204-1).md" deleted file mode 100644 index 6bec3ab0..00000000 --- "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202204-1).md" +++ /dev/null @@ -1,22 +0,0 @@ -## 会议主题 -测试管理系统TestLib演示及需求讨论 - -## 会议时间 -2022.04.28 11:00-12:00 - -## 参会人 -- 参会方:来自电子五所(赛宝实验室)和阿里云的社区爱好者 -- 参会人:yongchao、wjn740、as461177513、VosAmoWho 等等 -## 会议记要 - -1. 我们演示了testlib目前全部功能,包括大纲,需求,方案,用例,任务,设备等等功能,强调通用性。 - - 测试方案已经跟测试用例和测试任务打通。 - - 测试用例跟t-one打通,测试任务结果跟t-one打通中。 - - 测试设备状态跟t-one打通中。 - - 介绍目前规划:用户权限,自定义字段,测试任务结果打通,测试方案维度的报告,还有系统配置等。 -2. 讨论下阶段主要需求,主要考虑两个方面: - - 希望演示的时候打通台式机的一个**完整测试流程打通**(大纲,需求,方案,任务,报告等)。 - - 有一个台式机的**测试报告**可以看。 -3. 演示发现的主要问题: - - 方案关联的任务没限制,用例管理信息问题,任务结果问题,还有方案维度的报告结果。 - diff --git "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202205-1).md" "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202205-1).md" deleted file mode 100644 index 8139fbee..00000000 --- "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202205-1).md" +++ /dev/null @@ -1,36 +0,0 @@ -## 会议主题 -测试管理系统TestLib开发进度同步、演示、以及问题交流 -## 会议时间 -2022.05.20 10:00-11:00 -## 参会人 - -- 参会方:来自电子五所(赛宝实验室)和阿里云的社区爱好者 -- 参会人:yongchao、VosAmoWho、juexiao、wjn740、zhizhisheng、as461177513 等等 -## 会议记要 - -1. yongchao和VosAmoWho 与五所同学演示了testlib相关功能,着重介绍了与上次demo的开发重点变化,主要是测试方案及报告,测试用例的优化,测试任务及结果录入,以及系统配置等模块的优化。 -1. 大家一起交流了 testlib 以及 t-one的相关问题: - - T-One相关问题: - - 文档指导类: - - 升级debian相关步骤,涉及toneagent, tone配置,tone-cli等。 - - 同步本地用例出现故障, 以及系统同步用例相关的配置。 - - 测试机器:内网集群与内网单机的区别,如何配置等 - - 测试工具的管理问题: - - 不同的脚本都通过git进行管理出现的问题,离线模式介绍。 - - 测试工具的管理,版本管理如何做。 - - TestLib相关问题: - - 和tone的联动需要完善。 - - 用例结果:测试用例 及 结果 通过excel 导入及导出;关联任务/跳过任务 - - 测试报告:需要显示测试设备信息,后面考虑软硬件信息的提取及展示 -3. 目前系统已经发布上线,可以给五所同学配置权限即可进行试用。 -3. 五所提出的5月25日正式演示时间点不变,主要演示需求点还是: - - 希望演示的时候打通台式机的一个**完整测试流程打通**(大纲,需求,方案,任务,报告等)。 - - 有一个台式机的**测试报告**可以看。 -5. 后续开发重点主要是: - - 权限管控体系完善,方便社区线上使用。 - - 与t-one对接起来,固定ws、project、job类型等,自动执行并同步用例。 - - 手动录入用例结果、及设备的优化。 - - 测试方案报告及结果中设备等的展示优化。 - - - diff --git "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202306-1).md" "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202306-1).md" deleted file mode 100644 index 4274bb1b..00000000 --- "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202306-1).md" +++ /dev/null @@ -1,24 +0,0 @@ - -### 会议主题 -项目例会 - -### 会议时间 -2023.06.08 10:30-11:30 - -### 参会人 -参会人:yongchao,fubing,ylsong, zhizhisheng,suchunyang,T-One项目小组 - -### 会议纪要 - -1. T-One最新进展同步 -- runner2 性能优化 -- toneagent新增日志自动拆分、自动清理功能 -- 同步用例逻辑变更,不依赖同步用例的机器 -- 用例管理批量编辑字段优化 -- 时序分析中性能分析、新建 Job 提交、消息通知相关慢接口优化。 -- 新增接口可查询某个产品下的 Job ID。 - -2. 需求反馈和意见收集 -- 物理机迁移的方案:主要关心数据的可迁移 -- 版本升级原地升级的方案:升级的便捷性 -- 社区版和开源部署版的数据节点间的互相同步数据 diff --git "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202307-1).md" "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202307-1).md" deleted file mode 100644 index e59dcd0f..00000000 --- "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202307-1).md" +++ /dev/null @@ -1,26 +0,0 @@ - -### 会议主题 -项目例会 - -### 会议时间 -2023.06.08 10:30-11:30 - -### 参会人 -参会人:yongchao,fubing,ylsong, zhizhisheng,suchunyang,T-One项目小组 - -### 会议纪要 - -1. T-One最新进展同步 -- runner2 性能优化 -- toneagent新增日志自动拆分、自动清理功能 -- 同步用例逻辑变更,不依赖同步用例的机器 -- 用例管理批量编辑字段优化 -- 时序分析中性能分析、新建 Job 提交、消息通知相关慢接口优化。 -- 新增接口可查询某个产品下的 Job ID。 -- [这是一个链接]: http://www.z01.com/ "这里是链接的title内容 -这是一个链接 [这是逐浪软件官网链接](http://www.z01.com/ "欢迎访问逐浪软件官网") -2. 需求反馈和意见收集 -- 物理机迁移的方案:主要关心数据的可迁移 -- 版本升级原地升级的方案:升级的便捷性 -- 社区版和开源部署版的数据节点间的互相同步数据 -- 测试验证 diff --git "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232\346\265\213\350\257\225\346\226\207\344\273\266.md" "b/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232\346\265\213\350\257\225\346\226\207\344\273\266.md" deleted file mode 100644 index 1732d313..00000000 --- "a/sig/T-One-copy/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232\346\265\213\350\257\225\346\226\207\344\273\266.md" +++ /dev/null @@ -1,4 +0,0 @@ -### 收尾验证 -这是收尾,验证同步作者信息 -### 验证history -2023年11月16日10:49:13 \ No newline at end of file diff --git "a/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/ToneAgent\347\274\226\350\257\221\346\211\223\345\214\205\346\211\213\345\206\214.md" "b/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/ToneAgent\347\274\226\350\257\221\346\211\223\345\214\205\346\211\213\345\206\214.md" deleted file mode 100644 index 0949b8e7..00000000 --- "a/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/ToneAgent\347\274\226\350\257\221\346\211\223\345\214\205\346\211\213\345\206\214.md" +++ /dev/null @@ -1,63 +0,0 @@ -# 1. ToneAgent编译 - -## 1.1 环境准备 -Go 1.17 及以上版本([下载地址](https://go.dev/dl/)) - -## 1.2 下载ToneAgent - git clone git@gitee.com:anolis/tone-agent.git - cd tone-agent - -## 1.3 编译 -`-o` 后面是二进制的名称 - -### 1.3.1 编译 AMD64的二进制 - GOOS=linux GOARCH=amd64 go build -o toneagent-amd64-v102 - -### 1.3.2 编译 ARM 的二进制 - GOOS=linux GOARCH=arm64 go build -o toneagent-amd64-v102 - -# 2. Linux环境二进制打包 - -## 2.1 RPM包制作 - -### 2.1.1 RPM环境准备 - sudo su -c bash # 使用bash - yum install rpmdevtools rpmdevtools # 安装rpm打包工具 - -### 2.1.2 打包RPM包 - rpmdev-setuptree # 创建目录,会在用户目录下创建rpmbuild文件夹 ~/rpmbuild - cd # 返回用户目录 - vi rpmbuild/SPEC/toneagent.spec # 修改创建spec的模板文件 - mkdir rpmbuild/BUILDROOT/toneagent-0.0.1-AMD - cp ${二进制路径} rpmbuild/BUILDROOT/toneagent-0.0.1-AMD/ # 拷贝二进制到RPM目录 - cd rpmbuild/SPEC/ - rpmbuild -bb toneagent.spec # 构建rpm包 - -### 2.1.3 RPM安装及启动 - sudo yum -y install ${toneagent包位置} # 安装 - sudo systemctl start toneagent # 启动 - -## 2.2 DEB包制作 - -### 2.1.1 环境准备 - sudo apt instsll -y dpkg # 使用二进制打包,只需要安装这个包 - sudo apt install -y dpkg build-essential devscripts quilt dh-make git # 扩展安装 - -### 2.1.2 打包DEB包 - mkdir toneagent.work - cd toneagent.work - mkdir -pv toneagent_0.0.1_amd64/{DEBIAN,bin} - cp ${tone-agent二进制} toneagent_0.0.1_amd64/bin/ - echo "Package: toneagent - Version: 1.0 - Architecture: arm - Maintainer: alibaba - Installed-Size: 100 - Depends: - Priority: optional - Description: toneagent for SUNXI devices (A10,A20 ...),example is Cubieboard. - " >> toneagent_0.0.1_amd64/DEBIAN/control - dpkg -b toneagent_0.0.1_amd64 toneagent_0.0.1_amd64.deb - -### 2.1.3 DEB安装 - dpkg -i toneagent_0.0.1_amd64.deb diff --git "a/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" "b/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" deleted file mode 100644 index 9dca95d4..00000000 --- "a/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" +++ /dev/null @@ -1,16 +0,0 @@ -HCT密码计算套件的目录结构如下: -阿斯顿法师打发斯蒂芬 -44444444444444444444444444444444444444444444444444444 -hygon-devkit/ - - ├─ hct -  ├──pkg -  │ ├── hct_1.0.0.20230224_rc -  │ ├── hct_1.0.1.20230512_rc -  │ └── hct_1.1.0.20230730_rc -  │ -  └── README.md - -\* pkg目录:内含各版本hct密码计算套件。 - -\* README.md文件:有关HCT的简单情况。 \ No newline at end of file diff --git "a/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/\345\257\271\345\244\226\346\234\215\345\212\241API.md" "b/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/\345\257\271\345\244\226\346\234\215\345\212\241API.md" deleted file mode 100644 index 6be2fe13..00000000 --- "a/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/\345\257\271\345\244\226\346\234\215\345\212\241API.md" +++ /dev/null @@ -1 +0,0 @@ -参考文档:https://tone.openanolis.cn/help_doc/7 \ No newline at end of file diff --git "a/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/\346\265\213\350\257\225\345\245\227\344\273\266\351\233\206\346\210\220\346\211\213\345\206\214.md" "b/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/\346\265\213\350\257\225\345\245\227\344\273\266\351\233\206\346\210\220\346\211\213\345\206\214.md" deleted file mode 100644 index 67b07c6d..00000000 --- "a/sig/T-One-copy/content/\345\274\200\345\217\221\346\211\213\345\206\214/\346\265\213\350\257\225\345\245\227\344\273\266\351\233\206\346\210\220\346\211\213\345\206\214.md" +++ /dev/null @@ -1,282 +0,0 @@ -# tone-cli介绍 -tone-cli主要用于测试套件(testsuite)的调度及运行。 - -# 代码仓库 -https://gitee.com/anolis/tone-cli - -# 测试套件构成 -测试套件主要由套件本身和集成脚本构成,其中: - -- 测试套件可以存放于gitee或其他代码仓库,也可以是一个系统中已经包含的命令 -- 集成脚本由两部分构成: - - 适配脚本 - - 测试套配置文件 - -# 测试套件集成 - -## 测试配置文件 -测试配置文件位于`$TONE_ROOT/conf`目录下,与适配脚本一起为测试套件服务。 - -为了便于组织,当前根据测试类别分为`functional`,`performance`和`stress`。 - -测试配置文件主要用于描述测试的参数,以netperf为例: - - test IP runtime send_size - TCP_RR ipv4 60s Na - TCP_RR ipv4 60s 16K - TCP_CC ipv4 60s Na - TCP_CRR ipv4 60s Na - ... - -第一行描述为变量名,后续行描述的是变量的值。tone-cli会将测试套配置文件按照配置进行执行: - - $ tone list netperf - test IP runtime send_size testconf - TCP_RR ipv4 60 None netperf:test=TCP_RR,IP=ipv4,runtime=60s - TCP_RR ipv4 60 16K netperf:test=TCP_RR,IP=ipv4,runtime=60s,send_size=16K - TCP_CC ipv4 60 None netperf:test=TCP_CC,IP=ipv4,runtime=60s - TCP_CRR ipv4 60 None netperf:test=TCP_CRR,IP=ipv4,runtime=60s -在后续的脚本中,conf中的变量会以参数形式传递给适配脚本。 - -> 注: -> -> - 没有任何变量的测试套,仍然需要创建对应名称的配置文件,保持内容为空 -> - 对于某个参数,如netperf的send_size,在某些状况下不需要传入参数,则可以置为NA - -## 适配脚本 - -测试套件适配脚本需要存放于`$TONE_ROOT/tests`目录下,创建工具对应的目录,如`$TONE_ROOT/tests/netperf`。 - -tone-cli将测试定义为以下几个阶段,可以根据需要来决定是否需要对应的阶段: - -- 测试套件获取 -- 测试套件编译安装 -- 测试执行 -- 结果处理 -- 测试套件卸载 - -适配脚本需要最少包含`install.sh`,`run.sh`和`README.md`,其中: - -- install.sh: 定义测试套件获取、依赖包、测试套件编译及安装 -- run.sh: 定义测试执行过程,结果处理方式 -- README.md: 测试套件必要说明 - -其他脚本可以根据需要决定,如:将结果处理脚本单独编写,在run.sh中加以引用 - -### 测试套件获取 - -当前支持通过URL下载或git方式获取对应的测试套: - -| 方式| 参数 | 说明 |举例 | -| :--:| :---: | :---: |:---: | -|URL下载 |WEB_URL |测试套下载地址 |WEB_URL=“https://gitee.com/anolis/tone-cli/repository/archive/master.zip”| -|GIT仓库 |GIT_URL |git仓库地址 |GIT_URL="https://gitee.com/mirrors_HewlettPackard/netperf.git"| -| |BRANCH |git分支| BRANCH="netperf-2.7.0"| - -tone-cli将根据提供的`WEB_URL`,`GIT_URL`,`BRANCH`等信息拉取对应的源代码 - -### 举例: - -`netperf/install.sh` - - GIT_URL="https://gitee.com/mirrors_HewlettPackard/netperf.git" - BRANCH="netperf-2.7.0" - -### 测试套件编译安装 - -tone-cli提供的标准安装方式由以下几步: - -- 执行安装前额外的操作:extract_src -- 安装依赖包:install_pkg -- 编译:build -- 安装:install - -**extract_src** - -用于在安装依赖包之前进行必要的准备,如centos安装epel源: - - extract_src() - { - logger yum install -y epel-release - } - -**install_pkg** - -绝大部分状况下,不需要重写install_pkg的方法,而仅通过设置DEP_PKG_LIST的变量,tone-cli将自动进行依赖包安装。如netperf/install.sh: - - DEP_PKG_LIST="automake gcc texinfo" - -**build和install** - -通常状况,build和install都需要根据测试套件进行重写。以netperf为例: - - build() - { - local configure_flags=( - --prefix="$TONE_BM_RUN_DIR" - ) - if [ "$(/usr/bin/arch)" = aarch64 ]; then - configure_flags+=('--build=aarch64-unknown-linux-gnu') - fi - - export CFLAGS="-fno-strict-aliasing -fcommon" - - ./autogen.sh - ./configure "${configure_flags[@]}" - make - } - - install() - { - make install-exec - } -### 测试执行 - -测试执行被定义在`run.sh`中,主要的步骤有: - -- 测试准备:setup -- 测试执行:run -- 测试拆除:teardown - -以netperf为例,netperf测试可以划分为: - -- 启动netserver -- 使用netperf命令进行测试 -- 拆除netserver - -**setup** - -netperf测试中,netserver启动主要逻辑为: - -- 判断是否设置了$SERVER,如果已设置,则认为netserver将在对应的server上执行 -- 启动netserver,启动netserver的主要逻辑在netserver.sh中体现 - - setup() - { - [ -n "$SERVER" ] && server=${SERVER%% *} || server=localhost - echo "Run netserver on host: $server" - - if [ "$server" = localhost ]; then - source "$TONE_BM_SUITE_DIR"/netserver.sh - else - ssh $server "TONE_ROOT=$TONE_ROOT TONE_BM_RUN_DIR=$TONE_BM_RUN_DIR IP=$IP server=$server $TONE_BM_SUITE_DIR/netserver.sh" - fi - } - -**run** - -netperf测试套的执行逻辑,主要根据测试套件配置中的参数组合,设置netperf命令行参数以执行测试 - -> 注: -> -> 在执行命令时,使用logger方法将netperf命令行输出写入对应的日志文件中,以备后续进行结果处理 - - run() - { - export PATH="$TONE_BM_RUN_DIR"/bin:$PATH - - [ -n "$send_size" ] && test_options="-- -m $send_size" - - opt_ip= - [ "$IP" = 'ipv4' ] && opt_ip='-4' - [ "$IP" = 'ipv6' ] && opt_ip='-6' - base_cmd="netperf $opt_ip -t $test -c -C -l $runtime -H $server $test_options" - - # check online cpus with cpu_affinity set on multi-processor machine - if [ "$server" = localhost ] && [ "$(nproc)" -gt 1 ]; then - check_oneline_cpu - # the last cpu is reservered for netserver if test on single node - cpu_online_num=$((cpu_online_num - 1)) - cpu_online_tpy=$(echo "$cpu_online_tpy" | awk '{$NF=""; print $0}') - cpu_x=$((1 % cpu_online_num)) - [ "$cpu_x" -eq 0 ] && cpu_x=$cpu_online_num - mycpu=$(echo "$cpu_online_tpy" | awk -v n=$cpu_x '{print $n}') - test_cmd="taskset -c $(echo "$mycpu" | cut -d- -f3) $base_cmd" - echo "run netperf on cpu: $(echo "$mycpu" | cut -d- -f3),"\ - "socket: $(echo "$mycpu" | cut -d- -f1),"\ - "core_id: $(echo "$mycpu" | cut -d- -f2)" - else - test_cmd="$base_cmd" - fi - - logger $test_cmd & - logger wait - } - -**teardown** - -netperf的teardown阶段,主要通过执行pkill命令杀死netserver进程 - - teardown() - { - pkill netserver - } - -**结果处理** -tone-cli当前规定的结果规范为`key: value`,所以只要符合这个输出规范,对应的结果会被收集并存储。 - -以netperf为例,其结果处理的`parse()`调用了一个awk脚本: - - #!/usr/bin/awk -f - - /^Size.*Okay.*Throughput.*Demand$/ { - unit = "Mbps1" - next - } - - /^Size.*Throughput.*remote$/ { - unit = "Mbps2" - next - } - - /^bytes.*secs.\s+per sec/ { - unit = "tps" - next - } - - $8 && $0 ~ /^[ \t0-9.]+$/ { - if ( unit == "Mbps1" ) { - printf("Throughput_Mbps: %s\n",$(NF-2)) - } - else if ( unit == "Mbps2" ) { - printf("Throughput_Mbps: %s\n",$5) - } - else{ - printf("Throughput_%s: %s\n",unit,$6) - } - } - -执行完毕后会输出: - - Throughput_tps: 91336.30 - -# 公共变量 -tone-cli提供了多个公共变量用于在测试集成时使用 - -## 测试套配置文件 - -|变量名称| 用途| 举例| -|:--:|:--:|:--:| -|nr_task |设置使用的线程数,可以使用百分比形式表示,当设置为百分比时,框架会根据当前测试机CPU数量进行计算 |nr_task=1, nr_task=50%| -|cpu_affinity |设置CPU绑定| cpupin| - -## 测试套适配脚本 - -|变量名称| 用途| 举例| -|:--:|:--:|:--:| -|$TONE_BM_CACHE_DIR |测试套件cache目录| /tmp/tone/cache/netperf| -|$TONE_BM_BUILD_DIR| 测试套件build目录| /tmp/tone/build/netperf| -|$TONE_BM_RUN_DIR |测试套件run目录,可以将测试套件安装于该目录中,而不用安装到系统目录下| /tmp/tone/run/netperf| -|$TONE_BM_RESULT_DIR |测试套件结果存放目录 |/tmp/tone/result/netperf| -|$TONE_CURRENT_RESULT_DIR |当次运行时的结果存放目录| /tmp/tone/result/netperf/1| -|$TONE_BM_SUITE_DIR |测试套件脚本目录| /tmp/tone/tests/netperf| - -# 公共函数 - -tone-cli提供一些公共函数已方便脚本编写,公共函数主要归档于$TONE_ROOT/lib目录下,在编写脚本时可以按需引入。常用的函数有: - -|函数名| 文件 |用途 |举例| -|:--:|:--:|:--:|:--:| -|logger |lib/common.sh |记录日志 |logger netperf -t TCP_RR| -|set_cpu_affinity_server |lib/cpu_affinity.sh |设置服务端CPU绑核,会将server绑定在最后一个CPU核上,注意,需要通过server_cmd变量进行传递 |server_cmd="netserver" [ -n "$cpu_affinity" ] && set_cpu_affinity_client logger ${server_cmd}| -|set_cpu_affinity_client |lib/cpu_affinity.sh| 设置客户端CPU绑核,会将client绑定在第一个CPU核上,注意,需要通过client_cmd进行传递 |client_cmd="netperf -t TCP_RR" [ -n "$cpu_affinity" ] && set_cpu_affinity_client logger ${client_cmd}| \ No newline at end of file diff --git "a/sig/T-One-copy/content/\346\234\210\346\212\245/202212.md" "b/sig/T-One-copy/content/\346\234\210\346\212\245/202212.md" deleted file mode 100644 index 88250c90..00000000 --- "a/sig/T-One-copy/content/\346\234\210\346\212\245/202212.md" +++ /dev/null @@ -1,82 +0,0 @@ -# 整体进展 -- 发布 ANCK 4.19-027 版本。 -- 初步建立了龙蜥社区第三方驱动的研发流程,并试用该流程集成了国产化网迅网卡驱动。 -- ANCK-5.10 内核产品化。 -- 成立"浪潮信息龙蜥联合实验室"。 - -# ANCK 4.19-027 版本 -## 内核更新 -- 版本更新至 4.19.91-27 -- 重要内核缺陷及安全漏洞(CVE)修复 -- 在 namespace_unlock 中使用 synchronize_rcu_expedited 加速 rcu 宽限期,使并发启动100个 busybox 容器的速度提升19% -- 调整 Trusted Platform Module 驱动的缓冲区大小,避免上下文切换时因内存不足报错 -- 默认使能 mq-deadline IO 调度器 -- 提升 NVMe、megaraid_sas 和 mpt3sas 三个驱动的稳定性 -- 全面支持 Aero 系列 raid 卡 -- 修复了飞腾处理器 SMMU 的硬件缺陷导致的问题 -## 自研功能 -- 支持动态开启 Group Identity 特性 -- 支持稀疏文件映射使用系统零页,减少启动虚拟机时的内存消耗 -## CVE修复列表 -详情请参考: -- [Anolis OS 7](https://anas.openanolis.cn/errata/detail/ANSA-2023:0002) -- [Anolis OS 8](https://anas.openanolis.cn/errata/detail/ANSA-2023:0001) - -重要CVE列表: -- CVE-2021-33656 -- CVE-2021-4037 -- CVE-2021-4159 -- CVE-2022-0001 -- CVE-2022-0002 -- CVE-2022-0494 -- CVE-2022-1012 -- CVE-2022-1048 -- CVE-2022-1184 -- CVE-2022-1198 -- CVE-2022-1462 -- CVE-2022-1679 -- CVE-2022-1729 -- CVE-2022-1734 -- CVE-2022-21125 -- CVE-2022-21166 -- CVE-2022-2153 -- CVE-2022-2318 -- CVE-2022-24958 -- CVE-2022-2503 -- CVE-2022-25258 -- CVE-2022-2586 -- CVE-2022-2588 -- CVE-2022-2602 -- CVE-2022-26365 -- CVE-2022-2639 -- CVE-2022-26490 -- CVE-2022-27223 -- CVE-2022-28388 -- CVE-2022-28389 -- CVE-2022-28390 -- CVE-2022-2978 -- CVE-2022-30594 -- CVE-2022-3176 -- CVE-2022-3202 -- CVE-2022-32250 -- CVE-2022-3542 -- CVE-2022-36879 -- CVE-2022-36946 -- CVE-2022-39188 - -# 龙蜥社区第三方驱动 -建立第三方驱动的社区研发流程:https://openanolis.cn/sig/Cloud-Kernel/doc/721476448598622343
- -网迅网卡已经按此流程合入 ANCK : -- 支持ANCK-5.10 10GB 网迅网卡驱动: https://gitee.com/anolis/cloud-kernel/pulls/540 -- 支持ANCK-4.19 10GB 网迅网卡驱动: https://gitee.com/anolis/cloud-kernel/pulls/709 -- 支持ANCK-4.19 1GB 网迅网卡驱动: https://gitee.com/anolis/cloud-kernel/pulls/1043 -- 支持ANCK-5.10 1GB 网迅网卡驱动: https://gitee.com/anolis/cloud-kernel/pulls/1063 - -# 重要议题 -- 讨论并决策了将 ANCK-5.10 作为 Anolis8 的默认产品化内核,详情请点击[这里](https://gitee.com/anolis/community/blob/master/proposals/Anolis8%E4%B8%8AANCK-5.10%E4%BA%A7%E5%93%81%E5%8C%96%E7%9A%84%E6%8F%90%E8%AE%AE.md)。 -- 讨论并决策了将 ANCK-5.10 作为 Anolis23 的当前默认内核,详情请点击[这里](https://gitee.com/anolis/community/blob/master/proposals/anck-5.10%E4%BD%9C%E4%B8%BAanolis23%E7%9A%84%E5%86%85%E6%A0%B8%E9%80%89%E5%9E%8B%E7%9A%84%E6%8F%90%E8%AE%AE.md)。 - -# 运营活动 -- [浪潮信息正式发布基于龙蜥 Anolis OS 的服务器操作系统 Inspur KOS](https://openanolis.cn/news/726244284765327879)。 -- 于2022.12.24 举办了“[龙蜥走进系列活动之走进浪潮信息 MeetUp](https://mp.weixin.qq.com/s?__biz=Mzg4MTMyMTUwMQ==&mid=2247510368&idx=1&sn=95a1d511b32670f8388745682483046a&chksm=cf655a12f812d30494be938d7bf8a46b7244711c8fb75f44e8379ab261b1fd4aeb1c8bb0805e&scene=21#wechat_redirect)",并成立了浪潮信息龙蜥联合实验室,致力于共建龙蜥社区的软硬件兼容性生态、标准建设和技术创新等。 diff --git "a/sig/T-One-copy/content/\346\234\210\346\212\245/202301.md" "b/sig/T-One-copy/content/\346\234\210\346\212\245/202301.md" deleted file mode 100644 index 85bbb428..00000000 --- "a/sig/T-One-copy/content/\346\234\210\346\212\245/202301.md" +++ /dev/null @@ -1,101 +0,0 @@ -# 整体进展 - -- 发布 ANCK 5.10-013 版本。 -- 确定KABI机制整体方案。 -- 浪潮信息龙蜥联合实验室的工作事项更新。 - -# ANCK 5.10-013 版本 - -## 内核更新 - -- 版本更新至 5.10.134-13 -- 重要内核缺陷及安全漏洞(CVE)修复 -- 支持用户态/dev/ioasid -- SWIOTLB机制性能优化 -- virtio-net 打开 napi.tx 优化 TCP Small Queue 性能 -- 支持AST2600 PCIe 2D VGA Driver -- 支持FT2500处理器 -- 支持动态开启Group identity特性 -- arm64平台默认内核启动cmdline调整 -- 添加 Compact Numa Aware (CNA) spinlock 功能支持 -- 丰富arm64的perf mem和perf c2c功能 -- fsck.xfs 支持日志恢复 -- hugetext自适应按需大页 -- 支持SGX动态内存管理 -- 使能wireguard模块 - -## CVE修复列表 - -详情请参考: - -- [Anolis OS 7](https://anas.openanolis.cn/errata/detail/ANSA-2023:0002) -- [Anolis OS 8](https://anas.openanolis.cn/errata/detail/ANSA-2023:0001) - -重要CVE列表: - -- CVE-2021-4037 -- CVE-2022-0171 -- CVE-2022-1679 -- CVE-2022-2585 -- CVE-2022-2586 -- CVE-2022-2588 -- CVE-2022-2602 -- CVE-2022-26373 -- CVE-2022-2663 -- CVE-2022-2905 -- CVE-2022-2978 -- CVE-2022-3028 -- CVE-2022-3061 -- CVE-2022-3169 -- CVE-2022-3176 -- CVE-2022-3435 -- CVE-2022-3521 -- CVE-2022-3524 -- CVE-2022-3534 -- CVE-2022-3535 -- CVE-2022-3542 -- CVE-2022-3545 -- CVE-2022-3564 -- CVE-2022-3565 -- CVE-2022-3566 -- CVE-2022-3567 -- CVE-2022-3586 -- CVE-2022-3594 -- CVE-2022-3621 -- CVE-2022-3623 -- CVE-2022-3625 -- CVE-2022-3628 -- CVE-2022-3629 -- CVE-2022-3633 -- CVE-2022-3635 -- CVE-2022-3646 -- CVE-2022-3649 -- CVE-2022-36946 -- CVE-2022-39189 -- CVE-2022-39190 -- CVE-2022-39842 -- CVE-2022-40307 -- CVE-2022-40768 -- CVE-2022-41222 -- CVE-2022-41674 -- CVE-2022-42719 -- CVE-2022-42720 -- CVE-2022-42721 -- CVE-2022-42722 -- CVE-2022-42895 -- CVE-2022-42896 -- CVE-2022-43750 -- CVE-2022-4378 - -# 龙蜥社区第三方驱动 - -* 提供主流GPU在AnolisOS的Driver、CUDA、cuDNN安装测试与卸载指导文档:https://openanolis.cn/sig/AI_SIG/doc/721423765456666646 - -# 重要议题 - -- 调研并讨论了KABI机制的整体方案与实现细节。 -- 基于浪潮信息龙蜥联合实验室,讨论了关于整机硬件兼容性的相关事项,后续长期共建 AnolisOS 硬件兼容性标准和生态。 - -# 运营活动 - -- 无 diff --git "a/sig/T-One-copy/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" "b/sig/T-One-copy/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" deleted file mode 100644 index 30020428..00000000 --- "a/sig/T-One-copy/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" +++ /dev/null @@ -1,7 +0,0 @@ -- 每月的月初总结发出上月的报告,并更新到 SIG 页面,如 2022.12 - -- 月报包含内容: - + 整体进展:SIG 该月的亮点特性汇总。 - + 具体进展:SIG 该月项目的详细进展,分别展开细节。 - + 重要议题: SIG 该月讨论的重要议题。 - + 运营活动: SIG 该月发生的运营活动。 diff --git "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/000000000130_anolis.jpg" "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/000000000130_anolis.jpg" deleted file mode 100644 index 25e606c9c5d28fccaf9f6caa351e3720570e4162..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47154 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 diff --git "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" deleted file mode 100644 index 74f3dbc4..00000000 --- "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" +++ /dev/null @@ -1,30 +0,0 @@ -### T- One是什么 - T-One是一站式的自动化质量协作平台;打通了测试计划、测试准备、测试执行、测试分析、测试报告、覆盖率检测、智能Bisect,环境服务等流程的闭环,为社区研发提供一站式质量服务。 -​ - -### 平台架构 -![](assets/jiagou.jpeg) - -### 核心特点 -- 一站式质量平台:平台打通了测试准备、测试执行、测试分析、测试计划、测试报告、覆盖率检测、智能Bisect、智能巡检等流程全闭环,为社区研发提供一站式测试支撑。 - - 支持多CPU混合架构(x86、arm、loogarch、risc-v) - - 支持多操作系统类型(龙蜥OS、centos、debian等) - - 支持复杂环境测试(企业内网、独立隔离、弹性云虚拟机/容器、应用集群及多种混合环境) - -- 质量协作能力:通过分布式的业务架构和独立租户空间能力,支持多企业、多团队的质量协作模式。 -- 数据分析能力:平台提供了时序分析、对比分析,以及聚合生成测试报告的能力,在大量测试之后对数据进行分析以发现软件问题。 -- 开源软件包CI服务:社区开发者可以将自己的软件包(可来自代码托管平台如github/gitee/codeup等)注册到Testfarm, 平台会监控软件包的代码变更,一旦有变更则会立即触发测试,并将测试结果通知开发者,方便开源软件包引入。 -- 开发者资源服务:社区开发者可以reserve测试环境并登陆,方便在测试环境中进行测试及debug。 -- 缺陷定位诊断服务:对于发现的软件缺陷,平台可以提供了缺陷的自动化定位诊断能力,可以发现引入缺陷的commit地址。 - - -### 应用场景 -- 场景1:OS发布测试,每次AnolisOS的发布,社区测试团队会根据发布测试策略进行大规模测试,保障产品发布质量,外部用户可以在Testfarm查看发布测试数据。 -- 场景2:开源软件包CI,社区开发者可以将软件包注册到平台,平台会自动监控软件包的变更,一旦发生变更会立即进行测试并推送测试结果。 -- 场景3:自定义测试,社区开发者根据自己的需求可以在T-One平台进行在线测试,或者使用命令行测试。 -- 场景4:离线测试,对于网络不可达的测试环境,用户可以使用离线测试模式测试并上传数据。 -- 场景5:独立部署,外部用户也可以在自己环境下独立部署平台,测试并上传数据到Testfarm。 -- 场景6:登陆测试环境,社区开发者可以根据需要reserve测试环境登陆进行测试及debug。 -- 场景7:缺陷定位诊断,一旦测试出缺陷,平台会自动诊断缺陷引入的commit。 - - diff --git "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/Dingtalk_20240614165831.jpg" "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/Dingtalk_20240614165831.jpg" deleted file mode 100644 index 925bf2945891170613821e8e7dbc9e4206d17c8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6459 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

}E@Hj0_{W?|f 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

FG!grkAXdJNt$uIvKqhcJq z&+Ed1J8vY>_8{Fg5c<9FexfVv1a|A-3HPVumUvELTRMnOCTF3^tDOgg?v>EG_Ai3& z+*77Z7S(6V8ueIr)1YO(L?*-MFv%C3HXHjFMc7(Y)Kml(U)@!AO|C1? z^K~GL>qcF3wZmsWBy9()XihGz$o^;{Vr+)<4ycM#Bp% zs>98(vw5>jTjuwoth#~bjg{%I1tMiNVx?xMM!EFX!|-NIZiB^obSsz6c_fp2Ee{*6!?+IV(wWT$iPripV(D;B6K&%rp@}f=2hHTos7uo5ug`!}b91qOZ@_l2DcW0R8c{-&Fh7 zU?-0}omXI%W09OAfe=vTLmx0Yod#9qX2Rq`*sg)47O~)EgDsvz1t$ohMAO`eLyQs_ zk`w0}m+TSbGx4(5Il<5oqxUwOjIf1;4qk!eNfS{_-A&$DLJ z#cvos@wjI4lBHC0r3Q)js6Xw`QF6p;Hk!?G9lu9sJ67 zN;XqmHref|s{oGUTdTccmCJuwBS@R(Aqdn;IwC6-_pbnvAXv$+d1D*XIjc+={1$`N z@aUYGN0R-8SiVgsxk%j?ne%x>`&y=vl0%KN!SG&BF@-gbZa zDrIL)a7kxbEP8CV+OMyO-`&!f7{(;DY)CdAAn*A%jR*&xrneu`XgHUlRyptvd2dqr z{pAcKAK(&Cs`0+)tD;#uv8udImNX#OdjWJe{jvBWE743uOrHCHhbg+nr=SxX$u!Y_*5KqMc8&`Mk1 zH={0aB1|zOdO8ZPPsbgB%tH-zRbAtz!l)bRZs#Yb^#-x+KDXmd-x{m0rxCt`Yp_gS z;W_o%#shd?770J!*Z(YYrxtD383UnKR(Ka}&yOhAt%o{esce*sh@7vD`xC`gUwe%X zjn#$k_Srkn%ppEzk|a~Z=?6($^9x1(hDh|TMrDPc2nx`oPU%X-G$cKte> z7MkuEATclvW}`Ojf2){;^#UBCU@dlx={T`gjir)to?kExg5_zvBE}L}fL3^MlXWAt zB<`1<YInXd z7gu031%xSlVX=hHOf~C#5HUSWDq_>) z7$uqKLwBzQAOS297A|LOiC}oFIMx@;s})_1H75NWjx3$3}-&^_iLeKEm=sARLW*FWy9o)s3C@x4ZY ziuMygqUJPAI#g3e;@t7u{#*@p5+y|%`Uho_ce zxD*U+oXXUbM@C^OvK=>$S{!qsxkM{u#1yZ-jD_h`g7x?BQ(@Qgfvy%=ey{w+=klEp z&(ecp$1;-HlX@tA`KIsn0Fi!}-EWI0zW2Ppmk|yf1Ju6Sr;!C-<_jf((%2Zle%SSuBULEI6Qo(&}xL237|E>bXgqS{>kz z-`xI}j_>q);Q*Kk`6noVokwd zz<`B+x!Q|hzy!mFa?Sn8`BKR9`VTGSllv;2W-M_`v-@@N&CsUIyDeHZ)pBpuBHF)x z`kV&wO2w9A+o}O5po=PI`@E(VNAun1A?Z)3G5Oc~=h*lfrtdL+*0*dqFKY#S+ss;z zrjv+leth)k5o;A0{gPf^fK9;>_A5 z5`fKNGAzfxPt+?kLE#?oJ2QwJja0QiG9r&Aa_t3uJ5%v}-_HRk>pt80+s~LoOi^*1 zD{Ge>zS%+Ays0}G_%UfoJR^jOLu?-Cqk&Z5ahtqPTb3<&K#Cx8L3W5nFJ^+?1Mi9z z*%0kgz>&;o50w)h%@4V1@~2-~A0Zu$n&M<)$Oy62Pev!#Vd&}KCYe)veZY=0BULan zpbp13mUgtHd8PT>E5s|F{riH^8J3Oqkz!z*x}r|T#N!_j(Pm0C{QIk_v#J7#N5&|y zUS^K-h1sGs#!PD+*TO*6v?tr!h3a`X_8IRPA((J`uj9LGUKo;V3I=k!tFx1dz9^(e zRpr?>&h5W~n0q;@mj(XU*8MH1?|Oc4mE%2Stf+zC(j;mW^d54g>7sQ<4`{B zE`Uh>awLA-vQC7iZNp(G-)r30=hc_kahxz>`~aoUpBHwaF7L^-+sPq?mVb^;EHqTk z^~udk?XRiVQKK-Xs6Pj`2L03jiSvRYEAu}o^4yuv;W?+K%OkD|J5VLCZ&!9Tq*w`n z)volPcBp^r(O84~a-fdyX8%$9tslm(yOPTnVwmxqpa@siFXjqw)o1!%{htH zrEV{Sh^M%yn~Bfk7WrvWzC7of@0r*h&XJZ47IDT!=_hFhX`ZI_Qu6GVn8Sk0_93;u zQSRLuo|Ylg?yFmkJCx9e@z&rVYBLYpcXEKN;-AN$fuJ9dB)eTEQ60Yr)oh@}xR0sB z;dzc}`s$C+SQy9a0(-;K!by~&Cc2H+zIT+c_s1w@Zq$5ekAp+NYDg9M82OS!eDdi| zxlPuw=?9I*q<*-=zn6xf8ZWM3`^W&~g?o;khp4N}ce?o$)FgU2i;Pq_Oj^bwuhm0U zh=myKP&FZl5%GeYbV1XS_l00AVnH#_3er7o`>0H?na#`F1+@ef%ctQZQ9tR6&oHy6 z^~=eN&sibxb?pK3tn_q^O13Ir@SbqTX`Yya2?24(ZLk>Wu0iYSg~ zIQeHG%)WoPcQVvNz3RE+4Ka=23h09i@YMW%UlC~jtq9u=>lfqonua#6@^##!8PQ$^4`?p$ z>&7VrD1CoHdBe8RwjEi!$P#Bh&4ZM37?nHCPL+ge;aPU-jBE16l$7I$WS=*%@_mQS z#bOpztd&|b;T^ZGs4EQP_(ZF0Ds6x!X=p{lmbi5SxC%{6w3AxHhWLDweUOTM6fR^e z)*%w_c`Q)K_Bqqs4#wxzSQ|x_Bl{isQVq~d0x-qq!1Bb1>Qs%aWE+44npO9ZiPo^o z8kZgO*C*uf-R}@`T97?PJ@I!DuB$_Y({G)7MSJr7$CGJqT?suxb<3?zTrl+Q&jzv( ztvJwSk&7qwTvx7N6dZhzKQYBSSm>XrW{vfuBOHUc(=hfi{M-Du!TJg+Xo?H!`YI_M z5{a7(+%`73e#et97M7ETC*YGev{QcL60+5!trMF#J$4+61)T((F;rKY1z+xIml=i>lu!8`mAhaNB9 zTp?_Q`grs8G4L$uvT7lSg!(3JGuWPGiiHgmr$t~SPCcqENTtxi`uB|PxjW~g%F8w$ zvbuOpZ((gthJU%HR<#>vy~_-ii(gRv(9_G-n(kPyLkBMwoq}kM%71K`yI*{cSKtIz zxiv=;;`5m@fz8~2QL01T3RyifWZ0wtU2@#+e8uE4eaaAb|ICBh>aJIuN?3P%yC?#6 zREZ2tE4%;4q)2I=3(9XTAq8SGh{HM9P2q*#r6cacftYf;7(mK`s^&a!BvY>Z`Gkru zNQPuoDm>{jj3Ng{3J)v5$ODMrhI80P92kzX08OFeVrK;ZJPr0ToR~EL`}()N2GvMf*aKHQDv)4m%W0F zIGjoG!AfUBGWhw{NTyPm7Fh`fC}o=tRiJjM;3e*b_JZE0WKc-Qwx?%QFh^xFnuRLm zEy|M~Gq!ohT+FWh@=(OfToTA-h>a>@njC@Uea8r|*qi@_Wzh7p^I$m?g8)YDu7&OK zo4hgYHJyAF+&@d$qzqaA;O535RCsfY3&)^@U&5GRVWiMb&%xcq!qT6X#kVf&i)kX< zpC|8sBz`HFGCB9&pc%A%zFL;~PG+L0qwU95tKnrlgNxf~&MpP9WptTufFpA10ZiHE zf3v^WCjOmNA%{Rgc_foISP%BbK9dU4{u_egyN!#H-n5}v-;V&n3(WQS4TK)6oG@9Rwa3K3NUe1rO2td&M4|4`@Yr$ z5p{B|G)0C*l9C6my@QTWtm~$+3TyJ!$nj?D$Xzb!+B`<#ySJX=^!3G~j2MzsAh~~x zt&*p|k$O~F0kPKafb5Z|LIDk-sJp<-dEj|ZxjEw`JY=}I=lx;t%^Ypa#*cXgl5fNYQa#REAf0rsZlVj;14SCX`8ls{6$ZF3rmb z@+)5i8W>{*Aff*G4(a!{ov@HA7yD@Orw7I&m)))R)tBkrhjTSPvg00oi}voBm*csB zcQl)>`bin|{jF(BYVaF;+t}`KhD|DykAc|v&tP9{^TU^VTEd{qsHmyBX_m(t4-F{koQWgW2RpPee;Qi%uXoje^i^p&L zSYp2(@6iT$1Ib}x0Bmb*vzl;?058%-ZX~?W1xbN73@~C}ThXLgdNJnqn{a^r*-{;NOY_8fX7QL6<^hO6)h`E;tGA|PmMWgyZpgN|> zLTbm+dlXjWc)SI!5I-@yxW2f)G7D_ktRY}2-p%iMPhuNqtXfMpS+R@nyrfy7y>73l zX$!eHL2dKmrLy;ilw0oU?do1Z1*iu?$^;e0&{9ly-(kTp7GE?pz7 zLTsMJSrxgbNv^P0Me89Vc(G%j;YO>;`K6^U_YL3YS&u!QY@{0G%z#J)rdm{(We^7$ zPpF})s_oi0TsM4E!L%AH>#OeTcTU}9R)!w2xm;X7{gV?@)tzKbD<-a`z^3L{exr(! zf4HJEH)s@{cUf1z4ij?(6X_;A-NJ|9tEpl^tp5d&phBSVi)T6Gqr%zB(Py~`EA1lyc~I_}2l7r$k3crD`eJN+FS4kK5| zM!uvZRDQr;EX(vTi$P&mT*td84N(>(OsCtrOkUG$jyqwPj%&D1DHaI=T4dlZHIbaq zGPqNG#i$II?fvME#CHoVOU3-z>UPsmspZ}wa;}L7Kw_dICV(YJQu&Z)<_o3=At@Bo zZ~0g<`qbR}kt~Ifxc=~j$URo>-$v|-!3FG4=I3x!5cqa=5MxVtudB3#JPm5heaI%; z^c#1kyskQ5A~0#qN-M~q)M2RK%PVR+p0?cCoR7M>(>6X`9v(8uqk-ZwuxgDPK4`Wa zIuI1$0_KJXIR&ILNYCs@oM~s`Wi^v z3FnB;boIW0zvN&)s0|ckot5DT-iF)`B$>9JKrlL&C)LzW)LuNU4y%}7Kh&C1W^%K% z8xx>mh}Dz9KHTx2E7=H0lIpnnq+KFuEAR9dmg$pjWwQmO!S%nojZzF9!Vo-yw)Iyr z$FZupb=`y+M~t-HebR2YN`i=i7S2rHcXs-DG?T(9MG-UL%P0<`7LEkI5nQhr%BhX# zqpPQJp|rJ%#(}kMJ~&<2P>3Jr9lLDX0_>4(Z;o;oizlN}1Dz^s@e4xw;JM2bopSQB z&8E~=5&;V>>+-tD{Xuyy#~c(yT=H2U3K<2H3oWzy61*B>a0BSd7{|7 z)?a-ojm=%Ufl+;WDxE#h-BLcDSWti2X&GJiYkSE0cSwF& zmED6fhcx>pB>FO?BFI#q(8Bc)JLg{1Qd>c@%P$}xUuHd#+~fo7Da%vBy8$vSr`$&y zkQkG4xZ;9mzK=euIz2B_Tp??EK2RsDOb>q(W>(x|oThg4M*aaKWI*42`dKxca|LOm zaIa&F!NwE+$%Ia`>M05$ufC$)zoqT}_;d8y-SDV(K1q!zh@AxXgBiy&zR-nt?%Ssz zMSFOAhb9cL4Z)6A-BO1y574SK_WT;Wf7$m&6vTQqc@uzzB*#oH4%S|7xUV1gI|=y_ zLDV$P*LPkn_z!gd1Asw)zM;B{+U5-j*~S&;pMPOQa<+Iw%*)vrkRK4+L1>byX7d-!pFVwBaNXFh z`H@)TfO&>vnUyl(n2`4X`|SVwZ?m?}&h(gS`mq2E#z> zS>|rQY--U)fCB9|CI=s$UPT0f`8j9q`GtCI@_mwSv%|D$?|t_>XHK7iXO5pZ_QbD$ zU0Y7tY#h_?ql=%hOOFX%^t3U}^-nzcEHBEPcA9bE ztbYcVGtd0Bvw9&C1Wm#5HD~%-^xy+T+o@A`aG(T_8>>Yl*Cctck%-_lj_tRfa>5Cp z`PHw^Rw&G2sne&wh-At}YsTOk-}r{Wh6d|LO-b2Izv7!;`{F|nFV;P*G;M0Ez3Oi_ z{QT#qS#H$P)j^ljVNN^k3_a?=1NJ-l4={c#SoEMz&b=%5ncw~HcT~##_j|>sKmExhOY1yb@Ne2@pEzyy zO>a6}=|(}E1$p(W7kr-?6<&Z=z#}V7??HP3%w2OA?7Gu5w%h;tpHpJrJc|+QVgwZj zkz3n4PWarH=Fhv|&)2=-4MuL9{WB+g(S}sV9P=*opT9ZhY=TJgP49H%^q}<|JI*$t zJ$ZDuVn?=0F}1~wVa(X(70XNu^u}(hHae@RunKw5Oaw{@Bt#0*lLP@hnQuLT7<9Y@J?tYSdB z_o>HEKKYD!Fs4;YVvO#sEz9@X>)^h2uS@Oz_~W(@$+95LCy&P(U3cJ#zz_firbe(; z(&oVj9}MC7xY%g!@cap1fXs5?05*6hntbpfVCI#(K0{amgDknqJU{nT^-P#J!Tw|F zV^1Av2{f#?V5b@c+08ef;8z3d%%oKOF@?jC9Z}> z_Pp`Ekm=K>A9&zD^OZgO>|f2D6I&WcMaO1G0wfXOr>e3R=rk^rSjza}4TG#T7(aq!v>D8o3lPt6+ zpO7oe-aPqq?1B?sZ1PX@5;(9-^(j^JNtnGXg z40cRQ+IsHXdx>5kCS=8mWel=A&fGzZs|lqjw-l&5wxP2p<`S^Od+we4(T{#yAl|DJ zKs(lFRBUf=11d#OqDYT&V6j@TAOwj=9$3U6#iu~3t+t*ral)9aD1xXf#SERzb4^uR z5fdJjq0Z3*|Ls5iLn<8#EV(6%{=t3C=FFxs%`5?8GIao`0Y39Us8{-fH^VeH$H90JQcg&f0-+Y@z+DoOn zx|Yw4n6mo$&wqaXwb!x1n2<5|!nUDTu#@GibRn6$3;(ktTdp<%&`1bLm)*+>C&p(>N(^P!-gb)%0~{03@6mK9e3Oznc{dKO+4k4 zpPY5puP(aiBK5Z;*5Pl8B^)H(>Z(e{JXY}AZ@WV#rpkS|IG%~H@>Bt(_w)uU$AH!0 zkV6iU_78u!KyPYpjJa!9#Hr{rPD^X1E{Es7K-e;PB@o7JUU7{U1+-FvO7E$spTXcd zX|sv{{%;?*TDY&>H`nf`oONby_Zsbf#G68mfg}7NxBG3kN4p2?t3%y_x{As$sCnR& zmBj8)Z$Q+1g_roG$e4_xGa$vx$~ojnC@>2ssUQ_GD-u#dhP147pOk-x?I`N&Efjgk zR0+W)j)%bRy1Iz4j=r5bb*kc?e3Ek`@t}(2Q`yz$@h*py5Bt=U_?~1W2BiQSl#;Nq zYx{7U&zU%JER(Z3%UK0%ywHN@e9PyX@qP%qqX}jjz9d z-Xh_od8OZa>l}RnC$yAk_7zu2-qIQihaBjv+C=sQ(a1Q1kVNm>O?}V>T)ZwOa z%rWoTe*3Lw%{uTefBCEUa<-t3-A}pk8O1ev6wnf+qZ&4zYHkI@!tS@d?QQl<#vHsN zn`!;M_YTd94IO5%TP>pPsA@+Z`DW9-9i3f9RS|d!w1;1IFi)J2Mq_swVrPIq9Tbe^ zN(&@p*WGs8xwW;ETId;ghFKQK{QAJrw9az zo^aPZ^2oO`_?q%1lN@{OG5jQ!E^C1$F~zrlA}=H2nZ;+`hXfj(bVWl;%Qs}@G7k>D z5m-@y`M>dvZ+zR^k7DM)W5p-_=)&Imz!W_`$5mB{e)d8QaC+;mP~q;bTGCSb*`P41aZcXfmlj`R zL3WtY`Y0sQOzzqUk+q`-VgVftk)zdn!&(p9HI8S%T*<5)Su5>_KIJo?{*+Y~3l={7 zo8O%$txRm{U;=rsJ$BiB_g%jJ^{;>Sv!8!>@neHl6#})@;fKGT06|Z}uFa~+8M_NM z$P&v$m(G680{Wnt2vkXsbA-IUv&B}E-}k=v&74VRtGNA+Tdk3J=}VoDRAq))hqAll zVTT>eKt`4&Gns!L(^&th|M<^y&N-L#ysSO^i}WM7a_|5;j2jaMKl(sar#JkC%wRn8 z?6O$HonT1>u?7j`3@JjumDmKyo>c%DRnI+EhhqBSs99X2M}g`pD~ap1drRBqleg6F z(|4R<5B)p)+Wn=tSbw{}s#N#_5(i^UDPjI`NQzc9cN6OG(pi1Kk|@H$ye7@ zGla=XaX53|cJN_Ii40kJgEtcElS^BmuCmHv65o63si!I(KZeYt5H62;CW$=XOO2rp zNz5n(6c6i40gZy%+7~y|b|`Ef;JxpCS5k^%Rf6U2kmJG$p(TgE{`H42o6ehep9Zq} zAb3&I=kY~qTZ$e-s+nYScPU|m$-1dl>rS1z{j_OYZZZC@x%blpLGh474|~_U->&s3 zfIfyep)z$1;kjc`WlKvqIAqv=`qQ6gurM_(f9MifZACM%{_&5$he`TAe#rNMDR#Hr zKBKCq{oMJn5v93=nEdK$oF<2ISHNqpii{V~RL1S&?+k#27_5;D7^mnE7IY z`-@(*h0mOS|NXb!b_*75R;0P9!QCE%4?p~H%kpL0Z?~;dVBEd9Mv(&86lbf%k#N!Q z7<}gGXCHg)sjau#>{FjIc}4ak5AYJ% zM;|eN-hH><8Aon9QB$2|MJ88a9g0(rKA3=7@w(R?w%4A!FL>b5SpJZ9+2y+{j)V{{ zTddOmeuiWmtU2UW(zg(`iVs%Z{)dSD!o4NbUxTP@=RsM6GC53R*#Dvv8<`WRtcDN@BMh^e$!Puk#=i zcbUi`_ksM$3i2St2dX(KSu~gUIc*Rvb#HMz=d>~@uAwM^qzH&;89AA}Lh2J%`CDat zY6}s(^%G8B^~!zzjhUslB~4w-dkeWl9~5j@AFHbIu;LXeDB3 zm(RY^u6?+AG+cGx#$ukCnzbGKF8lQ1Z#XQX4sm%EF)J(i(7*Q3L$=&<(vl@Be*NoT zU-h@yJV31Q`ImqB*C|uBCM&=A#XEA+`TqC6V}+8cLaa})?Bd<;emnVo_SM(1j1bLz zpdQ8a_?9CMU%tE*ZYh&Jo!zv)@#C6*dFHRpW+NIRs1bzP99hlP*{)VuxIrs|O1h_W zY!jG={D2|8s|bE>3ao7RBi?%0p|iH!a^jMu%e4E|SA|c(jOjaS_sLsN>2LRnAAbM4 zsoguY`|#bA(U;XEQ-hc7pr@0JZ zq}tSFP(J+d!(kiO!r|%j$T?e&T<= zcM>4kut$Vrk3WuW`>}@~kDY5rQvIBqfq@VxEoQlcpRK z2bNC^8RC5O6Q7*C<+!V_x|XFm=6WiEVG0LYca;&QGVw>>d2T8fZ`YOrFaR*XAOp_` zZjVPK#~Ijk%x3Vc0RT(ZiI}eT&Yll`@EAIbW|Bnfm}Szkzzl>fZSCx8!gt?ww-;@< zjm>Pg+h!}PDmL3}ydm0F5DOPQO6_6LoHuVCVfq8d9`jGH*c*y4Qew1(PPJx<ohD)1aS}I@@O&xrQIqkfnY2Li~tiw)%*=^U|zWBv2e(5V; z7J*NuZ&Y#lceI9~S#seRxzFEjn<)z2Y32+cK_vgshdyB2kvVhjJO6?|u--0R@^k`c zH{87Z+c06{x)X-S0X4@WTv{!9Xf1IK-ZO()aF~bFWoiq}+f(C|JR5 zYAXXj!EAyB#RXLR?z?YiXOE4VMT0afOFo(&<1#r+VAc`*6lly%+%LqBl*39zsJW?m zn{Bp{VU6uZyLxW9Y zojQ2-_Jw+_MYjxQlrI}GS`|ZNgtR!Yj2SW)=}$P$Hb|YWR9D!oh|R}Z+S`ooecRSl zI)N>sh%8M!Cl6h-c>-nS9+_2z#Vf9Kx>`KMOkJW+{9vkMAE{xkuBoq6ihjs-x!rqL z3@u?cpfqNPrmcsK4VE5ND<&06W=(s$(hM!6tEgz}>`=+5l0m|5zurc_j=hG$RF+<~ zcgBQ_uHua)L*7PYJ~~7b6szp3JQkpKibgS4?hNq|`^?HMRV^)0Zi~IyBYAv$x=KCA zul(HiVx9j`XXTMmWcf%bznH2w&j@x==b&K19#X`=98KEvDe)_XgR8gb8IzdWCP&*S zcU&eD3Wrk3Tn8bJhO(lD+z`)k&SVd{!NV>)?PT!YW#<{3Xa0P_MJ%$U6En1|chR^N zl_qRY`rZ$S2#vM8Uc1t_MY|37I_FwwwI`l=X3jnLDA(Wt7>P>3D?KRJecP#1+gP2) zj<2Z-69#DjyZ2xW2q0Be8Q1wgIAW-|sc!M(PoMgWUlGKq^i^gAt84CG@W3_KU2lW< zU3T5^-uo7EiR4!-IevQS>?>>P8m-VEkTf*a9y)9PrB6S>k3ya`wKaeI{r{(vSfb4! zKpI*6)YE(HwfhxUTyy@PV{Y6fQbsAy;an3HMkSwVdsSAzhNcF4RK^fwQAcN6MQzA2 z&$kQu0)PXrup`o?6F#f-=Yj7x;BWLBwB5IvJgKkUo9n1mXPnX3?gmkuwAAjq?z-cB z1Ka&_3pI1QJ5l|0haL3HQ%};^mD1VX{mrj`&8uB@nPFuSzO|iYx0My&{Pwq>S+WG= zNG6&dYvSZ{{q@%y(GB?k3B7y_-u&h_Pv7B1>|I2FhK4vdg)Nr{gDF8i$a}wJ&tr}` zW~<4YU4F&Y#8VvG)@${glxi!lyZV|bTTXt(%lA$!)3i#(?8~oOvXoOj<-e|lV?#|G zW2t1`aB1_)JoykUgQ@DL+=gtDR@YGX>I3)Rf8V{Yz3#>z{Ld-IgWOQDvM9{k(bT>j zMq|5qqh_qULR+k@tP~Kf-6yatUtR*e@3J`a@sG8Yo+ zwL0gp@#$w`CkdS^&b+F39$;HjqtoP;nb81`SRc{vCgY*Du3oecee7e~Pv5?+tK!sO zoJkt^>CaBHX~c{jr+w~oUm(`cyZ0W|(-&eVC%R&1%;{N3Y{M$*W!j!60LX`qH9_~e z;<~^4cJ|jqqDK0vEvc@&`i8w<`U(rL}+S~To=jA+Sk38yav#gZT8P|GlBU z_S2vKFJ6?FUV14uQXNta0#Le4B*cDl#GNfRn}`amT6|R~NY8 z$qjWijr9%NZnG_+ohkOrvwq#bv^e?{JB!Yh`-{(yLEbu5GZ>Yz4=M`>sK4dtcj^vo zF(TwKOF|Es0|*>&t?%|N$)&JJl%^3;gn9#J`CqQiV1xgFiazJhwNTrhGr!_xL4oHx z1^QX`^Rk}CR6}agrrb%N6)$?xw(oxTdr7p*mbIOKf$4`!9((K&I!@wi5mOS}4I?vm zL7Dm3M?aXk*r4Bsqb*t5#vdJLuCK3KvSiuVv1W|rfJ@?aR+sV2E}El!k{E1Loa^oNCj>)OXZOuF-|}7WI{MjXW0zrdrViN0 zuZ>``$y^Lx{X)dXu5)Vl@YMmB)b5+$bdv}llar-uyM?p(RF`|_4$zkkW_$S$$ACggV#WPNOp~7lONT?Ew7pm+dw8 z?s+zLf>PmR*bsB$5Vk4{k~vJi_Rz!L^B%jQR@`{Q&E#OE&?LE(GlVN823XdiB;NJ6 zNz}xCs{|byf@f<@k38}%bhaP;=*RtW2L4rlx#f;2A&82h&$8kTj9UC&HwtJz0x>0= z@hcSjt}Y^DqJL}(>H*WhJY4~*?l><5AG1M-n3kXAcJV4lkON87ek3QH@SiO$-PrGC zmtBU_YC%>iE;+Mi%}NfvxF3djn@JK=YKpdQ&2pVr@Beah6rcb6=i1xDTbrW_km5_8 z!Br9A>{AolPB_NMHt=wpn1AqMMI3wVvHR}(G9Wwk)YG|Ws=s+c6JnqJ?5AhUnEJI7 zzi|6)cbV(6)0j(rB%y^Ka>#+SM{+P8?jY~kvu9fjZ#kUgJyo$<&y{H`=O9E+FA`0f z@R^-=-hqg3QqEgZHrs5o2Nv7B`h|7Hd_r{Fe3ewY{($xSm&T$1B=-OSSnGcK?Z-WJ z+_=V;*3Q#TI}H>``_t0i<~(rCf9|~V%+}T}8|i685dGQD&iKFwj?uXMP+ZVx^#N2s ztW6Dm^n)LGp!`gpJc%x(#ozIcquAHP@eJw^r~+?(^P89|0)fdp9bDC<-X6Ts?%`Br zX@)>qsV7bgS9*aXpbmP~%Xivoy3G!(r9AcnAJCu9JMT}{D4BmtSGbg`r1-5J?SS{v zJ$8KQOZU_@KJu{-9r&6{)HBM>Aorj?%a^a1G@;pa@CW@b^%-;NzWG3NA4ALz4HVagPUWnX>m z^|#-7=Od3;Ag3s95gc?)6`OgjU%I^Ix*Kk~;ij9YY8ZMl%XKw0jUmE@uv=gE>H`kq z%l_v-U9kA^N3CBn!(f#>6B!4L=CR|fqE^sdbMN`oe}9Imwq*GdI}>(U-QyU%Uu#+&Bcc+>UCghdLs3_E-_Vo_dC z#RV5#`rF@}XGX4NMO$5cts}g`=c%~XiUNjS!zWM~$c?fFMbis6-*m&WrFPr1Dy-VQ zQM)@SsHL5w9CKFY=qOp>(c0em{U7{D zZY!3z?(*WD=G-~gL_n-Fo{S+BAH7O$9gBamTe11K?+0aRqgbdt`lW zy=@_=a4}6*Q3aMKeEw?-7TgcUN{15FAte~{TU%F%?CbvW*GsmTywy!N-N0Bt+&6s< zOxES+QDt#OjYwu=+;L)_meYhL=}B^yBE*Uq`z?h?XB}KUTF$$xrv^n%(NwyB@|@9DPSGL_+q$=#es~`fRINV!9b8f}V5;@|-*F{O-v=v`E;VK6~u>;@$Ur zF)ierbI)TAlh2 zx2e%n4YN!`lc!99x^JCyQfoev z%08<+y1OfGxbY_XA+C=9z(Ce>tXY^gZQIm+_}FxqlH{0B%ST8Y#gS`PB`HNF)clP<*W8V@+Y5MqAQ_>BLvV&WVL$u;m7&-Fp=ov z%pBB6lYV3goOI_MXK>Lpcc;!)xl=(iUtPU5OUNJfhV9P~lvcA8hvt_5^~YMbziXkk zty_Ub>Vg8JN&!Pq?ux^=6(j>&?$IT7J*stDhs5vIkrv6 ziniEjySt)^qlk|&aZy2Y6pdrO&HH#ecXrwgQ;0KamFK&=D)?uHBL@}E7)BYxnpd>7 z+N6hPkpeh45unfbP*hhP+plK~UvkMM9#l`Zz~9i&=m8W>K79Gh zUp2tPEv#zF9Dl-uN$Ci9ONMKK$MAo~>A$Q6!rm&$>+2ffHqF|Fy*VdLgKow`pCsT& zI+4#h^VbA#*FE>#C#Hv?@J0?Zd8mh)fl;w6Fl~5rjYf$jS!k$l9gRZPHV=d)@S(E| z@G&seC{T)nx#Mz)i-s{m1ekG5r1>$6Gnx6{_x|@f?d^seZ!-<6HE|(vqD_;ePbOm6(*?AUnh zd3g=|kYQCarp*T$RyHJ)1rn&BdzfKc^31cdXV2yZpfxp3#+&BbW6#~~c{^#+#GC$p z>-iU4ICsunRBmg)Y&~b7!$|4p3m;hYAD{g9haY|9muLLq{sr@+X=|Om-OZ22o@B5w zb?VfsufFNkuip0?-#8ib0bRJw^Raj#1lnXS@Q|!>9w3CJVEgU2#q>}Tkb*h$r>%%C zqi*8hrHl?LKc;!?pZ|QJ89Zwr#!ob@7p6U&5DyOsrXx>eVzIe7w{Lv=TW>%59cP?z zhI8aaLxIRP&FMMRmR9o`r z35CtdV|N0mJB7_#tdA7Z(-YoY)I1|Jh8TiK;;=a5poI~*t$QbNiix|4%sGPOD%UJ$ zxJzj2ikc*vpY~%=C_dZR7)qmA2s!xaA-j91B#tS*LgUDoV49UR^|hYcu-6V^FlJ!V z1*`5|-qlu9YkQq)Mn@04->k{!so_(kveT()8TlJLNLmfm;p4>I-OEVWTiIbIM1v9N z9kgxd;)bS>fa#XuMP5-;-{2egzp!>upu3AOWV_St?S?XH!@A2W75fGH?L(Q31{_Shua z#!0^3?v#wS5;#%NJc(_uSs5H?$@I&5VM=z{^5s^Ez#*hVT)a)2ktBS^PJoKwDC=i7 zaOfR?04FUgT5IcKcc_+jTR^4L1FLGm@?P#s6sclV%VyRnGW3%+Dz^8xaZFz{f zvEQ$$LO54#LmKE)fJof09zWSAEQ+IF-&!kD4 zLr86v(|tm3w4(@x&HTW^g$sEKm@%L|&YU^Z!*70b4{07kz*ub)zYT*LK;~X42?N&l z(|1q-dL}-d%>lL_Yia9P-r`i)9xfP4vEd0;XqwloMeP8cC05Eu6Ux(lMQfY$$LGww z+p;AmebF$VZ|$p+t6l@JnqLmYaJHso5jv#O0iaDnevVU)^;HWRonIUT90+{brI*jX z?23-|)(k}qDw-zt506p)&_fRU`%O2SDdkh$X)AvlP6lFCJlI8hdmA<8jyZF=tN6~R zo_IpzIpcR3w#K2+7IwY8-~ImgU|<28k?Iejk60d9tfPYKZ`6WSM`k{ zhtTE>#1B09&`IAp*??|8RjfOXVoS?982)^9>PnqVl`YP8uc&j9WttdJ=!Y#vA=eCRJ?y>vjie<|bDmP@*3*6&N(}T);&aGJvk@bydW6|IeXCHjj z$iD&j>w7o+KkG$p8-DRc%z^^zOo8Z?*;25ktor+J=FlOXtZy#8rW&pG9uFc+WI;A* zQ(-;D-7urzlIZ{m3{iwU+~RtYcxCvR@*$U^aKX&L8o<-N6r*j+(N3E4foDR{6% zh^+j~ujD2lAL#Raoyc-fC2w;aLb`ltXg-8s;j8^rD?73=;>8eRxbQoaL>i-~P3!7M z>Bh$ApzThx)@r%kDaINF@wGK<4At%$vDEGv44PY@hLc>&YGN&<-Ah*oC91huhH_R` zXy9S3h!HweG?HivkExI}PJ1h7zrY6S06xThT)7fBoGq-w6Bny93(uLTy3*CLz<7hf5AdRb*@QQ~D;02Oyi+mxs|g~g zjLPTc5mJsc&$*KME)M@<6K(`_#m0JE84o1+Mq#HEHxafc%K!GP6p z{`~p#=9%0>L@!-6+$lwtiMJWs!BiU>pgJD%K9E@I}!P~o)jdt7`FvFcYu^|{LgMh^_yj!^16nPXB7@Pw9@x911WBscsgpi*?gzCR^kC4(!_{`zi#?~Ka z<=@n&NP(l@saBRT@+X!p42Z)aPGoZh3=7M{iSQ$QoK%1(CWa`yjbPztdKK&Au`mU? z2h$yBQS7S<#%&LhoJ#({m6cy9MOH-bh+|XQ>R82u zM|+Det7NpWbM1OM8=LA|+Zc#j)L*!RwtN@o1Y2b(ICK6497&%)7u*g@T!B{Ok#1!BG83PgJ+&=0?brN_?rr_b})M|FZH$J^@O7jxHvxhe6|SDuKhZmu9t+ir|> z@`{S(E%8iKB8!rPwIe2D#4%x;@FPV?sM+Y&*w|o!G3yvbi@AvkW#7n{C{8l*b*g5Y$>|0~x@yzdW**DW zx3$58&6fBk{{~DWmLL~WL7xneHirn;jFskE3B67%Bc)j1cn+<_v5?`aYG|vWHSt{t zcM`4D?>z`pqQ%L>bq!p^K_&4PMk~j=#~D$s#J+;103n!g(FG!TP>ia$Dp)sLXaBI4 za3!p)Hv1a>icUKX#;CM-PB~OkhZF?Eimz{M0!4}wU&!1A6r^a=TnHFzF44;FVKHsn zrXQKU(@AK9B4ghU&a|DcrR?6iasybssVtwP141+Qi|=KFoplq!c|*ubzN!kQ$u7rk z8|~uj{EoLNn*QZ&zQ>oQGv8Xx^*MSjc1jC_OK8Go{BoYT2J$JB2qWM1dBJCpX+2+g zs2hz!Qls`uB$+ttn?$2g?IMp&i2@~D#lzZSH)R5@eTaR2eScP&NOu?(o@_wHa6J<- z6DN(++w4Uq#FAg~N9Jp3ViF#{yY#`Y0*oK6;EAq})EtJttt zPH;{$=y9HVEp0T8%@n<}%QwswX$8Ajbo^DX6Y7P9YK)kVuj`p;ji=g-YwL zL?L2U@pen$k~;(_G{e>y4oLGpin6LEsgyq5QvR}4ag`@H=bF2hE_u5AbS_ay!@a(@ zyS}NB5||GeD#hHiAChhs3~V*QVSTG=<#fx`jv*7*0E0kKt-Ce~=kTiVCJl*n?>%I@F|2tG&Ttmn9k9O&pfel5G?gnPD@O;@-WkhwsDCT9fnR-$ub%ea#CL6 zGcC#?(T4cgL$UGTLn$X7e40RdORl(cuezKi6-frWzkQiiA;msz`N8p>6598_4T1aVz1wzq3~()8%^0m z^utVCLK3#AHj?0w0po}O%%Ls!R)${Wt#J38#Pi1Dr7Zfy6Dt-~CZQz#34Rhk^Ie1l zY%}&D=8|H~7`XE;^P+Uc3_>_#5Tj#BWc-M2DIrgk_~i7^7hQ6~svpQ8Pp`5JjUC5S z19H{X$0kilpo|_x?B)?*AH2vdc1(>0pYn`C`)bQ@5-;-=1x8+`maXvY`vgCOX_&iH zM@E*Iw{a)@%Sp^&o}ueOng6O%NX|!g5tj2z-XEWM= zeOJmdx%qhP`>7_mZbH!9fTqVqJ*(~W5ir!kzDJA1N9cyp;sLo7F2q-*4KsrX2AY&@ zE=y!3qEeLWo^hTvJ&VOm{pmIMnb|BYuH6$ROAjd%HQ^5#qf%``kpd$t)yoA1O4K`n zMMw%%o@g<3rbnQEY~>m&pi|t)ijyQhBY@_XBll55wyDm2)lRuZ{nJAf>P7x270wmY z&;oP)(}(&MSNU@eS+94kfcRztS=+n2V$0C1WR7m3BUal66c7C_t)+f88Zi4=S8riJ zcCZQP#edQB0jIbZ6c{lDGIPzke=sUN7vOqhHF;x$eY!)m%}cNv8)HW!W7q(Q=AV%$ zMC7ok+xQD&>2G11iQexOV*|brrcn39ZZ;xr6+QfazHg*d9e(CHrbh5EtUG2N%vB2w z`;PAB#fE<$e$HaT%*g38QhE*&AJvncn-FrQCHqK z4&FvO!VVvwYzhgVAgO(V`(|F6fE~;=|BNT($bwb=u~F`QlPVjf>_H2~99;Q6XoQu4 zP&nc%F}MWk4DB`DM_jGiDtYGgblr^WxdDrNL4lD|AX%OIfF0H(sG_{tVyLl!ZHU6=tXoU5n;T-= z1Mybp^*M1Edt#T14wA+AapR6W;)tcomeJo@J9wZlG5bGwB&=rK=KD(aGxD0RZQ4*8 zM-{>gc)_iwO#*UmH1xRyn{XRUgFZn z=bz_M^OP+&b5sL4*j@$Z)3Pa!`IC5&@EO}7Bz(RJFNM#R=NUfZeBzPea|A7$F)*V1 zogXlw_A zjJK{r(XwyRFUnxI^2I9sW%c4$3(5F2!Vh|_9=v+Upb6JH(6%w4g*RHf&5a*EU3rvW zEl&jSubg_TMHwPs#A;iqKa?^|T_C7okqkR>bAyBMTDV=!giMCQ^P=U&dYS2oNlPei3YBT;MyvZiZQ zkT6EmWQTh%jR^fB8k(%U*4?0#{n=LLxTdF7za__hE((PCa)f4@(TWdCr4c`QO+-!X zEn9Ds!tm1$e;MO`LqqHYYo`n$0O=~H0a+A}9n;jn`_J-h>{cv(>Di=~423II*woY4 z@AvkVST-Lu2nKv-AJ54n(UAOS5WZCY@xyrbwaMfgysp0{D-CUl+pp4#6CMWUo9Px( zQ#fy~dLLRXQS|E9AYZfwDd@S{YY;>5dd72oT`b;fcZO{^jo3&awly}mul}X$5;9`7 zjkl_~iNJn;4~Yr4s*3UB#w=a(jCwjuy{fX_Ty~tDTUX!R8%M1VLcZZy){C_N;1pOD z+@&rW`WOL%T-#7zYemqQ=0=>H=|%XeN&0?4YjRGj!R75jw`7SG8WmCzIXFdH+$$-> zrj-oAwl*qmOAK_FHuRD9uaV|Ig7||He4BDR?)UtG((ndP$Cm^C5c(-BaylRkV3=Rz5749_Qgj#O=1-%Z~yY7Dcds7~e~ zxnAUrfmdQ5S)vFL*ZP<;fo5PS{fSq~;+x7yw5E6oIOi$8CmHOiwU;PfA^V}|E z{qg(MHmRs>{ejQxzeC{@I|W5=nGE0)_A)*p5K3L_3zm4R9!*~o7)fb|e~+}z zu8LZj;_17WkP+H&LLoX4=+@%?+%+HMt#4SxjNVs)5`6}ktZewZfm<+9dR5E>_05*W zhA?)|Ku|LS#7kZ=F02*j9MJ1Za&GbRdw=W4j#UYtF=G|1hfor=N*d9y?unnpSLAP5<2_S==BDI61SSfUdPg~K z{$rb!6H=i`Iz4Q5n&m?SYI2x|8q>!~na^({s zeMN#rG|&LVrVR6fr-%~L;&WZAybXn+Dvl5s{x!nt4?p8I$ArBcDSW+kSX5E>HcWR) z!$@}yDIg#r4bt76L!)$;lyrBebl1?`(ug#Y0s;yW-$9>WeD8I=?{)qXXXfm^_S$Q& zz2d%Sbo#6$cG4_=+cR&?%f4sQ{Wgn8Ts5*t6hp>+Q`XXXUB{4nWbKZz8tL$7_}7sC z%0iZ{@>x}DZ;l4P7}=832o$y!K$Dd$wva>hd47xIQM1g< z-|5_p{KQBHAyQVc$=^x({hutjmzT)jMAX=OW!va`v~jrMY=KPVJ09M_VI zD|FEA^o@BN9jEFtH;FgO>w5FCR;A2giJoNijoa1NSId`=IUfs@LxR6pmH7pF9jVEMxk$fWsa#zEUO(qG;z2 zIlKwq=`R%l24xPsii&2?Pi3$%;1!ClAC6eP+k+PvS#+cDa^b3LNappueuTDb)`?y) z!=TfX@G0!&yf4WnsO}{kN5`2fL|iVR2Ploan(Z${PGPnPbPz;r{Idg}*XW~flb3FE2bjEwr(o9R!+MamawUkH!_?kvUk9+XTn0c7?$YHb(29MR z^`=W2H7Z}#KBbUJXvL89gh>=Hs8xH*3}I95Rh{<}pLsI!#QYqC7jRwwP0v3-+dp2? zGXgdAy4f^+B7NmBvGeJTp_U$mh>;sD_K8aGLup%9(YveCb+Esdw3*Iv4N^-Lef4n0 zY@FH|y!5DsUHxTsQ+M#9Wtm^R_YAY+IFs_t>4PuCLMNDzhZ5%-36APxLrCN$^!l#q z?R`U=!1{;bXiPOYEkl0LS8?g8W|bkAmo6IWQzikJ3o*nvqh=?qX)`i{ddd@PDm541 z{ruzC=;Z=o4BKV;cfVGBL_Lq|K{+2_^3CS=Yqz>3E?nvm`ruyOIG0RKgpG)}7!S91 z{__Ox-3JAsLY~k;%oYVvECTkOh9Rc*WW}cI!092l+~egJl9#=VFdlR_Y5Dw&B8Xw| z=2=V{vnyYzP?6B4i*1ozwgya`NnL+=CDpfy2=%@4CW+zp~P~UaDO}Q^Gaos9k-hR6@)-0!6zK>*e z!W18+%SA&T)LI4TurUaSW*CsmS%WH)K)Ft=^{=tcNSR%54V8_nnP6H?$-b@fw!kExJ?6e1!+OBw7H;21+hH z5|=WSrVMIXq3WVwIiy0h;_d$aoou;$61kjnWH?aABN_PO=2GH}pcpD9&onrSVF1Db z%(j?~20|<~q8!eorzHq3KlfI{G8s`sI(}bLv%eIY_j@9+(u#VWQOSCrTNVY$j4N_b zJU!l$7M=C?(NPhL_+l)aD5AUQ9-NRzgAvwmi%CUe)JhURIi`H|-KvWCoCXfBz=`^i#2+mG1&}DP9=*m?ztk`LU^;{r;e{lL*8u+8IG!tDIlV6Jb z$fS-x4Q9t%#!o*%Is`SqT;t(tlj3!-Dx$lDR^+W{aJ<8YR2}HR=(y~$;j9vwS|eIh zwL+Fmo)^l>#xI#*3<3^<6rkgbh|NCLX8Xmvg?Y_;o$6nL$J$c8beU*}na&UqrJ~^W zh{rus8g>@GrHoDDu=S)G5&+xr`R~>sm7KkiiD?=+!?(a50HI-oPQN%{9X9l1r{i2a zz$uWG#lPW`R`&8--BK@!P*XOBLF7u&L{5mqiTp#<_$R$a)#XjGI}yXTh75)vC#RRp z2dY?u5@Lbw`JzbXa5fam^41f}EEXc0R!lxI*o7s{dkHSWa!o2<=YEn_s=j4p1p5H* zWQil=NmRXu#g*F%E@6g4N2@|d%p2#0aS66$)WxE}X~P$>uAr{XgSIPE&a^R$AVWE< z0D;W0U<-tZ+UHaYO|`3+$ml5>$KVHa`B+p>G|9V4y3^~VAaF|G5ApBvHK?wxLhah!E?L) zti=(U%6V@CCompZFZ!d~T^LiGw8_&FlP;OafhEHRCZJ@IJd>8MCtj|lBZ`{)7 zpie=-et92W0L_DuZ`B)YVUcDjRbYCzc+nZ8x^%=ju0}8on8Z*xn3P1T-^rri^RH|T zE>qw0EHqyV?!~H**T)jDB>*w5Bsja6I*eJdpR9mfq6rblOf>s!52;dB$xGGG@&b!n zp2e+_FDfu0SIa7#6iJLjt?^D9ZTgM;1@b*>=wHJd3rC_-xl@6!8dPwPxbGBLj2Z{( zeqT&f4h)|cF#uf1`E5xsSG8|eeN8T%5YP=YG< z(ZJ~#$=iZ;K#!9%&#QX4BD2u{`?I2AfkANp^JT#5DVIU)6x*py{{R1xm-nAf@*yCi zH9;hl+ZYS~>reml=D(i-Hjy|)&u)$Y_5bpkS}I21C1gQkk|h80=Kp@d^RH>!q2b%E z=_Y=b(FW%8e~j_(A27uNw_yS>#r6uKgW&p0M3o|S9F#sDbmM`v#*6CnyVKF( zIsC2ZkMvo#2W=hRt+s3EpEL)F2!I7T_sJ8@Zx*J|%`XF#;02;)3to7hvX0lA`fyhB zs+@xn7ba7pzYDo}s}vYN(J;8w*wUi9R%V`^ovqIG)8?yimqi04d4K!9s=AtYP0C*$ z&!L~XU&fBBN+C+-S)lj*YI$)7k6TpAIR8s{_d6;9q*7LP5X`;mwl)E!D)$f98UEb; z`=z2aZ*d^M1=rq?Q$=yG15-7ISIJ9*tcixOM>0K|>@t1GM?J?qCsq!dZua6+gEgBD z_ZpvgVEoUzv&fA&cDv;SBK2Uo{si!tire7Z}Z;n+}UH(F>v2mbP z=qX>MSZK=W2&^t5>GALDNUC{RJs3V(_s?(sU*qkhWHOeE@v`KaT;k>By&cq<({0Yl zLBsY#yOKkged{OoBL8>U^ZWUz(C`}|naXAa8V}NWqRmA~Ye3Re=kZENYq4W)wf+t* zvNKpmpjb1vki}n5=s&^@l?hz%JRGYzsmAEm)zC@)Kv(A#<1l1VUtRsM?&@ctvH}pT zO26Xyf^KhLw!_V&+p1WSP0KRQe?A7e@o&7d`M`?CV7-jeM?$H&MZT-N}JGbtpcsPy}S{kG93iRp@3H9x$(vu_nA}NY$)2qb1aj!3;a>VM?)+y zMk!E(bzqdcRIj++Yaf(7UzI!%A}u zE|&|VP9;?h3@Wh*8-V@e(6zAp5pQ@+s=mEMwW8BX_MM@DPO?9e(H_t>xmjGQHCX*` zr@%9v4|4e7BKN6wQZ|^-!<$vz{An}A`F(VJ>?~N$ItsC|>D{@UUbtj}d*1)V1Zd`V zXL6YiXU=DYx-%>F5w)h0b`okdY!0%=kqpm_!9el#(@F>S@3AOb=gmwI{K)oG*+s|K1Of^`)tx%Z0A=)YgU@;qmKz^;ee%txE zKVP@sigYldyK37s=8G-FUt`xhL{>EoKK@bJn4GvruQ69C+yx$Jfek~_D?AW+EBlx$ z5C=T9aqvSnSE!jWh6NJ*?V*~eEDlub1>KxlYo^P{G|1>gs1k*2k+eM)Smsy?gvbRu zjzWJ#_&<%iM5QP3)alvTI@q-D?e{$VLd^9$sbj$4udATSO?98Z z+TyBei6udd37_&|<<&2ed;8|w`F8*_wIbgJ6kNtBP%Gw}?Z~1NSVWbWApjQU#{u$} zeE4kpln{l6>N@4XC<1HKa!#Q?+{j$WB{}e;_GHAw_j7hlLynWxw?~!!m&qJPt7@{Y z+#upp9*jo3cS3%-zBe|X7l|ETv_rj)fHGBcVAjCA)v#(Sh;1HZqf+{Q*p&Qf>FGG^ zL+5b2GozgJS|MNIn#ukAsD)8e4Y5HlURqRbIK^PdcAJ}e?XWawI<3OBAtcce=AV%w zl$Z=i92_H{+_G{+p246#qpkkQrg>I#ZpKtLodhd|v14~g`jsZ1fY7suocU+$Z<-g) zUz@+=?{1{mul)h#YfAEJ{{w&`a6ADFZ9LXxgwnf{rB|%qU9{YbS93LYS9No{zI6kj zls@um)zyl4e4S>Z6jdebJ)#zzkvI^8;v32lj%!`@sfc5MW@;w^m$0S*!V(-RH_M=5h%&V2})sDgzlLD2) z?i>FKwb1K5N6tq)V*f> zW|ZBUZm=)94;>o~Y-C;ZC^Yj~nX6V9y<+CQzR`RH*4bwZ-KZ1j`O&H62_7r;#s3s%tL=0Q#Rb2R`~phlq`5m z%S?m#^N^LrHKVqh)noRy-GuIq$TiBZHk$0E3(bqMSn%kRLW=b~8oa8Odd@M*T(=d; zJfS{Um4=?1fyiiX%ru!0c|%?Si{~l29YDWZl2t&MtilXD_mWc$Zg|@{u>!72>^`iq z7R_d{doqU!qH8#D2HAer5br3lV_1_mrIaO4V5 zD+a6(2*I@JathY`qGD?uqwk9bNR|1&4P?WQ6SX|6zx9zY6G!vzWU3rfJyUO7V~sjf zK6$_7Gor82-B_ysMbvSW%~uyCBVAO-iXwTryUIh1BN-w*K6TMmIQ43gUv1MslWQRz zv)0^9Q4?Eso@=*6RU;w^r?yUODAxwj*L!ZRTu{PaYYH~tSAJR6D)jn>bqJC6VWBm; z$a3%`2%Y0@p~i1vMSxq;y{TyDuGnOaEVl~O?Je8X-ke&u^tH?Q*VhmJr?L#%<*sbS z610$Fa}bsxtj2Os@uKOEyTts-i*)$sCu%g%zL|}_kV|_Xn&d=z(h^!`2XEucW}vaC zZz90^>gjk(+CKVz`1HeanZ4F0i&ur1!ASBDi(Fz-v)kx$OAnKBOyV_#1h(eoZ2+=s zXXtpsr1tvyI`!o!<2$$7hsbp^c_qFzLQTn=XNzBD403u%P^xR9%eFN06#Qgldvsj0 z@!<&`Xhs<7q40CNIa&GowJVhRR36*v;nX7AcWktksqqAvAcc*dw zot}S}`*?J7-&+MW)BSIE$hu!Uvk$s*vdT%QpKTo+XvA_2AuU;q8<{=|eh_Y{kNvCN zvZJL-B|I}ME8qsK8iSx9rEN&{!H`kw35S zH{trGLdMBtH`|wss9f2wiN8jcI1zruo-C19fZEkqP5^pVZ%rR1RaxG{HM2M;xOu#i zysGs1&tY+@Pg9FORJQqsBzrS^Dz50uy6w3MG=2zJ_vn3UKEm%X+#6Z7sVc{!HT_q} z6!)EhfhD$(b6Q^-*g~ptlYi>K0)t$YLl<1Z>)Xm$J}$SXc98AA6Y~nI)wD(b?CiK$ zs9ZU+Zm_A7?NB5EHJLe~2t9Yq0xkXQeWJO)qmjIwP3p@JUh|n7Fi?8gqowzgMIm~G zXGUqtQY8GqssQVvj%D5eQE%RbP6S#Ez|tq;hD{mzjS|~Iu0Q7GJa)@>yBxYN8Cd0- zJKp)sC`8#S+Pq&D%;K;vHTzYk5i-Mn1&Xq8-)c#hVS;uxj6e6S^pdy{%6(Nc4F!W z4stGJ(?EGEM;KUluH}h|=Ef_{406w1TrwKRu4_$Xx{#Kp4<*Yf3Gz=d#Iy+5Y4S3J zw-d+W)bn3lKD3BQwKo^_7)kA?2xs5do*->mWE1jEOh89Voogf{Mr@~xG)Uz=}hI$(jz zFldrghI6F|9v=L=u44iIt6%xj0L43CS0V5^enE<=^|mL`OmVH61j{+ z`@&5t;eDmBp%|2)_jq4*ZCwj9VuZytjm)N)O0()uxtq-=2kZ3!GvEUL^Y^3>#R3nN z$;nOI7;bp}Ja_|OFn*@W|3&WIw|0MP@U_MD!-ni0`-<&aNv3`MVM*px){21le$~SM zM9zXh|21u8b@S?p4mYtoz9SB_2kw$1@p)~))dF#^43&C~Z=3J9CkIQ$`Yh$Y zk-|-6xk{kwO~v)qZy*Ciw3RiFb-bN*=ey_sz1K}R($UR|X1#@l4XXG*SF)_wp||hD z=V=KaLX|(_F=x=eAe4DQnqsold3zbDZ>^Q?B?;q>X)iv)?F2|3kbR({E?(8RkxL7JJu!vxEq4u>0s#DQ$h4XAp> zA&jtI{Lc)1P%N2ORPFsg3zOym%99MH%_KKt2*UZPssBo?x+gbWu4sK=uBDla|9D){ zty_*+pm>*Ul7Ng}{&UGmqO6s4WwfqdhK+&Tf+mVGo5&2;+qBLSvUx7yXG_9DjaG?KIIX_ZIl^C`W3ys!`rKa@aoqM#?{@JuH%KLefZ(^!y%2m;^YFM zRLT#8+mSVEc5oE@1ntfQGFc7(xg}|u>$T2GA%8xV5E5sh$=H8cD=7EbyHZ+~E6dIUjHaL1w)YmBb@iHTEE6G7d)+Q=#p?^l;<%~b zOWvaA6V*fvn(9@rFABOYM#sipPQ*^Rc-u**Z)t`l3TS1?zH23Ail5)kpH}{7!j<}f zxd@{MySVK`)m`(PgPKRiuc=1m8t@5U6L;NQag83qC-8(~aOqf>;Slksf3P7|VJ@bU z5;)!9Yz>%~ZR_1a1nNI8SZiYfS&^;&URbJNKzWOdJo|WiHtZA4PGmjl>Zg2itIR70 z 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[WR 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ⅅQKHz};_SkLL8?V2PS1YROEdQ3~XQxay z02(r=-~RjVX)}ux9l7hd8{YZO^$kk3J2=FyIY*VWv~X+gzWc6gjUGkVoJVlxnZGp1 zbWM~+MwVYSG}NDc-nlWuTv55!T5CD8Ku@IIsR+@6Ni>tz>3gfdFmY_p9mN#*NLj!4N)M3WTzJX|WxL=}_f-{(QPpi)sFU2ic>%|UY- z2RCt?Y0Xo~TF5l$6V#*ZC?(coQ9oT_hqQT;hFH(dA3DFPir;qp_?z#z>&{Xr@YT)b zJf{$kh4$3_+3Lr~pP1yFr`T=i3OBkbluwS$dR_dR-?hc5miBQ&$u=S`@Y z^s{Eu)qV1R%XjTH<88izgFx}uT+nXx$Gf*-VQr#M?9JIloxYHG8#%1C^(0$yLcxSD0X^+wH$c? zv5pSHn{U49p@)9CwzlrDBaRTc(@tY`l(*b`tJ3(b@4fe4!#2x{|1^F)I>1C;hXPxF z3O*V_48k7dGNbKgTSZg%U;E~_7^Z){`%dPRM}ks?xOS651f;xEX_{uCIwP6t$d0hE zgVg;;>svz%< zJMPFRx%%n}n{B*)ShT&WuDSZ!(d)dEk*8cTW^YbiO|2o2p=`h_$FHkGY(s`aaowf= zLiMFr1O&87bk_BHptss;L(V(*jL2P3%2yFU96<`=8Vk3Ax^bX?2&C%3(@%kX14Se7 zE{g#{S*QdP2VHRqjsNqNVtf)QrJ+csQ41us5yE>xOEW$?uMagk*_XJyb>2~T8o5^` zk+5I5Z{K=e36e}Xs3eWSh`;R0tC1Ax(3#YUM}LiC-n=-^%?KP5iJh4lBF_3BG-yaw z?PIQdC*ljssgHX8xpU^-f8PVKuBj#LFe)X)HLf;kccuay2mr`Kh7A7Jx4z|6Bs?28 zZk$6q45X!`$TC-X$JyUsJNz)7{&m+KHD=7`o0>ku?6`Kqbq1f=B7nkQi4ES$GMmtc zU8)s4^<{}_xzePBsF7WuHkkGA-&X}q$8n3G&u+Wz(%4uQ>$<4ArbZSbN(fo28ZxPN zzN>{K8qwpEo-D+Po=Ed^2HH?p1IH9%1)sE(P?C(uL2|$VFpZP@L4f(|9z{fb z)4*!4`07^<6-@ODYCc6#aJz+IgH{q-n^da`c+pVrd}Dj$I^;HFK2|P8p8}2=sjp<> z1uS-A0Q=NX7p+4^$O9-0G5#qYSeR>b()jAZDHTyxwAl`|=HtKhgGB1D-=8~oUcUj2 znhCpT<;7gOtz-z}jv|1luc7K89rV9Fb&Ednh+;US=bm4^; zK&ccFroy$?UTa$syUvzK^X=lv3AHaEF;>6$;!DnHR0NrK^YT6S9GX4?l3>{8T*tlk z+GEh*fvgC2g@u=wUw%al|9bV}!8g8w06Jyu91~x#iZi|7DGU>z0!ddjHpG>K0xBg2 zamX7BN>dUKAiolKvugSzFBOK`zS3P%iVPskm9oksMh?w!!-9A&QxKMFP)V+T!#9E; zCXqS&?6Z^FV(`~{rKkajeq0Z4;S1Gj93Hb46=c|$xmZ47e#F3g?)-TS`z3(4FI!gk znC{^v^8M3){L2j6axj3eYx6jkg9I=;7^9_@8EO0zkL!5lO|AIKK-4C)yYf{t^e!nE z8)ng*!p#`{3TxO~c4@Rph5o>En}qJOcP<=80aIJm zEWwxY*kg~?n0XUfqWWxK`5l=Wigy9my6dh3f}OIGUv}A__SoZtPOvc>mKp@+(nCHJ zM{TSLHU;1(_+na{=ktmw#iAO?^6}MjZ9`d!#lWA&u{i;nF{5D5*wm>o@hQHpFz zaZ)XWOH+x_X5T)2GJ$E7E#fZYkD7@)_Soa*%$oI)k9~~Rn>l;I^*7#R5Js8ZbN9XG zQicv4c)&+La^898Ayk-JPSdu~Tt~rKTMlq{T(wFekfycT>O+q_{D{WBea}7jTqkrh zSQRa0Hd;M|EQqg~w7r_D2E~cJB0X^PPCCevsLK8pdvFBr4B(?LXhJxL!Tfus`4D~ya0D54^7h;1xL)hV{xc*8Dq z9Jhf7aRnCHWdY}|yY5(b-4WYwyWN#n{1JN`MaJP^RMciNp@=J(b(PhdZMEgL+ipwN za{G;rR?&_u*N$>)B~Zl4YIQ|8w=od_A*84*JX3dKlX$9vPZmWG7Bg%cZ@3<8RZyC< z&N_=>$+{q5@YHY+%06W0E6C-*G&LYj*5u5c-=s;lEQljU2#KP6Mcrj^2v2jl zwk$f6#>5~$f&;5~QpSzje!K0qBbirT^=D}oQn|IE$J9>g#Gbj}9caXU%XVwkh*VXr z0ZGh#SG8A?D?n7?)?5F=mBzMEW%jpW+kyqr7nl%~m>;GtW~|Hj$3ejY3d$E2(ZE2D>%Y`lOfy>{W5m zZ+>^*y>aibLAAGXwK#{kXj$)EZ_LL&x?h8RDV0^t?Nx5KM{{ioQ&h9QHY|Q+;fwVh z)~}^(m)gb@JqY}UCMuyC4WXqROB+`mglbX{^tdKJ@ri@j+|y^z@e^1y@f9d&hzUZx z{geSMG9ZqXuG?(4rKJ!YA9hswiT+e&4p&f&>}gOomEk7ew*eAELJu-@_0@CF1zr#p z&=461O|lVShxge3f9=(O=7W3gnJHLs&e`WGj!Ksp8-f>wYd9{R+84khEOWY;)+!5V z#KZX$?-;(O^%_iwaJATKvZ!OBhZ3hvn`tL7vA6s<8SNdyS*Dvw0#JU|H8eV5PC*M6 zw)AW4WAVaQzxwsfHs63chWj}fv~)|2l#*X1vwzkb=1QsU-{Fjw#)@qtG&rccQ*E7ffd;$mvJ+5F`Z4Jp z@?TCs&~_xN>ut+U6T&Et!S%M-q5#5Ty0N`MHGhFH%7=a`)QNevB<%9nh`0_6^Y{OU7*OK*-8i_@ET8@EG zQ#q~{-!KRpB|vpDflrxU6XN)G@P;1UY(f`Lq$$I_jtCjW=)W_s1}VmD(kcV`n%BDU z!i$`~z);Yn`CxUfH(WQt3T$a021HrSVm>$=D%2uF1bV!=S~5^YHH3Te+eaTgeE8}w zzW9p06Gt3z81Mcqx7;GVksD_!GnB@7;XQJ@@?6pZ+9X1+B(;cmBK)1Bzr`{;;U_ zfBfU0&8e2ID7vL2GVzm9E)TwBqsXu2j{5K*0)nkFViT*Bc$=zCG!jT+rO}xj9yxM# z+aU-)xFbi7WC2*ji*YP~|2pRD3`>p3K3<2CbIp?Zm=mb0>(@7iWG0P6>PnMI9BN|A zxZW|a^$Cli0kVwZGqLTa_Cj2B<#^3Oyms#VXa;wgKWwuFlx$Ptrra!z(+AXXw^r0! zQ3GwX;>6W<9WQjkkA4g$vE;%iR5E25Mli(>Lqrgd!Vt@+`>+j4w!OVFeY*OpEbb6R zZ`09=$eKgYuNTXQ@fzo__G zh^w!SyT9hlja^u@Jth_>IF%bK8+82P1*nL*0vZ{2R|AFa*9V z<&q%QG{tSazciB|*N6Ar+bM8d4@^}~TtEm3gw5z0RFhs?%d`cewbM>Jae=M2+NvM@ z=swRp_dJW!l0ooOhPhGXQaWX*I0X?%Ob5{HLE<)Mozcc@nv9lf1)5~ak_8arpY6_1 zWU;;rO-K|mE1Fh^1$?{Nc>XR z;@YAAxo*Ie*XWUz?`yri0L8VT2zx(Nf5yz|#s)-PPc(JL9PmNYHs!*dSV-Nu`~=#C zykTZ&cVown-E52ZS^$X;b~8?!_A+Q$Wdk`UlsMC`tR<<^sC5>@hyT|%zV+?IM_Wkc z;HMG+eEUIxB59%CpL*&k!!}B|w3K#j%2LUsQxSM;$tq1Cuf5hvwX&|@U_7{wxuQ38Ek_#CksD2jh8q$ts zl$gjCi|NCATRCFQcSvG}>c9W{zr}0CX2q2V;NZanQ}$oaKqykE^0pgw4dF2+bs@+1gD64m^!qI2YNNtF8D9b>= z+cdFh{}k^S>iz3K{{q9du2HpygtaT}P%=#yHTo8?S3PW$kO_posHlb`(L ziOT58i*=4}P@k`^Ig$=|H31mQ z(ZhvoBF(6iL!|b;`yR0EZNdDx#)Q*eeu=#CwlGl0C-@v+b$RX4RrN88Co4g{{rg&U zRB_m0|EZ+=?tAF8U;KQJJ@)$ar$4D6hs!Im)FSG_NR?NOo}T;yYK$8<&P3(&Q(yF{ zaIIkT)_UQB`kFw&2o{g?C)Cg8nT0K_mIegzdsW!uCrO?;79+aaV2hL7nkP?LxUkiV z0>iZW>RvI88TW&^jqOPnQiU@rM8DPKShSWh=;Do{EyWvFdE*@jZN0+$@@O%yy!6tw z*N(?TCKst*V~y25_nAW;xcB}!O?<#1LXz#b&weg=(ABpV+E_`ruk+I8XMypKr<9Tt^dyTh}F~=p5sC!9$US43yM*LxcH(A zA*>)cz*$NH#s2hDtI2^M2_HImz`Nh|E~g{7Ul0K`=DOOjdp`JqUH0F9|IdE*)0&ro zlN$&^qb{l#IdXV$FPfm{2XWXBlC&Lo;KwFRnBeL}#;%rLlt7zfSCGZ7W@sYxn9=LN zlLT_uL53V6pd0W64DE%yPp7hnPeuWlCq8F!53z)?+=1-J3ra%|9S;~hRrrE9LfPgj|G%V(_ zdP6l>`}R{>3N~?`B8G!}9B-pRVGSyYK_}EJe2g2+j{e3Gefl)anlt~bb1r0Q=q#{x zBv;((gM>{5vv;)*x3kD}D@(yaE?^I}%5pG3GxNY~`hh|;ZucD;VW1gBEURV<1y*>Aq}Ho3xp zDT`(ud2FAHut-ex8fpaYni44p{XhQRy`rC0FT1{?H^J> zV+0dxVsT^AIc(jSJX_)^=1NCQo+{t{GcK?t=_l8-=qVCrpT>U8tW3Q>F1ea3Zo4Ew zVLIfx$fe5&h|A+kNY0z>`4f7OukzrP}YD%SB`x?b!P^-(J^%O1*|U12{bX=OrLsc@`C1aQi6GXMnH2* z|Gs^7f#8!f-a)x^oFO{YUb&u9JWLV|1p&3=4%;veuA4C7oO8}0N>n861_8;0+2!u$ z()WMi3!mR{#~rPozU7u%0HJZ!F@!A_Qdd{A@c8uazyA^bR5)7zw#61(e)-Fv(*;hM zGWF)0Z>AT%@E`x-(zf|cEp}o&bpHd!pGI-?%pQB}#)WL1fO4(y1k*aVBIvQ86h69G z^mE)@)BJg-p7K*#{wrVpGJ@WB--Cg+&E~}>VkorOO4Zs-F&%i|NBi~bZAZT2)NZ)( zCVCB4k|_dAbR8qe94(kyyH$5Zd$;a37bX_VNsd2MShyGtgWtcazl`%%^@81 z-#Y5(C!U_nUdMgVJeZzT%_5|Hi#?d4n(B!AdJM$mWoN{H-~;1$F;!oT9-4vcB64-N z)~I(wpQFBcq}8^+`R(s?Dlu()&e;w`oKfzFDCDXrRE?=xM>xop)C*l!M2no8L^3Af z;Xdi4Qxsi@jeQkPF~-Efg9qt*&O7^D9Q?u;KKGvYY+x-V9IVOl#vN!wOvm}~z4!2U z4jMWHwt#0N)oc|3?QC>`QZY=GQVt8@Mh#;cVx$o!pb7Y?X}Hx&*J+DRLK6e4STz;` z775Vj_~TFHe2I%So91ij3`*_MI2K~C3dqGh5q4)&6F3m?2{LrOu;M%b(g2#OK>UDV zw_%%H`WU-M#Baa-_7=rihm*AfUn#!AdCSeW*yug)+Tfk*xfBkN1ud;+V6M3GPftGe zwCzYH00#}|YavH=R9c+dw}hQT2tGJ@x`Umq@PVGlg2-F&)xnpdtBuoCl#j_cO_irk zeThb$In$v~bbhfoTVpKu@FS1EbIdw>?YZ|!C;tTHZ5&6y_Js>9G(ezx?|WeS^j9Jt z*>nw^BVOmr+nhXqev?I002-4NjT)OM44lXhvg;`PG;*L|$Sqa&z3+XuuCDf=gAV%X z&rZiykrG(qOHgs2a>lLX3ig?lTYvp`k|?soZUrAq+Dr$-`~KvUPs-S*Z=>^>%yJkI z8mo{B*)=qYRn{<2DLFP{sw&GP0ignx??$^bI+AO*|Mxx)zF%ESGuyHuX7V z^0CJrQ+?x6Szmnqg_mEM;q2dCcm1Ft9DLGa0wyPj<(KqEoakW1drd5DP@8hTZ>uGe z*+`9--nR>23(Gwp(PfB_ktPpC=?Ju&0R!UtM}4uQPH6s2Bbi*9p&JX|v*EkfUVDUi z<}wysbkRlE-*Ag+);H81cG%%S@jc-eVfggHpW1on9n72{ro(=;-$I$zN=rw|LI5m4 zB3V>XdNAL9P@o8W_?iuP7#Jkk;zy@1_>_F4Ezxb(tU1>18dvo0ZOPvP+c^1cB|zJh z+Z1PT{Pgz8Vtc@O3NE?y(#tNpbmNWQGj_)v2ylA$jy&pUOLDOza46Q46}EDbJw1U) zGT^LN63&liafBVajSamuaFXDeFkw8|3*^H!SFI5Nt1)UpzIv0`lz~WHX3vx*vOE%S zl*htj5Y+Cz2OnVjrEI_-QXD!O2*}QwRYzex#z{Z=G1-%g>*tGKJmi^YUbOy`f7zzXq5@^Uki3G$kCr-aaH*M3TrM`pDox|~{ZyoKV)_p#_ zC&-Q^1Q{sQ03kUN_4&7dum&p;1V@k#RngqL_?1?II)G4F#@Va^OLqYTt+}Pirst3s zy0tjVjMi{UpW5!wksh|Rtwf1$hNN#g^_OGoWk=PBg|8fn^P5^vJN@Tc`yxA_%CU#p z7&_j;q|jnoueqRu4*Ix`&me?S0AWFMoZ;c&x`}Jviqc6ol-ACM3)8KPbH3za(9=&p z{l14D1}*NrvB{w#+H*rgqe0!f-~FyxGiJ`3F`aWOCJ*dAtBI2v+A70c%4Yz$1pwB5 z==%q*(wBdo*YM8UZzpHP-xIU&ru`*LHDN2oCqD5BW3~-881t@ojj{UCdMyiYcyVsI z?RJS_2saKMvaSD93Q#&@9q?tBjZ_N|6d{NJfx`O24= z5rbBZr3mWHEvJzfpt%&2hgH4k*1K-MC>Z>=~^gUdpE?7A1D~Il}`<@DYd0MD8>`-)LpWdu$CBpgo z>nCix%~sTWO;znWV@5A*Zrft>O(%}qQOQOc1-DfkO=(el7rpA{&B~R9J%JnC!aiH)+{UT)ULMdsgoTr)8L=^%)vHQnHJ*vxb~VqUwh4jXP$eu zs)hk%1E7O9Tb_UM1w~6QFH&#{C#ninDQ+R3oSFf7m*Dy2$(p{!-m0&TCQnIV9z)`d z`}B&r0+lsKgizAZri6hoJ4E~V|NSAcCr&1W9Wg@R?(u=0x7~V6YrQYL;MZ)!!Y1vd zuEk{!2xzMtU2i#4ZC$g`LhPGmZN|(hIvZ>NOR=Ca!Dc%OS6A0O_0-c7Cfr~YvF)~7 z-+ITLoM>DLzCwd#{2!k?#NI_`;lP|+u}bls$X$Q^^*#fOVbO%ivGX@(002M$Nkl>V$U1#l4pFiZY4RzIzJwECB3F9^D#)f(ZpUPT;$)vWQUJHeZ zo@>v&<4_;#do6X_aKrV^JvYog`=58(Ve8(#8^8OVZ~yRzCrq2^%)QEf1Nz$?XQ%WT zXZ)OT($Hw3N0U>jF1Xt*vFi7FY2qElT7;+(YCl-I*dl)$22oqzUOXJ2s5`0Fso6zV;q;&f9nQ^9W z=%-k|q)lNWXNHyntXS+GJ9aF@#$SC6#oIJ*zOf>FrCf8(HJ_S1MIQKv{4~U3!h;V! z*z~o!h>=|uh*^hI#42{3NoE%dRjUaT7e< z)GZh`vL$sS2SELdoKvPeTa+*yW6nojPsZp&;T8zQh@#CI2Ex7uRVykSto_lCd}!YM zMQ8rv=Nt`W5_-}rLKl2Q+&xqA!4K?w)m2yXH-S)KMlY$OP_?%o6hQyv1qNX#!iFkt z4Mmqv_j$JNG2KT8R2JHT!~EceD_kfGg@|*x5>P2dbFznLE_~u~h-AoY=TijOj}A9n zXLQ%UZ$>@yrW>|(QERDyCSiaya^xDPp85+78;?`_bHsF|#D0wNQ(}+ZU+gk{{K(;J zh&1?S8Keq`mb~O6Miy$$$Z&%V-g)DVx0+wF(!el9LM>Kt?QPM`m^vTOe;_yND*gN5 zby1sKiSx3Br<&CJZn4D{`|rQ+h~aC@p3`*ZFV7u+&9#cwPbLKTD-N;&wsdu3lxT^L zjXIQ_rROnz+hEM>In56|^oYhUy+W-vyyccVcyOhMb2@U^?tW6Kpa1+J4!XVe+UpGA z@+2kt2z+(}XYI!i{KO`kY@|BMWoqPD2-+k$wH3lz|KQ9Cn{Bq*YV$cW=KlQ5Gw#0U zuc58dvFET|PLbl(po1)TbKaL5PWtwXQ_ehVt+m#)88ahPxPT6qUh?~4Ypibf@V$Ti zt4T$>BdqH~Sa&_cnUgqMugx9|AUATzmaDngF_BE#9V=7W{Qwk4_9B` z5c(?yZ($;ban$MdlL{zP7J%#gz}Fd{e)_4!MHLS6M<0Fs_m}-aZ>>uVXjN4PV=S=$ z_zx%VH*z#IG}ht~gh4hG1CW7hJ3~urh2gq**z)f8>svSFnW?%rgUMtf&#a~@0hp!X z#L^lV`f10eVVkvQYzuO7`srubN(3@D4QSH9UtYbZ$gZCZPta7`BZ2r-1&ZU^7&Uqw zFfI52kTpPbBb}6`QDoX1 z;gY$I&1~beuHgr+uBvsD82@ixIbf+h3>of<0|8jT0pS%fdw;;kK5mBj<>}LWdQHTZ zhwz&`UVT-+bz$_@&p!Jss+zVHHpVi0L#dW2xL`4|ppWCg#n=+#N|H|FFuM zhYw$G?O_hb`|1Ck_S|#NpcSfO^g*Bar1R_79=R4{u7CeV{)Oq&W*9bKc;RoRJo_Sm zZt`I$^loVQ$VWc1^G-XGsouTojK+D^@~~Dw5D*%NAO4lQ?%IJjN;52$TrW<#Bab|6 z>eOiJAK87k4;rm$O%&|FRr*by z@|+tFuzm)b=}%B9Y@DU*zTYMV~WgmZz@(G39wrZ*>ML*ITTF>qF5j0*^F z=@VAbVWl1fmmbUX-TWP+M~}h>Csz>w4;~Rt6k`x$0hMm1H|D52CzrBuQHfconPdwn z?6E|DV-jY-Raak&6-j(+0qF3TU;c!BXkw(1%R02^Yna0e7a948p}>7o1g^Qg)6}%Y zLyZi|^TJz2}~P#afA{o_qpuI7Ip~3uphruYY~v#}E97ls*B@ zg@^)+>#d zgj~gT98G2g24is<02Zzo9{<=>i^n{Fr*ch7TAiHlQUuC{ccznYg)~W^9PhTLAH6$S zBg{Rz&xb#9&)tvSa`Wxx_8kfoyG`3$9Uc}dH_VgjTH4zG^yjNhF+KQjEXUIRue$2$ z@#C*^EZFwjz1N{!XP*6QXC4RREPpEIYoHX{;tb8JYiuoWNyyM)KRM+W)DwVhtV%cW zm>+k>!lDwgyRld0O*h?SAVk4^=}TW4IMAB=iU~K|>e?qRE7vl5{`bTaM+{$W;$u($ z-)U#kL?Bt24aHcf9mjw`xuUwhaiMo@ow6w}I#HMQ%Jdm${PL`ee|L!so%mdBFgxXx zINFW|p&0Ecn)ui=XPkM?qE_a6EE0erGO)!*k6!n%!@qp@-49-T@x>{k zPppNgd-mB^est2QEQ6hP+G(SWHe7SqNG5di0-bRky;~L`#&EaaDnsAD>t0sB{Qimw zK+#|33BUoQ);$Yx`G_ZCsw%A`ub9)+e(VoUX8q9hv^JE`l9Hk^%OKh!r;1ZgJrh3K z=b>NyCN)|PDh$^YAmTv|kgxhw_bP%Kj*?yxwpYo2Jw7bu@TP=ZElv?Ejv+%CJi@SjU?)wlkzFk$}62n0*<&MSRL^LuKC^XF0)7#XBRA5@WkU!-hcnY8*aG%mRoFo+W(!h@4ow)5N75!&0nzQ@YNMZ ze8?Xe=9I+ksCYTLbJ(!eYif(Xsj}ki^Uv2)uDjkkMD(_sZ{tDW<_Nl(WF}*(fo0Xz zH~;0<_1^ui9k$=5ws$S81`R3Gwq+YP9oo15fTU@(u=aL7h^@EWZ03x)C!Kgg2t9D- z0JSEQOXa@4UX_bl7B=~?&;B18v)&j}e5(xT?Wavd_I$EMq9r;$>Z%vuh$oq3MW;nHW=U zPQlT_Du%DQ`o`~$yXlvGBqP#BYlyjO|9;O;nOw&_HI@T`Oh&`6Y;I~f>+CacxN($; z1st?37OPnUqehL=B084V7mr|!`pQ9(tbyUfS7)HZTxz)vIN$(xhpfBKTDYwGYP~En zuM$&ko(Y*FX3-8J5OVI_<)n<|<$~=)bJ(SsULXtWQASZD>d@0otMMZde zhK*w;M`=@BlmEhtu81|X)r~E!3tyf&=ZZg0_{;5g(x=9{CX{+npS^0Gqy6Z_CyzS% z7z^{vHm^2#$V)H0c+(Bn87~o3ilwxy_8~)7GvSY(&%f{z!O)TOM^HWpj)U!vr^m3O zH_6ol_disI)-h}*RI}$b_j1xL)KoqqPnn$kHh75I-i9$Jsv;vetlYRHy%QqY_2@`tXe>|sE z+MP~3%Ie`sq3rmehW?_XDFN^0{Y1Nk(3?_H5Xu`!PzVcen*QX-lb-*zr-jE zxv+qcdt-Ww%gsJ<-~q8+nJLrWw$s=h_So(JO?>3BiH|%?VG=wtfTpIS(Np3~L9emK8X75ER7K$9{sTizX|w`ASK{dvy-3mOp}}>+ zA!t-$dt1zk8a2n#v8awC)Ke|51n|EhY4j}}Rmgt=Da7n}A};Xke0M0Lj;~Ap6IV4@ z5CL2_niNpoelMA&<5zx%Y znOUhf8~qE;T_)@jHF)EHbaMJ{hRh+SXEMEzj*xt761E#^t^ztjt(_rj@ZhI*M|sh1 zN;IO-ek@|q_FRA7BM$V=FMoNS0goqKHMOxX4ovYqruS8!WNoy4J3OY8lr{+~Yy9-D zx88c|kAHjzW1_3814nz#HY`k2OenYg*pQH(9x50F>FH(Wnh7*sMp;xGGCr{qn1fgT z@hV@_^OWeNHaD4e%rXCiL`eR7jF1=hXy-v6!*-sOn1VQajj zzOH)VqBx7pfg%Z3=`2f<=>gW8;3$Q_*bZuhBT_X}nz{#0I_Y?kY(ay~7`wDqeE#zX zyM}e{ytpk&3ks3b**CioGERexzN5Y38{hbvuggBgNR4RvK*peCnF`Za3agX{5e$`i zi(npT^K_J9wq1w@jrvqQxH3V|+fy(Ciq$NRJo0OhG^Q|kRD^A#Lx$Luw5zpk%VM&E zG0~-$9zM*KzvI)hdVI|SQ3jWJzLR=<1Z1B4co3F7mjv_^YseB}7S{JNi)+{7HP>9@ zr)N=XoCpPuHw}X|hDKDJjIscdj0Tg*OLXlU6fcXPu=W5a|32czXbZj8d3WAOIMntfDoIDorX3uh}6lVtA^4t$Ic6@7AAR;SpFjqiW6wPE zO!L(kr;C@2_TVzh-EQCh_P0$VQ|a{f*T43)+S)1#nN;vTm}H(kd){M@JvD07TJL}V zj>vxAdB4skS*Fg0=o-#E^XGTpeJ@`dS4F>m4RhzWFnjPcq@=JlrAwjQ2Yda$_YWB| z@Y~=1M!4-<^m@xZT1~bNiB&-_)3F2;LYeuqY^L3y6 zS1K4Oo;e%&c%^aHYScGeUSQ zJSIWP<@=CVUuFk2^M`BW$3HoRqTp&Vt3PVgJIFlOxpj}!h$T*+wg$fV-M9jW4I2g% z7ZV}{R8uB}1(eQy`{N(~h(VBqRVAQQ&D9F*iuMHy<5m!J_&lAi zU2kaY>uu}57zYNF_$rM>NBxJ(|EOuX=%xo$N>Lh{ohZ~w=%CsfeUoS%X6mM;vGK{m zfQt4*Cju_Tqb+7s53?I2{ZK|xviD{*Z2y2E53JJisDPJxFNjT&LsWgSsi$`(G zEog;5K(<%$c*gcq{Yuonhev#TT7J!X$n!Tu!J$*6Q}z(E)Hxgf((*WeLGU`3UBr#L z;mx(C^t97Xzx?twdAJQKUU(r+;Lt;xt-{~>hQ?+GE!5OL{^X>y&%ID*%`ZJsnP_6$wrx9^m=oK! zZF^$d$;7se+q3Vv`<#3B_gDXVRd-drT&wD>^*lTj*>3S&48am@a_8p_)8MKiIM{|v z(kdn@-a47DRWY?V6_ISaejzAw@3VO!`0X!;8EczWqv~Md#4`Lm@5ciG+zTZwPS+I& z3M~|0&rt%pu6sr3M9XF&ND20m=|&-+OP#0prp(^i$2X}j`>l^B1l-p0PsKl2>8cZ_ zr|*$Y8td+IhLfO;21U@rex%rLXAWPU+!$0bVGIVEE^8@(@`OB~&i8gdbvLG7u~VDH zXXpR(cc88~p%FxZYeuv2Zk?MGIp1C1j^5YMZEB>$Up`o|Di*jVgJ^OSBN6(BclQRv zNW82^UOr`DFznNd&zz^R@p%m(z}h~zaM4d-juBNMT(qPcq%oa8n!#@nHC>?a`@Z(l zt^6rfwl?@%vX^<@^RJxeXmq4_jpCtX=~vAjK|`l**$SVk0X&~wlZ07_MVG}yAhLo> zr;J1Fi2@*wx>JLt4UWj~%!LQ(=mXc#EHn}`>RFY9k+bi|lp1PyXUKPgTEt^nGV|CN zX#Lf}D4FW7QA%`o4jfIL_#FH2z|=kr&fgR<=mN{sl3(2WOEz#DO1ql=1SvS0h-~mC z>--uLSuqw?K5#@=rLlw%pyjUCz+unz{frddTGAD=9gDIlPBl?J?ktW4PP+*(!EH^$ zErlQOT7*s2u>V3^jW`H;4bUbIMbtFaU^~WLcpWV<*zY{kRxNSagtT~OUNPX7cv)pwDW|%V5$QQThbQZ{J)jcew-c*QG>dKb z^%a#CErDXNT@Umv1*D7~9j)=le>}fHL%cp=A*7Yk!E-jnx`TnatWbB0*9K$<|MhD#- z$I~yOES*ZW4d=Ukv*K3qq3@r6o@!s5?V5aUUdl?3x`pSeT??A7`=EXdGV$P{6Acza zj3YD#WJm54rTw{Z)o7Tx;VQJMYs-%cd_74j{bo^n#`DY1*Z;X07=&_|MlZM z4x&35%5^Uv=a04g){R8Ej+&xP6PBN5Xak-=_f&Z%U4cCHO!4xgY8J?hwfK5n2TAzl z$WXni(xdJ7u-|eWlujZ$!ch|Ng8fRkz;?WDm3(xtkIz13G~~a&!sW(*kkQhIultX& ze`U)3GC9ieodsY(eGGg%kFcmnjs@N&E+`V-1S9W+xwyd4w$H1BVQ7%6Tr?>#Y4mHG z+tx$}OAJUgpOfNm_ajq4cJnh#i%5Z!>_&IDcU9FJzIX@FZ7`IuSys)O{)ladt*kOH z4qDc&F=SSU%(?Rj`J0N?npFux?g85ZBnlK41y*QvkCPm~~Ov26~=@O7IbKU(O zqsGnTK1PB%*|qJekty7RJRDv;qqx8MW+P>qns?wW8kI1N=P$wnzfMDLLN`}3AR-c!%Fa1Y zMxGJFTcvPU46i`}A;uWyZgR%mk9!F?2x$H4T4e7rY$}CbIXQ2a4VreqNru)77^4do zyoSx!>WJ7`BL}ryY-*>yxCm}2AgEB}L2>ePcpDKRpYRl2!i)fcm31aG5qa_-lkAs%4y zaj}84F#Ss4E^*h)PpKjl*ov=VwjkZ6XNa*z2HNKX zefY_zn&*+sN*eH^a1OxWt%<@7rUoW~yAO)f!}C}aJa-nqOu0CB*1oAZq%f zS($8z99mty25)_QB9joj$4TiTV^EEUrpwHzy8go9fo0TO)v~4> zF^A3q+do^$PCpGm{4C#tc@FQ7X7@UUrC(%OV4YN|MyWcndDvI?GB~+W$K0-vYvHPBlbmmef>qQ2 zc9{ygZgyF>>Iy5MJhjQK+-W_T%!v3H({bu2%ahH|$EUnrzMxOLTDU4)lLhu1b+?V1 zeK?7u8r!e*g-eW2S=bSpdrR}m93EG6G$mACG(80^O>hKKUvfLIXYz`E!TQ|^Ah`yI zwWRYu;inMX=Nt7RjI5}u`Muuw?mSYYr;q*j*g=AmZJwN}WlaNqQS<{*Jj&37j{_k- zWi&=@t-$DpUB`^=Ngnk*A>$M0A;vwl+F&Uv2@$sC%;U?lMkk z!Kk1gu%Sjv6U6+WUXoGyjhbB3t-oZCHP(UEfmC%|HAQ^NX=Hf)V>TR4Bw}1uQa*CQn8(b63r3|kM1GhW(7s7b5=&x| zD-4Sx=SUuPVIH4BH>JqLT;`uKPNzUt_1i5tbtR`*nCv}>^Q?>g$?sSL-tPKt$mn0E zDIC*Oo&bBpUj#|uv!HhZr6JojLCc1NANaPZyNUjR1xsCAV%Uas_NCK_u@DP`jY z07{|lWvM52=QW*umf`hJWUq=m?U3Plkiup$bQFuA4d-ziIH-L< z$s|u{qHbkz3D={*d1CM&uPg;3fjz^=^?|t7O~Buxr+A^sYJX1lI&;tv0`~{^abfCC zct@TC8ET&-_uzbw^6PqnZ zc+uq@Kx;FR7Zg9on#T2QhI*4aA#rYY-l0io#AD(d$+5?o+3WP(k-rEBym6)g4|E*U zrr2ck>M~(4>RjACNT^Cp^(Iz8osl8$#u}v2LdqD*_a3$zqUv1U$10u(E*SBT_ptb4)en=pVIWW)vwKK?saiewt!ANkieDf);cBv|xYD;n!) z6d5fo!8E6j1ulmAvO(2mi+Qtd`!hZ4@SSxM+z*go>}C^+K2=>P$&S;3uE*?NQub|V z_c-Jr7Xm2c`RKtt3(4U@ebc6->S4W^jfE0B0%MI^+4_#;CwTDWabKg<=qScBJ7}7b(8t=@eiw&g& z9H75qTz;DRK&dKrqG4=3(K&hGu)S(pD*k6@Gn^CMLUkGeo}N;kH5ZNy5r)( z!^;>1*V|WWyIX8zjHB>XlUqERRM|N)gz57o7M8JkEKBkmfsLT9(;AMlZ^j#TB#REt z*%*mykn!e`U02qYdCX_ZKOp6y4p-&1xYUs1so>w;v9zIlR!vf%K}*qpV{lcg9y&-> z@Bg6{_cpnD}h!468V)^%V_Y}?LzCkxB?bmXAaNbNF3m$X*R|I%zs=l!cq{&8vM!6^@ z>{y~$lUW(bK(t?Iynf=v&KjL}DBHbb#|qAZcPe9E110I8N~s{X=m1WtM4te{8oByH z-Un!G1Ng+d0r1EX#iY;_kv3%4MOa3l^2!=wCa%oYr9KHu5z=O!If0?Vq#DFzby0&N zV}1}h)iIoJKID{q;O#!9`)9uNgSEc2WC7+9#F_m_kUWOzKZrd^z7e01BFan$3LqOL zV+Ba>Q9y~TaDLN8A;IXL$e9+SUfJmZBRbHgdZtce-v6zoPD&Wm@SC1kxVM&WH9bIJ z$|P~qo@_nZ^#&xwSLG*PQHr!WqkUy0BSQu1jXt_=KU?`ZNOSKA^LGrq7*dB~vWDyuVZ`k*W896yZa#}KtaP;fYD;TKpZ*KW8 z)J5Ya6Uj|?61xN1{Pp+*8o5UoqckJ1$}wRg?cc^xo$nc0PSGx?H#L)&P)oitybuhA ze5u-KQYdm_!Dy|3y9R(sG{=H8V^0JLE2PhxBp2i6aDw;sBFRB)5SDs3gxN$%g*pg3 z+d$sQ#}9_KqN&2ku>6nXkK~bT4E&El}u?xo#@gaSp5x=nU$&#SJ> zlz821yo!89hMKMpkXeOl(kYu$g0`TwPsWfzH7SkF=9GgSK#JnIG>b@Zk0#g#>Q_4a z`<4@hB}rn-5fJwZf`>#yv6%de<(uTQtg|;Y0#kd-#YNELnqrX<4G^BtpFvDlXr9?( z%&KW1O7o69?;_lyKbPvJXb@3!BUwQ;Mx%NrA%@|l%{yiWF{*jYb<7nq)4wyAYb8o2 ze!Xq!A^8E(n_lrm=)WiKG0>pCOP6&0p3G zxN^(q6AAU1V$Qej@x4Q}(Tr!Q%}4BGoZt%8%j0wJ`=W9vEq3aTjz@jh+LiT5T}KR+KB`Q=(s$X_z5QLqd`@7tp=+iFijq!~ z`_UXfxiF!pR7T@aW4jqWNZ9hA$^PM+yztW?8FsSP#g`Od9^XSjRhX=%-^%9zx3_#Xn4R(N61A)zb@ z`%Ih)z}h4bbK(+y;;6Invh+3nik>(8+0dHm3^1diFQ2gBUuN=_sSUe8plDEv;%`7ut+#`5mYD|JM zZA})47V0##rJB+-$$dI4Vju?h0^g1x^rHq@*1wt-Lkr;xphN|8BR2^of^&orE{~9O zNr^&(eWJY9VQdEEvSa1m2$HX2c@RC$3UZxoSF|o+!j}rs=V%(+PMM_w)Q@1>RFP6~ zf*1=4p0G@%%#<*`IH@`$$7RCbnMh%`fbAXNOi?}NAE7~(3c3mE0C?=Ht)>c58* zQYm%#jSWG*yo5bMlU<8bdX@4$eMUFNaL=`e% zo&W-mC^YOWx=Db@<}u5znVT`)WQ6e}K|UahrD-b7VJ1EVlykN98IXVZIT{2Y2}_0K zrE@UOri%~1AA&pBXogC52x*La1k5BHMpH?^Q`l3N>(<$m10jxRLOJgwrKrKw8@vZ|m2OWud1D&TeezW8MmF(kMc zK{Wa)FZ7_M3AByv8!>Hnj#!cXDKMR#|Ha@y)IYw)M6I*MHu25tg0)GowTtTHE5^vl zdFO@?3*kWZlauoi4T-u-b}gvA6nAF^qutnmC$q&3I9w=om9!4hIDN3>yivD^&_kTA zE8WjHSQkrO7rocTM?;$!h=4&}vPVHJY?rKf8B9N3eRSk55o;Aa8;nvktQ_d#+~fo7 zJ4q2Rupu-gVh*?B7-d9cUzs!$`Ich%gqX)D;a*8iISmbv6L5^%HA?hsasJ2s<<01M z7&izAUB~IjCGb+hfyb}doy**T-V)D=9w*E;#p{`ketWp}y2xIo@1gL-6k#(O9?nzz zLj@)Go4Z}WahOg_us%Cwa+pziCo=M2?12NIsO%sbndg7{84v9hNK@<0knEGk)lPy0 zlrk~)U_NhhmSl-$}YP>4{=57-99Hm(;XgnGt~Dw*G*HCdAK z7#!WrLPRb68P@67`SN_4&@wU+Z!u80fFc}5*GQtImb>?qu}7fttsbN3B5Ol{TIEqc z5KMw$bcDMv{2p3mk)OToyyScoL?d=eEr$^fWc4w*cRiuEtHB&tBk&-8P|o@xc{AZQ z*&>%{h|7c=7Gy>anvo02)F;nUQ&ZhgF#B1Y3Kq(T92?oKehdp#R+Rj+4+I}8sA#k$ zM==}$b=Wx09Pa90=0j03@n9 zR+oLgA`~bU-(be;v^=PD7bT7El@yoici{9bV7qOoATOMPB^Cq^ssvM6gpT>1^iLsb z*f$BXo%j8yKF1q!k{Td(;)I1cST}z3G`@xls^PvPxK9fc_|DQ>^^)wax;imDaZlGjEel(JKbY5uCSU0!f(o{)91<|V3 z0p!Tc(25|7;wOImT4Llyaxcknv4ypf$bMH@p;S|9R0orS9d1O5jB#Q1m7Rq{ITaz?$X%k{O;uPCH1~W`aSRmO;p!%MPH7SiOWNtK}v{c)=^aVxHq!9`BhZm zsa33j)Dbm>!1d;l`21RKHiEyoSf>CMwdaotOh|D!FG#DdGjny1|36We@GpKk?pkOW}~YL3XF=Ti`$uN%EQRpM1Wwu znH28OQL#Gkij3Mxr4)?3#=1XRz#gMjVk6deqQZ_wcioH)O3NUJ_?Xwfu@(- zDc!Ole!F${AYCPnW04ICSj4$aHCez&og$TuE+>R(&qJ+xMj{ohf0p+NBH4j==PYUg z)dk>AoME#ERimD2p_J0VV#C%raTGdbhstov12UIPIo5vLRIXI5VXf?n{uA)6r;g5<&0@j39$Old_?u_2pS zW2!8Bz$#@S^z)6dhg=G>d}GcwzfjmLtMn2_PC|01Git(_R!5_ldMr5FRa0qd!`l`8f-S{@8I%zq}o!D($I=*^@@=4W*14-nUwn z0w>q%n^z9iXo%FoH7zmT!5M!Pc7YWP+0CFVP@CqwNXDx|dz-QZM-Fr?HzO9UNRX(dB(fX&x4M({H}= zoSTd{fhz}tsfy-=0vY9@WEc>Jmu`uLNY-ZtZj$#~H3r++^0OK{Yzn5>bfngKw3sje z)LQB)cBa0&?|0CxcpMG-F^o`+xONDCGJ4#W-c^T?2MS+R+XC1O)BsD(@%;FjU^2H; z4j+-n5Zf*^yN2q?E|++DdZS5PEFFlbg^2RlfqXyUg{0Fc+(Ep=Hyp#_~F7@#oehUw}=Ox`3C(xNKxV4ZwIKqZ)g0`Lk3J*M2N)O zh)b@19@2fG_ew?)M95uUU=l?r3IxlhWXC8UoY1B91ucMYhj%f0s#VjOQ(H|}s$1CY zDu0o__Hc?wzIi^7)?8Voz?~T0A84blb%HkSc1G3;H^t6WY4`b@Ua56A63v2GC;b7hUB#s1<$>Pyg;1?zxmBuOx>hxStR1$j_)Ih8#E_-;OHWEby+Ijt9tG(0i?q)S?Re#sUV~#;-nKfexr(| zOSL+{4B>!|!iQt=6#t`r-(Zm8Ww`KMw+;=uhDMdApP5p!OLAzXGEkC}F}cip%mQ5x zywfxImTizuBl$FOE(-x0)aU7q`OKreJ+G%MFlnr@{@$y9j=ts(+Ifd0^ebu=zW-FX zi#J+b{LZCKNde?};M!deHFOUoVa>NZ&tU0Qp2LUW2zOj`$F+m+FT2vQvR~ zoM}Eg)qb~x$kl9?Zho$Tj&AlT;MQ?x8;>fo4pE;tou>-%aCU@{mE&8M78K|af7(3* zD~FKMr=@Mh`7%Vpi7_@0{GPo00}W}$UM=*g_8dkf`2gcJf2O)QYq@*!NrxoW+3u?Y zN0C=G!BvW8(|qJAsGGmN{EoC3X2uYl#jJrl|H7hl=($=$jor^u7U?$k~J5qlm>l4HNI6h zc$J#$xigs0);c%857n}@{(>;1FxH7?@N6!Lgk6p1GttR{3kL0LExd&04dYH?#XRyH zea$T!FY?K>6RHMmpsQMQqZY?hE1^Z9N}nCw-IK2!zzT&TkFY?hcSMGs<{q#SYit9ON zuX1PV2k^CAEmgkJuAN2WH=+6%6Q0Sk4Ygie#imIPH?8zuw-U4WN$Fv)FmSm#3>SNmqJ*s!M!QGgxGPC<^DdFnkS=S8ha=|qx zY7?_-pDZX)>PQT@xorJ)20jM;M71XTYV3J`7sl>MVn6Yj9}zN@#p`r#zwW#ov2wo? zH?``ahvVY9qdFuIwh*hR zm7eC6C2t^5=cFLbdXMhJAqqL(oE9jSnq0S*bcZ|AGbQ%$%hvRaaN0(*IMc`(xQJQioc25a= z(rQ}8Nd`zfgJEX7alCHPLwVvjCiB5wz z!g}ZNZC6>BIoY=XP=aS@ADkPN8js0~61x`3Rh)pT!Ox4h?qjD4EPAy!?jhGSm&}0P zN;g@TV$)8#6w#@d2NfyADEf4;p1VQapCN zMcoc3&xXAg#8%zLOn-0ci7PwNpxTVxc-ev8tVD!!!?8wZ#N^Em3oPID&u@W$pk0wQ zLW&-(2p|1KNRf!i?oOTvZmMhJDo!+@ZMu3M0-3R)1cgSLA<&YdAN2lHz~&=Ttl*Kk zc;SHGrPvnG&|+TC^ZFvJY?JmIL@VXbi>zxsR-_&FBo|GKj>IZT0xRMYf>`z#&;7b_ zdz2g(g5kUtqj>^1>l9xt&XJz?+et!le?#*}=zcVA^6Jptq^OLj=T%XIZcQ_MU-B<( zHkNP8L)%Qj7YC2~Yp4BK3_tBNf9gpWPXF}gxN{fG?kX>GJ$Kp@F(y&S09 zbM3y%(gyZi*?5_9J+y1AsH=+##Aggy&>Q>&V6D`Z_Omt-+|3f4U?6?&@qJqTm|9Qm z%WsB$ygJui8D(--pmOa$GhK;+-%bwZSh%ZG2!kx#aaxgi-O*w6aLeF7Lwd(-_&4V{5cbKS2tj-*@6CN zEV{X*G}=ZDtq0FFgbTL?wD=@0$@b|)29x#k(l+xd=>9|7)b4YldlQ_iP3dR9)9B3= z{lJfgD}#*Q$OOy5shhoF+m4T)a;{gsf#*j{-?Y^9N$MVDERNt#(QNm;AU2T%yN?-U zLQ%Ab9l#vhm<+W)hLeI=>r6|LtHL6=1+Lus;j_0yajA@A=awosn{$~`jKCiI3T{Sr z1`CG2ZT)<+@=~_hNpCT1Z=;X#T3^kKj$(GynHkQCtfQ_#hAxwoO<01(jq|fn+76y$ zu)uK{KE@a+DORhq@RaWIqg`|TdGFL%g_Z@o6k(mlAay8aF(Q+MzKAm=W;P^phq2P- z&RE-Xa#p>t#DbkD+eFG8hvC%{O%0pChOjVL!{wl(JK&*bn*Dn`;(k=7|L50jQ%bG7 zi$}of9_x4=!&DCQ6n!?2RgPi~T9%HEc9TsrtaX4qI8KrCV)L5gj=8T%%+W?mn5`j> z-GqqU1RES~$K{bT+s%f1%?jJpMi>{Lt+T&{no}n4*+W!-0tYp$jO>sT)>Zg>uR+VA z`QE}E2R_7?v(Ja`8Lh@XApJ+(;jqPdu}!tu;7p!(eKxP(d+{~wb}Q}wJm%dlv0nIm zQ7|2JTFUNsQ+Z{mg|sCU+hZMWxopxYZ!}sy2R6fSJuhl$nT}_h-?p{fnGj!ta>TwB zdUMUbI?&Pg1yp%yS|F`l*M=T>N9|VI1SYli;G44^L#iCQsn#S<0VIZak1m;4uWedp z{Tge(`1;SYnx7o^Is>2Wbk6IvFJBmL-=Tt~zBcqfX=|7<9$#@}-LMYvl!@DIA5@37 zXk13Xvva`7PBaC38SUg|+$wx-Z@*Ezf9kH=PURY5wj+i)j0GJuWJW>T>7*-mSiCGn zW4*pyl-L?U8Cn0?pk2fIb}wX-0P$h)BFc*p>BCGQiIegp&L&`nVNQH7FZnvyUFT(TidQKcJuCu!?R!GB`p2j?FsKibsJD}b-EPHW8$9YD+->->Ar{! zC;Asi_BwB6&RBARlh+nCOW}j7dgOl5s*;?? zGS^(HL+4EnMi6?=rcXDuuPORq z3f5IopRXt8BagLI1H6HT$R2p=a2x*i!rq3NI3_##q$I~nnqI`@PaJE6;YD@M&h?t1 zN1YY&3KE`@uAsSt&YN4*CxxN{ItrbUjvlkw6*zW>p^bF0=bZw(Ue<_N00CJ~Ba_I7 z?CV{l6=&6DtS|O7suP`?RcgBsbR4(d%REgQg7>jRB;WZ_fsxc0Vw!x&vCWOlbd*%; z)OvG^ZBNJX;8z%mPt@}1$eu0O=EYB!Lxto|Zr-VyMm;U_vZ#wc@RTGnY!+KGSz=Bt zaSSgWHs5#(ihPa@a5Pf#%@_LI*MGnf(T@B-EP%6zEbEw0BN`d8xf*9~lB&Y#@rZeD zki zMVzsX#D@7Esk4igxQRmex#S^4dawHE`R~yneb^0w@V2ekvRU3MW!#?n) z;+FR5U$H>DHf!7nR@i$Mr_JunSnJvpzjW!I5pLFp%|!9%UXw$b2tqkKI~^A&ZkO?% zRJTXQ40?RbBdtDKr3~;jRbK@4m!Xbjv(NB1@%MGR50eB!k58;md^%JabmMx(i-|Q$ zAG3F#!_Gd8=Wiw7{12aN_FN(qp(bGcTdRoK{#;$pK9cNF>W;*3xz1J>*wTsTh};xY zv)YqzVp#r0uu&&yHK*tKc2{m62g5hxe5(8gK~nB{(LhPFDY#7xb!;K(_OWpjj3Wzp zzsX0UP6pO_G}el_J2X@y{LOX){_ese-XR+_YFBg}_egGnxXBIHe-#lk`i_??op)-Q zy!j}5X?i>dTKFx>*OzFB=?$~_VJy;0)0}-AK;^dSgLU#c>^`lLCa50+b!<(_F6n`d zp;$8>y2NL~a4$56zZj()qh4MR0sP8gCTKZj{p8Ww{sCp~!YKwe_jJ#;XT#YO>9cYf zGRZ9FBBU^&q`dczm@syQ0>X(iiY4_HodV2vlY!(GXcnEkz|JT3Lu!Ezai-W`^Tiu}bCLT3j`RV1<%aoZMPRCdYr2C7J(#HoKY>(|GvEvhLk2KiUgF$+ zJDfzr*j8{4Mnni*`D$*9lQG%Nx_x<-$0w_}>TETVc#E9cGN{Yjy^yoTvLU@@oV{e- zBD=3bWw^l=)O{8QsKt<$j!rl|^)Iu_U) z2*lO}x=(Y^fY*;iRotO@hHcI(@&)zD!R87!lqK9Vk6I|9wmxCb z**@3Jx1MUNmaB|L&75(fJxIQR1$RrD!1!w*A>y3~o``%XkpHPkS;B~N?#VV-g7fd! zt>O$PO(0SsZ^tb{@-$UZdk^Xr26L`*?))q*DI$1$cYA%`U^-c0b~G@OR*s~^W3ae1 zP3*0}@i%al)Ei^y>MFTUBl^;fC9+?s2osDmE?qh@$sbo3yQsy8QfWcN6#FaaSBo2k0RB6eIoS0nY5+?zD z4iuzg&n(3(8#m54-=l%ha-VJ0w2}eC+Ku!v{h=S?}l7+j|G@^?@(Pe7rXBJ_omZpXyn(FV(fbvaLLrjhStcAFc~^4({Kbfs|h&qU^D)J20imhHaIZ zgVwUU#R0-~vglTL6FI?JdoU5HVKm=E_GQiPvxqnmna;aYb=91=fUb}vmrfdK=AOH6;|Td6tr zG^=6FQa%w4|{vAekWpKX1A+h98MO>Bwe zp-@4B`2YJu+X_l~KVpkKRv` zw5hqdxv_CUOdYy%K*RWZd+B}|UkhHC*>tv!hDP4#Nt@FVU_i>;!T&8CKoCDnNo8_n z6h-Lbzh})~?=9+*l(wN3k*7u}*4B6z(y^P%L;?H`A<+4v@xHeSIW$Vk|68~JcQ!a+ z$f?ll#sjMPEH}!bme7m1vq5Un$LuX}tSr`NR-%YVhtDI#&NvP#%KsrXK;!y`lgz1& zot>E+KVF2bfGPYly$IZGKs8~niqUd7T}}a~?5Qq(wOC95688Tz?0=aV3glxTJrcUs z2g}HGMSj2~JX5k;%&8sTdEG{0E}|JGq0$DV(*{*p;XkYh&^b9s@q(}-bS0PtumHJ$ zX2eSSVC4F+wWSRF(1368ornG8@xvLTry(Hs{fF~Vf(;=d#yn7?gDc5a#iG`7kT*-B zanIS`?6*=TmKkWZHf%Ez;W~tYQ^0&T{D;AV_z{o$>d<4zl+WZmy#%LEerz$pF=0Tj z2Uh|@_8$ghcLQsFYrfd7qKf*Tj{0x6B>^}kD~Na&`v2$0|7x~(Cz3Z*m5B(zm&?|}Gg2g{5Gz9|$tyxERxuBBjKh>uX z2Iy53sBHcpSAP5wo*C-&xlK-B>zk^9z_ir9>*NLew{s%#j!03>h zvv@pJgYJ%|xd0q`G0N5d9v%q9%F60!Dhn1BAHBm<_r6J-WbEYh^weu73dYcL)V+7I zknFHX@>XbUO61`}h3q9S)8H;7lPe{rp@;I;!cmxPt3n9QJO4V{#_)uU=#hN%{$&$6 zk-4O2jOz46HUv({gT9dQUvoak0~V4QD#d-9*L6JRz&rE|HZUb3S&mKYq*%SZb(CX! zq@|@rYN@TAL81P)0{D9ie$N;3c?68m)9LO{ZnHaQGw!>+jugJ)=5R@ed&Mx_z`Zb9 zr#|B1veBa=3~&=bYiMXdJE#&_)`fuO8wa<~JraQgGP$UtnN4MKc-)&?MwMcg_iuYx zj4;2{B>te$ zxM3`kNF`8(;3qhC|B+gf2cre%jpAUN@ArFZeD`M08RQkm|79XTSi8?3mF@lB`Rz1o zHZ7c}e3iraeg#0hL7+mZm=HeCiE~22fyJuDu;`LtT+3cSftCZxOqDs2zQAK-Vk`;V zH{>|r6yA#kR7z_4STWQFg*#Ewo-$Ti$kLpf{g(71P$$FH^}KsBqcT3SMs&u3-E)E%SMA)t+XY4WA)9CB_-!X6-bGq)+dU436P7XUaegtJ5{Yq#o z3C37rHq**^r_7vDHwtVrroJ*p#=e|UzIrE`ai~W5u#y(JN>SK-i+XrA=NYRgVyRDy zx5&DHDg0FoY+7$Q0iVe&93!rYaQiWd#i@0MKaC?aBQNjgO$-~<;f{k1v2GRJ{|%wk zP`}|ovv{CjIj`M;Ffi!bkA4foDu;agKBY+pUN&g4Xx!h2?#xr2urPJf@uA)yXL?tm zg3pyPtQU(zG(&e@$~;kjg0jkwEHYFR3Ut88X@D)@Aja#AhC#-saAc=W=1W#3#I0dL zoCi5Z`o!JgQd{cyvi%Ca!?C-Zq7p?WPBW+)thBj%?nLrT6zddZj&U7o#!hgHxdmhD z+$z?}blbTg#3_n+)>WPUEAP#a=v$A@*vOC7COBaJS{a+Y&Q9@jN54m-Fm3ME#i5GE zCeh>ze0UXQKl`ubv#lxGn;_^13_Oj`;O8ZnuJK3Dgf%e`-N`>C3pouy)cJ;Y zX&(Y0+m)f&kK?Gw%8r>Z!sHl^A;7>M?9@2eze%UyWWpTcjt9pH-52WrwSk0ZqWV%k zfTNH9B3&ey@RmDX)(nO+Y;n6P0b;>eUWk4-B8}4LXOvZ=UOp_HB z#)kgbvmv+Go4^lOzFrPXnpQAXeaUXM43kB9;CP?{ZZJy%ty4aUy6NR{zb#Y}eVo?& zna^eW#ZF*n_kAvZu?`U-pWE&31r%n7c-qFEP@v3|k>7y#F`_0VexwVW*VJ@(d z4D%3k9kai-RkA&yI8R&wX-ar(hoQ6iKw*bAzUn@sVA@L zC-%Y25@=4=5{_ut6Dp~+ytC=INP`Gexo=p4zHcqQ8I_(}Z=0b!a{skvfSjyCQz*LeckbW9mjkgb9L`= zc?8JrcT&zW-2~Bl?eJW=%Yg*(Ahwz(IRs<&e-8s2f^z-3m;1U05RabnTsp+Cx&2}r z>Fg?yzcKzd$FZrE&7{%k`K<|^RZduQl#}JM`WmQx^z@EE0 z^rf8-uubgKz~*F$I zhx(UO^!i@ypJY9_Jf1%1!#?K~-KQ1LzuiT1eIL|(AHLpvzpm;C*6za-HUuZ$9z!+dOlR>RWZK{7l}|J`;h15mb|R^yq5UBT6G^< zUHX2#0k9n2WmXU^e&gZ`HwnWs9!Hl`(4$Oc28Vdn#df+qXiR%7d0#paAYrgxnaD&G zwTByz&7;vqBdrs7GN}t5DrMg$y1J*hx(|@x-_)mc!I3@DK=-_l_ec+#`97LObT1?w z6VpD6Wu2A}ENCb0*BLx_PQP`&Z9a9^cpXrWo@bPW6GKxdj3QP`+NDZUN`gzpp|8sm z6LANQykA~@()oxe1l~sUJV#u80>0X8J=*jNs7Yd&=I(wv=VS*9UM+k7S?*f)>{?z1@SS_g@PmLl?(ENdF&3?qNf!MpNK6HL zflRi?{7jWc#e)RJqp_Y)b(GHsIq1IUV*;Xm+fsxuIs!Q8DWOPM)AE=B!XdA-Z`vZ7 zyS4%?#8NHBZ>l%wVEa`*{OwI=>p=&>trt`mfMRAeL)O}37;^-0`v5FCk`G7*x_Y|8 z>}Vc>g5v z8?J@{>uko+eMh{>O*M&EI|%VP4#9sJ5ew(P{Mpj+$8nt2_sJE&4Ke9FDqg3dgQZfc zB%D4XaI*FFvE@4;<`u{xDiA;n7uZ4HNVmpv^!Ktz1K%|$UvB< zQR9q}>zdEgn)=*0I@K_JzKeNYnZiH2F8zLjJ+dGn(d~(vW+LlS-M^kLrGk1F?AGa$1d9HyEa?cqo-G}m z(gv({<_E&!6b2rke;H}ljSt_}8}lJ>j0?UW)xv`_!$UGhR07k`#Sc;!Kn`J z0vREL6Yj)kABD1!P(b82#8#F;C}!}aSY$ZnUgG2ZO3eF6jMt@84mA*>#>e~g*E{`t zAHCPtlkXQGi44#6;U}A;t}9a{H<1#4?ht$uL6khQ7?cktPekYrd$E#(fX!C5Y{HPW zuiT;A-Jt6mkm55c_>IN~avCCQ4ychf$k&6-2F5EblA$6+!~d9!{{UpnTBB`~c;Y$n z-ryW{5uGBD?c7d4!ubNQaTvo{s}@2Ze+QZL+AHxnE!hoYb|W^_$Hd24Iur*NiEJ#N zflDF>5?gp$0vLPi$$RT5=j$bh{l=US6zX?werN1NxpEP|PajG)A*fauF2=o@&w<*& z7iob}@`7QclBxlT3r9)Y{qv&XFMdsOK`@J4M1sC0G=31C^Tx$4*(jjSRWaGMMcRfr zgQjD?O8%08gG|}86(DKvzR4qa%?tgThV8;nqPCu+UOG4tmbC?!o#x{12_`5p!H@?| zWhwJW{-*4j)Jdw4O>6w%0r9wCB{_g5-+B<0jdMi4YkkurpRjmh!pKPN>NC#{sEz>(FLXw3OuItmm`h zAvu6qAS;#DAJ?ccfNY=peFuTf|MAi8>ru7|ihRL9ikurd1j=j^R`(jD2@|&{)Qzx) zHs_8b=gz9<(Q21$aUKRl<@Y>G3(I#92C>i;2yjpz@~~D%N%3AY2rHo!wQ!|B;;}?n zBC~(Z6&^6dvW1I1h45C3z(jEv9~To%tLBd-J1Q2(@Y@9b0>GpyUu?;xgW0`H-7Oer z2X5DSBU+T&1l|*@RBrYAaSBlRO~}3{6=p3|hUka%o`Kw%rS3bYlq;@%ETZ==)0ZxV zBSvi~&;_VZVEB3v$@LL_>l%Ji+}`T}22dGf{y%JeWm}uk7HokOrv!)M!GgQHy9Rf6x8lVm zxH}YgD=x)diWjHFy|@+H-t?SvKiucJKOy_w*=wztH8a~sf!jwktiBWN|JtId_JG*! zLGBOxyl2D$D33a#l*8wS)@;}=NlYPV^F2^J2bB?N`|PiStcEcp3QbtYdtAM(?TFUx zB4^DavAV^YHYjA*2xJm+YU+q#R6C*gF+f>b`t)JNUe{(+_48|@!fT>knIZ}Sb^QvE z3jBmDS2h)4<9x)Se*$^gul%%SpS=Re`T-*=%de}QIZ!tlc{X4uyIvUj03I5Qt zM|z!mqqTCE^OP+Nt37|2UvbhqUB!T4{h1m8G||%%5h%^BtC5ZuE0xsN?gA`iID1u0 ziXdK7hvDDE^kV@8gG9_3-|2@0UR+@x$EQOARn{~0q zmb~~X`$_dU)5~JALzt?6Hi3NB>PV~m_&e+p4S%Q6CI8`6vif_lxWh)|HXGA-T(UM} z|Av;Zf5>H&c0sPutmr*&pe-)StA#8XCs|WcHqo+r<2=irCRP(Tz|)Md!USfG=q!Fz zZr~>yy&cWDV3{H}9tVwM@L@{Av5fqlx3Nd|$Ojjhbb{9V1FhhprNZuAHg=Tp5K+U@ zk?RxI%oM*>*e7W<$^`g`I#v|3^s9Tipj|qR*asVOC+qv zrLm8%V}DN@{!~wZZknF|C`{8*xG}hbl%@C6JLgw*(eyh3kyNU`g?~;8qnCkUWPiBw%o==W970QJ zHUIlPHU0r-WfHx2`0zS!;GZ}D#;67qJ5fHVUO#k5T^BwHZ)ad5+=n%nu(WxN9-FG}pcT zs6Rb~w$kl0Yv{B!!Ij@j4O|#-^xLuEEM(I&sN72q)7#DW*xXx8m8V!%h=B9%`%#-3 zjA2xTK4k^u-)*AYK^+rD6O=@+&2x%24~Wf1lfk=IVaq7-b|3smBl5QkN@PvhhNx5!>0_ zwJfEdQ+-ZTrJU(0Oxl<(ZRb}AY(!!SHszG61P!qbW>be1_pVg%0wJfO@9Plgm%fLUch6cy!Q$K0X4ATc;HF&i#C0D46#wpz}M=mu4 zBN{VW1YSIt{Jl5f(FTp6lc^}n9!9}0>3ykLNA2#2hTJQlVycU9ao zblAa`Lq6IHO&y-$*f}H>I>NjD-}mzw%Jb^xK1KlnA@%|YbbQV&K!>XO^whgI zYq_gRZ-PbN1!hg`NNzy4UYUcIwT2~gK1mqM^kJ)IhjCOf;x<*!EVRDB9D`N|fi_$0 z3wNp<7icbadGu8CpWZ?>qvFN%v9V1dBlx87l;l4GVJ)Ocjd@lOOPI1F1#2ZIO6np2 zA(UJZH#%{^!8Xr!KmQCN3UA;mcC1e5*0y~DK58njl({$kV zW%s|rniz7&UK;;d*!-+3p*Wl(W}Sea09vOQCirmpyCrl$;vFm!(Kw@xqkpR!w@)J@ zi}<|8p=$P)8e&73XMG6GFJCiK&O5)RA!e4y=YlLDfz5JdIt9>EDYFA!Lm8(z%&A#} z$^Jf#Nn$3Brl^LNKo(1jJ>5RVbg%Bcr}v6CbT*0=BPu2wWxxnw_VT1e+&2xK;dS)( zVE0~glOm^@^9KyDAxyvd*EKhOQN8CPG9mtTExaXmWxc1+7Pvqch;3A>KpuU~Mi*ZH z|ErY2e`h39eAwK)eK~tTWO%cY5UVvj%*2LiGw5vic!T@?Ptz&Edt5K3nGzZ)tW3p7 z&hTP6<{-kq=+Z{G$KyYWVg;A|!=K8Qw9r1rnGqIf4g|BfUCzaz_F0@3gVR@7hC3R; zH`uqu!aqOtSZRLfTFlQ1p~H~UWQb$$EESkqYmhU?R9Giwj(&>KiqN3laoeA|fxuL1 z(muE&DTL)l_3%6knoFaaF!-j>(hG}yAGaAK6|(A%FmZ; z_#Qsne{Ct^=Uo8sCp}8OO-qRzRMDGH#zT+* zG^1n-EVMo-Esx0=zusE;{qut;(Hn)+NgS(3X~@s&z5|2avdAoF?l2_bM%cjc8ZDyq zJ{zj3u3on!oy_a?{0T`|?ws1QWgUWLjXVXwcdOz#Ws7DPkyi2W;4kOhwMi_Aq-&7o zXi2KVH!`NnzHi;c#od*M=T__UdN$;q0|Fy6BXCJ_sGYq%;{fc{L z=t)F&nzs1XxnL-hO{Pj(_PNvGtTjO1TnB~aQ#?{F;C3q^LZhv8uTXtVevrH`o-tDV z%?|_IH2=*#vTqJsutUH^P_!gGtkf2g7-icKLJ%d+A8-RGzk70wK~2v3@OtRs<9KM? za`(-^W#$}^%ly}(x{jXYLW83CYG}AElVa?MeU6zcJf4gl+Zq9ZG0gHzCm`$%jWn)*sD=KnUWZ}tM2po+MBJb+@$ zRBkoLknf^0ubVf!Lk`8TF&0aF6{1k-+Vma_=V%We8}+00=%}{N;43d}3U|e$^OpMI zdTfU!DrPJ~uwofO`gh-V2$m(sS>}kq$KMH5LFi@uWC-y!Sl3mY5RD8bL`Sf$CZbRc zMSs3YgSqpRfruQjQI;l<^~dMC*uqw7Gi$!NIh|ux89iO|rIdr3&{LBw?|?sCzw_Vq z_+$#MGL+twcPZ9h&?Xea+lEU;P)&fLT!0E8l;Z^OPr=|}^s6qM zh`BBdFE-0CC({c^G5N0MRCi2PK7)Gc^Rc$e?!1Q6-3%p!TPna=gNqNsEJ=F|QkF3{ zV{-GvvAg6A+T-QWy>HPWuu6~N#;HDZ=Pm>itk0t=@qS|cy-y`O(tANg6j>!5Jq`&k zN3xI2)i3T1K1DB;fY&D9ZP3Fn3;9j@og`Ja>3e<-s$wur z;n^qxWQ*Q^|3nK76Dssq^(iFb7&loyXn*BB8yT@zO5xS+r|&S>Mrou!jxRY>Or$V6 z4ZyH~ngwKeYC%QgROv$+5yiKfm&kGby1>E7u*?3wvuJp-^6MZOTpsvaOp}x$!85=< zEfV3IA5ZJ?;3&qy3#v7VhaF)*g9Mu?B-RXUPD}*0YlwLVSHYH&>{FcFk}T!bW9fH* zkS~u{=+!jlnX!M=)>7Y)m5~zjojt_u6J!`sp3U)Q=AI^xy=qFOg0D`)|A5h?s{Zh5 z%ShJG$S)%mMGV5umtPG=eVb3Hk#xQlqOUKNtbbg}Urkej{E;K$?+KKpJ^0(tg!)*0 z7SD(LsFdLXHY9oEj$;&RGFZ-~2G&jn1$1YgC_90gs*0>wXgT322G3HT+unp6Hzk5G zJNI5dY!yLQzlCK*njGhtBjo^`^@Xo-bykLA8`+j1x*qbS# zSM0g~7UFC|gmW>gj264I6x*4JMTTbie9xiHg}B4d!#3l`S<8qE)hO zL>L-j!Lxo_LTyM>dJsC(n+3tWv)^g|qo6rTiko%+mBeO#saUmu3pxwci!P=FaO6fQ z@IB&+vT9G4NC&vVzcmH2wGLX~*JX#}8m`S3_}8)2Ah-B_%EB0=Ra#Z;VC|J+vc|rO z-t=iHKdF5hZ16+J7i|s~;KVFH;j1-&qXUO*YBteAR@Jm$+QbnGw`dZIpOk|IPe8mh zayTArnI>Zjir=pzlOk9ZB@6=T-kmXkR5*U2yDr|=P`vXyu%7J?F)Eu`)IS}Ek-JQe z_y?HxbHsp&+^K!NCX#j3eXQlFUC@)8W0e`7h82FVf0i!7cls<#{}Ffo>?6eHy&|i6 zN>5pw2$6YnBXhkdKUl+)Umw~2^H)IhAsV_*NN?Fr@GqYjFruXboYW&Mv{0GeHM5En zbJPQm&gTr1W_8dIoDzu^$)72tZ+(@eg`3{=kenD$IybT+J1Dx%7L-h9x69>RGoETz z-2rfIY>%Qny4f*%9tJShnFceY<#41|OyvkTnWeMNXyRH#BM>z-2|0SgRj*3oR@-U2 zqb?hMfHLl>h;`{cYdt>X$K<}|qRv1+j(cx67 z!nTTV^le0`DaG|0Yw?J2H3a2o6up^GUFG%zbX!apt$f;%-a3UPiG?!ba?y5zh(w+` zbKzMIGbgI6Otm-G;zEcSn{WAu;`CZfX_b|}60%j7+4;fSIRoGt$Kz3@T&oh0I@FZBDDVtd8{ABJAYwDuhV!Y%8osPehvcJJiFit>jvZW*^#XYQ9 zo3$pLMoeK}^(xKh(h1)NW-EkJ53wl_)$XDEy@7vg1YdPp4IZJwI^a^)R@bo+(~pXR z%25$vNsoTEDGxPb++PcprGMs7VV1e?lD#{q;lxNb*R_!l2dFm8SN2+*#?D z#A?{~*^B=fC^Ps?jf(76L*CR8rKz2njr~iNzd_>Z;j+`_leW$%BE~!&cb$%Y_J3HK zcVr>&!`_kIF6bf~vLn0d`S5RYivate{;nrFIay(L}BdwuRr5pPw&j(GCk=Y8clO(md$GrjIMJ~*+nmz3SNtD?t7Z~ep9 zlxABhQO?;+I>q44+ma+13%et&8VPv9TY8G-5oQG}nu>nh81_*q zsIG*URdPD<@!RCPn-Cb-KCqV)p- z20TPloFNML9PW73`Kn-Oa)5c4lp(xIDk1#&9cnr4H;v5vB)a&OuT4B{ z90t#*^e+_#y31sOmlzZv-PVwZM*)WTl&-E+pHVb4g84Jd6`eGPU-PeZddk9W zQ6moUlu(V^dRj+4V#vrddOxD&LunIOtxO=0N=5)rvTNS5Hj2w7ZjJE`U$CZsYeM)^ z@j5-*@<{ojc~S*#7`1ANwl4llXW>hyf?e8&l}cpxylD1?WSYZ)I7-5Wkg*r$>`r-) zopEuuqHIdma6}FxkSkS6l?9G-xqun6StaUT_9VIsjnWL!j8tH#@V7xaS}eZ$cJP1j zWD-Kyo)RhHQduRi1B4ZwI-F}3*n=+uEEYOSjG`WD*ge(L8o%5bbpPqgf4!`!X&Lp# zxP)MJ5Pi{BYDArCj5=88JJ>k`q=L=Q5$@5+^!EIVDyPfpF7D|4e#Y~33`Y4#DPc^M zm^oFdFJYbr9SzR+WJ@h2y(_Ei(=^@e7BKeeEH)krB@h#_ol1|pu+=0fJ5M5yB84#a1 zn=|84H*ae5!u!J^8qpq*z5YOw?bUFi&gOEF0lu{(1QeQMOC{MS9OkZAWu5*20qKC| zjY_3ocJUhK#=zWPs=8V~heO1phYJinW$fjgL4#pJ#Bv#QsLkG3xqmM6Lw$_ zl*@~M#1KiLKXB7pT=j>%ZkH1B2x&1?{T$b1P#TYg-kRlB>YlAS!d2MLbnGYtAT$l= z!^NYZ+fjVBZf|WL>_Po%c50k>FQ)(C+5a#8Da721mYKYQCz~-ZMCiF4H{1YCv}y}y zY|vaS#}(!A8k$Y^ntZvI$oCJIgXJiHS;1>iNr!=M1Ia5RMZ?zjpB5Xd>RFhpVhd!(Kc3v(k6r`<40l`V;H4Sg1vZ{*z;04 z(mNC(xzWl95Dwa2k$uVHY6%y%>!=TrjKrHrz2_ z>`LU<>BMY`U4cF7JdI*YbD22wYD;@6g>c(d!xmK+Ttl(19ik_Ks5 zbQ%&Xl`FRJU|#t6SQV<^wf{UtBd<|aMwg~7X?%?7#25*x`Y%ir4$8?7leu7J3XDFg zpigjfRWTIeSa$F_j4I6AL-Hd2EhFnjXy%Zq`FNQ$s^e)5sJ*3bWwh_%rqUZfX?Rz+ z&qOEZZPjV=rSjiMa?Y9?GXhe*4zB^wgkk#})2svW4RvYRMNc0k@0i-Gqu*%O%oqwN z?>u5!83UP+Ehun2EEl%J5>-B1GAsmSdZj#9A>dB)#SB_h;~Rpf5o!H@tS#qWjf$t= zX)NnmO_T+_)n#7B8>uh))&IeAGcLWMtgGjq{ZegzF^59KU*=fFK;k<$lK_MRBh25wfRWeN8DfXZ5 zyCBlnMMILLvneFf!;ytt92X>?6rjb?U|fCBB)fc7R|-T($RZm|L;i7i61-fT6@o;Q zQbMx;Qn=6CrIRw=l2aS@^?I+vy^f%{KkksvkdQ@5v_eFqEp4}dE5f;v1X(5cyzgDt1lG2nVc#dRQQczjYkj3lMY4+pX&Ed2ac^qi1 z5FI;x7O>k7AJfp-AigQRU>T|@$Ks?kOI1f>x2{PKPcg12yZL4O@yjPHl=Y2`n9%yB z)qRxA4`st$ereHiyp4(#@};=*inU@t%X6Kv>#AV0b^CBBa^@^O|NL=_i=clNDP#?J zk#N)bEvr?|i1Cg|5Z5+){~E8@E6cgEwq}@0!<bM^)9}nfY*$&(od}nP zeTKl3x-fK~SADl^gj+$|VaPW~$q9!T%#!jmgq+c8> zyqD+BOp`wqJO z26VG7f=oo0BFlfP;I&=w4$|}iJ3_I3kb49_ab4@|_Fh^02!R#&d0#nuagm~3#_pTQ zCN>-{&-ZFA)TR^zWy^Xu2BzotLyEu=@6`47WopAEs7%<_*;6A2aYp20s}L3VJ={J{ z$k(}j67-$PPmdvwjDpMQ@6_C?IwdrZLC32)kVDHQ9il4H#48{PLcDuF)PF5a$&dBc z+M!-9*sS`K8kCZZ@{lWptGaawi=FwjwOVP%2hRrqvD%q7aI4i2qN_s6eL@b zFs+u!f|7_!If0qDUVzV@*snPZ42e!dC3F6AuYD7kIF_4;k7uPcW!sAGB4{e(7L-z>AQd$AIN4IqT#W^XUB=1&%HD=ZcoOeWrWrAiDc?0iN zM5vmI*f5*pN}QQQ)S=NPj;8Q>Uee||siGMv)r9?lO12tPTsf;*VCH4iJaZ$HhE5YE z@JP0Qym48|Y3~HrMr0ukyS#;!d&m`=q-*GaW&Y)XqX*PHlfcUgu#jKMUBg?4*2?`g zo_D(viDT$32+B^V8~R<{!;?XZNT1>oHy2b94Sr9ID3yJUi+F>#<5n$wsvrW9!W9ks zS_a2=r?xsbb#lv4p53I(cK*U;J*+|$X_kbQW*#&yNwzES-oCPYitWI5g(NvwyMl66 zPI1K8;=gNt9n{DqQno(w@3j?RL!s#<^04AwhilxEfKb8sKH>;*tj=WLfT?^ziB%G< zfsavuf=H5n9$CXJ=|q!6N?#>Q;ey?!vTOm)1laA|^2%aQWi6h~w}8ejKu-$ly6!ai zp3THt*@2#nCzW=hCL&b;F=~M^UhKvSw~B_nze$w)MI70pMIVa}vl-GVkxZwDS7%W= zj5&&9lA5=a4#&iq$ABS49mdE)-zCH&ef*$;Y;I^TH3-3Ko()oJeHM~O4~sU5HOE8& z$5D!FBn#Ua`H)o5q_EfQg0NGBa%r^Sr*2_stpF8~-x9;M(hLhMj;U}FteJCVY{TfX zd3hG22Jo^SEXgcVq+iElS~YFqi?zepUG4PIEl^O&rhQ2C2uYT94{-28j;H%y7czS_ z0iZ+n#QkP=f6ZtlU5D96-GuL%j&W)GFKOE0a_^U?t!0!3Gp3>_Gjj)`VS9?M8l{D) zskBpkBjiK1Sm~7bBN-{qAQQP?>G0FwQhN6mC}!FBJ-`V4b6jSOaGHRYqIm&TnAIu* zNpnDgO5iWsDP=)P_(E?7Zh2SLou~rLTR@XYR0%InMVZu&Y+OIrrk(x#R4GO3*Q6<| zR5n#5AH&+-2K%@1QZe0{;T04a#<;T5o(Et_Q&su$q3$otH(v^QNe3_gk>Kkzy7!VF z2Q5fvGu;UTN*_ZBdin=76}gxzxSmh&Z=G@pBtZf=1?!b|@8Pp!GGO|n4sW2Y37@Ca zZ^0H@c&DSk@5ky?}iW_AoJu<|KS2BMD z=z--;jV;I1mwoLBMJf1(XjESa62r|lHLmP1lJK#(&(h~11BP849VtsezWQ{2s2iH( z06yk&RUFkbiFlA%OUXEe0QOIqIlWgA%uxhY>nYawRnQ8rVX5~cyqwUn{q-qu5#Q@T zk0lI*<8?Y&lfbV$l;o2R^mU)JKuEQ8Z?PyndB;HxBipDrB5jnoA#aIkW0ma9#3;$b z(2dkDxTIw9NYf+fy7tF#(AL6Ifn~UGW6N&K`+5gs=zPD|t=cAsamf~N%XG3j2QkU# zq>VJkE3&6?__9le8u0lwTo9iLi?`MA3!%mt@@2 zs^$1N$1^j@9y`Xi?(09`)t#t|*p?i)-H6~F=Y+yZs{}_Rw4}QLi5+yN0e-5V;f`iWp zK@n|{cBdp1^EVAo>5maxi4Ld>rrSxGs<;TTBKg8*8&t0zilLR4@}v6to;&I~s85`j zUMoUO_S8_;x7Cn7dpuKJm_F~=)GW+`nmSs#C>A8uH9l`6_aL1SgH?uJVpKA&`giH0 zTzQU?*8s?K=~0T}0ejyy6~PAHh^d=f-@bAK7-4>0*NaNh2Ylmw312HgjYN}ynb=YZ zqPIevUaR7lqA#YgmUWMdF@qYq>DnwB%S%OFpM9L%?7p>paB z3A)A=5&f-U{R08rUe7z7i{nl^b4$Ds4@b=iCl5fg6dt?|F?=4K2nJ?ME{pa~mmMXN zVl;@#XOHkYoUdfl7FRKaPZ+lO-u!!=<1w?Q6n86f9hS>i1M&US@;!zYQouP(i4*h` zJ#Gm7?kQ8M8DMTyHW$q}k?sGjxxi{BCEa4XSCNn}p$F`LeDERfx{|M8yh5&Om@d|U zzWSP8J!_tQ)$F^AKypmT-dEmb`}keS5@bvt7wayr&3bf81@yhu?0q*}lPatFQIT^; z2r47Ff*t)ZSB8uy6c8lAG&6A-xEG!)M84jz5JQe^hP}~q&Rb$`1nz@Kr&9L#hA;|- zgvlB?K0G44C+2Gnca`+`;@)y%LZX+-lLiA4>qGI`yLjO5|F0Los``lAoSJTKwkrA! zcptz>G{AqG2mk$)8<*g%n)X^u|J%Z#{+t<#T^!k72oVpbQsjrPFHr>$cM8>5s_<+i z99eTCbNSIK4buJw|J)djWHD)wJzh+@dBKc2Q#fQ2Yen}CAXE5`J;um<}8A)21AhRDVBM}#9M!)I2XtM=_5mTu+(<0aC!+&e=K(do- zlG;qa)ts28=*R_G8JIfS@h(R*DWO(Jn@%*j465lI{0E1J2@x3_1%0L!Eht?_DEduy z$gb^thK#?&4(y7!+xkcZ&=(M)evkeeRcr>2*-Ru7u*-j)`)t+|@Ulg}tGUC4Oy(fTq9hr6MFr8p4H-Sn4be%uy33NS@n8?`B>?|3WrljqG1nyx(M>%9nox6RBK7dI zcv3#$zlhuH`6Q!9juT9?iM@^rTH^84;dFD1{`oU#Q2}!U_yKn-IKNyLooV+Ixe;jk z3fox(*c2i2huh{LPX;6i{fS-{P>`2%r5Q@6)ALHP0!xsnQrp5$^ixVPx(aZ=wWrT_ z-6|s}(N~ngMcnDCBhZR@nIc5j6Iw&Fk!Oi2sVR54D$PQUKpw2qxg(-WqMR1ujn#M~prDT{4Q0CRhDEVuOEK** z4g7Hb=KvX&JASkDM*&u3gKQUR?moMSpn{d&rPc}vPRQe7Z@wP@lG1enco)yJ=$E^Z zr8E^?K4>yx`%y;`x#vM2YmvM&=h4EA-_{tKK*gBD^eourChm$Qim+5!^5UcfQ&T7b zeZ>4X2Wux;UC~Tq@}GO4DtIC5zeBgrs+A~R>nL5>n&mTbs`nbgFwI4r`~mA8p2Y9U zh+cZ^GG<+hoQF)L|5KDHldver2z4TH7X4LTIV;@8<1mj^t_9uUI`yiE`*>IgRFOqW z=@qJ=*j)^ONFq$T=GrpLZD@KEtSW)IK(~{>;=F)dpr6U zs^+y7Y20IlA)?z|_Ed5RO5(=*8VypqXYg+TKGtdd{Mq`L@!;TBpJSv+j)5;sdPNTpX3mIwudJaQR}0rJco-)$A*HRdya0HqY( z)*rf9)XBUhA*vfS9jKm@d*k?7-BXrohbtup;*}Tu#n`uPAUpu4PvHQiZ_4PW`Jim_ zQc0cWZ4sq*yX6X90=;r~r71&mb`k$caSP`(mJw{t))JbC?}dWfn7yTtW?POtJ}pBx z6KcHEMZ}hjoqbL>Obn1J+aL4!R&JMoo1Mxf?4S|(iG zRjKTL6eLnil!hO1KChEf6W$0L`r!?R$>r4B7AqYR&H6Z zGDyi<Qc>k*PPUN~Gw!(0^5)c>NPT>M+B5plzT_QI$lwkn-lHLOD>e1Ng=ZtUUT`dNyTqH>vt9q&hBt+PSWN zkxizHFr^j!$yC}D(N#yWi*!jsBeBbf!#MQDq)L4Tjn{$}cV}&k)rRcQ_L5UYlKqyR z4=XjA^7(jwxNeMpp0JEMR>k)grlrKG8&$#`nD2whN!|i>w7J}`nboMZuV|%`0d)U@ zqzmi@?WhaQ#3ji%H@Jo;l@guMwDC|xnc`XkGFzo+7WyaHlH=w^sIwSA0xvJI!^1|k z?w%o)Y7t3Sf?WdTD@s2n&}P$q8K2py`sdhniLqlv0VkSDwQZ@x!%BUP?(UEf#l*r< zj5(z1GEVH#h)L+BaqStn!)E0A#%(%F+A8sY0p7%)e>Aotii;c|&pK7xxoaCr-=~DJD;4O`!VMX#3N(3nPaj z;{(>rl?{w_3at#fPYRl$0(_0Ak|{k zQp0mr%-iyaP>KcPX79(ozrWw+NqqhhDOYtkG~lOs>AO5q!d%S=^2k}xE#?YDS(o63 zM9i65P<)H3l5O{dQ@;a{*ziYkkFHym#CZ|JLJRpL!a;#PKaO#n z@d%m_KCpgN7_VEp#msKl?J+}wcYPB*FlL%-GrWH4z4y20P1RbPFQuOQeiKi-gixt1uNx6oy#e<)o}^V8&flOG_>mTZHt!-Pxt zDG^QfWP_#}{Gm9~*_3vFtfEG>X3vQ$n&-3at8nWVZ*EmTZjxSk*vG)Osz z6a~OmOz7eu%u?<~hxQ!u$dCxWUhN-=}z%8_X!Wjt9^lKoe!h|3XG-+SRvZ-He-vu(>++~G|(|DoP+ z;b$%m=iN)1B_n&Ha13`@1Sj`ma99)J*tgjPW;fJx@D$)^wD*H3iohxDSKu?F;H7ay3aI{!iNOGr z%hArd6pwp)o{k3}D|ATEhQyc+(?K<5hs*I106y1b$VvzvN?yKgRfBTwnwoEE#7)o1 zML&m2MrNZD$-b^qP;FDm76^RXO$HJjazsR{`0GdM(OM%Q<;(BAmy~BNPf41}aoCZQ zyW2(aSXcaf2-bQVrikAb!yp$)i8$?OEq`7(Za56%xU=H=2N!M@cBo_<3``98JRV+) z?nj!Bv`LxYNfC*532%MU`RP_SVwEBNFm}(<7xZKstFKxh(A?4J$R+Cb>X*AQsfy^d zy@a5_>C&ud{9iYRei2arzyZEN!I)RZ5u-=i9{bqAflLM1SWqX+V|pc#Gd{|V;j1O+ zIYnQ{ky7@t$Am6}*B7cTh+b$m}X5 z!#ctB+rQmEC23Q$lhO~28M0mM1eq)En3-7WYTFEMl0t%Z-Kr}YOZ&rfF~7kqH=Tq& zKJ+}0344>gS7e-OFLdYHIQ0DhtjiGyAP>J;Q2(!wg{vN@U-VG^c3qF)h%f^4BJDCa zSlP7yQESrT5dS6K>m7R(@jUxfBW4;y^_JM zthFAT9*GwHc+8;w_`}xQwmtl?V3V(k z8E$Du2L8~o+{~liniM$%VaL3nJk9}GxkH;{ns|)Yp!yy*u}A^j=hglmpY3@*O(|BC z>z8HsNr;X^UUS39dI7}vsvH$Xe~cQ!bqB>*aP=;~sGg$k)xeGR%MPUVlUJ0GO(rat zW}tnSykei>@E(=Z6;U@YSv6F{%YqUyEv>p9ys)GpT%0zELkRHO^t=6q&a;d%T=fN| zSToaBQ=v9sI`;Rlj5{lSt~MWDNNNeH3K5>a^d6Cr#^C{1{6S8tc2Z)Yu7rDhp3G;6 z_hIzljoSpciHNRdRYsHbBj_WnkVsG=CPIr5H+vUd_2HO}FkZuft z8LX=mDUm>zAlu>D;}%En>#x#_x3djAM_~;=R%tgk)H45wir&+ltjn0zo#~u8)U~rR zbCCyL1l%5aO=a`|oyeX?Hv|AK@)dC9nzCNQKopLj1b{H#)V|M3-=15SN33|47z&?O z+4o+HAV*(WSV{E^bd8Pp0&Kqorg1Ck>pFc7RBBuj@ioysRXH(}Y2GL4+nFmis1lZK z`&kh0@AN6U`*J8&xnNxHs#^dd!>nyyOBdv;_);W&>PN|u{~#%H)SoY8VW}oJ+F17* zPwUC9?#b#{>0rYQTob}Tj*c}Vj!TMCkY^G*lwp04vW-p*M zd1|cR-TL3)Wll7Ib})+y&|mt}V|bO{v_Xbw421qT|2)x@>ep|@Md&v%U31-JXS_f= z#ox1FtW_Yi)~jt|;6zp4GVvavi%RWWZZSu1Ou{r1d3AYQ*jx##Enj4#O~Z9txW|C@ zOZ}{)_n_~ei-;+?nzPr)!>|I8#a{KMlbl)Y-?5X)H6iEeZtuN-SWM#IIX$S$r@oX)D)^X12OAPn9wHZL22>aBFI~0L+80AAtmj=P zWM7Q0)9E;A4xd-@lh6JX#nHEL`Vsex^}k?M)yN zthT}oTphyyQgWa0!J(k&%yLW9z#+xucP(+9Dv>HeK~Ml}Y9Hboqwo z_p67|Do;*-n~-TMVra874`PKn=4K$ zL3ov9*gX#B-&fg=m!6#4z@qs-o6l_?RrF)0e`+ZC-B>a+~zi&oaVb^6{1?4D=e zZma0_tUZ`XXw(rSb}Rim!$)M@u=?BfU?ttQh2G8^G){-3I%iweKlPbTUK+nW&MaLz zo%0^K?9Lc2cn-}*(fh6}`WupafP8F#bDNc!4^9CH^a1u;y}sEVXQx!W3cTa(zy!K4 zj&K1VoWEF-NiP4j2@ECp8-d(H-*QOZ^2gzJ@PUX3+K$j$u{(D~)kD#oadeez;gomz zjnbKI&XY?1-1`xcM4EiY^x462;Xc?J-u|(XpD_c4 zetFgNmj_tQGpDgNiRJSnZEa;vIklO=9Ixv)F1whuU|x-Qa0wB;NAGMcF70{GmM^FT z+Ks9ZjsE?LsNn5y8OpAS&nU(1^^a~T zvmaihS`wi;vl}jt``OJO*uI{H=jMC#e&pvI6{B657ADK05qy+6v{~Ww* zt*sk8DpImZ^&hI%)wGvkL}{-_rJecC`TeB5fXw!p=3Nes4DhMi+{0A)ra(TJ2nMFt zSUK_7HaWg^8hE|hS~YYDj(7W$hZ!Gt+q*4l{d1^fjF0u>Q{#6h(JbxEj2he!49uci zjII^SEgg@Gr~;?{#ZInm0+J?;o24~QA!xjMP!MS^L1oRYO;4_39#2n2e`bSim1TTTt4e*0bLlZ`|b?H>RJE=>=u zBQ&qoGX3^0XTwU)+3Pol%Q+TCKc}BP6!Akgp4UnxH;!yRQo5d5$8k>Q3wFEiKHaw$ zidYE@Hs@hFrOaF~L(k%Dn>Nb%w~QM5%G2*^NZ|UKU`}864Ih6yGzbRWou5E@uk?i6 z3_l9`l{y9a?BvcnTMgx1xf+~o{OnG4+cr+}SWq)Z4T+^PT~uh8_~|qDka`fMlW|k> zadbO=tD2R?6ft4OEoeCwJ2C4_C6CYdR}02!0!uqarI0h?-YdF!Y%A~>Yy3DHlYWp@4sJ^jXmGx6PMljuH*{&d8om zT#lC5jRO_=v#izyk>7fwoYq~Rq61TBeF$26%m;UP`V9PjEv-dZsn{DQ8JZe+Simec zx~2Oekjg^~PZ!i$$vff)SUw29?@QH?;?&Rj))8+LU+KA+!rKbx-xmz2aP_%Pf@2}N z#uJ!ZZQsRV&BEP$$r!HFYNMU9zTxkW?K-`u+<;oZL(cTr(9zd63<<~dpbaNFmyVrx z!U6&|k3At;I`YEo8eVL zdlq!RH8;nFOWio%#_4XHZ#!e#L(U_{gQnegR!nxkJ9p}gasKG)xs3BWw7u90fl&lR zZocstP}`D8W4OL;q~+%<`=N{V)swHk?S>m}=-Ku-&XeEu^IqP@*P9`Z2p>7!s&ftG zy0&jkat5FMZudThZE1k3?CU-th)E zg^zB!IfpF~>9JeqJIrl-&$h))juX1F8q@oTSHI@9CX;0xZF9E8TDd}CpApdW#cYQU zx7TFn7uwHu%jlfV^_@rB9Ov7+kMw*}+c1Cfr2DJ=oSlO91L*BH;+pE}|MP(TnwPP* zF~yPLH=n@!#G?5yt;e--{)X$<+Sh0E8RvO2Zl(A$(4n+;k=NTdMOMc8w2~X$ePHQXUXSx3PL-c0 z0^PlofUNDus`GXIupN3e?QWZE8Vc;yMRn8DHjR`RFxvC`m~F1+l(1_Z0ez3-D9P+M z7U}R5Nqy(vZ>1%_5EwzA?|ywIy>WzXFQ?PT`Hcrk+um>950||dTy?K>1mdRi9lA{> zFBr_bnYOj{_CfPGef~;sY1zLM1om;ZE$YQ=#?AIlK%cTdsYt!^oV)&IpTA+;*l2b| z--+GDQwU5%z)v1_^sVqr_uIcm_(U6ex3yEvB2#VM6MfOX(DwcJ&dOWZLF)G6%WQM? z{{b$Qof&~Vx7)i4H$vC*6S>)-VP;vgROrU|HviyWqfsW`W7I2&Sx_wAy&|B~>w!|c z0lKtTiPP(EYG{9>ag(=*$*5!CVKDBE_R_U3ofPiP};KhBHX z4ju9tXQitgfqjpWTCeKHueH?{xLxINR`V`30{UCxA8}FVGPdV;>ve`Q`D+Y4xEUk;t&Q^Y9_O!G zM6alZ?e8mCP?%54lv>}V^rTI%btGtPr}b^m71e((J7c?51U?+=eye_SIpRj_)csUo z-w*fC^r&!@sHSM+8_urZ>*3t$;c%MUAUySAWB;zpwII2z!oBdFfKE7gc&C509ycKF z0+^AZyO+@JyPRa4ukpNxrZNYBfT*bryIm*jdw7?*@UEDLDbeB+AFC%0c`dz>#BbeC z@V2MVx|Q*p^!i%}>;i$&k+%5>dR+4&T9HMP5!!mAecQ)Ue;16E6yZumV6;!{Lp!_} zSmH*v_fV~`>2!-Z-3MJIvJlX{JSwdsXi#*$&2x0rd)%k7Y+UTdqrJZ@p6Fu_@(R^@ zcq+3;1oXG|)_>ze$~N<+zopBKcE!C$Zljh)OWv4_meqM7a3Baw?CKjmbAASl3v_dJ z^K4sV`8dz~^p~V-3xV{i<~wgX&uvjr_ikdHcfDx1=k+X2?ELCfSG>x)%f8RHwSLxq zULjm%C|7e141tC9bBEdWW`=fTZ>kj6$dbc4ORG- z?a*TTz@eLV6SK8Yvg_n+3~ugq3om{2wvnp;Zz55DcZ0zA&UJ0zZA)|8zcvpr_SRrG zYNpqTGm&!n=2cWG1P%~^*6TWtcE5Fw+)7T}TlQRA=r(a>!$Lc$AHdk}>u{CJ?;M5Z z8B5KP=+0%j)wr$4b+KHF;(F(y^}T%_=dW_mFYo4!1Wxlew)Lf!DB9?Lo3CT{UG@AM zQxdNX1h%HyV(%p!!X~J`aMPXc721^nYgu`PA<#X_yZw7J2=Al$o8$ZiDkc&y;HZ;A zU_TMi0}rMXP8jF+vt1?o+Cd;=_h7wHJm*b!x_jrVlUrhOFkSuHLH@FB>AuHK-GWGq z)Xtm1^_zfx?|~b!xMb2}-H!=5E-x?Iz0@+wW%ClNYb%G&Eu25&hY-47)oPyxEvxAj z!`j&+%ZKiG{P6wm^PblqKeD*igxIod*%aRDc|VoVx~w0XICN-f$?sy>vT}84?cDPE z*_E|3hu6=(&%52@ZEk$al|$`!RN7uV=495-Ev}#I#1ejb{ru^pD+|jDt1Eu2V%3jp z(XdK=Q@x-6maI*N!=W{qH+z#edjI>p7c>4pd-nn7WpOkP{Q7a+arCD2qEf^L2qH?c z7sTF`SYt1!(WtS+o*2{B#3Xi;SYp&*1ro*HW5J4wz0tW|{@-~PE+Sms*Sr|<|Kag` zcz*lr&d$!v&d$!x?gO!$`f8ZC7g?%t8fQaYQDMHEB?XN=*XS7SLa2rsITcJ8$|jHJ ztbz4QAU9MN$lCpS6z0`6)cW>xqp})XUsqM6I$psH2W3?n_14uQti<3# zL&l4xca&+Yttrm8Fkd5Qeoh@Y@Wh>zk|0Z$FOaXVmO-L+x#!nawDd8j`pSg4D&QH+ z%BhoCyYlL*rN6NBXfOC1p$z!q$rQ5;IbAaS}DarASgFm_uNHp^rUqhid;l$z|9D09HADwdBmtKQj%mHT0tn-keSeCjSXm<((|3y^CKUl7 zIF6juRVIgt6bVl${!-5LK%Tu?+KOOJdiIdm;im_Uk~0;N0;QCmI*Xs$k{YEgGW$zi zCYX)_*|(dTgkKL$6~zFN!B2I4>7IZ$(KAs)9@R-yFyWK3rROg}_#b|LalFXW%b=O| zTk56${;${aT_$>j&VX9@97`b4d;Lst7XJgbE2(#^u$IJblnlX6D$zikjW3Dp$eaEo z%I5B8VnhO%=#MGhD&jB6KuS+}zHpCD$I@u5t8h2O>p1F_;oryuL89USRE0l+of#y$ z2~__j41jnQXs2?8SEL)wQ-^ObhLi{%yK(Nv$S!-%)ii?YNT|FU5n{Q?6bc`EAtWQ`jUc6X32KXxc z#v5;Z^wEc3cG+bUcG{t)s#?J%%*YG{&vIf7$mvQJl8?uqeDd)ZTyXZLn{MiDvV^jZ zSLD^Hr=GgQ4m-4J)e3z1U4?~(K3nMS`nqWXne-W4^^O}i?&zZr`|*!|yxC@(!C%$s z4riD^N$a-RW}8bdz3BVj|NfvsgV02Zf--21JiasDFmK-JZu4;ABQSy|aJ#~gF^ z*=K?53#4ccva;^-oN>k(+i$;p%a$z@^-@I&$_Y+VQnCT)+5L(uuGng;t<;`U+P81N z=9+6ZaS)J%z$Tk)A~CT;L40&S{q)lhJ@nANefuWJQow0KIJF|ZO0Dw>1kVK-L44A; zw6qk2pa1;lLxv0)K79Ddkt1QAq)6t}1VvQsQV!;cjNYy~7sL|RG!|B5Akhs$pzUW$ zhq<3#A+7sg(SFdcb#iK=9z6DoS^yz;Puw-los; zlKkeH04y0(1T=YI;v2gv1yFJ6?g@v4lBz+IlHS4@o(Warn%>F@tZeeQ1LCK|R3!1b zq@+Z>E?;R+c~Z870A#>yN^cJN{}0kN6AiT#eNfc{Dj~jf3Lz!BOGlZ1(_VQJ%Sea^ zcf0^ukp$2)_y~>{fG55uSxT=Y0)h+jfFMyp7f=$tN(B>}fFdWdf$x<(=|QC_gW{fL zXcA^csPj|>P%b&M7BzU4a85crOAN3wz{=ZHg>UZyD<`ZFB+*0$mkjO+A9>`Ik`mq3 zm0$u0RRBSdS-Q+bQDVxh?I|bV>A?^axaQ_+Z|Wl{{Y!TMfdUyCUIEx7!_otlOb?`b z6P{m!u=?l!h5{Io#0G=XLt>e9lt*4bkT=OpN=Y2|EDv5NmDrKQAi$)>FY)}4FIWwQS`bBvSJU)qIE%0F~yKukY7_>*``gKEJJ>AVL?Sj z1#Ms6s#rl?%TJ33Es9&#@W2{T@(YxzuBmEKT+EKjv_Kfgd+)us<|uf;0sGB(>``1a zz8S$PDi-zV(QVy9YY!T*_L$8!|K9h$$3uqSMFoWwHMNa-W|Ch!n+YXSaCFit6a@U+ zwl1%)t>M_Js;De0Z%qwJ=gX{b%=M5_EN94&0iS;Q>5DJV)E1V5)*)Tem`T4RwTqHO zRhuSFnp9lG4WF~mKKnfQ;Dd{0zCMjWUmicW0LcF%k32&6Rr640{VO`1<((Kr8;kUToQAsEm<`s} z@@s{OrfQtRrbIo@8RB2#ja;de3o|4wC;EZ~W4+nWb=O_@v(G+z^UXI)N?Re96d2Ot z1VE9JqT<@>u$!%(z*7cTQt~kOAjN#%^Mj8(PJ56Cm%70B5VaH*Cbh#~lOzyKulRFU zczKl|D^*-j$nD&^tQE#lIe37`N&yQ)4|vp&AEr;m;;NR#;rpnmj0Z?sVAZqAN@Fs% zq(zxoERRwP7A#OvL1A$s3s7kpP;;=lLx*+?=g;Q>&dbk(2Fz<}s+eG9W#up_EHJlM zd(062zr2u_tfEYdLbhG(>_Bb$x^nSiGhs83Hm%#CZCy?fHZf}{9g-M_9+R$Af$gS^ zv;?Z=ZnecW5~od@=5E!ix~kfMg2h&UIRCALBEGH^JZ)&mv=GCwI@n}+cIjk31i%7U z$R38&o^Zkmx88c|d+)ucY_A?Y3}G{8&Xl25%Tk;I%6?aSZtH8gCPVFWS~8()>%+cG zn%SBn)llCM+CZPo7Fp{FL-?KHQJ16t1~M&zAl&Vm9H}hVqJp*78u-yiAI+OLuVsrO z9h=l4T_!@&b`L;$0H#%GiRb7DX0SC?$Yk9P6{uNnGi4AqlRULGl|nHjx-3?dwk%y- zQKh|xS{Yo?7cv`**r(38l=#d1tGD>CRau!%hXfRidJTUu@T)s`%JUL345oTr%amXJ z<9|m198VI9Unq+;L^PfoEF9%A34oz>Q@ja5Ci?}LURRUxH@~*Jl9Ui93QJjBa3}Gp za=@FOzkp8kFSQu@PdR1sQ%^m6*IiSHeM4=yDlC3{A?Lpy88-QO;RuU*qd(SPaKS~! z!N1*kXH8X=S~_*=r0Nep{IF_qweDY6Ut=Mn# zt$+F8gAcUMIvcRMiJ7EsLNbv;O4j36JQIMxF~=O=wQJYgZ@)ctoTs0CMky*68kvY9 zM;@_Xl)0h*)soduU!4NWkG4ro(SBBc>*~Tb;AWr>Xr&O66${aliqm3a`a#l}i&^RL zQeh>1LVj@ntE0KfmH67tvgTU6ggu!;K~4SBh^t?v0VW7tSMAw@bXvWps#51Md{XqY z-~I58JMNe}_j9GF3C<5ArLL$;s!pPx6p(qHS{Q$$M~{*|ZQ9?DJn~41G8ki|c%DCh zzM(=eqV~@4A z20a9U6?OX3ORxRrH@|^{;sntpGYHL?Q@d8CtL z)I(nJ169?H)~_T2Who5sU3cA8H%SV*2^8HYeCPMS|NSSQ&hOE^vx%1FO137Zu#yK4 z9=zUq>sbWbV1o_TSYwTX{G4IKHdI|AECfIU!NWDzT;n;}K!~hfD0S)5a%;zByLGzWiWrK^!lt3BbsTvjzq$kM6b zJK@}O&$Yl_S-IHT45=ln5YRSXGR#XfFGh*f7I!U8U0~wGiANl9$dy-K*`Y%R*^m@i z<Fo_*Iut=Kx9-6 zt&*R=|Ni?QddLA6Uwm=*?%jdaUrd%{!y4IK64Tv-Qi`Lq=X9473;ZMliulQ6vdPGe zF248zAqki=bm-8tesJm~mt4Y}l_7C6iH$ovjdW(ANfMGwCQ3C*(24?5w%l?{4TO~Lhn^*>7X+HY z^Ev07laTR>*f)od{94zoTjwK=IGm_Yo_svbFl^W`5YW?G&Jkew%iLGXXLDrykJFJf z$ssOalV_l??5hGytjWYYe5oKLQTeKHR?Yn1uv*lmDSD(ymzmw;Zi!M0x^wawF>thCCIg8^&?TZ#wyz|aG;13$G&Y7p5UeY4(zytT#WW;be zzHYWvELvcBfsB%~%EgQLO(E$S1vI%uQDL_=x(*+{fr0;r=bR;{x7x_ULprL27J;GW zGu@JKqZ^Wq`8jv|b;`9@U&D=Y^5l~)yYweLx^>s~#S0e{p;u0h zs^59%Ei~D1{q;`!-YLa}IeYB3%ZTB_`E-*v)XI!M^XG6#S65EC>rSQC?8<&<4+kjy z?QeghF4@^l`fIPZ9M`2&M@xue%dyV|;W=~WXrorA;UAvT|N7Uz z>YgW@a5Sqzic5?50a-6*cG{lGMp8W;o%8zZucN~+fB8#t0p`#RH{g;%3Z;^gRRt<} z<){0qcEL>>32IfvqE9~hV9JyS2CUQP;tPK`Y@-b@FXx9d#Q5ey(-V@UsgZN_5RAm3yH3>VD#$I&8l(;P^>L9 zNI{wIYj!>S(1TmIDy3PLZLiK1V()ME+q3rBYvOt5o?YI$Oc&UB;)I`GcJY4u?!DV? zEQuX=-F4?Z_uT!26OKFf*dtFq`Q+%i*~KE)qBXm99W`phGkIq`rn*p6k9alYbn4KaM!Nsrdp`c?^Pb&1pZ$YVd-v%H!+{&63kqz_0Ffn3zq=-zmY#Ba<^0HQ@MY=FV#*ZEIv&(+6h(X*S~Kc9jCf-aW+sc@=TCszVyPR z{dd3k!t>j;DOclOd+l}6MduO1op+iral(#vAMCl;?#CQ;^eHDDd(2TsmK5tXd9;Lv z=xA-q%g1as{D(h0hk`;8Jq{VI{8L0*Z@r~1(5h9b(L2`tVw=s1{u(TGsy1hf@uM%k z_&j~*SHJoNi`?wA1WdC;^Xi-iBQL35u0Jl%&($d_rT{6Wg|LZ4=_cgX-A}}4Vzq12 zx#<*holZzs{vaO}}X?XlYgmVl`>@uOQpGV}9EJL>}Q71x@X zBD}8Nnz=Cstdc3Hn>3f7C;)Dp=WVkVObjl&^hb*pEM8-c&ZnGm67(R(1Q;}6;D#G; z2@f8&(T4r{^zPN8JL%vM;XVU7^lcF}7#fx1``W92uMfjE8ByuZ{e9kf=W>6`j}Fb@ zW7xCG$C>v0^Dl6Jy!F;>qr>DAj^ApFadfOpTi_f6O|~1eIXJ7+|1%2Ez1WR+SShN) zffq?azA7{fB3DG0tIGqc2JeXCSB0}`=KspG*p<}`bVOO!72nA^{nw%n`~=*fhEMg4 zRDNzpF74LE2OYGZlxYv#kCz^d6CR8W7Wn<-O3^KCTx9kbXsaq~OzWf<7v>e0v^x33 z$z^3N%-L?aGGMXwwY~P(W5c0Cc~9reo8PW|n}v&`@5rOc zFlPj(5Fm-96$JXm^parM<#L$9c)L|fPx zst(pyR_?X?j)>2vD#G$K=f9IkHeBlZ{PWLWef3pTMJr8~^3FT&(^n{lR(PEVxI(NFG0C>BWks37 z3*Sg%z}$WJ-4pTAlL|r3QKN==Yn>DKRVUh6aTheyB1P? zn{UnhP!ZX2)m2x0|NGyQX!&CH?AeL{LKWkFzkdDcv4b2Kid-c^>{rmT^vSE`p5fbU32+2SF^fTXk?>%-b z+*GF)0}7ENhXV%=?AfEs4}S0i!lM;3j~Kr3=bwKX&zWnXecN{G+IZuQZn>p14Nr_g z2(@FJ%E`I>^2@!|c7&oK2yNoa4%=_pr%xa2iqMc>p5-siM359Q_xryuIB|Qs2Ht)5U2ABtGC#~ZV;pTFLNZf{ z5k>*NXNr^sIO)JWPdxGH-~ayl`|i6>r}#1|*>AOLCNGM9s+4UYzy9^lkiz0Knhrq8Gm8?CWMr-vVX>b>_q$eTG6&ye15=+2>%`iW-``XqkT zWt*;BmbIvkk)mGcb7@ITvBbks&0u6M}6 z2Q6B-;LSJR#EEw8T3vY21>L)K{rvLa}x0RnYf*rbt|nb26D`14oL9Q;>M7{ zgZR=*@U-iSo9VpJVrNLXXwx8kIh7hZT_qm4FTLx-ZTj>7WwC2z!AXdT39MYS zSd?zaXHM=df4=#sqYmL7?c2N8^9$x%WD&w-D$5c1^Pm0{ajd5}(+g`_mIe#5A@|F} z&(e5t!)Fc$Jnk5pQ9v&;s21kM=E={?IK@LD+DFwQ+ea$01rGKh1VNp^nO!ohtoAks zhYK?#p~eQSvUzhpXLK?pIU1}hloaQgN(ovvPD6(PBnj-*t6Ob-4!^_s7hXhq!@|xc zU`R?b!jk0W$hI^XRSAiO#^^QKW;W{vR+2fDKmGV4^~O?1tm(DT3#k_m%#|iozu5SN z^XJ|Dx4ZV+Z%=tTckU=i#@h$(yXW>h|4MGrSgaRgV#0*&ZvN9BKmYU-MCQ-7#i#|e zt1JoTNYsDzU~XYWs6L%}>irD~I=BD;KmbWZK~(qdy7NwJuie*-(K$o>AR1d&Q-K|e zD`NpCr@^VVv680e>Sx5B!emKLpZoTh=Z_Ij2m(+ayF}I-E_@$Cp-f#fr&sX0Ggiiy#y5@}Iihdx z?zG>_FV7?)lnKefFD5O@N0gu$RAY|dMmDRexdW0Wq_2n~f+v~OW%Lxtkm17)IasMh zi>h9F;h(*G_P|X$ODVv&-+s4GpYHSL&RL^N=TwTMn&%((-NPc3ps<)%uCCf?$tk!i zf7TmsTz<>jpwFI=os2)LL&^+9^IxTHh?|N83>x$CYeTn}0#aqYDa@7lFvzkdA$ z*mKR0n)~jX&hCVyQ4gN#N}~foLa00cdi!_2vtNgHt-E&alywmK@44sRyRBWzuZ;$d z9d_8}+N-a7Z}vMqx~-{}_doo|-3VeM!u+{&t!BjfeMC~n4SY&}yKS}^JfQD+=bp>f zH!+oe`OD68d#FezBY2{e4%c;laNjiF`FFxilS+=kVZZG>|t_I{>PUd2OR{=7M#*_TT;$UiA^ z5#VMqXl$sgSj@X*aTo+W1rtSxaJDP5?B1m4-I>M?u$V5`hhDX)`}b+n_u6w0AvtsA zehx@Cn59 zzfXH$_g!~xRaP`{!Vc3OxbKVmpuX4^z6ee>a4bR^MHVcaf7@+$?y}2{iCp6O0k36d zhAR#ILNkA{`0D4cNP(apRyJL63ae9X^YYraZ5_jzpHA5gH%~}%UiR^%Wu>U8C^-M( zg~>JN7sxG&BiJ%FZ)RGZATieg)G98Z!h(<5iFAyYS@RvH^7pLAk=LE*1|eTA7@^8B#{Ehu&D z*hZgX`HAL_>Kv9~dw}qf_|QO3aZ$cw71=-l8tzS*e*TMJKlqP_c>9w6y5NFyjymf2 zPv*@3S{bM<#wQab272Zj%W2iBWV`LQc5!Mx^4Q}BV+hbnG=)~67y~9fJ4fI2=FBtC zWHMfK$&cT7;|&c&6KYZ`goC$l-%44V&BU52(!yT*Y;m%*wAfbTk`{$y#*Df4+H09B z`h-sMt6%-V0eOK!fg_GMcJBOGGzd;KG+3o%D1#O%b;M>sj)6fUmx+72OrBY>nG%j5Pnr?4(yK%S^*;Ud(+rfmraVB`@3hm-+O8`m_|fFd zY@(^xUw=IXSu^%4)A%hTg2)(?bMV36`RKE`FTeaUfYhskV7f4L2@WTA(R#|(OR}FzW(}~{`t>;BHHN9H#ax9^0!x6F4H?i%Mb=DG99U;6I;KXM zU@qDJNq&fgJDu>#E3cq{pE66aX|R9)UREKjU8HZdFW+iifVXwK?Y4u7=-jQg+KOGO zY8N<8j)$#RYGfhd)N#ihx8a8CO`G-)VxP%jfP|#&jItrGdc*E*XqYl(%3gc!+_h_a zF+aMw#%eO;!g|5>n zdiLzTXi>Gb1w|D6@Z(QXdqD;Y!lY~Z^y#(j=m!Um|`W6 z;=vgY3kT3}qo+irTuBt6Aw^~jo)af-*S&jZtI(byu>7S6--K~P^9@@LkhuQ(>q&mg z(ju-~9CV>Je2BD8S8Lw9`uge=NFyMoD5_T^p5ArWU1n+#PM%{hE%X&2&(44G>_Gk4 z1CeVlrSo#^J*h5g!GBaQU^g*^ggf$0kHA5|o5Kj>Tt0eHT@#&!z!0kFKFzQ(^*CUm z+NMp&gHmLbQ<%6?ZuL-XjPXblL|9CnKHbV29JuaPlp0uADB5`#Pq%{Ps_6nj2T@Qq z&(!{~p+nlXZKELRZOZn=2aQcIWzbW!^xk{#)vt#S-;lBN&_fTaLUBd%^OponezExK z=l?qeh=ibVgZs13K8pn`bL?KiFWW$}ncM$Z3n?Nqj&%@5`_MxV38pA6DJ2X7nT9D_ zT3pz)vw=i#~g!LA_Tg0?I6X5J=W)} zS+hJB6&Kh(K}iYn@l&J$zbv!Bk+s@xLPdyCV1o_T{p7=s1Q0uaj;cEI%+rI+Dq|sK z`!tlbOb?$Ge!l$a#)!LD(9M*wy6^u(B{b|649jE7+wlxmuAKoaPE~=S?BHy7_gSca;mx$SBon8n#|lc^62%v_^I1H^UMoB``OQ`Yhwg8adi)3 znw2?lm3yKnn|v}(vY}a7D|oD16p&40r6di52%eK@Krj8IXMl1ipPlgG6|`=qQuJ9uDE2XbVSWVD+Ts+Ocr#1^R|TW?h8u1;8$Kk*%{zO1Z3hN_Vb|Gm9gGIB#e4PjlX_6F@>OE>p$v6;< z1aqH#_HN(4-R#*PKK|CZgkjr;&vW*(@-+0xTZT=dDT!GAE?wZqnmT97sm7q z`DYE+d4=8{mi97Czk5Z5{rorNDLv(Wsi(6DwhfOSwTdy!s z>L)^h4aRx-g>qU@G8Cvi-`+EWh2RAzY-eJhIKDh$s*8#u`o{c_DvnWG3YbKNCX|6l zC}=iDEOYbC7+DArA5OiS(*O21R~qzVk3fEYSxL)m7k89v*QQO6Ze0)De;=MZVUT)5 z2=J2l@SH#Y`Okb1fogoV&4I}=_w!a=T21zhgZv;vhYq>_{s;VYmJg=}zW{ucl1FvX zog3@T(4=rZv~JfH1je9E3S{=XhaWt5?tDGY$pO(r!%xBv{KiaZNPa6WR3!i?nPkJ3 zD1J{d5yQ{qbDu}W2K$OqH3O{GMWSIl-;L+rS5Q!v^NEdY9I+|%nx&iz(`hw##K3ZBeNJ3Uv(}hX_q0DWIA+!bDF4Yf^;qI+po{K zv75c~*1H1wk;Ns^tIfxbTWhU;ue|cQdAJm1)4|HxE6+g(9i-JHT&w%`?V+*OlgEx7 zJ7~~aBS&rwI1YYO6o5SL;7Dqt2bcukbMvepZnw?W7LH8DtP+@_*a&pgQAap3ktaUH zGe6&kF(>8~7J4>9|K;XeZw+o|$NdYEOuR-AVKDkN8`SP`%ML2hgREGh#;{=rhZcRa=1cvfo^BIb(t|SVM}7W7RG}(4h?f2OhXD4B5w$AuNxsq!Rl` zb?1~>lcnbuE!m}+!HF~Fm6|hW5m%9kpD1OE)$)`7r0$p?9?VAcN5D1T@~jN@AnAJK zS~DH!%HXc837y$oyS^>ysR_Jw2OoSe_XK_ksL7UCnOqq7GEQ(4k-;DP%O z8nmt;i>ID>hRVT_#CKFpQS}4YS$mspw&q5#$o9c|?~2ISdh4xdRK_1r&d?L8t*%>c z{fmy4?9PmRLB%9IYQeksoe7CK5BUtSij}K~Ni*AlkE*HhrhW&M;(oe%_36Xa_~>Jg z{Q6gy3r+N@upmCOsfdExZnLci@($GIn{Tcb+s2$AN@I)}v#FZ5-F8dLneqC`Cv(Uu zuvcAm6_rj%>-=i?IyA znwkci*;K&@Lx0(N_v*%Z>Rc;*2OV_e!0lUQPHDv|a$y`Y5_s%m2;o$cTk@5H(rUQ4 z7S$GoD&yYMtHQA)Pj!9lO^9vPnP8JevYIp!Lz!+Qs9+{&D{QP+_)8AK!NH`ZQ$c7r zYuZ9FmrB%<`RGIDv(Zhg4PDLq?9;XOJE-^kbAM<9h+3i*AV%-AYxL&SBNTLnkSy($ z%i{wXaL69C1#n$_aRrCIM8*SOIYUJ(u~O0dG91X~i!Z)nsfSdDkE1bne#3%$?wN{6 z5atx-{1Tfk2=<8KoUN zwqpa}8rF~BatofdyY8CObV`NO7;u(gV1x{gp(5fIU3ss7m2Nq~;7E*bz4dkzMJcH| zr5KPl(^8m8c)V&ZYH9iAtO_Zs+_ViBQ-?<#)HIad_{W48_oD!&PoJ(YkqoiX7-@Wx-!WP2DnpbMU&Jz^bZp;d(xe05fBz$!O#!FZsH~#G zqC*ckOov<|2RV(Rp(uzEBZhAK+O`7NKu*S-3`B%ZTv^Q1UOJ+0-(GLN88a?m4OdgA zPBoD;fw2T(c;j*);@Yn2t+p6Hc<_LaKmO>dtA0z{QO&+_mjqYYB(HK(iw048=YRwD zzvGV9D1ewQ5SWJh?YGZopUtsowy>-&`pm|RAq-Pg( zCubs~zAQiBQa~szjR_%w$1+-3E1AJ}IZ#SAKV?HD%>k3CWdDz{u#M_+^PIrlP#0#m zY%*(aDzy^%rK11f;@@1pR5UsBNwbh_JiuajA_8vO)n?j;eU={;Otf_$vi=4#^I1@Q ziz_S0b4^`x-iNcifB*hyJAd9>a8iACSeZ6F_uNbLAU$P*jTuJigiN+x9W47VT!|N& zrmn<9|3*ZC#AS3PINTadh*H80PIl%!@qBAt5)&NKw#bD z1kQqj88c?=vda#Z_i2n-Z@f;fn8L6c%Lsk^ec|H)@_qMI$5O8om)uDWkg3IWZNwa5e&&0`HSqambYX=o|#8C4@7HaoV^ z*3fVXA!kW(iw)LWUvQTXNZfJfy*9okw~qJK)pkD97DdM$cLEju%U}M6pUY-NE4M7g zJ@(kuxpi#HU3cAuoIdvCGxT0f&61rwc;U;L(X+DSVTf7albwt&L_tixgZUVILk6xT z3xHZ7PihXYmWdYjIoc#8g4Ur^TT(G*^G$uA^0&YHeK`JOeK+RzoQ6Uz9QBVD#6ZZU zx+q(7Ax*S#j#MvPxY(;+y?W}@9#AZsCguO}kGBwbQjv&O>#&~UlDhfx!RMyjd#_!5 z%EGB3>==T?L^fL^HS$AAtC=r?A-CCTOEv0NunpriJ6sAt&Cl8$Lvw^HiKWlY^Z7({ zpwt~+d&xx?Bk!UGu|>0M=Ps5#XU&=gI350Z7As+qO+|bh23{B7rfp8EqKg#KcE(mk zl^DFd>Z*t!P*Clwudhl0bi;AFMdrMGU~ z%D_Q#WS~)T#KbOFNJmpYTo$ubmb7P@P}l;PVO7(9AhRVVP1^gzk3KUwH*qrj38)0Q zF;r;HlqvU&8@GkC-biQ?e8>42F)qT z931+yeW;06yu;CF&F5BM%~Jri4baJWMlPiL)1Pmebl~2TCm-|3BTxO}7eBN7WgD<> z|Ni)r3+}yl+O^kSj~5)T7T6r{ZZCk?Ck%mz}pKOE>-LW^(Aekx6a?Y;`3a zWY78cPCo9#4?l~UUTw`9YpmI#C{L6-LE;+5$`F;>h}aVKT3TAvt5*-Ze$+y+4IWt| z(mfuNgvThq>Rl^s`mwT_hO#<*rmT&@(UtZ4(Ok=0gM`!9*eXu* zr<`;ut3uxDrCxRK-u2K!4}qHyl!790S#>QOY>_MIzYAC8AFjPdb#J~oyHB4Un{U2} zKRI<#MpastSh%o~*N5UGA4|~4&Uy2^vf8T&j$|Y=3~LB`Amtt$pl63zn>MXx&3cDT zpR}ROFo8e%c&Mm!c)FuI!h@?JNI}&Ucl@b-1}0 zBFMFL09b}d+1pU9DOD33G~%1lB6&;^(^gTR3b2}Fd)r_CI^|C{-;yj{n5RqA*e-kR zu{&!X5Ssvv@!-G;*!&1_EsD@7jm)Sa(J`B;yDo#uD)0k_=m|IY3+qEM424(lCWJ7o zZ;7PB_^MqfAjMDjY_y1NjT(rmS++&|6sMnlnzwd)I!$4{!2>)xlFKB=DPAqJ1!pk> zkzvVY#QN{)B+Z0sW^RVBM02#_;DaYU@z~>BFtgu&%Uf*^@yN}w2t07$I;L1GT_?@< z?cWE=Pe1)n2IU7IeQ2I;$gHhtB;SOM-yu;z7;05kEYi}s*qX4;I{jXIZI{;^3glQ9f0H>>iZ$ zz}))5nWwMOwLLw2<&{?wfM9e{7FbB5t>{W{3|4w1F;hF81X@wCue{{<@83&3ojZ4+ z<#adDSTFFYt&QFII)dnuNt5>2S_7eGa=ByFe6)s$yrnx<}9u>+F~1%hu}>NjSaphHsz+9{wT#T3EF_Q`<-#d z_uu>Qquc&^JCKI*bI<#sSTat>&;r>(v_JvwTJ+mwLFmJBA_M!>;A28`V2&F-Q#6n^=flu9%(-dNC;^J2lyY()vTzg|?LeT=0!)YNTDq4wFwgxu!CPE8EDuwFIZt3l}faJG4$4 z^YTLmP{vhVX|KQ24{~u+5slUrv|ao_?8S2EzUKpTtE1Lp7!5kTe@0O*QYi=RV;y=bUpUI_UX7|M@S?zU0YwFjQTG z?Zv26Wg}Bj3tl&4XBrYz!M&;@IIbq?VO>=zmpM{cEpfDY5oZ?sZM=keoP6a>vqhEWO*y`BMJ#=Grm)D}v-1)>IHO+(~VRP$r$w;>rXiDM02VscTY8s0#If>l&tF4ibPwosCzM)pMO5* z!5K3ox-?TKJ>i67e*3$tA9{F(6)|N=lj0Pe47d-1AW0A1diJo$sPAOD0$$NE6QMk- z0zL%5osB95wjnv0nVuWlldM%le$r(i@NMyu(qh}sXm1O5rikmTvz8h`09IKDTg%ny zBpP>=B3Eij8G_onSmsAimnJS+6mv_<89p>OY}iKD{H;7IRqV{x?1F&CB{q>-a572m z(yncLhY1%t94tCr3<`NB*bNbW=2@Z+Vv}yweq&}J-IepDfCxw!6ioB^5*7~v_ zi)`2mSxr50Y2{1)O@kVF@|($?g%*c9oAo$wVE^I6H@yA!yNIZ=nu#E)102#qoc7sw zZ|n08X>+;(njiverN*&Bx%vLe%iAnmxHuzVPC;yxa;(&sDqsC`846%DA|n+2L$pYd zP!nOUg9o31KNiwNtk`9M@56=dvmTrwm{^%9ohHI6ZwxKc;$FPCHda08+91V{jX(1egne}2q7;1z8+vpK| zqWvvA7{WzXIFJM7$%;aFL0s@jx8!rpV8-}CcL*`^s!yLjYpt{Pv}x0%C}l}h9?C9? z*M&e3HG>DfLJSNw>gV!!UMc)FKe_#{cRSttzWeSQGiD4?R-?-rf{1@B47T9~O|r!b z4au4lGbjjiB@trZZW7#RP=_RhLo~D4LidDWCfuR6U@lQvxJxAZDq;nS(&YG*S)#Yv zivlt;3f&bpLeR{`^oov!**S2)QLMPWd3g34fV%MBuBXwP1=vl^A zez;m@$=J9=S)8Nlo%j0Q?(`wN|94> z`(AJvOwZ^k5p zXmn?YSpBmCAECwBQ7GCa#yANZfXP1gGviKZAwUw@F$k&^HG#0<$R0MjD{yG2w>s(z z9JnTEP5$)B4a5P5y@IU=9dr;yfr%Q0bkUIT@WeB)rfo#UsXQ7Zv`eQBlqa787d~#1oCLw=96*-A zUDcgChwTfopZw$}xCxY;%vL@0po1nk5bL1_AI5IRu(xJGp4p_Hjc9;mo{k(-9nhN4 z05;)+_3%kLfvpT%Kdr0pyYJpV`q8D2J@Zd3Rh>kpiFF1c5+qs7t(E6w+(08O3qxLY zh$g==LiKXG%b+^7yF3S|y!gtZ2e<*KJ0wQ%qnDHv*{O2wx##LEvT3+`M*mQEG8?Ms zw;@9Ysx+FG1&>f>vZ*?BLbkjKxSkR-&ehjfr$8FSlko6=dC(nDp3ER@k{mI&g9r5o zoAc+f#~w$2>2hLIB$^;qRJ`%V8w4P|!Y`&5d6O*;iCEDkGxm`~*9|w^Ku8#7QcTZ6 z`(@(9&nyM}kokh}PuWRFLe%49KX&Q@qBn8o{`saq`m!G(f|5kqPrKv<7JMlQ+ve0c znS`w%1ywLwG$f3=GR1I&`w~tiOk-=R}`XU8+41 zN~ttCjMlEcRz!g$Il4LP1+`I99KY%M%$aX6-t2`zL!+Kxcz!w`tF*d8nSg}XNu@Yb zl;!e=tFM_hb-EySTriKvBRrLXsJi0|hO!K~p3L;rlBA0i5xMLjx6mrC7TN3|li`^A zDeJ;h_Z6YPil(h{)3)quMG@{2-8d&tcudO{>2$|9a-&VV@`|c@3MlFHSn)41vx7b88UsMn+)Lq zUVHT)h+2JqG2VM{>EWbMDeA_3rLa^3IewUK33&+f4R9A(6Z0T4fe0qSDlUr98h)Un z>pg2xzU#eW7cK z?T!1U{4q{~{lF$&b%1s2bVjhksM22nNNBBD65;022_?a*t`7JrdEt{O}Q~$b8HP zWI+&k<6}g}9(x2M%HQ$@Q2~VLf^rjJCh~-S1Lc95<)PQAZtRQ8aX4 zMpduKfS-I$Nk2;O*|TTcHmz{hD2M{P?Y4`*d+(ik{q;8>Mbipfpwz^bhv$&*1hfeJX*nP|=H>Inl$W;*VTkVsw#$F-A_N)R$Jed2NZaM}o5vZ_`bbp|KS6qPyjSQe$@<0arY`~zEy;)7{L2OO~9`0<;m zkJ=Esg$u_|KCyfEZoBL}f%{LWt~KwhLHk3155V}virL7w{Z zQW0)J85F6guIk;p_ZH*F%wM=rggN*GDaj#B080);jj}Ps1ws*$K2_+>V z?XAnhjy&bmQ%Qw_WRGZYiu?>6y59BI|H(uba0WdDjHFxx)Nevh5d}fkB6aZ;1iqQGKylBgN`vXS z7PpzjBw3SXKo;Yg39SV^T+m*b6%lJUdem?XdHdbj0OD-C zt`shb>}U)iS6^R^0;rAbE+XeMWl3_d*iIAN$5|;nPy^QPk7K^MXY^Mj3AR!muqIf~ z3d= zVUx#68j4qAm#MO;?$r-VDS!p!iqd0OBcjWvOTE1C!t?Q(_7-V^*dKiO{^A7-pMK(L z<`1)H(4c`KGC4W+r1>70bIV_!^_B&Ox88X>ww+gnXMv+T=${*b+$0k)$9fswg)kj| z{P8lRbc)N+h;d159B)b*9e@XZ5_k|iuOxGRX|uoPe^i#7g-ozd?od7Dcj8ZQzheP_0iCXQR7*YsjZQI8DIp)nm;acibM+Vs4Oa z&&5{h+(?7~5bpWm!-rA?AH4Uj?oAy~a2Twv^dL`Dip2lp1xWyn*O>^?i6Knzu?CeU zE%d2DR#VtCl2th?^u>#qAlb+!qOe(Bb&^Vw&gEtDKtTmbSX*~m-NF>rhdfHRni zRF}7%I(FW5*9jgnsf~JRKt$$$b*HlqIN$)*5@QrixIi*SL>~$avk$BSg?ht=ZRDhW zeDR$6SaOWvg(8XgflX%OBr2t63EsLgl+xN@ZGP-V342IOp{w-s*a>jHiR<_nY>bDc1ncZw)S-}AQ%(l$B);gKK^um zyLPP|;b4i?0VRaFXU}c`>t&j+6iTXH+u`i3dYfz1wE zVlUPg8yL@-#gw|Xp9=C-@t1QpOr1KF?#iegBZxfSx;*4I#2vYe^qYsCMi<>fPG zJd#FLA|!(#?UW5)aF!&H7Fv;_PAhV(0#RK82r!E<*>S~>$RhZYf&cFc!2M@vkt6{@7+6bIi zUwQjpW&WLI}yVa&nwJnSpTKB-}8F6}5VM}xrUpRc{+PTQOC3qMk6 zFf2dksV5$Pd)AwN9(2fIqecyvjSpt{h*9_6KP`^M<#o^I=%N0K*@ZR5u?05lt@;Sr zH{Qeu7YB_kr!|&s@``@tah5|&e2g!p*gem$S?k%FRYheiIbMFnRlWN5;mDjj_jBSq zYUuhq?6Cc;S#Mo;-Sr%jX11oUfe9P6poOpoi%dM1Ez8QQ9omq6UjE(L@6C89Hs8}b zWK=}ZF1t+d6TvO}vjhnGQ%^nd_S>^Kiw~M~;JC4yW*ZxF#BSYr$KR|b;FKy{JXrkG zjSV#uc9>`>!?YZ<&QQSZ7^8G zKC1vi<5RNwq!ZpK=z@Y4J_f2T;uDJuv5l>fHT2@kFYPd4JFDt}l~dRA3mdBI3&byF zzMLdW?y$A`N=K}S^#6@C$TKfCMPneIQ+n;^*Y1$UAE#w||%+YX# z?UcLkx$nOFyLRr3iD5m|3X&-tyT$mOcG~f_JEq)t;~$0JWXoc{G@X4fHYaz3jfO%= zgP@}!Kfd%w7hZ6Y?>DyV&^{DJ7V@rZWO&BJc*#X)IIlK+Zn)ODh^bC(Dx{aFheJG*e^{lZVbdgqC-&Vs>JAgOb(okXDQ6=5@rIi~CUQoE0R#G* znKL8q_{;5g{Pj-Xq~2ou=<-(O^>y{#ySDGzWi&NKVk#)j*)V(dTC=DU2SeeV>E;Q-b~g28|6c!nO`I*}ifA58S^qWW4p?85}P zG5d}j=S8OuZ6BWT$cz~?ve7C}L@}3^d83t(C!c=indhEY1=VW)=C~2xyz$8vo(;WP zvJkHjwrt(l`gvhdq3(~cBZd#t(HsS|*`}j}Bap_lMcIrrNv8hc!(MinRYy<~S&yMP z`$P9Ss@ey2A}%*iuUA_f^xR;rJKxwF`U?KnTyx#@2d0~>Iu%aTXpbJ94dSrXaAyXb za?0cZ1N+nGhH@z?g=c-XkDVCfeoFin%kh5&^=u#VGBu_6h!DR_8<4cdT;E2Mhj?;V zh3>^5E6L?;$|%D>-*PKQL@1)%I4Xt{fq>Dpi3OQ;5!<@V!>sCqX~+pvI7X5cT=)n$ zoyU;{W;n+43yf+F)_N((!eRje92Anl;fa+wpfs=m^SNUgh0Ygf*`j2_^)`6*l_l1N zEUGIjFDHk-(JC~<0Hlz$Y|Ua7xXVD0pl5u9pSQXpfyyfqJuc*iJ2bzzq$RCMkt%Lk zydoks(2rn;xgr}NxxPGJS2y$3*PJ-OQj%G;c8Fq5xP~FB;}+({P)^V-#8C*VuYX5@ zOe4@3Q|`KBv}9P8#Gc zZPjv@-QtU;u4GvsH0e8!Kl)f~hR7V#WH1vpiapk8d4`Oob&b+yfgX5XoXxRF;uo=DV^LGN_qKd^9+sxbhAU zOGX>z5a;Pf-{Z(BX(gS3ZW5jP9dg!4&dUQ2mTe7QR-h%XsCd$-7ERUF( z?701QtW0N&rtv1zj}f9n5hbu+iIGdxR+LFn5>KR%Y_SO-%wl`&$tO~xy83qOLV~$h z9Tp-mi}mJfklr#HfKm!3RaFrs=-6M+G#C{eE7aM10M4Exe|Bk+6a)##efx?I?b)3N zH0Q3r-OZGtBC|uDgDVjW~ZyL5x;~ z;&4dS$q=;4J`Am=(TY}zWX^~glW=c=%?RE`5E1r~3JsBH|Ca}=kzne#0|yR#`Nfxb zQ@|`NC}fTUvIIW09Z`fK7*f8GD^;BY17e9mNmk)z_n=p>+h?EM8BejMxO5oMx}H6| zpMCZjUqoADl2wF^WD@Y0nJ0@U#;f|?y?d{~ZGx)j=e`)zjEVH;>C9)`6}w`OY^ zJ5AWm2Jt)Yif<1hNFZNVBSzFRtWT^}RxA?gMqt4I`Oklj0@jnM6kr8$1@skNL@S&H z`Ejrwn3>2$3elRs$ztLQ4U%;egVHH^m4I=QSEH{Ia7|oA4@-i2K_>Cc1 zxe(M8Y$h`V7(nhQhP=8w*SKA9y6ViCui}*W4sU&#%pFQ9#g1j5f7^Z}iP8{)Vz@PJ z+kKB+giCF^{dRU3YF#G(axnrU>=u;>gXY`8$ZPJG@C4}u29U%EQ#AyvuBs3vwfX2x zd2`FlOP+lE>055`4f;p%j{J7))JbUKoH_G20>Csc!u0E}zy7^<-yAz;JU9af4oI?n z(@i%UAQGwNRF}7y=pr+ul+fy8P-06+Btp)-#Rqa_4kHEX#L0s$`QnRVFWP-!oJw*9 z8qPu(1Wo~#w6gYz>B!*6lr=Ap`n4SQ@u#0b11R}T5oJRh&o0HY0bz;bfQ>AtD0G>< z(likzM2N&n7p0D#BpK1vlBxzxMH(30%7^RypQS`Cv`}6+I5a_V_nPWB^d%{9-P3op zmGz1wD`?sV4l(x(nr7M^il-JTEVEm~1R()WJ2n%N5@VX0MGbhn`ua)~K&N!W*;*^{|I08-xbLO9oey5Lp^^0r} zHbRj}LTFAY_)A?v6tv0)rR-<6(z=r(?(VzU*?!sd4J{xN+n7QE7v2UDrU%2OpgAiz}{bB3qg` znVLya)`)5x2TiOcu>3~kli7@4iOUpAd<{NdP|OJ5P?3kc;g=(nUX^aP`KFE?%gDeAsTF={+E7wj#_Q^y?Z?Y`?Tt6pV9Iyf?SH%PfvMrf%eN%R zwzQQb=C@5Gf+S=ZRbd@u7N<(R^^0I=n&`OkKkwCeM>P<@?S3+Ud0ZR7`^ExM%Wg` zC6;mRkw5{m#$-3@GD?;~F8$!kZOmodLlr*RkPzJjs?pNg8lOzWAYbEHx^5g()--Js zq9z*&1PMN{OK}O=Ci;#l4dM0ahkjw-DlikB= zDJ@--v8(HumGDa$c(~G0MqqzUbtPZ$3YzxqNwQjwJn%(xTfoTbym<>cv@LJlx)tw$ z6&~`HG0MimCC69DjPl?4&Uf^lfBfSyzNDlueFTQR;4K28ua8aJ!D0Zp{f;|{oUe+l zJz!w(eto05`UVdm=NA<_rIvYD-X=cZXI$T8_=csWC1yBB9C387zJ1!XZhPC$pVSOpM6==I~kEXi%>Z<`s1_v1sw$P?cnTgr8*IpaFAlq7@NGc@*#U)typD(^- z+`&*)V>gM~ddn?*u|^XPI_RJYJ8U2QE-%kX5=AWvL~=T+2ZSY!&9tJX$dI8?H+cQ^ z4nO>eOE10b?YG|+3F0Ey?iT7}KS`sH9L&@N^EB|)n|%~6=d({fsj8^3+~Ld#pa3U` zsF)NE-6v6x6i9HU*;Lg<#Ed06+jqL_t(9 zOk|bPDkvYStTCo=>}HHb>YxAgG8u3X@!hZb&6TH}c9PHfIXlO6S_aCRgb>{%RN%;l z`|>YesT7;nzI-romXCm0&UGLVQOS5J)-jG`B(P?3qKP5A^;Qv5%PCBUGX!3H?NvWv z>#p7&J$f>NUVCL`?AVX-Jrcc&g|M2~7Ll|rhzU1$;5AG-J<4<8XELA^)q zo(M5Ztj7rT7w;OZ$?P1)2^J)A1!oz#%496IJH&7hl^ADJLCjj5sY*jBZrU76Y1rGw zl#neukPM{INSXYXkpXsN7$KE$?6yn<3@fdFl$EyuA&PzZ%BuWw;wtg`8xy;vzPZNt z*=L`=z5BFnTZS<@k52gZ+p}3+k38~lP&2dVx^?TuT17D5P-5q$1Fso0m`xX80Hxrq zc}~(nhEYQ%u1I|N;m3{B9!wi>v2X8QM;>{of^48{%12wpH0Hkhrit)o73qqUojb3; z$mUnyoDF7OUHIK88qcSlcAAqRe00KeXtOb!TQrzH{U5}_M?$@Yu)4nD1%nV*#T86< zqrMuO)Gqj5E!CJ|8d5sGb|8gf3UQ2uV1gJ7MO$J`MRXiu`sj$*nD<$ z$d<@UDTnUN%lZ4?AGZ3jXu*62Zu+d$pPp3|8sbFXryt(VB zHfv(L?z+>01(o~nzrU??IK}=*eGDelrRM}EDOQL(GabP^q^3a+KvheDKbPAMJ8XU9 zO@B`5^0?rPYns3lX4m3+>kf%;mG|qzF1PRWh$9Yq?x>fLPDQFiNodD7lJ)-t;lF&x z#84S&$jk;vJk`34Z`cpOpun?>wMKg=ek(z73b}g8hOm?jBT7x zv)+1F`l7`Pv~A_F9oNT?2|OiEio zOoOrefc^FkQG`rh&LfXJLa2g$*@cXA=FGL;b;9w-v~SlI#xovy;&*?zI#vz^tz=*I zk#WG8>b})7ZIlI}di{jo4%qoiJjPjZKqm z;5qy3vp@axW8V?ke2cM!szbZBb^rp4uyBAI0ESVAG+0v+NW#G4DkP98E(89+szueF zrE54d7}-5=7ivp!v8BTJZYnxR$0nI!+p$YW^q)KLa|%#AnoEr?M}KjDIE~$e*03vc zay}xhPhdbkx@~4>XC{6WTz!2d3M7TB2*xFG!j7a;OxgzxS{onv3S+yk@1$qy4j(b) z=9_QdefNp>)n9)3<-TK))F3!bJr4W+AA9!!sA*9hjQ{q!ji!i*6hRcEC5mWF#G20t ziXzciVu>1!eom8!b-&BQ2*ZH~ z?jKIT;{IcOfsql6LM@dORLjn!%k%S}KQp(E6CTUOx^RpmA$4K@$btif)S#T3M)!n@ z3`#6TPyOXz{-rHl&wu{&AygtVK=34ZQ7Qr zLu`G9)Q&sF9&7Br?6S+h^rbIffBp3ow@H}c&6eoi{+?I=-D??9<`ovNL&eiFrSDNR zu9wtUdMp>LGhJ<+Y|Sw{l(mqbT0#-mUVE)(gH7IbYva;wD?q({J)=IVG;Xfda^86t zf8rCLh^8%QQ{~xF2GX>xbmnMm;-W-G_4`l!z%Oq&<{8g8rl-68dC&U`(*$N>PiL&f zFZ4qm<@Q602?JuZ_J_wkmoMBxK4#yWN?9bd8?MFb@VKqvobePBdcYH0x1lMwD6Ck@ z5D61!+_$0H%lGA5xHfgz>(=&kweo4%Z{u^11yz?(&)(~PC^aq^; zPRD{tc5u%aTBZ%kWk9eU*%=%auwms@C0GNYF}*UcbAJE>1xsPW)sKASBYLckq!&p+ zhD1+AV7Yj7urgcLXzI=r=EVG8{KausU3LALU;F}670(`ZO4uh{_u2OW{e4|OzVhds zf=3_qJa_9Yk7V2|bQu_V=${9ea1Z z{n#f?DxSagJ@?*+_?f_i;rsWg7z>!Y?snf~npb2`)95ez?YBRv1N--X|GIa+`#mO9 z3@jBt_Soa_)%~AQ47;lI2r`WovYY5S;bxkB%Wr;bjnqF3AwtE@d(^&=X*OQBvWIx%_hSJv10y> z3=Tc=k&nFL#$W!b?DbvU-|y!`4&0Btl3Zl47-Ufe6;%b-pXhK@mN>MhpMHkDeEOQw zf$2W#E9hfV!gS~iBe>jl8z@B+67zB2#^!tPveTR2`c_}Iajyf(2SAKr5Ye@n+RuFE z)A!u-e!1YL5y^v%-}q*|0wl2QI*?VtY|V^K5dZ1Ves0?KjcxIvO46jgXQ>- z|N4+cU?r0Uc(mgY5B*PgPCf0jHXxwNUK-~)wIgX}Eqe8eSG@e*yZC~T9oj9!BlKp` zz>~Bn&BJKczF~&yFVB4DvEb3EL>~_v8nHxRIV&{e$Venon{K@`jU>!U_lXFX73H>A z{zSeQ^iz*^i|x7h9!8u;{mG*Vn6Z!3CpKh~kvPv2Wb2RL{N{H(xi}yAz6bmd zU5wNNAN&9`2*bnUR^hVS5@4F#LbR3j>#x5~KjKR|`|R_Sh_+%L#k>w?WywqQ@!vRA zTA>KJE95ELG7@PH`VFv?dvAEd8_deiJMUZ)?;MGxeCcWmry0UCp7At0x}9@lB2y0g zJz(FpJFFAWMv3!yvF==j&2d0i@fxqD0qG;8h2w+AL4#s@^qSVG`|W<;XZ?8$6QBFs z7t?xn(o%y04yhX-b1@Q0*mvK(Uj4VP_}~ZIF8jKZ zyRObA`9jEE+};}%k6t!4xw=36EWwQ_inLR`1Pq`OQqH4~*qJr39>6hAdzzIWK6hEv z3q#1Hytu@Tvfl&tF?w{!c@hy7uLNV-ml7L~tff>69gR-xsr zjP|X6MH5U|Jm8y-lxue>>=aLmpQKShT3m>fvNx@(^pv?)t$}TWVXIBssFLWk6K!V3 zC!Fxc%P;@Vr~dmSQ!IA8o}+p6BKn<)1g^4lN%C7BA5;W}ZZjD_} z`jSQsTaJ^a4DAxdr5i|0(a25q^HOvf;6tRs5iaB_Per4__9w~$Lcuy)`5P0z4IAz> zz2WWV9J=5A_UP(tdHU0zPLEJY(eo*W#RgO-!JbeVBb}ZXN1JlTV}=|wL2JV0hgIisNj*Ia+J0l{D2MXaFq%cfdT&;HYKKFh$57z2(r%T$9aMC z147v33T0i!Y(uz+#zF?e(bKB*AN;{#s&0#^=^Xp%agTe99SHAw*Slb52??;lU-&F{ zw2MU=Zv{VZO-ocIKI9-E`9pa(()g zQ(yUiUv}_84>5D|eLpss{;vhq#WO-#$IK$4)U6Q+hPt!HOs?<>=efWSKJWnqMa>yJ z_0Q7A#K7ogM5E5Ub)NIx@BV+8*dV-N2ufMEu9sWXnN0gac^P;IFTVKejsw-ZNt`EC zcLa#AP1$EZ{PF*q(#WeJG(m$i;&Mr}uy+217n!zck&g0FZ^-}YpZ@6uFL=Qp{n5kz z^od74{_#hC>|>v}W!CpUcQb~oL5Or_;-{8EI(ng`X zbT_g=O?~yNU-dKOw_JoM&U&zhqmSQw^Y89+pPjA4y!EYbr7R!wn8)azaY02{ahF74GbQVC9RBCIifq}PH3gu&J;SZJ=Rz8jY2SI zlgm$X;%)_a#66{JO|Pu<>T%!v)(`lkV6d@Px>EQAi?!ME>sx-KxbCjnx)U-i=qDMk zdChAMI`BXoX^xF&;XUSFMAF4-RJ#W8-(x& zKl~AdJ|Iy_32zabNy@LsQg!olO7Pa*52z|c zhQZzFG73fE*p%Ub0x4^TF52mEXe~Y;Pf^qJx{PfpYUiUeFz60Z!7_ZH;h}$U7}w9O zx8C8Sw=TdWy(oFqqaLY5-D+UST3<{GqrN4Vj8#|=2SNZ0f-z`EFThE`=uc)GQU2M_ zuJ$#QL`aykmHhvs*^!4aRKl<2XpLYHAzj7V~03>ob4aLi_-~Riv=&tJyW;L5c6D*<J9{RWTbXLTKe`9wwlaoB|>jw;q|||@#Qan zl>yHH9Ol<#IAA)R)Y57D`d{;RfA`=AKk)ar-tmDC{u?XJeP8;R5lb*T_p_(ZRfMtc zE7Vfm7|nLls6(R@u7q>FnCls3UzOkY%tI!{9@6(TRn9{+vv^T2u>ppWZNkvndMXvr zXK9YPR^|XENIBU1%If>y_s_1v+j*zet}5BEKIS9~ZTOU`%oX-5F)cb4bFc`$s8+cs z9CGh<06-nxU5x3~u8SOTMZszVr0u3YN^4g`4y5Xp@B|;(`N^FahOwxu+!@pzyNA$m z5k14JICvJ0>iE2Pd)a)21LkAqPD-KrQ~Tr0o_p?TOAjS3yA=| zs){wa+iqWf$ydL2-gy_?bj!`|Z5tbpRYCUsjW-^%+itr){b^61oX{+6xCo6_fVmOh zDiOq>lO1EkN@9{f1_?5M$8EpI6Y2Ovd0~;an8Ok1k`k7U!6O)A_-T!ECZXGk1tvv9 z&^uNSG(>-IFFXF0-`x7KPkdZ)APK*!1A~)BgXHkTW1I0;&Nz~f1c#9sxl|{VY|MoXW9ra|~eaT-v-&$^&rGz=y-WsQ{NNPbfJHzn- zor;L&DTb-BmX*0~-5Pg1oOjN-NV-We4<|NIMq zDNDU@gV@N33_IU$x#jmZk>V%q4JKLV6{*ARM?UhAQn-^9jTrG+LhGb;iKGOJh_0LW zZf%+3mpSH`Cqn|argXrX57_r%ST77yOFFN4&8yEp{{o!_Ni>GVK;1`oP!J@*^l0rh zREnkKP*`{tN(&iIp&ECNKmPCUb*~-X^{)50QN|$0J?s?+^9x`2!d-URVg33cC$rBw z^UN2&`1ucch=W1b1Qjm923$Em)oH=&*&aZT%g0 zp7WKnk?*D@mukedHNNWQV_%HXqQkYbyEmD4L;_fL6I)+a^~KHd=21AWQM9SH5GncM zYQ+>t>z0Qca-fWsNr_7If}yymV`6gRUOVqt?2RcdD%(RSB7Kq3piA`kuOlRiI5ONT}C4D3vIk^6%G87m;TjHe|9BX zISz-lOm>%jzcf~A*I7tvQvb19;$In!?cIozkPb|b4!h;XLEy(8`8Xp8XRIA2J}9JH zI=ilPmj+umHsa{EN#r9R`9}vGbg*IT3ul}`_$|u0iGaWUU*G*Nqz)u+i)yNZD%0yw zMb+BFfufIq@l&S&Ko9S+$8O9OBgBV4{9z*Zs7F0&{|6tSn{(j1unnuJ$FahFmjdvSa`SVtPQ2v3>q3G6pb zqoJkHt~AoGZoC-+XAwP{r)@l+l%56^I$RI#>+L?yZs;$YT1N&)x_$jOLVyv8;gKPb z+K%MgqC#xe?XaWfixc3?#9<>l2Ohmu>jk+rFG}7X!d9EM>5!VrQ&Sm-qcO@)(>9$! zFqL}E-@R(z2kh~~AN`#BM+;&1vBw_k3xHL3-(&O z!;}%lg21CmfH zlAbF+Z@&5F(>`~`Gmbsl_zD$~0l@zV;etXGT3iBII?S>^;R%mB^iYcfVbh1fT5eEO zJKvrq!HoX5z4Zjd$l`R(uDkB2RE7dzJ;C@*O#8}CEpiM7PA4Mv+G{TYoofzIVFC=e zs(fD-a{Z3oj(i*7sXQDr9W@5KsNFP7)v|Xf!omfiR|>%U?zWpD-v)-ye)jXlj`x0w zQTu}*TzSwz2iRt5+IG}YM_KB*zU+PFYSlH|waxiq{{~=4EHE)^Y1KXV+|xXoNBoz+ zyxA<&v~8cgc6Vdim(Tvn`R84rQ|a6NeW9IwjFqSikB$8Mzx~HQz40Fn3Cy^T_6~DM z5~W@+tF_Hm?7#&z$I=30TClUeMMT`5pjTVq~kDB7lkL zL2r4>TOzwn6t(XxhgQAv$}6LZ+wF=Oe9wE{bD#S}H^1(eH~H))!%oE!h8r4IEmCg) zfbDaiJvHPidd(!AEDT}N&IWTR-P1Rda&uY8%r zOD?&bnlf+ald{|@Wsg1X``h2%`q7V`#OH(fOOhUqx)GAZaO+ZQa)NmpkK$_mTP?#Sg z>Xjz&3VuIjBm)}S2{AJMzrVQNW@A~Pgf`Ns7A24y{DaNj`YXSRos#+*O!HL&9S<1430mp500h zeduAnLt`E_Hax;r^!Ud=h7vg8gm=J9l3~kn0bAr%HRT$171SEr-{1-TP}t+ZvO{+- zLF>1^^?d`u;~w|8!w-KL2aVpi$NhG{;ili6eDY_``N~<@A|?_%-v(K#Uf*#k3z8sI zH3$`yU<$3mf;gaogs$jBF&CmSj(JLW+{oeXyYFg?6Orid4&AO@{G*+zj_|(4x7UY= z-wx$CNq>JQW5aT&bh4B-x7G=`1qMw?M71eA)c)?f-P^wX51jaKn%lw^%j7$~)fimctISwf@CUcF33lk18`yvo94_meb(+juIOH zibFCENdDgUu6Wzq-m0L`AMvG}(Jy@AD@L^2?~JV|+?sMZ#{Apg#@2?TkA4!?**&38 zrEtQmxO^^<4fiZ?4NB5RM+aB+_4%+wk;%A}pIa6qIJ`7a@mKLnhlSv0Jj-0a{tS+l z0n}8zV{|6X7w#P=6HRQ}wr$&(*v7=k#I|iacWgVE*fu6M&i$3G}A! z*$)#`=@2RY*R{YWpv)eie47uZ=j5H<7cnil_`6$vE-w$p zaRo_={p9HW&vr%hh#eU^CbwIGPU?+jJmswTE?oxktq`UL+)Rg-wCkbQlI??Y z8U0mFZ8u^9e!^`PT6l2u=MS#+R!hw^B1Tarq?fqm*BGELzFjMWTW=hpT?{93{&+E4 z{@0&Da8ool)3<2c155eP&58F(T>FP4x*%q(K~Z3T4=(=g5^P;~OEmCrUs0Ci{}H2> zVx6cH5pY&|BKW-q2HZUL)W7jm$E&Id>Ixw;*lbXz|& zeEYzh#mcK!LFOeE?tnTD2*Yz6l;^yNWvCSRwS}n2a}!7u181p3t;X%KS24TFE({{a z?ISvJ#?E98a{&$Y{VDi;v05hhDENKQ8%ZQIi9jO7iQP=a7>Ct^* zxP24qPbT^XMDqOJ7O4s%M(=5CeH8hFg7Rx1H8?zqNYN(T@>9y;ex7@ltM33iFUN_g zuhGJVWdnoqH1Qs3GY*X$h-kjmvUB;<0gQB~p zkGY*5DTRUo3UZZ%`L6j3Tc-R;fLU7XZg?x;KagP0Ki_{CEuGRB1imU3lIhybRjT2r zFWP^OZ#W)IgkdZuxG@BjDXPA)}j-^VFV{+E4o>8LD*ANy&2WP&D?UOu(- zB3_vdG1jq+;5hOoQJE=W452V#b{1`v=>xL~XVI*^rdtEvNxZ9@8md?*OKdF%Df+GE zH3i>4;=YrBeswQtEBZe}9b);Ke)R{F6u$9xR8#UjGv>uzQRewno@FTXqwwqnbH2tC z4L{Du`LWT`l76K_SGGp?;i*mYu%!7`V~dE+`2NGaSE<(ae}^(SeC|5YuaJd#ND=H^ zcBdfG?}#Xcd;eU>dyVGaj^(X=vVsQ3B4Y|GPdmU?vg;*o{yt3R-mtVSg)KwBrGoa> z)g#+EyKIc(ZvnLT5efQBQaoZdS^)kewZ(LMTH@4OtA7LIFae8l6&v9Ypur$C>yL(X zz+fzI*Asi)_U}=4&Ch*c{onvUJ8bWcD6+@e680~P+nDgrd2(vz*7!X;pV|7h*=7ZR z?f%qRJO*cj&oc1MrH}H#Cc4bD&jlr-&_Ab`!(|PIK5_QE(!2X`v)+Gy9ti3I8-5JC zPepQ*Z5cn+=wZmDIaWxB3&^I8VSd|G(}QO@CZbuKPN~BLJU>2NHp*T}1nN2vYPBB3QhsGE zgfj0d2>^vmijRA=elM!n4PXj#fQ?s&@24Xmz%Q152EF{XxG2wA$xvQZ;949+lv+lbB}URWU93 zhQ?IAfbdAcwr~yv4`0MY&{(9(Cb5e5d6u~J|1?JD7z{itqsTAiYv~F9{nF9Wz4CpB zA?Xf!xGP@e1Z$IQ*>dYlni=DK4AOHzmd#cXRojSuJ zPgj2H{;Tu*K(Oc9_aARU4X!-zTH*!LBKwp?h7@g4QwB_M@nRB{7p-lnyY9tOqv8e* zdKCKoZwUOCmxDO}vA~~g9~V2{4`qTi`uan{f8IUaD?w;;1z&ID2;PBF7SQ{7Il<3q zsU?s1%5?$PuHKl5t{9{UWuk2MltKbsoBQ=p@p~3?#!>Ei7yOA33u|A4c?6Z{1-LKy zw=@o2RqnB;3u(XvFA-NM?!3%A2OiZ{p3a)#k^7VMO|ijuu;nDjJ~<=W5x8YT6;9Zq z!^o2|N90T0qA$_b@fmb4Zh175p^T166)cLT6Fv&f9Ewy@>R4)#cBJuux6lS<%pB}p zffK$2^!FpX=yP>D>l_1pX9ZUT%xD-X*y2}xjvSFg2cam9N?c2 z1kSC2R!})7q(%-gp~h4N?jzRr-%B*0Eo1k$C!_r6`s%mDN=f4c{8m-Yfr!V;b7?5`NQ4s|MF` z-`DJ?BZ^2>oA9c%o#cA|N_mX}+M!a@_|oWsC>dAa+S@98eVp`qUN$H;;44d_26c_c z8>A98yWFl+T^h>BIo(BPre0-Mq_Wqp%@=*YC~toArqF)<(-O4xD5QPyyU*GghiSi$ zZ^9@@G4q(^O7w|k1;h?J+s6lc&w4EzUN$eR*ZE#$9oA2|*|<=?hy2DiRki_)`MqCx z?7UwUpzvgD$ZtQ_{Y%k&OvrpM=Vy;h;gp>-m)A(2FEs$E?S5K!@Voccpr7KfTXbb| z01CYu*8d20UKUzFF14|3<3tfRCzZ_<2EKr4mvyj2u3aec-vrk6DX>~>Jk@p*+bf8Q zQsuRsk~mj{R4IME#Kq;iD#@OK=0_ElwMv@U^$L4y=dIm;J+EvI4mO0ECzhhKF(6tJ zJ+`n8Xc$D`d=~r^%uabKQ~VIL(WryWe_x=tUpK`#y$3#2Rdzt@aZ*s^Ck|XXCARk- zoMD^0-43IlQ;r)w2+9>30MWdcyv8!nviFmqkJqLGbR&gbB@b&bpEr5PGQr4O7A}}W z^{VlnCyPsZ^D7^1cHmzI6txz>PF;CDazhX_j=joM);HLiLw9` zM9M{HhzR%h{*z_3_QHDzqt6;T7t($s+mspmMpcH$HA{`2cHPDV22-YIxfB0!S= zd{4qN-Q_oS1=9vOC=~zSs(K|vBRAySbb^C|*Hxed?ZDjJOZOecDhtuR<7fpU5tb(2 z7|Y@UiFAz`domYG2rn!vJi2PxL(5ev{c zk{ei#Ji#;knM9Dh=&=e#Zg#;!*q^oYK@sFOL0zWwZZE@np20SPk+PbIKM)t7#@^qz zOkK=!du211;>Kw6atu`&@KY}j&Mw)Ts4KLO!G7y~+hZlI`+6=!LYyRG_P-L)P&Tjx3B22T+V!jNy@o>MgtN=&c(C>A0xv1cJZ3 zFS}0+>y5vFJ3c`7ME{=`CH?-#Z|zMuUlQKz?A#}F|5H&yWsF`lK8{KoUlxh((R@9y z7d!gu&E}f+V{W(9#N0bQi^)zsc-Jlg2d{e|wRS}N=nu2m2?E`nn3nl4i6;bR^_Tf4=2n+^_}ILz zxlfwFU$DXr@icMq-*qtT)th_&+?!Tl6LHUoDc#s%0|$I>wmKVEH!>#nSFm?_LBMT#_CRE z?HSXlrtn_2-T(7{#&xH3*YP;eW-kA@^!GRR#TZ?K-eWyB!G+r?2)`bZVci`a-5-(Q zu&r-gsp6VfSp|?~WF>V3y`PXpDYVtOiG6{_LS##I`~l#uqF) zPXh|l$j`-f9$BMqv;4*ux%N0#zjerEy~V?%E7^S&%bOEMtN;N%z~w#0M8B@8%PHd! z8;@*vLeGaI&P18KQt%sqvqK;Ckq`cJ)n!&|vEvGWkmmcTJMdihVoYV<&ws!zhk=vH zT=rCd31gvWj&xV{-Te6Y6!rAp&8%{{ZNc!D18xnJ~Qnujf3|h7hpOAMDfnNqDH`Z)iA5U6wubx5T|~ zx5({-(f{Z&4Bv0HW#!{94s}vE>r1@o!5msiFm*OjNAyv*kfrzeP%t@fV`c2l*EM>W z;KOc~eV4YP*wXgTa8VmN9rinEw5@S>2>mQFR6jq<4 z4E_!6?6X$mPcL^YYO`;v3f_NR`X<^2_om|dzHXN^@WUz;G&|q@=wzuc+)SmFDBkPq z+I}Q$V&vD2_uc-kM~W4QC*^06wSaLT9_w{&*1Pt1U9B^4S;+9Dg*zeIvu#}bxU?YT zJjRmHp2p7zkGhjz?FwOvA`-V8qsx|wPU&8hB zexou(Sh4W^nAKYm~LHk%biDT~PUpi~%7IWv#! zn{6t!qBFM%4PWXFYNt)m$*(}eRjEX7#URbz(7ZTT+Hn!!1oC_D}eGaA($(L32jHc z_a-Qc@%6k!OgWwwx`J*?q%B`|0JTi02rW)3C6NKki_SS@QOP1lz{K<-ER+BT8|t{H ziglJRYWCvg;2T&p`nWdSzOTD{Z|=7ooT+{JdY|=oS{hY+bDjFRvEKXCQin|)%YQwa z=lqaYcq}RSfxQ3*3i}xCJf^2D(ZqO$|L?;hZ^W1l2OIzVqmjAG>E zU+vv^Zmd0lv9p38seL|`NsWgdh79Ub~qrRJFL zfqp?76;da7)ruVvQ;Z((13WCun1`c}GT&P_3Hln&tOXc9V5k!ufPFxb^z74?PI53QBN z%_CGXBaR7{s@d+B^|VTFO;U5v0-(N(Wbx}T4qNdFI!dfDbVxX7qLPiDfyn~j4v&@s z6T#>yq?H7RptvOMmieSk!fp*QXGz1}hoEV-Qohr^`*UW=X65umj#FC>%GD2BT771e z3`ZoHR)01bh7#ukO&ZH#Sh$oX+0q$P`+ShwI!aGE%YkZt-kw%gQ|flyl6{sHKfeP{t!E@8U){zaIK|5D^OB7PD?GN1}ThBtZ5UU zdtM%tPQd^MQV-)v%>@PGXPuK$r2p{%tH88R;^!;_nu!b8n4p>tJ5B1 zR|gTATa*Jp-afcFWE<^dQfi%Bp*LM72Gbp~x$wwDI#?8&JrF0FUSv%N;u4W0=yr~l zm4A(sjO+u21&9**a-utK7;Y_&#ZimwcM}%IxY;}m!*?GePct|Ug{Q_^UE9h+2+Sz*>?mS0o1h`yROZ-@4I(T2`wO^a1J zg*E|%)FJr=NCdGmGsy#1=*;DNyW4P~Mru2c&w&au|LRSa$6aH}BnZyM_Od{j4MJ$U zi9NXwDq-S7A5IfeQKx~L!3W!kf_tE+^C8gMaTpXNSa@fmLyO1dHJHxakgNXP{#m>r zdMM=|2w|d0Td*hXlm;m_s)OHx;HJ-Hjf4Mt#EQNPy)E@O$=$g<<>zxnDMok~P_2T6 zs^O69F6RUCIjZ?35=V4zVphw`fwP5xszmaOcE+ċXdTaw*%m;m5ZDbWgJ_XqbT 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�R;g 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

ddeE*SWKS`wD5C=M^ov`A=E-e{k-D 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 diff --git "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" deleted file mode 100644 index bce7de80..00000000 --- "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" +++ /dev/null @@ -1,73 +0,0 @@ -*斜体文字* - -_斜体文字_ - -**粗体文字** - -__粗体文字__ - -***粗斜体文字*** - -___粗斜体文字___ - -*** -* * * -****** -- - - ------- - -~~删除线~~ - -带下划线文本 - -# 一级标题 - -## 二级标题 - -### 三级标题 - -#### 四级标题 - -##### 五级标题 - -###### 六级标题 -[链接](http://a.com) -![图片](http://url/a.png) -> 引用 -* 第一项 -* 第二项 -* 第三项 - -+ 第一项 -+ 第二项 -+ 第三项 - -- 第一项 -- 第二项 -- 第三项 -1. 第一项 -2. 第二项 -3. 第三项 - -1. 第一项: - - 第一项嵌套的第一个元素 - - 第一项嵌套的第二个元素 -2. 第二项: - - 第二项嵌套的第一个元素 - - 第二项嵌套的第二个元素 -水平线: - ---- -带反引号的“内联代码” -``` -# 代码块 -print '3 个反引号或' -print '缩进 4 个空格' -``` - -> 区块引用 -> Markdown教程 -> 学的不仅是技术更是梦想 - - -SDFGSDFGSDFGSDFG \ No newline at end of file diff --git "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" deleted file mode 100644 index 12f85c9b..00000000 --- "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" +++ /dev/null @@ -1,615 +0,0 @@ -# 部署说明 - -> 此文档以开源版本 T-One 最小单元部署举例说明,不保障系统的高可用及性能等 -> -> 若期望大规模集群化部署可以联系SIG项目组进行具体讨论。 -> 若遇到问题请参照文未的 FAQ 文档,或进 SIG 群联系我们。 - -**组件说明**: T-One 包含多个自研组件和几个开源组件,此文档以开源版本 T-One 最小单元部署举例说明。 - -* 自研组件:tone-web、tone-agent-proxy、tone-agent、tone-runner等。 -* 开源组件:mysql、kafka、redis、zookeeper - -**机器要求**: - -* 硬件要求:推荐使用 8c16g 以上规格机器。 -* OS 要求:推荐使用 Anolis OS 系统进行部署( 暂不支持debian、ubuntu等)。 - -**部署说明**: -- 主要分为安装环境、项目构建、项目启动、数据初始化等几个步骤。 -- 该文档以x86_64机器为例, 如果您的部署机器为其他arch类型的机器,则需要将docker-compose.yaml中指定的第三方开源组件镜像更换成对应的镜像源。 -- 可以自己指定安装目录,该文档以 ~/tone目录为例(推荐)。 - -# 部署步骤 -> 后续步骤以 Anolis OS 8.6 环境为示例进行行详细说明。 - -## 1. 环境准备 - -### a. 安装docker -``` - yum -y install yum-utils - yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo - yum install -y docker-ce # 若出错:yum install -y docker-ce --nobest --allowerasing - - # 启动docker - systemctl enable docker - systemctl start docker - systemctl status docker -``` -### b. 配置docker源 -``` - vim /etc/docker/daemon.json - { - "registry-mirrors": [ - "https://6kx4zyno.mirror.aliyuncs.com", - "https://docker.mirrors.ustc.edu.cn", - "http://hub-mirror.c.163.com", - "https://registry.docker-cn.com"] - } - systemctl restart docker - # 建议使用国内镜像源。 阿里云: https://6kx4zyno.mirror.aliyuncs.com,网易: http://hub-mirror.c.163.com -``` -### c. 安装docker-compose -``` - pip3 install --upgrade pip - pip3 install docker-compose - docker-compose --version -``` - -## 2. 项目构建 - -### a. 下载项目源码 -```shell -yum install -y git - -git clone --single-branch --branch master https://gitee.com/anolis/tone-web.git ~/tone/code/tone-web -git clone --single-branch --branch master https://gitee.com/anolis/tone-runner.git ~/tone/code/tone-runner -git clone --single-branch --branch master https://gitee.com/anolis/tone-agent-proxy.git ~/tone/code/tone-agent-proxy -git clone --single-branch --branch master https://gitee.com/anolis/tone-storage.git ~/tone/code/tone-storage -``` -下载后的目录结构: -``` -~/tone/code/ - ├── tone-web - ├── tone-runner - ├── tone-agent-proxy - └── tone-storage -``` - -### b. 集成前端代码 -```shell -# 下载前端代码包: -wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/tone-front-latest.zip -wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/toneagent-front-latest.zip -# 安装unzip命令 -yum install -y unzip -# 解压到指定目录 -unzip -j -o tone-front-latest.zip -d ~/tone/code/tone-web/static/front/ -unzip -j -o toneagent-front-latest.zip -d ~/tone/code/tone-agent-proxy/static/front/ -``` - -## 3. 项目配置 -### a. 下载 docker-compose.yaml -```shell -cd ~/tone -wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/docker-compose.yaml -``` - -### b. 设置并替换变量 -执行以下脚本(需手动替换`必填的`变量): -```shell -# 部署机外网IP地址(必填) -server_ip= - -# 账号密码(必填) -db_password= -redis_password= -tone_storage_password= - -# 镜像版本标签(非必改、默认latest) -version_tag=latest - -# token(非必改、可自动生成) -toneagent_access_key=$(uuidgen) -toneagent_secret_key=$(uuidgen) -admin_urls_token=$(uuidgen) -pub_api_token=$(uuidgen) - -sed -i "s/var_db_password/${db_password}/g" docker-compose.yaml -sed -i "s/var_redis_password/${redis_password}/g" docker-compose.yaml -sed -i "s/var_tone_storage/${tone_storage_password}/g" docker-compose.yaml -sed -i "s/var_toneagent_access_key/${toneagent_access_key}/g" docker-compose.yaml -sed -i "s/var_toneagent_secret_key/${toneagent_secret_key}/g" docker-compose.yaml -sed -i "s/var_admin_urls_token/${admin_urls_token}/g" docker-compose.yaml -sed -i "s/var_pub_api_token/${pub_api_token}/g" docker-compose.yaml -sed -i "s/var_version_tag/${version_tag}/g" docker-compose.yaml -sed -i "s/var_server_ip/${server_ip}/g" docker-compose.yaml -``` - -### c. 启动docker-compose -```shell -docker-compose -f ~/tone/docker-compose.yaml up --build -d -# 注:如代码有更新或首次部署,需要加 --build 参数才会自动重新打包镜像 -``` - -## 4. 数据初始化 -### a.初始化db -* 进入`mysql` docker 镜像中,`docker exec -it {数据库容器ID} bash` -* 连接数据库:`mysql -h 127.0.0.1 -P 3306 -u root -p` -* 创建 `T-One` 数据库 `tone-db`,`ToneAgent` 数据库 `toneagent-db` - ``` - CREATE DATABASE `tone-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; - CREATE DATABASE `toneagent-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; - ``` - 也可以直接通过 mysql 可视化界面初始化数据库 - -### b.初始化 `T-One` 数据 -浏览器或者curl命令请求接口($admin_urls_token可在docker-compose配置里查看或更改) -```shell -curl -s "http://${server_ip}:8080/admin/migrate/?token=${admin_urls_token}" -curl -s "http://${server_ip}:8080/admin/init_data/?token=${admin_urls_token}" -curl -s "http://${server_ip}:8080/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." -curl -s "http://${server_ip}:8081/admin/migrate/?token=${admin_urls_token}" -curl -s "http://${server_ip}:8081/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." -curl -s "http://${server_ip}:8081/admin/import_access_token/?token=${admin_urls_token}" -``` - -### c. `T-One` 关联依赖配置 -**系统执行任务还需对以下配置进行设置** - -- 配置 `T-One` 测试用例 -- 配置`T-One` 测试机器 -- 配置 `ToneAgent` `token` - - 在 ToneAgent 系统-账号管理中增加一组 token - - 更改 docker-compose 配置中的toneagent_access_key和toneagent_secret_key - -## 5. 验证 -使用浏览器打开链接查看: `T-One` 页面:`http://{host}:8080` `ToneAgent` 管理页面:`http://{host}:8081` - -## 6. T-One 多生态使用 -`T-One` + `TestLib` -### a. 创建 `TestLib` 数据库 -- 进入 mysql docker 镜像,docker exec -it {数据库容器ID} bash -- 连接数据库:mysql -h 127.0.0.1 -P 3306 -u root -p -- 创建 TestLib 数据库 testlib - - CREATE DATABASE \`test-lib\` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; -- 创建 TestLib 数据库表 -### testlib数据库初始化 -

- 点击展开/折叠脚本 - -```shell - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET NAMES utf8 */; -/*!50503 SET NAMES utf8mb4 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; - --- 表 test-lib.case 结构 -CREATE TABLE IF NOT EXISTS `case` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '测试用例名称', - `creator` varchar(64) NOT NULL COMMENT '负责人', - `type` enum('FUNCTIONAL','PERFORMANCE','STRESS','LOAD','SECURITY','COMPATIBILITY','OTHERS') NOT NULL COMMENT '测试用例类型', - `priority` enum('PRIORITY_0','PRIORITY_1','PRIORITY_2','PRIORITY_3') NOT NULL COMMENT '测试用例的优先级', - `suite_name` varchar(128) DEFAULT NULL COMMENT '测试套名称', - `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试用例执行方式,手动、自动', - `run_model` enum('SINGLE','CLUSTER') NOT NULL COMMENT '测试用例运行模式,单机、集群', - `is_available` tinyint(1) NOT NULL COMMENT '测试用例是否可用', - `tone_case` varchar(128) DEFAULT NULL COMMENT 'T-One测试用例,当run_method为自动的时候生效', - `device_type` varchar(128) DEFAULT 'unlimit' COMMENT '设备类型,可多选,默认支持所有设备', - `device_arch` varchar(256) NOT NULL COMMENT '设备架构类型,可多选,默认支撑所有类型', - `labels` varchar(256) DEFAULT NULL COMMENT '设备标签,多个用,隔开', - `desc` varchar(512) DEFAULT NULL COMMENT '用例描述', - `pre_condition` varchar(512) DEFAULT NULL COMMENT '前置条件', - `steps` json DEFAULT NULL COMMENT '操作步骤', - `custom_fields` json DEFAULT NULL COMMENT '测试用例扩展属性', - `parent` int(11) NOT NULL COMMENT '测试用例分类节点', - PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`), - KEY `ix_case_suite_name` (`suite_name`) -) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8; - --- 表 test-lib.case_label 结构 -CREATE TABLE IF NOT EXISTS `case_label` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '用例标签', - `creator` varchar(64) NOT NULL COMMENT '标签创建人', - PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`) -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; - --- 表 test-lib.case_label_map 结构 -CREATE TABLE IF NOT EXISTS `case_label_map` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `label_name` varchar(64) NOT NULL COMMENT '用例名称', - `case_id` int(11) NOT NULL COMMENT '用例ID', - PRIMARY KEY (`id`), - KEY `ix_case_label_map_label_name` (`label_name`) -) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8; - --- 表 test-lib.case_tree 结构 -CREATE TABLE IF NOT EXISTS `case_tree` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(16) NOT NULL COMMENT '用例结构树节点名称', - `parent` int(11) NOT NULL COMMENT '父节点id', - `level` int(11) NOT NULL COMMENT '树结构的深度', - `path` varchar(128) NOT NULL COMMENT '模块完整路径', - `children_nums` int(11) NOT NULL COMMENT '子节点数量', - PRIMARY KEY (`id`), - KEY `ix_case_tree_path` (`path`) -) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; - --- 表 test-lib.device 结构 -CREATE TABLE IF NOT EXISTS `device` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '设备名称', - `arch` enum('X86','ARCH64','RISCV','LOONGARCH','NOARCH','OTHERS') NOT NULL COMMENT '设备架构', - `ip` varchar(16) NOT NULL COMMENT '设备ip', - `type` enum('UNLIMIT','VM','DOCKER','PHYSICS') NOT NULL COMMENT '设备类型', - `sn` varchar(16) DEFAULT NULL COMMENT '设备序号', - `status` tinyint(1) NOT NULL COMMENT '设备是否可用', - `label` json DEFAULT NULL COMMENT '设备标签列表数组', - `owner` varchar(256) NOT NULL COMMENT '设备负责人', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; - --- 表 test-lib.device_label 结构 -CREATE TABLE IF NOT EXISTS `device_label` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '设备标签名称', - `color` varchar(32) NOT NULL COMMENT '设备标签颜色', - PRIMARY KEY (`id`), - UNIQUE KEY `ix_device_label_name` (`name`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; - --- 表 test-lib.device_label_relationship 结构 -CREATE TABLE IF NOT EXISTS `device_label_relationship` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `label_id` int(11) NOT NULL COMMENT '机器Label id', - `device_id` int(11) NOT NULL COMMENT '机器Label id', - `is_delete` tinyint(1) DEFAULT NULL COMMENT '对应关系是否删除', - PRIMARY KEY (`id`), - KEY `ix_device_label_relationship_device_id` (`device_id`), - KEY `ix_device_label_relationship_label_id` (`label_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - --- 表 test-lib.func_result 结构 -CREATE TABLE IF NOT EXISTS `func_result` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `sub_case_name` varchar(128) NOT NULL COMMENT 'tone job名称', - `sub_case_result` enum('SUCCESS','FAIL','SKIP') NOT NULL COMMENT '功能结果', - `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', - `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', - `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', - `task_id` int(11) NOT NULL COMMENT '测试方案id', - `current` json DEFAULT NULL, - `expect` json DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `ix_func_result_tone_suite_id` (`tone_suite_id`), - KEY `ix_func_result_task_id` (`task_id`), - KEY `ix_func_result_tone_case_id` (`tone_case_id`), - KEY `ix_func_result_tone_job_id` (`tone_job_id`) -) ENGINE=InnoDB AUTO_INCREMENT=479 DEFAULT CHARSET=utf8; - --- 表 test-lib.outline 结构 -CREATE TABLE IF NOT EXISTS `outline` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '测试大纲文件名', - `title` varchar(128) NOT NULL COMMENT '测试大纲的标题', - `owner` varchar(16) NOT NULL COMMENT '测试大纲负责人', - `tid` varchar(256) NOT NULL COMMENT 'oss文件地址', - `remark` varchar(64) DEFAULT NULL COMMENT '测试大纲备注描述信息', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; - --- 表 test-lib.perf_result 结构 -CREATE TABLE IF NOT EXISTS `perf_result` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `metric` varchar(128) NOT NULL COMMENT '指标名称', - `test_value` varchar(64) DEFAULT NULL COMMENT '测试值', - `cv_value` varchar(64) DEFAULT NULL COMMENT 'cv值', - `max_value` varchar(64) DEFAULT NULL COMMENT '最大值', - `min_value` varchar(64) DEFAULT NULL COMMENT '最小值', - `unit` varchar(64) DEFAULT NULL COMMENT '测试单位', - `track_result` enum('NA','INVALID','NORMAL','DECLINE','INCREASE') NOT NULL COMMENT '跟踪结果', - `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', - `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', - `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', - `task_id` int(11) NOT NULL COMMENT '测试方案id', - PRIMARY KEY (`id`), - KEY `ix_perf_result_task_id` (`task_id`), - KEY `ix_perf_result_tone_case_id` (`tone_case_id`), - KEY `ix_perf_result_tone_suite_id` (`tone_suite_id`), - KEY `ix_perf_result_tone_job_id` (`tone_job_id`) -) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; - --- 表 test-lib.plan 结构 -CREATE TABLE IF NOT EXISTS `plan` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `title` varchar(64) NOT NULL COMMENT '测试方案名称', - `req_id` int(11) DEFAULT NULL COMMENT '测试需求id', - `req_title` varchar(128) DEFAULT NULL COMMENT '测试需求标题', - `content` json DEFAULT NULL COMMENT '测试方案内容', - `status` varchar(16) NOT NULL COMMENT '测试方案阶段状态', - `cases` varchar(256) DEFAULT NULL COMMENT '测试用例,多个使用","隔开', - `tasks` varchar(256) DEFAULT NULL COMMENT '测试任务,多个使用","隔开', - `reviewers` varchar(256) NOT NULL COMMENT '方案评审人列表', - `owner` varchar(256) NOT NULL COMMENT '测试需求的负责人,多个以,隔开', - `report` tinyint(1) NOT NULL COMMENT '测试报告是否已生成', - PRIMARY KEY (`id`), - UNIQUE KEY `title` (`title`) -) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8; - --- 表 test-lib.plan_review 结构 -CREATE TABLE IF NOT EXISTS `plan_review` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `plan_id` int(11) NOT NULL COMMENT '测试方案id', - `reviewer` varchar(32) NOT NULL COMMENT '测试需方案的评审人', - `status` varchar(16) NOT NULL COMMENT '评审状态', - `desc` varchar(512) DEFAULT NULL COMMENT '评审内容', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - --- 表 test-lib.product_category 结构 -CREATE TABLE IF NOT EXISTS `product_category` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '大类名称', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; - --- 表 test-lib.product_plan 结构 -CREATE TABLE IF NOT EXISTS `product_plan` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `test_product_id` int(11) NOT NULL COMMENT '测试产品id', - `plan_id` int(11) NOT NULL COMMENT '测试产品实际复制执行的plan id', - `executor` varchar(256) NOT NULL COMMENT '测试产品执行人', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; - --- 表 test-lib.requirement 结构 -CREATE TABLE IF NOT EXISTS `requirement` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `title` varchar(128) NOT NULL COMMENT '测试需求标题', - `outline_id` int(11) DEFAULT NULL COMMENT '测试大纲id', - `outline_title` varchar(64) DEFAULT NULL COMMENT '测试大纲标题', - `content` json NOT NULL COMMENT '测试需求的描述内容', - `status` varchar(16) NOT NULL COMMENT '测试需求阶段', - `owner` varchar(16) NOT NULL COMMENT '测试需求的创建人', - `assignee` varchar(256) NOT NULL COMMENT '测试需求的指派人,多个以,隔开', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; - --- 表 test-lib.task 结构 -CREATE TABLE IF NOT EXISTS `task` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '任务名称', - `status` varchar(16) NOT NULL COMMENT '任务执行状态', - `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试任务执行方式', - `owner` varchar(256) NOT NULL COMMENT '任务执行人', - `plan_id` int(11) NOT NULL COMMENT '测试方案id', - `plan_title` varchar(256) NOT NULL COMMENT '测试方案标题', - `cases` varchar(256) NOT NULL COMMENT '测试用例,多个使用,隔开', - `desc` varchar(256) DEFAULT NULL COMMENT '备注', - `run_result` json DEFAULT NULL COMMENT '手动用例执行结果', - `config` json DEFAULT NULL COMMENT '测试任务配置', - `device_id` int(11) DEFAULT NULL COMMENT '测试设备ID', - `device_ip` varchar(256) DEFAULT NULL COMMENT '测试机器IP', - `workspace` varchar(128) NOT NULL COMMENT 'tone workspace', - `project` varchar(128) NOT NULL COMMENT 'tone project', - `job_type` varchar(128) NOT NULL COMMENT 'tone job type', - `test_type` varchar(32) DEFAULT 'others' COMMENT '测试任务类型', - `cluster` varchar(256) DEFAULT NULL COMMENT '测试机器集群名称', - `tags` varchar(256) DEFAULT NULL COMMENT '测试机器标签', - `tsn` varchar(256) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `ix_task_plan_id` (`plan_id`) -) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8; - --- 表 test-lib.test_product 结构 -CREATE TABLE IF NOT EXISTS `test_product` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '测试产品名称', - `category_id` int(11) NOT NULL COMMENT '大类id', - `origin_plan_id` int(11) NOT NULL COMMENT '测试产品对应的plan id', - `desc` varchar(256) DEFAULT NULL COMMENT '产品描述', - `test_method` varchar(256) DEFAULT NULL COMMENT '测试方法', - `test_requirement` varchar(256) DEFAULT NULL COMMENT '测试要求', - `need_config` tinyint(1) DEFAULT NULL COMMENT '是否扩展配置', - `owner` varchar(256) NOT NULL DEFAULT '' COMMENT '测试产品创建人', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; - --- 表 test-lib.test_suite 结构 -CREATE TABLE IF NOT EXISTS `test_suite` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(128) NOT NULL COMMENT '测试套名称', - `creator` varchar(64) NOT NULL COMMENT '测试套的创建人员', - PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`) -) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; - --- 表 test-lib.tone_case 结构 -CREATE TABLE IF NOT EXISTS `tone_case` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `tone_case_id` int(11) NOT NULL COMMENT 'tone用例ID', - `tone_case_name` varchar(256) NOT NULL COMMENT 'tone用例名称', - `suite_id` int(11) NOT NULL COMMENT 'suite ID', - `suite_name` varchar(256) NOT NULL COMMENT 'suite用例名称', - `test_type` varchar(64) DEFAULT NULL COMMENT '测试类型', - PRIMARY KEY (`id`), - KEY `ix_tone_case_tone_case_name` (`tone_case_name`), - KEY `ix_tone_case_suite_id` (`suite_id`), - KEY `ix_tone_case_suite_name` (`suite_name`) -) ENGINE=InnoDB AUTO_INCREMENT=603 DEFAULT CHARSET=utf8; - --- 表 test-lib.tone_job 结构 -CREATE TABLE IF NOT EXISTS `tone_job` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(100) NOT NULL COMMENT 'tone job名称', - `state` enum('PENDING','RUNNING','SUCCESS','FAIL','STOP','SKIP') NOT NULL COMMENT 'tone job状态', - `test_type` enum('FUNCTIONAL','PERFORMANCE') NOT NULL COMMENT '测试类型', - `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', - `tone_job_link` varchar(100) DEFAULT '' COMMENT 'tone job链接', - `task_id` int(11) NOT NULL COMMENT '测试方案id', - `server_info` json DEFAULT NULL COMMENT '存储tone job的机器信息', - PRIMARY KEY (`id`), - KEY `ix_tone_job_tone_job_id` (`tone_job_id`), - KEY `ix_tone_job_task_id` (`task_id`) -) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8; - --- 表 test-lib.tone_sync_pull 结构 -CREATE TABLE IF NOT EXISTS `tone_sync_pull` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=76149 DEFAULT CHARSET=utf8; - --- 表 test-lib.tone_sync_push 结构 -CREATE TABLE IF NOT EXISTS `tone_sync_push` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - --- 表 test-lib.user 结构 -CREATE TABLE IF NOT EXISTS `user` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', - `nick_name` varchar(64) DEFAULT NULL COMMENT '用户昵称,具有唯一性', - `email` varchar(64) NOT NULL COMMENT '用户邮箱', - `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', - `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', - PRIMARY KEY (`id`), - UNIQUE KEY `nick_name` (`nick_name`), - KEY `ix_user_user_name` (`user_name`) -) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; - --- 表 test-lib.user_open_source 结构 -CREATE TABLE IF NOT EXISTS `user_open_source` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', - `nick_name` varchar(64) NOT NULL COMMENT '用户昵称,具有唯一性', - `email` varchar(64) NOT NULL COMMENT '用户邮箱', - `password` varchar(64) NOT NULL COMMENT '用户密码,前端对密码md5加密后的值', - `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', - `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', - `token` varchar(256) NOT NULL COMMENT 'api访问凭证', - PRIMARY KEY (`id`), - UNIQUE KEY `nick_name` (`nick_name`), - UNIQUE KEY `email` (`email`), - KEY `ix_user_open_source_token` (`token`(255)) -) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; - --- 表 test-lib.user_role_op_record 结构 -CREATE TABLE IF NOT EXISTS `user_role_op_record` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `applicant` varchar(64) NOT NULL COMMENT '申请人name', - `applicant_id` int(11) NOT NULL COMMENT '申请人ID', - `apply_reason` varchar(512) DEFAULT NULL COMMENT '申请理由', - `signer` varchar(64) DEFAULT NULL COMMENT '评审人name', - `has_review` tinyint(1) NOT NULL COMMENT '是否已经审核', - `review_result` enum('INIT','PASS','FAIL') NOT NULL COMMENT '审核结果', - `review_reason` varchar(512) DEFAULT NULL COMMENT '评审意见', - `method` enum('APPROVE','UPGRADE','DOWNGRADE','DELETE') NOT NULL COMMENT '操作方式', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; - -/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; -/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; - - -``` -
- -### b.TestLib 服务依赖 -### c. clone test-lib代码到~/tone/code目录下 -```shell -git clone --single-branch --branch master https://gitee.com/anolis/testlib.git ~/tone/code/testlib -``` -### d.增加docker-compose配置 -```yaml -# docker-compose.yaml service下增加test-lib - test-lib: - build: - context: code/testlib/ - dockerfile: Dockerfile - args: - APP_NAME: test-lib - ENV: daily - image: test-lib:latest - ports: - - "8005:8005" - depends_on: - - mysql - - redis - environment: - <<: *common-variables - # db - db_url: mysql+aiomysql://${db_user}:{db_password}@mysql:3306/test-lib - # redis - redis_url: redis://:${redis_password}@redis:6379/10 - # app - tone_host: http://${server_ip}:8080/ - tone_token: tone_token - tone_user_name: tone_user_name - main_domain: http://${server_ip}:8005 - oss_url: http://${server_ip}:8005 -``` -#### e.重启服务 -```shell -docker-compose -f ~/tone/docker-compose.yaml up --build -d -``` -## 7. 独立部署 FAQ -https://tone.openanolis.cn/help_doc/12 \ No newline at end of file diff --git "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" deleted file mode 100644 index b09df7d0..00000000 --- "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" +++ /dev/null @@ -1,70 +0,0 @@ -# 一级标题 -## 二级标题 -### 三级标题 -**粗体文本** - -__cuti__ - -*斜体文本* - -_xieti_ - -下划线 - -~~删除线~~ - -上标:Xy - -下标:An - -> 引用文本 -- 无序列表项1 - - 第二层 -- 无序列表项2 -* * * -1. 有序列表项1 -2. 有序列表项2 ---- -[链接文本](https://gitee.com/suli01/community/edit/master/sig/T-One/content/%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97/%E7%94%A8%E6%88%B7%E8%81%86%E5%90%AC/test.md) - -链接名称 - -'''python -def hello_world(): - print("Hello, world!") - -![示例图片](https://pic.rmb.bdstatic.com/bjh/gallery/03e17cba710868d9153176b50a5fca0d1090.jpeg#pic_center=100x100) - -| 列1 | 列2 | 列3 | -| --- | --- | --- | -| 单元格1 | 单元格2 | 单元格3 | -| 单元格4 | 单元格5 | 单元格6 | - - -| 左对齐 | 居中对齐 | 右对齐 | -|:-----|:------:|------:| -| 文本 | 文本 | 文本 | - -
图片名称
- - - - - - - - - - - - - -
值班人员星期一星期二星期三
张三李四王五
- -- [ ] :待完成事项 - -- [x] :已完成事项 - -
- 图片名称 -
diff --git "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" deleted file mode 100644 index d0a3a7f0..00000000 --- "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" +++ /dev/null @@ -1,2 +0,0 @@ -# hello -![测试外链图片](https://up.enterdesk.com/2021/edpic/0a/13/7a/0a137aaa28f48af0349cee1e568c0a57_1.jpg) \ No newline at end of file diff --git "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" "b/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" deleted file mode 100644 index e5d110a5..00000000 --- "a/sig/T-One-copy/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" +++ /dev/null @@ -1,2 +0,0 @@ -# hello, 欢迎来到聆听 .md -## 阿斯顿发射点 \ No newline at end of file diff --git a/sig/T-One-copy/sig-info.yaml b/sig/T-One-copy/sig-info.yaml deleted file mode 100644 index 879b0bd9..00000000 --- a/sig/T-One-copy/sig-info.yaml +++ /dev/null @@ -1,40 +0,0 @@ -name: T-One-copy -en_name: T-One-copy -home_page: https://openanolis.cn/sig/t-one -description: T-One兴趣组主要目标是建立OpenAnolis社区的质量保障基础设施(包括但不限于一站式的自动化测试平台T-One/Testfarm,Bisect缺陷定位工具等各类测试平台), 支持OpenAnolis社区的各类测试活动。 -en_description: The main goal of the T-One interest group is to establish the quality assurance infrastructure of the OpenAnolis community (including but not limited to the one-stop automated test platform T-One/Testfarm, Bisect defect location tool and other test platforms), -to support various test platforms in the OpenAnolis community Class testing activities. -mailing_list: t-one@lists.openanolis.cn -meeting_minutes_url: https://etherpad.openanolis.cn/p/t-one -maintainers: -- openanolis_id: yongchao - gitee_id: yongchao - name: yongchao Zhang - organization: AlibabaCloud - email: yongchao@linux.alibaba.com -- openanolis_id: suqingming - gitee_id: suqingming -- openanolis_id: jacob2021 - gitee_id: jacob2021 -- openanolis_id: eeeeeeee - gitee_id: suli01 -contributors: -- openanolis_id: fuyong - gitee_id: fuyong -- openanolis_id: woohello - gitee_id: woohello -- openanolis_id: maozzi4 - gitee_id: maozzi -repositories: -- repo: - - anolis/testfarm - - anolis/testfarm-front - - anolis/tone-web - - anolis/tone-runner - - anolis/tone-agent - - anolis/tone-agent-proxy - - anolis/tone-agent-front - - anolis/tone-front - - anolis/tone-deploy - - anolis/tone-cli - - anolis/tone-storage \ No newline at end of file -- Gitee From 3a469d83894c1c6e264563f71b5538c756d3d9ca Mon Sep 17 00:00:00 2001 From: WB01533938 Date: Mon, 20 Jan 2025 13:21:24 +0800 Subject: [PATCH 104/135] =?UTF-8?q?ci:=20=E6=9B=B4=E6=96=B0=20T-One-copy2?= =?UTF-8?q?=20SIG=20=E6=88=90=E5=91=98=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改成员 suqingming 的 OpenAnolis ID为 sULI01 - 修改成员 suqingming 的 Gitee ID 为 SULI01 - 移除成员 eeeeeeee 的 OpenAnolis ID --- sig/T-One-copy2/sig-info.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sig/T-One-copy2/sig-info.yaml b/sig/T-One-copy2/sig-info.yaml index 49d584a9..2386d80d 100644 --- a/sig/T-One-copy2/sig-info.yaml +++ b/sig/T-One-copy2/sig-info.yaml @@ -12,8 +12,8 @@ maintainers: name: yongchao Zhang organization: AlibabaCloud email: yongchao@linux.alibaba.com -- openanolis_id: suqingming - gitee_id: suqingming +- openanolis_id: sULI01 + gitee_id: SULI01 - openanolis_id: jacob2021 gitee_id: jacob2021 - openanolis_id: eeeeeeee -- Gitee From facff5869a9722e279a4ac752f4cb07ef0e82c1f Mon Sep 17 00:00:00 2001 From: WB01533938 Date: Mon, 20 Jan 2025 13:38:34 +0800 Subject: [PATCH 105/135] =?UTF-8?q?ci:=20=E6=9B=B4=E6=96=B0=20T-One-copy2?= =?UTF-8?q?=20SIG=20=E6=88=90=E5=91=98=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改成员 suqingming 的 OpenAnolis ID为 sULI01 - 修改成员 suqingming 的 Gitee ID 为 SULI0 --- sig/T-One-copy3/README.en.md | 57 ++ sig/T-One-copy3/README.md | 56 ++ .../assets/Dingtalk_20240614165831.jpg | Bin 0 -> 6459 bytes sig/T-One-copy3/assets/dingding_group.jpeg | Bin 0 -> 176005 bytes .../1\346\234\210test" | 2 + .../2\346\234\210test" | 2 + .../3\346\234\210test" | 1 + .../SIG\344\276\213\344\274\232(202203-3).md" | 20 + .../SIG\344\276\213\344\274\232(202204-1).md" | 22 + .../SIG\344\276\213\344\274\232(202205-1).md" | 36 + .../SIG\344\276\213\344\274\232(202306-1).md" | 24 + .../SIG\344\276\213\344\274\232(202307-1).md" | 26 + ...13\350\257\225\346\226\207\344\273\266.md" | 4 + ...23\345\214\205\346\211\213\345\206\214.md" | 63 ++ .../test.md" | 16 + ...345\244\226\346\234\215\345\212\241API.md" | 1 + ...06\346\210\220\346\211\213\345\206\214.md" | 282 ++++++++ .../\346\234\210\346\212\245/202212.md" | 82 +++ .../\346\234\210\346\212\245/202301.md" | 101 +++ ...10\346\212\245\350\257\264\346\230\216.md" | 7 + .../000000000130_anolis.jpg" | Bin 0 -> 47154 bytes .../T-One\346\246\202\350\277\260.md" | 30 + .../assets/Dingtalk_20240614165831.jpg" | Bin 0 -> 6459 bytes .../assets/jiagou.jpeg" | Bin 0 -> 366652 bytes .../test1.md" | 73 +++ .../tone\351\203\250\347\275\262.md" | 615 ++++++++++++++++++ .../test.md" | 70 ++ ...26\351\223\276\345\233\276\347\211\207.md" | 2 + .../\350\201\206\345\220\254.md" | 2 + sig/T-One-copy3/sig-info.yaml | 40 ++ 30 files changed, 1634 insertions(+) create mode 100644 sig/T-One-copy3/README.en.md create mode 100644 sig/T-One-copy3/README.md create mode 100644 sig/T-One-copy3/assets/Dingtalk_20240614165831.jpg create mode 100644 sig/T-One-copy3/assets/dingding_group.jpeg create mode 100644 "sig/T-One-copy3/content/SIG\344\276\213\344\274\232/1\346\234\210test" create mode 100644 "sig/T-One-copy3/content/SIG\344\276\213\344\274\232/2\346\234\210test" create mode 100644 "sig/T-One-copy3/content/SIG\344\276\213\344\274\232/3\346\234\210test" create mode 100644 "sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202203-3).md" create mode 100644 "sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202204-1).md" create mode 100644 "sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202205-1).md" create mode 100644 "sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202306-1).md" create mode 100644 "sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202307-1).md" create mode 100644 "sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232\346\265\213\350\257\225\346\226\207\344\273\266.md" create mode 100644 "sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/ToneAgent\347\274\226\350\257\221\346\211\223\345\214\205\346\211\213\345\206\214.md" create mode 100644 "sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" create mode 100644 "sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/\345\257\271\345\244\226\346\234\215\345\212\241API.md" create mode 100644 "sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/\346\265\213\350\257\225\345\245\227\344\273\266\351\233\206\346\210\220\346\211\213\345\206\214.md" create mode 100644 "sig/T-One-copy3/content/\346\234\210\346\212\245/202212.md" create mode 100644 "sig/T-One-copy3/content/\346\234\210\346\212\245/202301.md" create mode 100644 "sig/T-One-copy3/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" create mode 100644 "sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/000000000130_anolis.jpg" create mode 100644 "sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" create mode 100644 "sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/Dingtalk_20240614165831.jpg" create mode 100644 "sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/jiagou.jpeg" create mode 100644 "sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" create mode 100644 "sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" create mode 100644 "sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" create mode 100644 "sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" create mode 100644 "sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" create mode 100644 sig/T-One-copy3/sig-info.yaml diff --git a/sig/T-One-copy3/README.en.md b/sig/T-One-copy3/README.en.md new file mode 100644 index 00000000..831cee37 --- /dev/null +++ b/sig/T-One-copy3/README.en.md @@ -0,0 +1,57 @@ +## SIG Home + +https://openanolis.cn/sig/t-one + +## SIG Mission +T-One SIG focus on building a one station test system, to fully support OpenAnolis community test activities. + +The main activities of this SIG are: +1. Explore excellent solutions, collect requirements by the community, design and plan direction on the test platform. +2. Develop and maint T-One/Testfarm to support testing tasks by the community. +3. Make T-One open-source, attract develpers by the community, provide testing services for community developers and cooperative enterprises此处有中文. + +## T-One Link +T-One:https://tone.openanolis.cn/ + +Testfarm:https://testfarm.openanolis.cn/ + +## Members +| Member | Role | +| ------------ | ------------ | +| [yongchao](https://gitee.com/zy_chao) | maintainer | +| vosamowho | maintainer | +| wjn740 | maintainer | +| suqingming | maintainer | +| jacob2021 | maintainer | +| fuyong | maintainer | +| wenlylinux | contributor | +| zhangxuefeng | contributor | +| wb-cy860729 | contributor | +| jpt2021 | contributor | +| woohello | contributor | +| as461177513 | contributor | +| vosamowho | contributor | + +## SIG Repositories + +Source code repositories: +- https://gitee.com/anolis/testfarm +- https://gitee.com/anolis/testfarm-front +- https://gitee.com/anolis/tone-web +- https://gitee.com/anolis/tone-runner +- https://gitee.com/anolis/tone-agent +- https://gitee.com/anolis/tone-agent-proxy +- https://gitee.com/anolis/tone-agent-front +- https://gitee.com/anolis/tone-front +- https://gitee.com/anolis/tone-deploy +- https://gitee.com/anolis/tone-cli +- https://gitee.com/anolis/tone-storage + + +## Meetings + +## Chat GROUP + +欢迎使用钉钉扫码入群 + +![](assets/dingding_group.jpeg) \ No newline at end of file diff --git a/sig/T-One-copy3/README.md b/sig/T-One-copy3/README.md new file mode 100644 index 00000000..9c662bcc --- /dev/null +++ b/sig/T-One-copy3/README.md @@ -0,0 +1,56 @@ +## SIG主页 + +https://openanolis.cn/sig/t-one + +## SIG目标 +T-One兴趣组主要目标是建立OpenAnolis社区的质量保障基础设施(包括但不限于一站式的自动化测试平台T-One/Testfarm,Bisect缺陷定位工具等各类测试平台), 支持OpenAnolis社区的各类测试活动;此SIG组的主要活动有: +1. 探索业界在测试工具方面的优秀方案,同时结合社区在测试方面的需求,设计规划测试工具的后续方向。 +2. 开发并维护相关测试工具,支撑社区的各类测试活动。.... +3. 开源相关测试工具,吸引社区的开发力量,并为社区开发者及合作企业提供测试服务。 + +## 平台链接 +T-One:https://tone.openanolis.cn/ + +Testfarm:https://testfarm.openanolis.cn/ + + +## 成员列表 +| 成员 | 角色 | +| ------------ | ------------ | +| [yongchao](https://gitee.com/zy_chao) | maintainer | +| vosamowho | maintainer | +| wjn740 | maintainer | +| suqingming | maintainer | +| jacob2021 | maintainer | +| fuyong | maintainer | +| wenlylinux | contributor | +| zhangxuefeng | contributor | +| wb-cy860729 | contributor | +| jpt2021 | contributor | +| woohello | contributor | +| as461177513 | contributor | +| vosamowho | contributor | + +## SIG仓库 + +Source code repositories: +- https://gitee.com/anolis/testfarm +- https://gitee.com/anolis/testfarm-front +- https://gitee.com/anolis/tone-web +- https://gitee.com/anolis/tone-runner +- https://gitee.com/anolis/tone-agent +- https://gitee.com/anolis/tone-agent-proxy +- https://gitee.com/anolis/tone-agent-front +- https://gitee.com/anolis/tone-front +- https://gitee.com/anolis/tone-deploy +- https://gitee.com/anolis/tone-cli +- https://gitee.com/anolis/tone-storage + +## 小组例会 +双周会,采用线上会议形式 + +## 钉钉群 + +欢迎使用钉钉扫码入群 + +![](assets/dingding_group.jpeg) \ No newline at end of file diff --git a/sig/T-One-copy3/assets/Dingtalk_20240614165831.jpg b/sig/T-One-copy3/assets/Dingtalk_20240614165831.jpg new file mode 100644 index 0000000000000000000000000000000000000000..925bf2945891170613821e8e7dbc9e4206d17c8d GIT binary patch literal 6459 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 literal 0 HcmV?d00001 diff --git "a/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/1\346\234\210test" "b/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/1\346\234\210test" new file mode 100644 index 00000000..8c388782 --- /dev/null +++ "b/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/1\346\234\210test" @@ -0,0 +1,2 @@ +test +0228 \ No newline at end of file diff --git "a/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/2\346\234\210test" "b/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/2\346\234\210test" new file mode 100644 index 00000000..479dbaff --- /dev/null +++ "b/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/2\346\234\210test" @@ -0,0 +1,2 @@ +test +顶顶顶顶顶 \ No newline at end of file diff --git "a/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/3\346\234\210test" "b/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/3\346\234\210test" new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ "b/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/3\346\234\210test" @@ -0,0 +1 @@ +test \ No newline at end of file diff --git "a/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202203-3).md" "b/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202203-3).md" new file mode 100644 index 00000000..3bf59177 --- /dev/null +++ "b/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202203-3).md" @@ -0,0 +1,20 @@ +## 会议主题 +测试管理系统TestLib的方案讨论 + +## 会议时间 +2022.03.16 10:00-11:00 + +## 参会人 + +- 参会方:来自电子五所(赛宝实验室)和阿里云的社区爱好者 +- 参会人:yongchao、qingming、wjn740、as461177513、VosAmoWho 等等 + +## 会议记要 + +1. 对齐五所提出的方案扩展需求,主要是字段的扩展以及流程上适当进行松耦合 + - 设计对象:需要考虑测试用例套与测试需求的关系,测试结果与测试执行记录集的关系,测试方案的扩展等 + - 评审相关:测试用例、测试方案、测试结果 + - 流程上:主要对象之间需要进行适当的弱耦合 + - 平台输出:需要考虑测试用例及测试用例执行记录集这两块内容 +2. 讨论后续社区合作、运营等方式 +3. 后续yongchao会结合这次新增扩展需求进行设计上的优化并与大家对齐 \ No newline at end of file diff --git "a/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202204-1).md" "b/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202204-1).md" new file mode 100644 index 00000000..6bec3ab0 --- /dev/null +++ "b/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202204-1).md" @@ -0,0 +1,22 @@ +## 会议主题 +测试管理系统TestLib演示及需求讨论 + +## 会议时间 +2022.04.28 11:00-12:00 + +## 参会人 +- 参会方:来自电子五所(赛宝实验室)和阿里云的社区爱好者 +- 参会人:yongchao、wjn740、as461177513、VosAmoWho 等等 +## 会议记要 + +1. 我们演示了testlib目前全部功能,包括大纲,需求,方案,用例,任务,设备等等功能,强调通用性。 + - 测试方案已经跟测试用例和测试任务打通。 + - 测试用例跟t-one打通,测试任务结果跟t-one打通中。 + - 测试设备状态跟t-one打通中。 + - 介绍目前规划:用户权限,自定义字段,测试任务结果打通,测试方案维度的报告,还有系统配置等。 +2. 讨论下阶段主要需求,主要考虑两个方面: + - 希望演示的时候打通台式机的一个**完整测试流程打通**(大纲,需求,方案,任务,报告等)。 + - 有一个台式机的**测试报告**可以看。 +3. 演示发现的主要问题: + - 方案关联的任务没限制,用例管理信息问题,任务结果问题,还有方案维度的报告结果。 + diff --git "a/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202205-1).md" "b/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202205-1).md" new file mode 100644 index 00000000..8139fbee --- /dev/null +++ "b/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202205-1).md" @@ -0,0 +1,36 @@ +## 会议主题 +测试管理系统TestLib开发进度同步、演示、以及问题交流 +## 会议时间 +2022.05.20 10:00-11:00 +## 参会人 + +- 参会方:来自电子五所(赛宝实验室)和阿里云的社区爱好者 +- 参会人:yongchao、VosAmoWho、juexiao、wjn740、zhizhisheng、as461177513 等等 +## 会议记要 + +1. yongchao和VosAmoWho 与五所同学演示了testlib相关功能,着重介绍了与上次demo的开发重点变化,主要是测试方案及报告,测试用例的优化,测试任务及结果录入,以及系统配置等模块的优化。 +1. 大家一起交流了 testlib 以及 t-one的相关问题: + - T-One相关问题: + - 文档指导类: + - 升级debian相关步骤,涉及toneagent, tone配置,tone-cli等。 + - 同步本地用例出现故障, 以及系统同步用例相关的配置。 + - 测试机器:内网集群与内网单机的区别,如何配置等 + - 测试工具的管理问题: + - 不同的脚本都通过git进行管理出现的问题,离线模式介绍。 + - 测试工具的管理,版本管理如何做。 + - TestLib相关问题: + - 和tone的联动需要完善。 + - 用例结果:测试用例 及 结果 通过excel 导入及导出;关联任务/跳过任务 + - 测试报告:需要显示测试设备信息,后面考虑软硬件信息的提取及展示 +3. 目前系统已经发布上线,可以给五所同学配置权限即可进行试用。 +3. 五所提出的5月25日正式演示时间点不变,主要演示需求点还是: + - 希望演示的时候打通台式机的一个**完整测试流程打通**(大纲,需求,方案,任务,报告等)。 + - 有一个台式机的**测试报告**可以看。 +5. 后续开发重点主要是: + - 权限管控体系完善,方便社区线上使用。 + - 与t-one对接起来,固定ws、project、job类型等,自动执行并同步用例。 + - 手动录入用例结果、及设备的优化。 + - 测试方案报告及结果中设备等的展示优化。 + + + diff --git "a/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202306-1).md" "b/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202306-1).md" new file mode 100644 index 00000000..4274bb1b --- /dev/null +++ "b/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202306-1).md" @@ -0,0 +1,24 @@ + +### 会议主题 +项目例会 + +### 会议时间 +2023.06.08 10:30-11:30 + +### 参会人 +参会人:yongchao,fubing,ylsong, zhizhisheng,suchunyang,T-One项目小组 + +### 会议纪要 + +1. T-One最新进展同步 +- runner2 性能优化 +- toneagent新增日志自动拆分、自动清理功能 +- 同步用例逻辑变更,不依赖同步用例的机器 +- 用例管理批量编辑字段优化 +- 时序分析中性能分析、新建 Job 提交、消息通知相关慢接口优化。 +- 新增接口可查询某个产品下的 Job ID。 + +2. 需求反馈和意见收集 +- 物理机迁移的方案:主要关心数据的可迁移 +- 版本升级原地升级的方案:升级的便捷性 +- 社区版和开源部署版的数据节点间的互相同步数据 diff --git "a/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202307-1).md" "b/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202307-1).md" new file mode 100644 index 00000000..e59dcd0f --- /dev/null +++ "b/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(202307-1).md" @@ -0,0 +1,26 @@ + +### 会议主题 +项目例会 + +### 会议时间 +2023.06.08 10:30-11:30 + +### 参会人 +参会人:yongchao,fubing,ylsong, zhizhisheng,suchunyang,T-One项目小组 + +### 会议纪要 + +1. T-One最新进展同步 +- runner2 性能优化 +- toneagent新增日志自动拆分、自动清理功能 +- 同步用例逻辑变更,不依赖同步用例的机器 +- 用例管理批量编辑字段优化 +- 时序分析中性能分析、新建 Job 提交、消息通知相关慢接口优化。 +- 新增接口可查询某个产品下的 Job ID。 +- [这是一个链接]: http://www.z01.com/ "这里是链接的title内容 +这是一个链接 [这是逐浪软件官网链接](http://www.z01.com/ "欢迎访问逐浪软件官网") +2. 需求反馈和意见收集 +- 物理机迁移的方案:主要关心数据的可迁移 +- 版本升级原地升级的方案:升级的便捷性 +- 社区版和开源部署版的数据节点间的互相同步数据 +- 测试验证 diff --git "a/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232\346\265\213\350\257\225\346\226\207\344\273\266.md" "b/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232\346\265\213\350\257\225\346\226\207\344\273\266.md" new file mode 100644 index 00000000..1732d313 --- /dev/null +++ "b/sig/T-One-copy3/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232\346\265\213\350\257\225\346\226\207\344\273\266.md" @@ -0,0 +1,4 @@ +### 收尾验证 +这是收尾,验证同步作者信息 +### 验证history +2023年11月16日10:49:13 \ No newline at end of file diff --git "a/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/ToneAgent\347\274\226\350\257\221\346\211\223\345\214\205\346\211\213\345\206\214.md" "b/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/ToneAgent\347\274\226\350\257\221\346\211\223\345\214\205\346\211\213\345\206\214.md" new file mode 100644 index 00000000..0949b8e7 --- /dev/null +++ "b/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/ToneAgent\347\274\226\350\257\221\346\211\223\345\214\205\346\211\213\345\206\214.md" @@ -0,0 +1,63 @@ +# 1. ToneAgent编译 + +## 1.1 环境准备 +Go 1.17 及以上版本([下载地址](https://go.dev/dl/)) + +## 1.2 下载ToneAgent + git clone git@gitee.com:anolis/tone-agent.git + cd tone-agent + +## 1.3 编译 +`-o` 后面是二进制的名称 + +### 1.3.1 编译 AMD64的二进制 + GOOS=linux GOARCH=amd64 go build -o toneagent-amd64-v102 + +### 1.3.2 编译 ARM 的二进制 + GOOS=linux GOARCH=arm64 go build -o toneagent-amd64-v102 + +# 2. Linux环境二进制打包 + +## 2.1 RPM包制作 + +### 2.1.1 RPM环境准备 + sudo su -c bash # 使用bash + yum install rpmdevtools rpmdevtools # 安装rpm打包工具 + +### 2.1.2 打包RPM包 + rpmdev-setuptree # 创建目录,会在用户目录下创建rpmbuild文件夹 ~/rpmbuild + cd # 返回用户目录 + vi rpmbuild/SPEC/toneagent.spec # 修改创建spec的模板文件 + mkdir rpmbuild/BUILDROOT/toneagent-0.0.1-AMD + cp ${二进制路径} rpmbuild/BUILDROOT/toneagent-0.0.1-AMD/ # 拷贝二进制到RPM目录 + cd rpmbuild/SPEC/ + rpmbuild -bb toneagent.spec # 构建rpm包 + +### 2.1.3 RPM安装及启动 + sudo yum -y install ${toneagent包位置} # 安装 + sudo systemctl start toneagent # 启动 + +## 2.2 DEB包制作 + +### 2.1.1 环境准备 + sudo apt instsll -y dpkg # 使用二进制打包,只需要安装这个包 + sudo apt install -y dpkg build-essential devscripts quilt dh-make git # 扩展安装 + +### 2.1.2 打包DEB包 + mkdir toneagent.work + cd toneagent.work + mkdir -pv toneagent_0.0.1_amd64/{DEBIAN,bin} + cp ${tone-agent二进制} toneagent_0.0.1_amd64/bin/ + echo "Package: toneagent + Version: 1.0 + Architecture: arm + Maintainer: alibaba + Installed-Size: 100 + Depends: + Priority: optional + Description: toneagent for SUNXI devices (A10,A20 ...),example is Cubieboard. + " >> toneagent_0.0.1_amd64/DEBIAN/control + dpkg -b toneagent_0.0.1_amd64 toneagent_0.0.1_amd64.deb + +### 2.1.3 DEB安装 + dpkg -i toneagent_0.0.1_amd64.deb diff --git "a/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" "b/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" new file mode 100644 index 00000000..9dca95d4 --- /dev/null +++ "b/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" @@ -0,0 +1,16 @@ +HCT密码计算套件的目录结构如下: +阿斯顿法师打发斯蒂芬 +44444444444444444444444444444444444444444444444444444 +hygon-devkit/ + + ├─ hct +  ├──pkg +  │ ├── hct_1.0.0.20230224_rc +  │ ├── hct_1.0.1.20230512_rc +  │ └── hct_1.1.0.20230730_rc +  │ +  └── README.md + +\* pkg目录:内含各版本hct密码计算套件。 + +\* README.md文件:有关HCT的简单情况。 \ No newline at end of file diff --git "a/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/\345\257\271\345\244\226\346\234\215\345\212\241API.md" "b/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/\345\257\271\345\244\226\346\234\215\345\212\241API.md" new file mode 100644 index 00000000..6be2fe13 --- /dev/null +++ "b/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/\345\257\271\345\244\226\346\234\215\345\212\241API.md" @@ -0,0 +1 @@ +参考文档:https://tone.openanolis.cn/help_doc/7 \ No newline at end of file diff --git "a/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/\346\265\213\350\257\225\345\245\227\344\273\266\351\233\206\346\210\220\346\211\213\345\206\214.md" "b/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/\346\265\213\350\257\225\345\245\227\344\273\266\351\233\206\346\210\220\346\211\213\345\206\214.md" new file mode 100644 index 00000000..67b07c6d --- /dev/null +++ "b/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/\346\265\213\350\257\225\345\245\227\344\273\266\351\233\206\346\210\220\346\211\213\345\206\214.md" @@ -0,0 +1,282 @@ +# tone-cli介绍 +tone-cli主要用于测试套件(testsuite)的调度及运行。 + +# 代码仓库 +https://gitee.com/anolis/tone-cli + +# 测试套件构成 +测试套件主要由套件本身和集成脚本构成,其中: + +- 测试套件可以存放于gitee或其他代码仓库,也可以是一个系统中已经包含的命令 +- 集成脚本由两部分构成: + - 适配脚本 + - 测试套配置文件 + +# 测试套件集成 + +## 测试配置文件 +测试配置文件位于`$TONE_ROOT/conf`目录下,与适配脚本一起为测试套件服务。 + +为了便于组织,当前根据测试类别分为`functional`,`performance`和`stress`。 + +测试配置文件主要用于描述测试的参数,以netperf为例: + + test IP runtime send_size + TCP_RR ipv4 60s Na + TCP_RR ipv4 60s 16K + TCP_CC ipv4 60s Na + TCP_CRR ipv4 60s Na + ... + +第一行描述为变量名,后续行描述的是变量的值。tone-cli会将测试套配置文件按照配置进行执行: + + $ tone list netperf + test IP runtime send_size testconf + TCP_RR ipv4 60 None netperf:test=TCP_RR,IP=ipv4,runtime=60s + TCP_RR ipv4 60 16K netperf:test=TCP_RR,IP=ipv4,runtime=60s,send_size=16K + TCP_CC ipv4 60 None netperf:test=TCP_CC,IP=ipv4,runtime=60s + TCP_CRR ipv4 60 None netperf:test=TCP_CRR,IP=ipv4,runtime=60s +在后续的脚本中,conf中的变量会以参数形式传递给适配脚本。 + +> 注: +> +> - 没有任何变量的测试套,仍然需要创建对应名称的配置文件,保持内容为空 +> - 对于某个参数,如netperf的send_size,在某些状况下不需要传入参数,则可以置为NA + +## 适配脚本 + +测试套件适配脚本需要存放于`$TONE_ROOT/tests`目录下,创建工具对应的目录,如`$TONE_ROOT/tests/netperf`。 + +tone-cli将测试定义为以下几个阶段,可以根据需要来决定是否需要对应的阶段: + +- 测试套件获取 +- 测试套件编译安装 +- 测试执行 +- 结果处理 +- 测试套件卸载 + +适配脚本需要最少包含`install.sh`,`run.sh`和`README.md`,其中: + +- install.sh: 定义测试套件获取、依赖包、测试套件编译及安装 +- run.sh: 定义测试执行过程,结果处理方式 +- README.md: 测试套件必要说明 + +其他脚本可以根据需要决定,如:将结果处理脚本单独编写,在run.sh中加以引用 + +### 测试套件获取 + +当前支持通过URL下载或git方式获取对应的测试套: + +| 方式| 参数 | 说明 |举例 | +| :--:| :---: | :---: |:---: | +|URL下载 |WEB_URL |测试套下载地址 |WEB_URL=“https://gitee.com/anolis/tone-cli/repository/archive/master.zip”| +|GIT仓库 |GIT_URL |git仓库地址 |GIT_URL="https://gitee.com/mirrors_HewlettPackard/netperf.git"| +| |BRANCH |git分支| BRANCH="netperf-2.7.0"| + +tone-cli将根据提供的`WEB_URL`,`GIT_URL`,`BRANCH`等信息拉取对应的源代码 + +### 举例: + +`netperf/install.sh` + + GIT_URL="https://gitee.com/mirrors_HewlettPackard/netperf.git" + BRANCH="netperf-2.7.0" + +### 测试套件编译安装 + +tone-cli提供的标准安装方式由以下几步: + +- 执行安装前额外的操作:extract_src +- 安装依赖包:install_pkg +- 编译:build +- 安装:install + +**extract_src** + +用于在安装依赖包之前进行必要的准备,如centos安装epel源: + + extract_src() + { + logger yum install -y epel-release + } + +**install_pkg** + +绝大部分状况下,不需要重写install_pkg的方法,而仅通过设置DEP_PKG_LIST的变量,tone-cli将自动进行依赖包安装。如netperf/install.sh: + + DEP_PKG_LIST="automake gcc texinfo" + +**build和install** + +通常状况,build和install都需要根据测试套件进行重写。以netperf为例: + + build() + { + local configure_flags=( + --prefix="$TONE_BM_RUN_DIR" + ) + if [ "$(/usr/bin/arch)" = aarch64 ]; then + configure_flags+=('--build=aarch64-unknown-linux-gnu') + fi + + export CFLAGS="-fno-strict-aliasing -fcommon" + + ./autogen.sh + ./configure "${configure_flags[@]}" + make + } + + install() + { + make install-exec + } +### 测试执行 + +测试执行被定义在`run.sh`中,主要的步骤有: + +- 测试准备:setup +- 测试执行:run +- 测试拆除:teardown + +以netperf为例,netperf测试可以划分为: + +- 启动netserver +- 使用netperf命令进行测试 +- 拆除netserver + +**setup** + +netperf测试中,netserver启动主要逻辑为: + +- 判断是否设置了$SERVER,如果已设置,则认为netserver将在对应的server上执行 +- 启动netserver,启动netserver的主要逻辑在netserver.sh中体现 + + setup() + { + [ -n "$SERVER" ] && server=${SERVER%% *} || server=localhost + echo "Run netserver on host: $server" + + if [ "$server" = localhost ]; then + source "$TONE_BM_SUITE_DIR"/netserver.sh + else + ssh $server "TONE_ROOT=$TONE_ROOT TONE_BM_RUN_DIR=$TONE_BM_RUN_DIR IP=$IP server=$server $TONE_BM_SUITE_DIR/netserver.sh" + fi + } + +**run** + +netperf测试套的执行逻辑,主要根据测试套件配置中的参数组合,设置netperf命令行参数以执行测试 + +> 注: +> +> 在执行命令时,使用logger方法将netperf命令行输出写入对应的日志文件中,以备后续进行结果处理 + + run() + { + export PATH="$TONE_BM_RUN_DIR"/bin:$PATH + + [ -n "$send_size" ] && test_options="-- -m $send_size" + + opt_ip= + [ "$IP" = 'ipv4' ] && opt_ip='-4' + [ "$IP" = 'ipv6' ] && opt_ip='-6' + base_cmd="netperf $opt_ip -t $test -c -C -l $runtime -H $server $test_options" + + # check online cpus with cpu_affinity set on multi-processor machine + if [ "$server" = localhost ] && [ "$(nproc)" -gt 1 ]; then + check_oneline_cpu + # the last cpu is reservered for netserver if test on single node + cpu_online_num=$((cpu_online_num - 1)) + cpu_online_tpy=$(echo "$cpu_online_tpy" | awk '{$NF=""; print $0}') + cpu_x=$((1 % cpu_online_num)) + [ "$cpu_x" -eq 0 ] && cpu_x=$cpu_online_num + mycpu=$(echo "$cpu_online_tpy" | awk -v n=$cpu_x '{print $n}') + test_cmd="taskset -c $(echo "$mycpu" | cut -d- -f3) $base_cmd" + echo "run netperf on cpu: $(echo "$mycpu" | cut -d- -f3),"\ + "socket: $(echo "$mycpu" | cut -d- -f1),"\ + "core_id: $(echo "$mycpu" | cut -d- -f2)" + else + test_cmd="$base_cmd" + fi + + logger $test_cmd & + logger wait + } + +**teardown** + +netperf的teardown阶段,主要通过执行pkill命令杀死netserver进程 + + teardown() + { + pkill netserver + } + +**结果处理** +tone-cli当前规定的结果规范为`key: value`,所以只要符合这个输出规范,对应的结果会被收集并存储。 + +以netperf为例,其结果处理的`parse()`调用了一个awk脚本: + + #!/usr/bin/awk -f + + /^Size.*Okay.*Throughput.*Demand$/ { + unit = "Mbps1" + next + } + + /^Size.*Throughput.*remote$/ { + unit = "Mbps2" + next + } + + /^bytes.*secs.\s+per sec/ { + unit = "tps" + next + } + + $8 && $0 ~ /^[ \t0-9.]+$/ { + if ( unit == "Mbps1" ) { + printf("Throughput_Mbps: %s\n",$(NF-2)) + } + else if ( unit == "Mbps2" ) { + printf("Throughput_Mbps: %s\n",$5) + } + else{ + printf("Throughput_%s: %s\n",unit,$6) + } + } + +执行完毕后会输出: + + Throughput_tps: 91336.30 + +# 公共变量 +tone-cli提供了多个公共变量用于在测试集成时使用 + +## 测试套配置文件 + +|变量名称| 用途| 举例| +|:--:|:--:|:--:| +|nr_task |设置使用的线程数,可以使用百分比形式表示,当设置为百分比时,框架会根据当前测试机CPU数量进行计算 |nr_task=1, nr_task=50%| +|cpu_affinity |设置CPU绑定| cpupin| + +## 测试套适配脚本 + +|变量名称| 用途| 举例| +|:--:|:--:|:--:| +|$TONE_BM_CACHE_DIR |测试套件cache目录| /tmp/tone/cache/netperf| +|$TONE_BM_BUILD_DIR| 测试套件build目录| /tmp/tone/build/netperf| +|$TONE_BM_RUN_DIR |测试套件run目录,可以将测试套件安装于该目录中,而不用安装到系统目录下| /tmp/tone/run/netperf| +|$TONE_BM_RESULT_DIR |测试套件结果存放目录 |/tmp/tone/result/netperf| +|$TONE_CURRENT_RESULT_DIR |当次运行时的结果存放目录| /tmp/tone/result/netperf/1| +|$TONE_BM_SUITE_DIR |测试套件脚本目录| /tmp/tone/tests/netperf| + +# 公共函数 + +tone-cli提供一些公共函数已方便脚本编写,公共函数主要归档于$TONE_ROOT/lib目录下,在编写脚本时可以按需引入。常用的函数有: + +|函数名| 文件 |用途 |举例| +|:--:|:--:|:--:|:--:| +|logger |lib/common.sh |记录日志 |logger netperf -t TCP_RR| +|set_cpu_affinity_server |lib/cpu_affinity.sh |设置服务端CPU绑核,会将server绑定在最后一个CPU核上,注意,需要通过server_cmd变量进行传递 |server_cmd="netserver" [ -n "$cpu_affinity" ] && set_cpu_affinity_client logger ${server_cmd}| +|set_cpu_affinity_client |lib/cpu_affinity.sh| 设置客户端CPU绑核,会将client绑定在第一个CPU核上,注意,需要通过client_cmd进行传递 |client_cmd="netperf -t TCP_RR" [ -n "$cpu_affinity" ] && set_cpu_affinity_client logger ${client_cmd}| \ No newline at end of file diff --git "a/sig/T-One-copy3/content/\346\234\210\346\212\245/202212.md" "b/sig/T-One-copy3/content/\346\234\210\346\212\245/202212.md" new file mode 100644 index 00000000..88250c90 --- /dev/null +++ "b/sig/T-One-copy3/content/\346\234\210\346\212\245/202212.md" @@ -0,0 +1,82 @@ +# 整体进展 +- 发布 ANCK 4.19-027 版本。 +- 初步建立了龙蜥社区第三方驱动的研发流程,并试用该流程集成了国产化网迅网卡驱动。 +- ANCK-5.10 内核产品化。 +- 成立"浪潮信息龙蜥联合实验室"。 + +# ANCK 4.19-027 版本 +## 内核更新 +- 版本更新至 4.19.91-27 +- 重要内核缺陷及安全漏洞(CVE)修复 +- 在 namespace_unlock 中使用 synchronize_rcu_expedited 加速 rcu 宽限期,使并发启动100个 busybox 容器的速度提升19% +- 调整 Trusted Platform Module 驱动的缓冲区大小,避免上下文切换时因内存不足报错 +- 默认使能 mq-deadline IO 调度器 +- 提升 NVMe、megaraid_sas 和 mpt3sas 三个驱动的稳定性 +- 全面支持 Aero 系列 raid 卡 +- 修复了飞腾处理器 SMMU 的硬件缺陷导致的问题 +## 自研功能 +- 支持动态开启 Group Identity 特性 +- 支持稀疏文件映射使用系统零页,减少启动虚拟机时的内存消耗 +## CVE修复列表 +详情请参考: +- [Anolis OS 7](https://anas.openanolis.cn/errata/detail/ANSA-2023:0002) +- [Anolis OS 8](https://anas.openanolis.cn/errata/detail/ANSA-2023:0001) + +重要CVE列表: +- CVE-2021-33656 +- CVE-2021-4037 +- CVE-2021-4159 +- CVE-2022-0001 +- CVE-2022-0002 +- CVE-2022-0494 +- CVE-2022-1012 +- CVE-2022-1048 +- CVE-2022-1184 +- CVE-2022-1198 +- CVE-2022-1462 +- CVE-2022-1679 +- CVE-2022-1729 +- CVE-2022-1734 +- CVE-2022-21125 +- CVE-2022-21166 +- CVE-2022-2153 +- CVE-2022-2318 +- CVE-2022-24958 +- CVE-2022-2503 +- CVE-2022-25258 +- CVE-2022-2586 +- CVE-2022-2588 +- CVE-2022-2602 +- CVE-2022-26365 +- CVE-2022-2639 +- CVE-2022-26490 +- CVE-2022-27223 +- CVE-2022-28388 +- CVE-2022-28389 +- CVE-2022-28390 +- CVE-2022-2978 +- CVE-2022-30594 +- CVE-2022-3176 +- CVE-2022-3202 +- CVE-2022-32250 +- CVE-2022-3542 +- CVE-2022-36879 +- CVE-2022-36946 +- CVE-2022-39188 + +# 龙蜥社区第三方驱动 +建立第三方驱动的社区研发流程:https://openanolis.cn/sig/Cloud-Kernel/doc/721476448598622343
+ +网迅网卡已经按此流程合入 ANCK : +- 支持ANCK-5.10 10GB 网迅网卡驱动: https://gitee.com/anolis/cloud-kernel/pulls/540 +- 支持ANCK-4.19 10GB 网迅网卡驱动: https://gitee.com/anolis/cloud-kernel/pulls/709 +- 支持ANCK-4.19 1GB 网迅网卡驱动: https://gitee.com/anolis/cloud-kernel/pulls/1043 +- 支持ANCK-5.10 1GB 网迅网卡驱动: https://gitee.com/anolis/cloud-kernel/pulls/1063 + +# 重要议题 +- 讨论并决策了将 ANCK-5.10 作为 Anolis8 的默认产品化内核,详情请点击[这里](https://gitee.com/anolis/community/blob/master/proposals/Anolis8%E4%B8%8AANCK-5.10%E4%BA%A7%E5%93%81%E5%8C%96%E7%9A%84%E6%8F%90%E8%AE%AE.md)。 +- 讨论并决策了将 ANCK-5.10 作为 Anolis23 的当前默认内核,详情请点击[这里](https://gitee.com/anolis/community/blob/master/proposals/anck-5.10%E4%BD%9C%E4%B8%BAanolis23%E7%9A%84%E5%86%85%E6%A0%B8%E9%80%89%E5%9E%8B%E7%9A%84%E6%8F%90%E8%AE%AE.md)。 + +# 运营活动 +- [浪潮信息正式发布基于龙蜥 Anolis OS 的服务器操作系统 Inspur KOS](https://openanolis.cn/news/726244284765327879)。 +- 于2022.12.24 举办了“[龙蜥走进系列活动之走进浪潮信息 MeetUp](https://mp.weixin.qq.com/s?__biz=Mzg4MTMyMTUwMQ==&mid=2247510368&idx=1&sn=95a1d511b32670f8388745682483046a&chksm=cf655a12f812d30494be938d7bf8a46b7244711c8fb75f44e8379ab261b1fd4aeb1c8bb0805e&scene=21#wechat_redirect)",并成立了浪潮信息龙蜥联合实验室,致力于共建龙蜥社区的软硬件兼容性生态、标准建设和技术创新等。 diff --git "a/sig/T-One-copy3/content/\346\234\210\346\212\245/202301.md" "b/sig/T-One-copy3/content/\346\234\210\346\212\245/202301.md" new file mode 100644 index 00000000..85bbb428 --- /dev/null +++ "b/sig/T-One-copy3/content/\346\234\210\346\212\245/202301.md" @@ -0,0 +1,101 @@ +# 整体进展 + +- 发布 ANCK 5.10-013 版本。 +- 确定KABI机制整体方案。 +- 浪潮信息龙蜥联合实验室的工作事项更新。 + +# ANCK 5.10-013 版本 + +## 内核更新 + +- 版本更新至 5.10.134-13 +- 重要内核缺陷及安全漏洞(CVE)修复 +- 支持用户态/dev/ioasid +- SWIOTLB机制性能优化 +- virtio-net 打开 napi.tx 优化 TCP Small Queue 性能 +- 支持AST2600 PCIe 2D VGA Driver +- 支持FT2500处理器 +- 支持动态开启Group identity特性 +- arm64平台默认内核启动cmdline调整 +- 添加 Compact Numa Aware (CNA) spinlock 功能支持 +- 丰富arm64的perf mem和perf c2c功能 +- fsck.xfs 支持日志恢复 +- hugetext自适应按需大页 +- 支持SGX动态内存管理 +- 使能wireguard模块 + +## CVE修复列表 + +详情请参考: + +- [Anolis OS 7](https://anas.openanolis.cn/errata/detail/ANSA-2023:0002) +- [Anolis OS 8](https://anas.openanolis.cn/errata/detail/ANSA-2023:0001) + +重要CVE列表: + +- CVE-2021-4037 +- CVE-2022-0171 +- CVE-2022-1679 +- CVE-2022-2585 +- CVE-2022-2586 +- CVE-2022-2588 +- CVE-2022-2602 +- CVE-2022-26373 +- CVE-2022-2663 +- CVE-2022-2905 +- CVE-2022-2978 +- CVE-2022-3028 +- CVE-2022-3061 +- CVE-2022-3169 +- CVE-2022-3176 +- CVE-2022-3435 +- CVE-2022-3521 +- CVE-2022-3524 +- CVE-2022-3534 +- CVE-2022-3535 +- CVE-2022-3542 +- CVE-2022-3545 +- CVE-2022-3564 +- CVE-2022-3565 +- CVE-2022-3566 +- CVE-2022-3567 +- CVE-2022-3586 +- CVE-2022-3594 +- CVE-2022-3621 +- CVE-2022-3623 +- CVE-2022-3625 +- CVE-2022-3628 +- CVE-2022-3629 +- CVE-2022-3633 +- CVE-2022-3635 +- CVE-2022-3646 +- CVE-2022-3649 +- CVE-2022-36946 +- CVE-2022-39189 +- CVE-2022-39190 +- CVE-2022-39842 +- CVE-2022-40307 +- CVE-2022-40768 +- CVE-2022-41222 +- CVE-2022-41674 +- CVE-2022-42719 +- CVE-2022-42720 +- CVE-2022-42721 +- CVE-2022-42722 +- CVE-2022-42895 +- CVE-2022-42896 +- CVE-2022-43750 +- CVE-2022-4378 + +# 龙蜥社区第三方驱动 + +* 提供主流GPU在AnolisOS的Driver、CUDA、cuDNN安装测试与卸载指导文档:https://openanolis.cn/sig/AI_SIG/doc/721423765456666646 + +# 重要议题 + +- 调研并讨论了KABI机制的整体方案与实现细节。 +- 基于浪潮信息龙蜥联合实验室,讨论了关于整机硬件兼容性的相关事项,后续长期共建 AnolisOS 硬件兼容性标准和生态。 + +# 运营活动 + +- 无 diff --git "a/sig/T-One-copy3/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" "b/sig/T-One-copy3/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" new file mode 100644 index 00000000..30020428 --- /dev/null +++ "b/sig/T-One-copy3/content/\346\234\210\346\212\245/\346\234\210\346\212\245\350\257\264\346\230\216.md" @@ -0,0 +1,7 @@ +- 每月的月初总结发出上月的报告,并更新到 SIG 页面,如 2022.12 + +- 月报包含内容: + + 整体进展:SIG 该月的亮点特性汇总。 + + 具体进展:SIG 该月项目的详细进展,分别展开细节。 + + 重要议题: SIG 该月讨论的重要议题。 + + 运营活动: SIG 该月发生的运营活动。 diff --git "a/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/000000000130_anolis.jpg" "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/000000000130_anolis.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..25e606c9c5d28fccaf9f6caa351e3720570e4162 GIT binary patch literal 47154 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 literal 0 HcmV?d00001 diff --git "a/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" new file mode 100644 index 00000000..74f3dbc4 --- /dev/null +++ "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" @@ -0,0 +1,30 @@ +### T- One是什么 + T-One是一站式的自动化质量协作平台;打通了测试计划、测试准备、测试执行、测试分析、测试报告、覆盖率检测、智能Bisect,环境服务等流程的闭环,为社区研发提供一站式质量服务。 +​ + +### 平台架构 +![](assets/jiagou.jpeg) + +### 核心特点 +- 一站式质量平台:平台打通了测试准备、测试执行、测试分析、测试计划、测试报告、覆盖率检测、智能Bisect、智能巡检等流程全闭环,为社区研发提供一站式测试支撑。 + - 支持多CPU混合架构(x86、arm、loogarch、risc-v) + - 支持多操作系统类型(龙蜥OS、centos、debian等) + - 支持复杂环境测试(企业内网、独立隔离、弹性云虚拟机/容器、应用集群及多种混合环境) + +- 质量协作能力:通过分布式的业务架构和独立租户空间能力,支持多企业、多团队的质量协作模式。 +- 数据分析能力:平台提供了时序分析、对比分析,以及聚合生成测试报告的能力,在大量测试之后对数据进行分析以发现软件问题。 +- 开源软件包CI服务:社区开发者可以将自己的软件包(可来自代码托管平台如github/gitee/codeup等)注册到Testfarm, 平台会监控软件包的代码变更,一旦有变更则会立即触发测试,并将测试结果通知开发者,方便开源软件包引入。 +- 开发者资源服务:社区开发者可以reserve测试环境并登陆,方便在测试环境中进行测试及debug。 +- 缺陷定位诊断服务:对于发现的软件缺陷,平台可以提供了缺陷的自动化定位诊断能力,可以发现引入缺陷的commit地址。 + + +### 应用场景 +- 场景1:OS发布测试,每次AnolisOS的发布,社区测试团队会根据发布测试策略进行大规模测试,保障产品发布质量,外部用户可以在Testfarm查看发布测试数据。 +- 场景2:开源软件包CI,社区开发者可以将软件包注册到平台,平台会自动监控软件包的变更,一旦发生变更会立即进行测试并推送测试结果。 +- 场景3:自定义测试,社区开发者根据自己的需求可以在T-One平台进行在线测试,或者使用命令行测试。 +- 场景4:离线测试,对于网络不可达的测试环境,用户可以使用离线测试模式测试并上传数据。 +- 场景5:独立部署,外部用户也可以在自己环境下独立部署平台,测试并上传数据到Testfarm。 +- 场景6:登陆测试环境,社区开发者可以根据需要reserve测试环境登陆进行测试及debug。 +- 场景7:缺陷定位诊断,一旦测试出缺陷,平台会自动诊断缺陷引入的commit。 + + diff --git "a/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/Dingtalk_20240614165831.jpg" "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/Dingtalk_20240614165831.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..925bf2945891170613821e8e7dbc9e4206d17c8d GIT binary patch literal 6459 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

}E@Hj0_{W?|f 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

FG!grkAXdJNt$uIvKqhcJq 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 z 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[WR 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ⅅQKHz};_SkLL8?V2PS1YROEdQ3~XQxay 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ċXdTaw*%m;m5ZDbWgJ_XqbT zDvAh;-~A5{-eY6$?_p6wFPKWC2wO#bCkhup5n5$xivQYC8gC{q6W18Df;8o)yZA^L z&19`0^;+FlAyp9lc`R#?1}XdxA=qZp@qYg0K_H~ccT+X*5)8#~rET{E?)6ete%?+` z>Pg;Oc!igL?}wr%P%Jl@>kT2>A_9lw&WZ1JDr##o*-z!EZ(sXULd{qi52l@J2FAZh)l%b1RxVsPVT45>GYK6W zs%mt)YBEJObA&^*vaO~&Ylbo`Q*J?uQnpw@EGyN#=FD{MpiJ?21iE=JK@!i{WQwiN z)*KO=f$)&wM8z%)PSI(CGAWa3)9c;ND@?)lyrRtaD7$GqMXV^g$953;;!hXxxUiRa z{)GPb`7iQmMGUkxRpBs!#wr?u=&Mts2N^sjCv}q8AWjT2j+a*tX4s1U)^X`h<$6f6 z<#{PRw?(ir$IPNe(R5FYC9daux!_Ty_s*Sduj|)adE_3Nm6{4cb89eLQ_KCsL(^t8 zmONhdjy;uav|LBMmFJmw)HSpDHl46wr2>kjJDF$H`h>YmCMPl;nd353r|-GB2~crJlEYSZdvg__fXQwTu_6lDVdjdWA1o{3pj<* zWO7`~@K{3uUOy}vzP|fwRJ|qtV1!mFv;onWLycv;NES?DdSWTx7<4q$E(7u-h5`*y zunjTjaPhRXv>5{Y=$2uqyQi2ZfQq)L2rSx1#qp2#kA?Cat1N}Vess|sMKCc!m>fu# zskZ_Dk$MRV&f0w`meIYU7U&TXTLZk#7Jyte?LOzQY4aWx7Jw$Q~AW05`zp#STqFF;8>m(vmt6lfA_v~Z zPR||?_~jnZv`K@EVgRKEX5W(W*9-znsc1ALK-W7`aQY%CLFZcpXF@&6^`$)77hpYo z+MF(7h6)8Jg-v8eiTVL$q!< z6Dva)^)DRY@#s3N<7D%mVKJO5Ef3}A=sBe0`p_8|XbHCSjuVlg^#tR(kG0h7_lfWM zl1KPfPXTED71gAg({M9iGpA9D(7lpLmYY^kHI2xI^)RNz_q_|9^Vt1u@Lt}?$Rx3q zHB5%ploO($xfB!a{`_da$~3pMA*$%)S5+tR16^{WCtPCoxk9|No(`ulTm=fi#KHxn8b$4Gmy;6T91*vrdDsFfq&&+a>I}QT$-}alE@Cye%#p7#M?m1`^VJfG8cOpRxv-IIy|LD(Bu zup^9K&aifKUsoB@Nn7bY)Aa1qEhPJzHOH=PpUXl~YKAlYhmBJ6h+Mf(of4$kGP zTX$P|+AfOJI{A+^{3aYTYfWZ-JyTk6^vZL><~Vh&vlYu3rfjlYLOQ3~Vuvc(WU3or zr1Tw_hLp&V{<6V6?{K~U=lAWc`Sn2g#B)Y1$I|vgI{Vms_kn4(^n+9`GM{>0jzVyc zw}D4rdDqgU7lE0S_m?prJ)yM*{lKmMrVAUiXJ%@od0D)1YmPYm1Oz%%dCc&P?81Gi zPrCw9tq1gXqQ{a;6W*LaTZ}hEfZQ8KgPkk$SnEiQR0cX@1pK7h#t)q&g}+E9;vJ`^ z)W#ra{#A7IZRFuvDtpnu`uUfL3)UPQ%^$9Gte&zFN_HT6wbgM%x*;df&FYfEG1M7C zi^8c2vThidKUDO4O3I6kMs#~2@X%(71?`{{b^!S4o*dmNZdgCkaA=OK8Oj^B=V<(E zwsIA@Dm!xAHWE_a&F{IWFkTgR4(!*CvG%g%MP)n?n_8LP-+zdm&-~kpr)ZgNFt64= z4y*IK#RIXN#67XEE}w2jH5KB|X!O9sgS0jZaz346t+tVpa;&*}P+mM;GizAtAr7oD zzJ8NePQ%;;ZuX_g*>X0l`h$sNY5e8_m@+(I; z9jJe?g@n)80~8;b0WsrkzymB6?GP=0@X-||R`xgwF~lER*GMXe0L{oJ8sw1>3;HW~ zavo)i>3u9hC@kMB(jhAQ8Hub)#;Im9oEt&u5LAAKA{9-T;Uo~ZvcZ1VM>HCI=tL08 z9Flu?l(}k&j~%E26#63lz55_*BPZ%M<>gJ&A*9Q{*81JdEHQB*O`<$`g(&RZBI5P) z3w;&((H>lRL1fAdngPe z|DM?l6daIXAD}C+F_N5}(4h!@0FsFhk z)}9(slQ13XTG~*X6#4QOT%rgitrTSyu@8O`9k`XdB8ZoQkhrIo8d4l1RUit!Yq#5nAZ7~&4Kb?jMk=5p zuYHaR;rgv^VHD49*kh>!z|9}MR5}9*m)B4g41#VUE=Qd|pgS2aVRN!DLyk8M2;8xU zx=|ud_tx=GP!?Arft%7gp$a6R5yvBExr3$A96Rqb3~A?zrw@N^$kb+lcVWq%aoY#g zWXAs4z&2E%MNRBYmsBxVs5cxWVO)jT|KoSKl21~`FfHXz+3PkL9R}?WHXW53AhnGb z!Mq_*Y(BCCa`ZKHSKw}p6k+;F^5wEpf^rpSaV&^{p{Wm57KC`!Mct0Jv~IQ84#2Za z>A?Li^|XuAgNufcu~$4l9l0MaMp-Xuv(YSd7CBwZ>>tHUI;A9$ zK#-m;DU$|e%TQK#{;0#|P0bfjRFzc{hEC26sIU}CwN+B#Ys2VaYkG<{uXO+H92g1x zFcbeye!yZmqHN*D8>nC~cx9t+At&AU;gHEAZr|6N{Q*wQ5b!{@_L99cM-CM>K~}?B zOA|;a^w3;LLYzFTNZh8jjuZUXLhd6?({M+9N+NJ=Qh7xG9?TBIL|^k79K1G8J$`zz-f z{LcoV(wMBU$-4#I1f!K9bZTyo5|~K0fND5mtn>zsr?P4I3HFCf&hvtjpoSy-bOwyR z7DxneuS-w~V(&}@1Qs>=3Wl0#-4R{FcJu1?JuFF(KutI@YBSL_Vu^TSVVcgrQu6lg z`YL)Ip8xX#@N}OSg>jFcT{w$&tTILH3^*z(&E{ojAo+Y z?}1f^ZFE!ZbKI||WR~c)hr|sW5*>-0=4vllV?4{AJ(}cb!0x)(d-$86*j=|}jQit;;=T9t#`2- z#ho=jO14r6+ifC^9n}o8@0M*VJbR^7(8uuqyQ03@vV94ocz_nB#FA7nFamBH10C~=;yg9masmmH zn2d70nZH%inRjtzGaUMs+&oxg1#A-4$XSByBQ)uCc^Ux|T6Ivk$P!;$l89Rc?^HZa z6xChNiRu{Ix=59@P)lsstJ=3q;ok_}(h6j}^-^s3-4C5n0$g0cS2P4Z#ORH%@NY0} zjNwypw3$A~wW@u6Y&10DWWyyBcSKA4t8&gP*5?Q7IgBO>KGX>FIODC@#CpfW(J7^2 zx|jrH%I&=Gt`ln_gzo=}L#_1t#8yul$wdEvVt^ZbcP$&%?5gj&kMX!1`dxNsE>%*2 z=l0ppYmZ(`XO-o6P#f2x`vbynvDMtW2gG(+z0Qs^@bXGC^5@q*`8# zJiTFiU|(aUyPn$A?7FA3IT~R0#sNc*>Dwv?!WJ61Sx>AC?j7pim<>8;(?Q8RQm^A0 z(xb5Fs}xiB6J+grKWeNr`IIyG$g3Eb7LAf&-1@_R4bL4W02C31vQW*^pA zZ#+Y6EF-PtXl6b~#rI^unQ*d!K<4-XeGy8xIKhWmn&tRk9B=1F3GH7j2>gw3*6UZ7 zZW*107M(EK$g26SgQ(6+ninA`ajbWZC63?slr$7#X}~w6_%&Q)*QtABV58!%GX2F+2q>XIczR{vfFXJ2Cay zf}uGwNA|O3H;Na9E5Oxm+Pr#*KtC^3!3uJ_WUc8tj!I6wDUB%4lmR1>e%UQ^wN>^- z22DIvc>)_0Y1HHaNB293pfK7_0EGzz4)$xs#)b>g`7*p+m3tPvk27D?TqZ(CY}1Ot zp#tkAAuymZrfX+e42w=nS~#K$#B|CYD`^lA?~-gg?1_QGE={V|k~Em5)J@lp8+g;Dz?dnI^n)@La~@$3lt_uC%ZL~I z^vaTvwO^kJDWYRcfPOsuR`-R*RSkAjzhLu&8rTn5ASvAKCUGM{xiKs{l|eazU2PVO z#7VA2?nW8cjE@o`FA6tLkqr>jD@4MwRaq~;A1rsC*O>^=dxPWqp(HsLbKQ7aKW7>? z#|rYIF!9$lQVE3=5@cZpPf-SqkW@cfb!Ko;dhzik843}dp2JqWDv~3{cINKG= zG4xObQGx|yfxpMQ?9q1r5^-E6|ntGW_mfP6Xxk~`3ZXYV$EVG;ggChqrl=%_L!gGzLdZ#&#c;iKcwNBjVDp^msR zN?}4wU-O}4Rsy)kzSL*yuPdj7govOIVM4DwDX^YW z{l+{+3e@%#B zM$lL$^lEJ**z(J%J-8{~UMzibIVWL^oEA&()K!q?-M@WsEKJ~9uyi@TwNfaP+s3i8@Q}Z5r*@NdR z2&sU<&KAlcl~f~f5Eqx!Gwk1T_|3p4Fdr)%3o0Y6!8z_1D2AB)%sr*x>Cv4uGVamk zNY4EwUBIeP)R%~Y9hE&uQ7lyYH-KB0tW%M)Tax8Ji!tmwZS&?x1%l&5AR zQx%IxDVgCt9I?e*98W+bEhJN*DU{6A3B!!q4nIQk60jer#>Cf_8AF@R2yD{dq8y>% z@5aY<+6rkGrY22CixG%9(?GqjpO`{X`%AvBOA7P`g`Y~yg}=nH zdNrBJre9~$+&9v`nJt>*2RZ$^CeYx%|2aJbN}L;G*Af&q{ql^OK!+bf<{}Le6@nHL zfVLa$Nr*&{jk$-}w}~}O7C}M;8Z_YU9W5F|l~LVq-iYI_=vbkyn}~rxw-YcI`4t5-@YD-9;$+u3LBUYgf_@kqx|k zm|kGcaM8N7G`q(H^Zx~QwdKBqOY;2!27Hre9y$Zj4CgSkm)#!S3qWTxUbH4I7PDX6 zOULp4RQb-kESXp`_}p_#@eZ>7=BG;dMUmZSf~sKjoCz7K^WdvBzQE@sJ2d8P)@_|iW3`1XqWlKRX)gX+8uO?{}# z3x3&Cxv|;ELAtA4@*)2sF*z$!_;@3e_Szi_zn@nmuJ7r zkTPGMP&Xwq3kF44rLs2?iO#FQ9+08)Hg%TZL>=eIYP?+Fm>OoeHi$K%!-(6u!4Mh< zV;&dJaJFh9CLr(Qn5>Shx61<`k(YI(ka^k?t81Rz-b=s9M5@m;$ybg#y?;#TNoZ>u z(<`(|Ix%hMCttK_f7+T>Q~5<+4vP+rF$qfWz1HL$92Ya<2Li5gNfI5;gW&`G>bD__ zOMg0>gwc2ja9m>JH!)(Nnc%AE53W4;IK9m*X=5n)L3+&|gYYXx-VjYiX}P1txfwc3 z-K-ieV+E+0g+_ zXUJ__P;C+>i%wdbVWm?7g$Ng&Tv2Ci_=iI!kXf5A>+SbjU{XO4>hkpVjr3+qc?XSd z=||H>gjh9KLh*`0z?;Y7hgmO*=AuF35zS>U+8bZfeAh!6xnkut#C?5A+5RY!rFCA4 z&W2XDWDGjyp^u7T!l-?#<7weR(|PII?e4oS(P^_-uzGerd97>lUY)48by!(`y24hp zZe%pHDHYT-O>aZ_X>$_2Pl%Eq0jF&`ur0w2K(HUGPRR0W>aEeZ`Z{(+!8_^3YJgfC zTAOB^5jbtoJYTo(8xA)AZj9rI!>VlynOvf3(7sZ&V$N4>H9j?+j1usqUKP(|UiYiu zx~)xqwI_rNvAk3Hi!k&wr>-^E7So>F@OK-Bc9;y#9V`IFYgD%K z+sC7BngS!7*_)PNU56M(ntgBj-Bjdm47&c7*B9f*YOZ=1#MQ&CrR_bu;z_CC_sx@S zsKtbYf)*RiG)RVPjHsVZUG&+IhqVmuvX5!N4tNr_;nT4>W<_opCR!r zC&sLtbpZ*T@!!LN!_G!N);=1qx9BF`xIWL92E12Y|G7%d=>fLq4Ld;q+G9n~i)Jm{ zzV}X{L+}AuH-FK+PI7QhUvp<_Ed&nQ3QrvHu?QR)AX;)$H0rqO)$sDgbq{EbRIk{q zyk!+F6#rGe{4?mh6spwM-_3P`%H!g;=$J-Y7pDNi)f(zG-w?+=0_C$|ad8QFj!%oy zb2)cDY)Z>^r&o~I zW9GQpVuP!+08X1@K5MPrZcPJ*VJGXf2l`+|Q5l9uRBbwbZkL&91&;-ZEfFImfZ14| zv(6Agw$yuF z<#4(PKI^j?QWyy=VY#iU!&i!^HO9Vjp}uxOn%6iLrfvIusg41;l(KGFfhiKTwsG)b z9j+rJfu{E*H>jQy9>^;EHmTZ=UBsc%I`-G{3bo>@!b_5OkBL~VVO@}PwdwdT@s{rpDZ$P z8>YzJMFpvEHIPO&r^heeMGt^@Qk7_*BT97OFQKy3AltCr2Oh{RCqoAwhTpbxb6aed z9YY&vnBbt{c5KQRhmx{3=z3`e08WUf@lZ+~0|9n72Hlmj41Zphwe&uCy2BU?>ZirX zLwc0hz~cAJS%2+pFH6cFmR{LqC!zn|V1edf)oZU@^gy(mzG^h4WjKuBWlgJQ_&qAM zKpn+alf7z7H}rZ6g}NN36qOry+g5vG z_Y02>GSdeCwy8Neph;h@fwp5)Iz@W>?Tive7#Lwd~TOl>eI`h zaAU|yZR$rF<1R?>CS$48?1ES7m$RC(#^V82+Pj+Ew#x;8DMG1b%3;qQ-sHznf7g$R z*@2!_=ZU$kbGZtbRX=W_RM&y)YxcFD74Vh)svY%-j}s_KAVGGOsS{%oI8k3~j2el# zmDS#0(9YrKSJ%WQu5^28zd&@aJ7!Bx+Rr0%1 z=a@pGVoh*#p;lSdO^`ui!_KAud~0H|pIzM) zA0Bm&F0Rk92&Oj53Qr}@qNrOZRGo|v5#xn$a9~n(&29Wl*mZYbjk$Ov3?wios#>jld z6!-^Fr*pmH&yqYTj@4vHq?{CQ&5iK8KsP;UnVbG(vmfdjtr??kqdM+8Af-k$k*sl` zra7%Imot?b@pKwj>Rpi8m^>8DyEpp|D?jpC>=H95rf19i4F=dIi z_IU(zzyF2j-;tQ@9K#9#v3V_g1Z&XTMTb7eOSf5<_z;=RYD+na2d*z}e=B=+W56c` z?4opk`)Uq5P0ZACnayu246N1#$)x3UW^EsHwg6N5?B<$~bs*5|){=dyb;Cji8o16x zWoMC#OP5kivQo-+*$hQ3L1_4*-in0X=Xn>zZT={w!hWv4Cdh6M#~G~!g9ck zmmSWdYiQRKFW#C8wf}o>_MRH$S*he?)PR?69TRoQ%2wq-f+^F(zKP1_Gk@RnuHrJg z?k?w&UU zPrp^mCm5CKuzY{?H#v1RTQ4LMJnEoNZ-HYqJliVE!Y6=)E*quJ<^`f0?ce@tPt1u9 z5Cl~81wl(5;Z7VdAUi$-)fP@9_xJ4!$1sO83RkrN8@Mhle4FPEcS(x>0P zu`yK1ar!MiFSl-Oq3KsS3N7L$IkZYBDjh_RfGDY7f%^q@j1=pKKFJO|NU#$5y2RP5 z>bxy(gm!9~(%I`YQ(M8lDy( z^xq3~LNkQPmQuAJx}q?cac{NG=E%9&(l;_Q|03;{-iIBHGBf4Trh`_(IZ2|Z%>jH7 zjyRwwtopGMVqJ;fYg$?*(|O<(gPc0U+;)>6+4jLPfVxk3enI~!^uwo#z?5{ro;*#X zxtm5WL@A6}LQCQ9KHBEf#AM{PT>yA$tCBJ*)bKg#kGT)+Q zQ(Bc?f{Lhynsp7PT5LU}a~oLRPiVR;C@t)98xjr^Rr~usLBi~;0k(^i_2zoe_{J-E z7gDpXSKAQ@{@w_y4Uk$Abm-&Bzz)YhbykaG-0Df+r9<+~w>}NCKQwt`3^lkp`fWAu zMv!dm-70@A`280RCW5zg5{O(ZKR!v+@DBgIEj;~**l*Z)u}?TsUju+6R?jupWS~}D zo@YUeOsRlx%#zy6DzZAF1CNAEh*)it>p>P1T6Qnl)iL+4tReM64Dg?Nb1@=&n0J)B zPXKwqv?qB(0Nc-d7vq}0w1{-k;J5tC@!y#S^1uIx><=K>F}tR&9+M7bg-T$qvbDdd zI~n!krBg4ZW|SF&k}h7wSTSOLpwfV4&q_dGj7IU5jJh;(Sb)d#JM|B%VbdUzL1)@) ztI+g3AsB#(1^F);1Vd=hhDi zG`cc~ZnMRTDNhS#jRwhl;UXxDV+;l^C$u{&SG$>5Bq}&CmJSch(#(eR$n3atJFb}A z0A#(zwTA;E!O@{<5Y_O?xs;sp_l5qy3)i4{T7gS|*BST)7p4VW_n(#_m65U|fye40 z>p|Cvdj{}@GP#(8Ei|+H+)Tb6gL>&25-ggf$?fM_C7O6z*occOz0tx6INb_x}acWX6x^8;S z%j{B3iRR!^7sr?h1fm9(}goCi}T?Cmop|94FHlI2rBXrPn<+J|6n-xm7v?lN9$Up~L%ick2J|O**_)=aKllq$N~gHKu`4p`kB zV0l8cb$F@+bF*Y{W0|7yTBG{JDg3*g!R{2t|8^ z48#cLY=eV?4FZ;|))k_P1BC-D)PaE^Pu~SLkTY9Zkm)R2Ru0Xk=eru6Vp)r>kXIaN za3EDHw?%r2MS6RC8~VQiw&+Mhq&KJM$0oZvdj{zFmL;1mE}Gyf*P-G!G06G$xQ~M$9#Ht8U)gda`qOC^=jMojv># zZLO`7tt|tC!{klkT=KS5b#8C(92ps7ADbl>J>SDUQS^MZe`2Y4T;aKE4z#t#mWoxY zR^@^-yLNbZcm>=R*0$T)Vz}w<=|#ZAR18D5d+?szHPIDB#eq3EFq`%ai5efP>-n}e zT9>j-J>OEv+Z>#{J0&msw9P1P@V3Z6jnbh*LnG|hy7#MXiZMMkZN-myEv0%^99SF& zT1UsnxLQZXMoFEG1O`#^Hnp|f0j=#FZEYQ$ty2?|BX&r3bdHXXceJ&un|mX;EoM9s zTFHOKfkkqlyDKJXLxZDzeSK-a4i2o>9mJP)+?t{1hw6I1lIO+gu`1UhIbiXDG%_~m z|J*GvWm$zEa;^#`GIi`y&O*mWZBFiNnesuJMfT;&3aU83LiP=j~+ zjSmiu_V@NpPK~YVU$bFweP??YdwRJ=y~4lMIk4>0Hj5rs*?6IBmE`y8>h2vaDz!dy z+v*&s2)J8uzzTy&QjF5=9ekam!=sav<7M(@?6l~{6sU#zji&YA%k;OkeQBK9`A*3hh0C0~4e1-NN49{-L2^vo%{A+B>?)TU$AGv+0_1 z_J!ydTNVOCM@RUDttzLUH)l)J*;%71R2*0_4onqo&${5e5R~h=giFmcM~&Pcp@_ku zAr89suFf2KT01(&C#L(PSBwu;L3bMtY~t9h+YENEQMf(5{j7`j&W?d0PiN-25AHVg zt|~Go2bO)>MuGA|F(5`q#-}D*{p9-MnJSwHh*4CK);Wg})4_(G9~~w6eil7X&fBYYsW`A=9N-`${5C9F zYU3uh{6!jdfz-yE5#U9?O3Vb_-VP>Co~9cc&1 z!+g``0oAE(B$#R)uP+A|Rlmssag|bW;4V1eOi$fv99!ML%E)b*;X@z#P%D{Z(v~d* zW=zq4YIodi`D#NTYYsV(*M{?{mKVSHrIRfaz1@B52kz`>>$LgY6@OAHIj=adF!-Wu)+4o=yWk% ztn_?igWp|@-A!8oE6AA~sBMp|AFP<_>FOCA9yDR|-^V`kvEh;7_SW{U>L}%sbn|T+ z$#Hn2&+CeLsghx4F%RvcI`2gsY}0j zw&rdbxK=)lk59(!5V2Kq2ub!cjEzl5sU*DOz;bYaYPD0*l!?`7y(?E9RzU1G)$?%) zyH1ySzS86s2Ud&&1drGgJR9Tr5%S1odeD}&7vxqYty3&VAFpuUBRLR8 za_L9$m2cf@+Hp>(RP>>r!5d$-+Lh&w7tte~MJ*G_(3|30vItSrR5t5CrN2#>t+nZKBN6Q!Z}<5u z>)H!e(6cvWm0EFN9vqlz=@=fF=;>*9nWH7I(7@#^eG&V4jPlWWwQC1ex$l8xJYGpud4 z2Wp&Y!k;Hmn_(tuH*FT?)a>+`wnvt@xpFr{(h9s<#%WuFdYa8n1qyVWdW%aKYDPl? zpo&x+SXvH*nAL-LjNC09jy=S&vJ!}39D-{CtAj7{Z=y;qnJ7#Vi_uU!R+ouOSmGiH zt+L(SIY7ot#zMkdio?PccP4DJO`n>@b<4S;Tt48?^R8kDJzp~#wj6VXq2jQPXf8UJ-#b2YZao(*i%G9zpS}Mq24j_HAsh&6 zwP`X|eoopg)6v@F4oCm3j0!_Tv0ulBhr@)OR_HV$7gE2wA8ftH%&%t4uOH?|$2JdD zWUPhc+w0KX)x`xnQx2E55=G{Vo*x|(FOHL?x0{!i<_g>0j05DZ9Oi6s%#ybv6>m)# zm!YaKvu*e(bTsjqdcJn_Z5fKLP%e}McS~ioQO~z_ba$?Vo?j5#H(4vYiv~!WIqZQ= za?PW>&07WeHrL#I)^Q&A5+p5?ZPAinv1wbJvT$fJ6zE+v-n_Y50ahHCg9FXuw7ByI zF^0Eyb(9NB8kw5G8i|XGG@}w1Oxwu(&`?~g*TC5vZzNWciUUi<0i!tge_ScX^E%Z+ z^3B)mQD;(S5oMU)D3D84E<6pHA07_(oVB(kL|&n)I4~a$5WJkW@lz1{oJUE_$b2wt z9wr349>j&Zo*xo#*f!1aI(YTB;=qz|V56RobMi&cw|958Z~Q*z^6B{{t3!oou^d?T zXy^QlRLyed>2SP>48e5(#7at?JeWS6hZqUOVdy~pVJ<>O_Ad5bte=AE(3uf50V zsESxi<)YsGS^4k>9*ENmA~xegr4tio9qrnzpQ$GX=^g`vP)A*?un11V!BQ6%4Nsv(xk$DGje zm7ZTd{#Kah#{t^DA@G@FIp%DQ4%LwPO3%-)eJZG>Wkvs0yEWbU7Mb5{@#W8LpGN&)1T4&c4mB`YkkX&e;in+KWOA4sjwmMXna4l}b@9yMfV+NSGTHX_=aE9R_b) zT#ZqxFs;xeBkJW~^W>E4>c>Y$ee4UW#FI5j{v=N_i#;LD{P7B8rU2;da5KRKug2uW zScm)Xry|AAMv4!Y6~ZRGP3H%;%cvko1SDm3vM!M4Crtr}XZG>25qV+oPl|t8#LTBG zkY~M;PDNxyx*|NYcH&utXC?xZsL^EslOeNVSsnQW# zL)%u)BsRlm+ch{Tf(&>v-S?&&aS>!lPht{Dl9#0<{YgVgAeaC-$Bh2QV={+TGRR86B+?+N)eiSRszfi=W@UxCI?VtWE`nd zs9&f4nl+yEBmiVGO(awN+&pa{;e;QUt2|xPdAoAb}|{gS;X+9016S2`S#t z;j-kbX~e)LNR&kcHnxzbpdnz+x6^Vpegc3Nujif#FXX2>Y1c})^ znX+NS28lgAJ&V8(GyDQniV%Tnp?KzkPf{C-MiJs!BTt&h;ZYKnXHFWGf-NiSl`OzK zSFKtF%qtYSUl`d9Qpu_8&T zbQnO&2w1u}NXSu}Pw+`381+q@4N9g(3>&Hgj{qJLkwoZcqRQetlPV0!f&lmR^&w0V zQl!h`C!DII=xJqDKbMIE2FT>L2GSxa655fdXrpY4Y*w#QY_yaV;wl9U!lcYfUP>%5 zc*Hd>NFj4c5j4HLN{1Yz6!HLn${vxBm?@c<#DIrHNcjOEBRo<72r|M9OvKMbtFp7w znTe2OM6O0eTsj&AWf6FStqRfwV2~?F)x?vA%v(Jx4pbbdII!g$pn0e@x+QfET}qGT z;G25STct>+i$tg?5x|}~|4AJ?D0Z4VY;W1Sle5k_=hE$cse+7G)iihH2TW zpY!AZPGTTdYcl-A5(U{&1;2s_jEoWiY)4_6o3?3Ge8gFORU2R^qfql?BF=gx&iIpv z?+fKMoN{S(m?81B9A%QeP&{+N_jJXA)6j;2?vBp(me#KJkU3Io)=x4&9!93He!NEaz0^Mu@0L2Yq z66vP^Q0+Vsrganzr&@bTkuC-P(gWkJTiF$nb@x`eSshP5tFQtb&=y)sqX^kL8cVlQ zbm~NH0YKwQ*HWJ1S{bmm)2yC^YA#Zz#wYZh(XrvlshVZ5X3d(+n*t*v4B2-QxfH}m zOq?k{iUuP^t_*;c3le!rSc-9Gr){J|0vL=$*;5D;?X;&V!`4707x*MBGkPn#CrAZ( zg#fQIi>Hu+Jq>g9v*JL-fr9+^+Ng3W)u;Pmx**KT?e^DDu_m+oKq8e zMTb*UB6F3VuM%NuJoqKbC5wok2=G*#CzvD&<}5TR5tl_UtV{70RSkH#kOYsQ7Epn2 zJhLKF1dxy@LebKplE_XdFK2lG6R<@_15NB~VunmceWgfGp7@!i&w`>#ng<8$!^&+Y z_MR|zV~MPct++ioJ~}=+JT@{EMsH`kg)dLZeLY>?F@4MTnk;dQh=B3bG|Wp9LQX`q zGVvfSS~41MbXay4IC~y^SOeqZgX=etQf~(a1~etFa!*fm2dL7h*7Pmq5`=lwW?KQ- z=B91>65e3=>eZ`rqLK@1*~zo_;<$(u9d)6M)L`;5^r?yLnaa}J7m8;tcxb(%FA{Ca zmV(qP)mAD6l9V$Iz*2~E&Rc-_DK8}@7izsqQe{c2m&i(#QA(E5%!hm>J%dv6Ewu1R zls(aAxl%+VdMX{k(58ySVQ&?bqRqSN}hI zcLDEbaV!r1xW(Pwkl>yK2uTPMoFc`&c%elL#T`ni7pKLw6ev~*uEmQJ0TL330kPxf zyx-Xk=e88?ZTjBZ@^8=Pe4gxYpWWHnnc3OdS$QxQr~Je=1Tt_^p>~-CIlXO($kS4VMETV#h-5+X1X;E$LNe1f5=C+s05ITwy*G}u zLri8k07AEDsV4}YAS-o1PKSzaCnbK7=ROP4N|v#hM7Q>RWF zZ@h7a2CF<$69ctK{C_C?uT59}x7uvQ$+X$b+brDV+oaj-+0v+#dl zl?*RUF~*D;)uTr@yd*tYH8@fBmzPYY<{-{;(+4yXw(4plD=N#JQ7el@w^&B2EHBNj z1wMnyvhup>8a|$;`k2dQJp~!klaU!SX3W}auPrWxm_o+etZK9FGs&S@vbxEd#m}s6 z6cH538V%{PuL7;OBDUOo;;8l4<=v;J2o?QlOOrtrS>Z3ea+tOtx_791##CW_3rG zvRSi6rQhWADr+GMFdNoXB7OUH^(y5p$h4)h;>H3`DlS_W>^Bi3G8NsfO=Z@N^dvRt zRmb*iDM|5c_T;kQKnXxdW^+92Nhu&hOlE_K0V4n90mYaik_{41akd2efdRvo_;2u! zIch_r#g?iz?4fY6$*f&!&sgOYwMVtB;UA&^#$h7M;9G*!2V9ARaKOG#o{9g$_k2vz@)=zc~THoYY~@jU2XLeqJ?$L`+fG> z?ZWfV-EsRJthezh!@5mnC6NGU{P;}{JLJHh|MX`Ytha7`ZA=2O7;c#Uw~h17x4-=m z+}~#Vm!vHBwB-L9OLWvv1T*jT)>{v^GUGjuJMOqkFTHfL%{KFvC|Kgmy?VJ&0;glg zjtA_&_j%`?H+uAFlA!mtIQ5qc)K_LE0rcGo#~=NxU;S#Yz4o$ZxY0%%nSc=vbhdeavvyMjoE3q#cnh>7+wqVHj;El# zSuUlkeV1K!IrNbI&ph+Yo;`aiC{a%EWrK#Cz$ztO3bZAv%M;C^mz^9i`ObH~v+~L- zOKEAEvOp=G5m4kSLx&C>1`ZskplrEb)hP?6pP4vP;Fg;Jh_L~-haY|@mWjYbeh@OM za*`QM^Am)xth6=pf1LuD(!wAS>>w~%0B{5^{9Je4b+_1J3thlZ0b4zZ6JF!KB2vB% zF>(b0&MNNNxpQaFEEpn!f--o@>8DD?^Am8GWPHR$)SEN=nNvI=kc($ovWY_R+?Ko{ zlceRg$o6$1i@g@@xZ{rcqv9az^4+_47lBxo)o$Io@dE13xld&cra9zRk*@>Zn%+u* zRtmII;2)p>#g#`xT8MU{{b)HV$Z7)>BoRz0UWrga^m*PzCQ-A?J z$_&EmEF^48=`3Q55Rr{fQ+^p_Hny@_zxAze5e$-pvv?Rj@xg&(~etTdg)d4$>E0{z+kxX#+&ZF_ui7S*gG_0*wDT9*ma-1cD?()M}GU; z-xAckPunYW%b0v6{MN))3baz7l>*C40s1YhqqNP8LZc7q!mYR7x>KjN-~RTuk2&TT zDYTG8%7+S~jwn5f(UUL9Th_A-U#FTtR!YtxLxxP5GDS|+NwMQ$`|Y=<_aF>fj~+dw zv)sh#I;A+Uh7KM2#1l`bQ7N@#RC96ou>ClNA9&yaVAU=UQ1W;Mg24eOaK1#4TwGaB zdBcP}Qsl31`ic!5xh#9e2;l6ry>mY}@%z)JfArIz{&e;ya{*T{QwAKQV3x@Ir5am* z{+$#E{wA)ivF2*%sg!42XPzS1#B`LxmWYcV3kzO&;f0k}T1iTlL%aZCx7~K@*RS`` z!F|h1ORl~4TBYioez#=jqR6yo2iM9=%j{EAfi@?p?sp6|iLbo!%9zpXh@f3I_i=Q2ziNrQeBqcxY|cIJ;ul|h5h#7KsPKP>6cmlA zAfJJm(&d+5&Vu~KFMe_K(MN2$=|)8A2PdDz;$*XGCgin+?u39AK`a}xYpt~wW0QD4 z^w8u-9(jbwW+g(lvPz}MR$OsKlrdN7)w83vuvWkKz3)i}1Sr7sQ>4BrRxd>qw@?YP zEc55jr@JL)m2L7P|3({a0Owx4`~UKnzx?#mPpK*m$<&rpfF44@fo41>g^f2}cgW!W zC!KVXMDQuiL4*1YA3j_yU$=x1+bEj~__q!?fN2|xb*fg2;&}?nsGT!sj)vrkfvzP^ z@85OTT|4cxowkG)NRGGsgxKMSA3l2YdT+fo{@ioVt^4c#2Y74vzn}n)r+|-S zpaoU_8XnN`xVXUq9B# z--2yTX{A6b1zIWa4^w~!qj@MXDwmRMu>t5(t|$hT6k5?>YP{wPV`<1qRpuh}l8rgW z;spy9d?gOlX4aesAH44iFZ}ua_up3|XhQ}KSZD23$Bi3jYYbDz9)$JQTj&1!AEXsy zQdd-D#jj(>Dl@lhuDQlfl?ssYRz-PqFcm!g^b;pfewxcZn-**j`d_yD?)d}NolD6N zhm4*SdA8kl+d+f+o_p>^ufP5}d;(@j&K|b_06+jqL_t)V9{g<+RGmhg*i7`ZpZ)Bj zi!K^4pwHQ7pS|A!2g&S}ws?YI;9!zH`|PuS3#2vWf22TW5GI+fn~itw)Fv0HuVZ`$ z@2n|QRajXKo?<3z;E+QOF>AJJVDF0+Q=AgvYn7RWyZPo53ESh3Kc4w(Zmyt33Cvn! z%{7>&2KdR7AD=mMrm6|jfC0TvJn{Q?+;PuMH{SBa(7bFXnt`4~sS>XX@+XG=$M$?P zGW_q%RhFkMc}Gx@126c2vS_ET>K^DWQdqx;9X4V7Sm!|&F0T3RcaK_HQ&&(}+*DBf z@~dyCXwwOsS;E2q_r$WqHY~FTZf(^*8Lb*KTbpi#8gy!ELwQR#{q-#H^VU zqO7zMJS+31CB;s9p}@wYHz;l{nD^P@n{U36FUUQYJ-T(KM*H>YJz&6qo;|x;6RU83 z#^>Fj%0MhE=+wUK;DZmMdf)(g3K@OeNC`dn@py8L*&Q)-=l~eL{>Gb2tCy5l#2Q5? zyRwSnf}#yJSX-Ac+w4DhNS7WxKV7uAh7ZFDw6gMATfiHeDlEH6DJ&?hC|_E=c=3{j zcinyGE<0~$>C7=aW;D!e>uQkT%+pU}i8dAl{eN@KZ}f|oUww;0RJA-mzvQBB-MU=# z^NXE5DlRK#BNzG(NBWXp-#$IoU1#K)YhEzxquK1*+WNGSGVQ-}_g}}3opG&gRq4-u zd@-~gd(^JPxPmS{I_tSBtvu|QKm%t zRr(4-4ewNAnkJ!4<|Y|#43|WSLtx2=MXuT?7$ikrPkyh6BsWTZW2E>gb3;?~)7YfYPLt4UPJUjjzSG-g^D`v7_6!uWDCip9GAO6QQ8#(8CVfV1spTxZ#$2?u`*$ zmnXNjCT_juq~Rk54<9^Ok0jXGT36ff=JcsEXUtx(@bdzv!y0S5w69uY^;K$X>RidX zWJz^pMH~IysYl~0+ErC>`iy_&m6vMk3tX*ZL0ca&3SV&EIh{Jh5i;FWM~}Xmx{qg2 zys2P|aiczb=e7GDeI|se$)5Z05yIi@(@&viY8t4i@+MLneJWP)HlH|Q(4axi=b`)x zE3I76==@&st~>2uj{tx$-+tR|1`i&nI@}q#(uxvac>dWJo_@STWy~bockTGCop+fq zVdGnGzne}-g#xAj^xzO+S=o{$i`rDCuS%qOKAMM=rhq>6NScE5X6hpa9PvLX@|3Y9 z;-|8HN{l?ojBEDY%FvtbARvH)lX`Bz z$uJXD5?PcIJ?3fQf{1CGc3h{08>D;N^D#K4X_1qtS z@WBV@5xnrltt3wJII#w1I>cVE+R7_*?bt5MXZJ203mcpJcJI8}iYrY1% zWZoRW$yHTl?Dtt~tu;*BR1{L4 zA3k`sm5*eol$A#}&T2Lktmd%k>l(|;SOotJtVtko>7b+dQr+&QyY|W3JJcEqNMpz<7E^p7LUr{Ujvi&!;E3fdx7^|qFluVph!wEs z?YF1gbI)CAYp^>P3YhUg3C3kZc}>33EM4jj8K6K_y95Y)Ggkrr`O`N23+W1qO9~re zx)QsPL$g#?+Wv2s_S);c5@f>z{QmI6x&8b1|K!uogcz`LLY0XLbIACqlyn6{*Q69>jYP6>5;zWK@g0V=gBAZVV>Yzy zYR4V7ArQ7*wN&RykfKr(HVP|zV*~p28!%`f{d@cEw>uiN?Y7%@?b?-AN_QxPacO|| z_ws9ROq)90nwYf?8!s0u_{_})V1mGVlqAoWf6ZwN>)qH9$Hppm+G!`~39xlU&{Gp2 zBXh@g9adRom9}lmKlotQspnjX&MgaonW}y+Nw@art!oYSVRJn6&_kPVzIn&?70^(1 zCJt?ii6GOe3AjPJ;Mc$YHU6TlYzm_Bg885F1(rB<8YWAg@iwC^lb3tX5_WJs8E5OR zvGU--L+`r#Zg)3eV=w}g=H{&@O?u~@cgzpf>q=11+QjSJ#(%%3hT{b>b3W>z@9f7| zb8#2SacM}O{n5cxfqH;G@On`9%|xJN7rRU@$Y{3yKAns#;dQqcJU=Y z4mKr=6s1k=2x_`irj)c32C}#EDkBN-^!MIF%HKpD^>o8E?Gt#tA2!07AR=ZSjZz5Cn5JrR+-Q3h_C1XtZnJp+oyB3h~?D-g(AH zpYV(VsA5`I)Qb#^Q z0M%t}4GWAqJ$rW55k`%&u(y8p4rNnA&Ts9wHFx;E_dghA{^J8VH-4XV(upGBP)oPM z;1NMWauHToQAsIZKADly*c?~dO2;)pDM5PHLefz*vZX=9tA?gD159+zr9^3`IyYT? zRRBCg1|-zl7n2I0zAF3Ire%GrxEw%v0xRNc6i_8LD$1|&PftIkduHTw+{X6YC{M)$ zh#V>86q!Xb&N-4X&ub{rkliUkzx!yHr?s>8~$q*RJa4 zKl^!-@aVZzzglD-IB?)P>#V-&su$bl5Q>`M!l$fM^U=Xb2Y#D26%-3NrDfsfh`ZCu z%e!~)Ow!j_W8_gs9d-VN7X{jBWkwZry9@4@pE>_QC1U7I$_)!JPSAM!W6wI{bQU;^ zMY?PMa~{G;TI?P36P=YM4~)!V!v_8S_kXzQrki9Y(j59S&{VkNivkk4n!0r9}7TMQSSrwBFs3+BsE+A@(`4VQs)8^~cp95l>Hf;wC7`QOD&z9bB z(@j74!LjVX9e3K!!7L)k&FUVb`hxnBf?}GH{4q&4-FzZBnKS=0ZST;jqm>Qye*XEV zOyNa~7A{`2=r>ngt)5$NxsCfF30ZS#c^UVRrGP{P*K)*>A&Vyps@M97Flo|uUAlCh zG2>%hWt(lc;)}W_ZBZb*^4J5`rj0XfO_yDE*{2KURaTTYxXd$6v9v{mYI9jG#t*zDxxV;TvY1*P}B()ry(2*NFXh_-+udG z&fD)!Gof04-StMUIuc)Adu_mrFTVng{A4C;)#M?&`r?Z&r1f+SGn|)Se%ZA#Q>MPh z2p~2G9k`z=NQAR(_RJVuL5Qor7<|deilG2vG?bi9eEEeJn+xh2YwM`ittL(C)2B~1 z8cK@8Q>&2X=&%~7$5p3gy6{c#K@?Ept{sgFY=ANmDk=$UJ~T{0v0BtV=i}L=3qZA3 z*M26ORv5n_z&J$M?B4N{K%rjVoC%c9r5k898CJa3M}A6*AAkIDg1W+x0S?_wojM(a zY15|t_{TqXG3t#sUN>vjC%^g4Z*&tlklxi-ANkQov+Tx!{HRf*w%KNDG&%94AHqbX zW_=>9AydG)*%2d#8f0h9oNWLexzb8ThPiV;<38v&V1OHdd9~~~$osNbW%xy?&>4e7 zFwWEHo+DT+WXRH!54Fe=wYR1%DLw8MPxHGkaUh0@q?AGvi4z!46=iY#Qtto$r&7>> z03dMlQ~vnbSZ|+&Nn^HDw8dLn(T#?>kBa<^WhdjHO@aMGdOSn90VxoLD{Y8I$$GF{51DVD|>C*nA2LB39C9X z+j5bDua71y{_A0(E#szat^(CWi`}AZ(!&K-aWiM7l%G2^z7 z2tr0!Tm#h@>r>q;3loN-g;}s`yW6|y5Yu2Dzy+u z)TpRxo8&W;Ls|mJg<79qK>@=w+6s7qXju%<)0V5Pw%Tmr!nmKTwtCrzqcD`@9D3-X z@@H7&p-mg#Z7y(Z$~wWEdGpDJ#1Mm;CD=`|2-w5~lFi@44?nD|Y|dHa5!{AJt9&MM zojP_V>x_B9A|6BK=%bG=E-hoaJp9OGih$G724Vx@zes3#^RJKm^QLY1kpmqO3y{fc zh)js3Ki~vbxv+K5J@*Wwv!>A$LWCVzmbZdfkt-{Abi~Qg;lqdQzyJQ1UwSF#8FRu8 z3}#g5x}YKVn{U2((#dD&qMy!RKrGY}-K?qE*5~bZoK#oeaN22S&_|UORjaSQ`k(&v z;o z)tZ2+-h#j?4Z@ps? zraoYHgeU~9PVikjL!uHJ$rU@{CCbL3mAFajW|v~ zn;L3NV({+31NXti%P+s?fj>T|)GasN%xy7px z3IgUpLXB@|78g^snHOd(VtSK8-Za2 zNbs{m#||n5C(WR0wZOh*DpraHDy>qls%yjF97Ib!mo2JOl3tMIOnbpX?Qq@M0vbJ( zU@HP*zpU{;HjXrdo=6@n zvMBzAi_e??3KS8Tg5pvEY=QG%nf{KLf^wg(&BBHJ&lb^ zmMpcEgCXaZGK&BD8#(tieHnS?|kQQ)&lL9rNZ(oU&9qwTw$fI#O_$3DNUHu z`Sbd^rInTCJ^`@fw{{>EbmtFJXliUSArIj!C^+YwGx>Ab9a*)wf8o+ge;zDNmbn}z z9Usm9goVjVNV;->aL7qXIJUlN;jgTd{|n?;;_>&_pebf*UMJDF(TJ10zBcY~@7=Rk zx}di3+N-ZK=|Wi+(&D9YF$M~|fYE<<+;;1+#~w9q+=kPpyl3-aVX1FV7rVZWDDdS2 zh;t1MjqklXRacjY_dd6${;r)nj~hQ$~rHCfX%9*{(i#nVRg9i^@Fn=L8 zzXQQiP@X)=@6a%4_uO+|o)4>$m+|r|uOcvmh74AhIa07vy-l%}8;9!}8{J_;sPON= z{rCT5?p%GRZJTzaMb9#adFGkt7~C@Rc%65_g;!m5)#Fb-fy=RksYKt4!Br_wO(2uvdPj7< zw0YQfS|)Bb(Y}{QAAchHNNFhzqYJ2oNP}san(IF{EhkdzehET&L!x&_hYLT3{E+u# zJP=feKvV}6C-2uU&UDIH@ zv?eZYCGM>O1=xc_h7J4d^Xl7fyTi@UQs^}QXIGB*x88dDCgUfd{DTioCY&;05Ei#| z1aYE4mU21)@H3c~^mBYRiYwQ_TE=Lzm8IxE27WAVp}zq=#e*f*D_Y8eEaYr@K}-I> zCxX$6nApIJ11?LcB{dNTgj|p2t+>w;#b*h5pv~6Ixaz}`MaaF%1|r)yP>2btjnHWY zo{4NANwchs3Gf+bTDr+0>)7=WOCKmHohz-TW-0oxymLGMqEQGF6I5^V0-&;nIo%VQ zv~wtsL;+EtV!f>>1|R{3`i@oz(9pAxG+LA@k-^ZVT}}1X8VHC+;VH=CT0{LKgc)Kq zA(UL6?|HR+bj}oLec}S*JCW{E5Lc`RgBluL&wyiNMr|;0!g%Mz)?IszpIKUs>%=b8_6#W0Rc4WL=Pwz3p<%l zuJZPK8ysvwCpX4Ky{4+FTz=?fKeB`M z*Gr@1V^2Q8r0m(F7dNyU(Ui){#N7e18C&gsVkOGl8orJKSpy(`B3+m(7#ICK&ie%4 z!(=Utjf->?Akr0~J*b_I?c>U^R4`^xG?=l{PiqIEd9Jy;FRpg)e`STEAYuKz z^Y)t{lYtGbzZDex`qHca{OW7oP!z)i*HwGtv4h!vq_215f5nwPRh5UzL^|dg#GS!Pj4Z`wxHkL+T{y5~Q-&T!Dho z<(eAZ{rJR_&sY{X=%D@j_3LxPEw{P*t+LF{C3`=jLz=6Q27FaYN4HOj+Ok=Bx81(o zp+lR6i>u8~LIET#W96!}w0*XpBoY^J$PfrimoDLVscDE+azYRYmy~|=(MND2e1J<- z3uTcU`BAk*UjxQ?^E&YTG%o@wlx9Jk3Lu4UP;jedF*gdxW8pOl_rkMGdpiU~smOl-vWZISl1vk2%^w!Amar1r3-- zZWo8pbSIv8;&$6^1uaJWtFOMvu!bbCYEe*N?Ep*jYK25`r_MGVzlno7K9UHZ(Hm^g zr%(4`E3U+**9X+7INhkfopHt)m?c=J?%1(|)gicz7`_7ixW#4@b1mMo1E4AbI4dN2 zcwvDHW6nPNYzHV%#w^bHWzF1Xn=SphWP%NlzMyDVO}I}^KmAmz6a-6eAGgWq*|R^n z>z=#8|Mv?)oa8vS&THpulGtb^sY86Wptuc+AAUHyU;kda@4ox9&%Z#Djk94UHpFM{ zY#E<5>tkzKy?b@HD8x_UHVqS}Bv&Cqu1sv--VwxD!&IGt8kb4M?Af!eq>bHp19LX& zOrrVNiYtw<(f6IV-X*({ zs11matD?zpb-F~sEC9AiNn{g*`RkBRUAqqL^+(NtttyT@@<@49nzw+u-(|b)wyUYD z)np24yY04q>ZxaKNu4@%x-LLb9CFBaMvPd|KI=t`s*x1qAi#qQrum8*TLV%I9@OXN zo9+lHN}FerfW;Uu;-DrTJ^l341JlvvOfDSs7T^6OuHso0qixQRHD~5^lRbn#sP$QeT^1}YtvJt_l$%9^u*nF*DPt2#GdL9hH&W2Pa*bWcAs z*j$CoQUuVrPW)6w07-MXsI;+BzZP+iYepto(U=Z_CprV3JH98Za;2&O2ejBTlLjNN zKn1xqEH4ERALT16+W@gaPQGz#@=7pBD$C<@Sm?^C;jwz|xfhX|gKz58X_Od7*u6}aGBDa^ zBED(qpi+P(6|rSqfB^AU1#<}4E}c4$8#m4lAm#+fQoNFF+O%noK=aP=LHFz3NAklD zKMYiC^iTa=b##cag9yQ&UQpJDzC0E8$`u2ojzJ>>pPEF(G0F&8RzcH9GYfSM88YO! zV~^()?$f8wuYY|R=Y=LXu?K(s55j~Ugx2tN6d)V8AjlAMlsq!YSwn0JeTtbXU{A`B zd4WrI_fS@mIql7HQi)DdgecN@^4B?_oTh)l_l6pbv($#WT>bV;S}C!JF<|Im*6Djw zXFUG+<7s2OJxBG1VDbw%;UU0~3B%Lpoe%1EE*E`)*UzQGq3Y{8iX#*dsb>!E6;_Jim)LsdB)vX6YhgG4Im_db6LY zlgFngU6~k0M3MVUiWe<0XRD}9-pqKgGLHVT!9pReW>~( zN^ISwuws^zbP!V&+Jb3IHl4*&{y6L>&p`(rpy6kqeePRt#U-3tA-zM#_EV-zF`w+; zuQxgs7ZtLhDNwa25|cu-Gha&cWU_9`39OcCg%1ym8@DkGKm2f3w{Bg*?AyP8k6wK~ ze4px%AVp?Ybsh$c5UeSeAMRjx>WU+nU0GF0qu54-ytsbiR-!dfXrjgiY zr=ms*hzMY)t$^jF6|Tu4b+!taocHd%1NVegAP$Zs1|g_%^tMm;2k(Cfi+lGPXR$(A zQ;{-5Xn59Rohg5+^36Bj{$%bPH*n}pg(AWhpy`aCf4+o^RG!mLJIzJRk3RNftipW}$e4XEmt1o3xJ@>6HtDRh&cP|& zim1o}L-#PNG0g9D$~4<+#~t^*I>%p&3Wg5pcksanhlmyy9CvJ-TxGY0(U5eQA)8oI z!fLOois_siXaP58%c7_XVhN6euZ#>zCkE-_Quj(_v1#9~!xDFCmMt?Qz)zhljOkD* zaiG7vraBf7oHg=vA$7ZU?SJ{J%l6xEzsFFqiYYHP0HA$%<7EkgEPjFUpiF-EHV=(haWlqY%5QzTduJU7k*iB+_53EZ0Ul@ zKqG}vCSZ9hh+8j;XWBQRV9N9NKCH75C-$d;1kyM{s0fTEc!Hv(f(Vh2C%R`IT*|}8 zr{Qq$s-dy2q}i3MVUiMWts_4Pc`MJce8C0+C(ewS5SmtnnG)3*Mk~zOmc~Krz{5Zj zlnDb!PP*SS6CpKs8TG_v08lM40;T}xTyK<3Twq~|%M)!#2C-UTsP`GQP%OxlCUrdP zj-;wKIMwVz;MnFGIa4XQ6pTxR5_u)I_KP6h-xtEu`9;VQYo^2pN+fW{h0iOkG#t;_ zHkSHjAb5DXq!F0Hm}0qrL>%%PkJ+%Qs*D@m&!HoRJB>DJ%dHFn`K=#SGC5S? zfgzb1l66a_M(gt{DS*q^fn45Z6^&?ql0$@@K7D$`(>->WHF)p5c@`HVOj35R@c$8EwU-gx!$1F3;e>gDqh#Uic|RW1y9thX(I~rFYyE#^7kvCO&Fu z)k5RwsTk*CBG%NcOV{z6Y~rlA0nt%%ix^Jg1#rV~-bv`z^>i>@rB zb94$aY)YxRnwq?gu$gJ-GE6%Ovp6ckDq^zxGDg=f9bGqQZ;pO);f3elefJ-TxV}NC zks=x!BYGIDbZdCUQn>1>t7xv8rAy%dlOJE~l+=0WU7+t}BS|gFo__idlbMBDVO0w* zuH;1(nK*I0ry4Xos2cviup1KnGOg zqQ#i*CP_^BcXiGpf0j4oVta8-p%sFYA`*xQp5`m=MA~JS*!9}CchBdZ3mHSes*3WJ zS6m4>-+udT1e`c=+`xf-Ep2_iXc1_FyLP&D?Q8;$Wkz&)TIzCjq73||21`r_8Ig^< zzy9@=habNGs8MU1Y@c<;Y0%SUFphKAB{7z(1 zxZws4`P?*Xxu>0W?x6ky=FFWn|C2czZa8Yk9kzqdS!bR*d)}P7+QyG>?DawTAQ~CA(xqAyg9#FC zv(=W+cIH7&5~jU`)iV%IZs6EI=_YtaXu7+F9qhxk{rmU7@WPAUe*LvW4?XCUPv&26 z!3EmJCUAzt=Iyi3J%=zNluwPr!C0bpQ@GqU^g+cxocWO=Iv}uL7!0}2|J)~4gCm$o zTl$na9tkKJglcZ)dQbW-&aFv7H=Gj3EWC5zO(3O=!gt?&S40L+LDw++Bm4U6uER^E zBjEVZ;Un;6=8RdEslSfmST@LEh<^R3Al|NN)21z{UbZgrbw$21UG3_EBsp|DjzjQV zS}=#9(>oB;E^jr&!E8f`3__L@{$moW`35X&=CrhJ3)-k%`py@mXbwF4^rab4hECQ- z4HOraSg(E-KYdemZLt1mEcT%wf^qy0P8c+3;Bm(ubLe4*v$9O> z+z)ZtWmoW`D3$xKy*Zmr+{i6$3l@CZrBg@M5?AAt%@Od?BI2MU>lYBnjtnUxuF=|d zhix8s;31$$rKZX68N*_dBG(mwLsVzXnEl(|{uWIZ%$o=2J@(pbz4g}m!@UpC(jb%4 z_~=Vf(ZxTxglTl>q2J97_vC)iQ*7q-4`lHqq%lx>+Zw)(0*IMkAyoFSAu_e_zyp&h zG4eyGxNnFemSwT=Ih@4{KhNxwPUDd@`h-T}UkF>YEY^($Wo`c2a?8!8PWyl@vH2Dg zu^ZD_lC<3GufM|}0fCK+U+vo1>210Z1yjVFB9>d!OZ+^=MIfwd8H5((qs%uc{7a^7 zK>(yNfMvqDNMVaDCVuwmLW-Wzufyk%JA{5A#a~2{48(BZF1YGi{*~3%bo)iY;6eTT zb?x5$s;jO^FGCH5K&0Ix2Of0D;6Vd(`id*8WZ1(bJ)bn_$?_OeVM3l@)vjH95RjYR zbPfa_NErlg?ckzWw%dLiaVcJc;As&SG(%BEMMS^zCBIF{^mE=Z#`+NF5NmqK%&_gQ`=e!nInikY+&szlOh}x;VOcB zamP-bY*U;$YnB;Q(!T@|ne1_MbK~U&X%`$r6Al!dg~YL&Y-lf{y$U9ob|$U!=PgiO08d{e!$UlxzSmxB9Tf$& zqt&6EtroG)5y$Ri`FUcJ3jOy~qlh1LCKYL)fcD}wYDo7qMj;FGGI~%5Ur4W+jFe0? z=c!C@-3&=R1_28SScK2N@B*2P1-0fTYu5^zs@UZMI2CEN%6Z&OaJ2|n=4a;VlTST9 ze!?azju`AZCg~e)7>>^;pL}xawCQ+lo`Y+{hYwk}aLIzXY{Gfu!E@0P7osjY;GhFL zc8Gm`u5cKmM)3UMUby|-<`thr6?4)Mi~B) zbihd~0J-X_t2NF5?5!r$r`^SYdO`H@M6uYYnMEk{PetUk0ggxsx3o{M-d@d`HB+TZnbYpM z&)y&}UhGoVinZ2S%~8W!Zo6Gy`*==VJCsCM4gcu@t#E{T!I2oyb$7(E28D$_zu;!X z7+J%H1Ba* z@ZbHh>(bf13oEQJM16T@`x$4R&$|acqi5*gp_<>fZ;!=`Ywc68pQ2s6Z6Lz{ zy8E8Ec-?@o)ub)<*nJnZgYeQzFMR*|NB8K_)j%M4JpJ^av}>7(UtDy|_m1w_GnR#4 zd+n_qx985@7BZR$LpxB+d#$%4l!BBEj^LU_mE(^+rhk9?)`F_KzvD=E-1&Qlf{aBr z*XV#JoN%n~V#y%Pne!+Z4mGOS zJ#rwQch1>;`}TBG2rDA%1i*nk_0%6IsP~f&@&WV9F8gJq#20-h$lwpo5C$-cB;<{c z>hj9y#w{X0%_2{7E5xBV!B8SULG(0d)639DU{}CDQPD}h5L6)xC#O*Q)%y7FD1aR# z2gMqbP>mfscEW@S9Q|B8Loqo&S@I!4fO<2HKfrB_k8ddU*QRkq0x@q5P{WAJ$M&3EjI zkw5x&b0d51s3Q&s!7POZw&@m|@36y;-v0EbKY#hvKZB`D5)@a}>&xH+NJqGYu-ql$ zg+)MdL*|Zcus`akBlKjRa)QFn1J<>(d+oLRYp=a&U$vif3g!_MbDpJ(7E>a`0$3fM z8OqM{U2bA==bd-67b5)-o zdEmbLci3+G7_FL`2=^LmtYewBv?7kl8mo!7B4&nE)o#1(Mxm6YOaF%q8|vHh9Xbs= z<&=|8KmBxhV4KP7Sy>vZe0H}xxug{1V8+bZ)?{p1G}3cXSdQCz%dL#ecHFGB)~ai) zvFhQ6AN=mr_kHtv`Umg(TAJG|HBEEAGN{Xd?oa{(Mh`4>MPBU9uJ~GOuD!#? ziyS+SX{7tWW&aNfLH`)@VnLrOG>Bq>;GmbMw>pAX0|xY4_~~cfE?wHZV8O!no!YOk z!tj?~c_qX<%`2=bC`grAzzji+W0Ubs3yjjIKp;z4N%93f!bKoP<EDk( zo)HRaafna@;%bzRgkEp=~=n1qwF@4j#g+bP|lW)!l$9a#4+Re3Sut?JY;w zFD)-F;bXH{Lfap4#G#wK^X{*HdD*~HP>8Y z=n5k)z4UV09b}a8v}Da(FwQTS8{HNJEndT6*P`S33Lp^Pm5m$H!*Q^hJ$E>Vo0olZorEzwV-?)l|ywZu^}n zt_3<^ci(+yf1iF{Z3X*}4?hx>wT8c-K-@<0KUwYgVoH3_LHkh%*WYlP4PXFBF{~VY z^kG+Cc`fr4TX}Z(-~Rx2d$y@E(jVjs+dJ?4!_!YcYiVewU3Tu*x4Yw@-cruYg7V5Z zY_`un`%Id&>1UrUG5vevt+%ZpF%ec=aj3;)-x73$T}5j5)FVhjM!Y2@i;Z;BBEvDq zo^;MRXUpXNaqMP0x;@A?A-C+>N&EfpfB*8!FP%UCQ>)WDAp6yJVgkv@)wy#Ao)Jsa z%!})qo(iw)<3KvUlE@YJq$% z#aeJUC5jgp>pouT9a<6X3eRt>HyYvw4jedo^k`tC;Z3pToHrt6Rj&vM2SlmXu)GvN zZF-E2O*YURznBMrm?X0X^>m!#am5S7@7Hg8Oy_Hp=4WOigWus<+JjEUcRY>D{8D~b zfDRhi_ks(5?Djj8Had-CkNmv<;RjbDRt}k0YqI7h~7^>4|GsRR*bnr~bl}Z$$LE2Tdu}j3r znzMoLtk;AI8@a%r>LD4lfHQc|&;+A?yY`hMS6$_U88hW%?vX=lXzpb!E00|(CMw!! zMb3~sW5#R_1I1O^=&Vf=YaU`(Th5$0t2UkTipg9Y^$vG3!4gPVU2Q#qe(}Xc)(z+# zW1h7LGuALZU5--D?u}~_#*G_mr?}&CS6y}OqmMnpgr$Xs4;$>_1S>FxRfD=d!1!+8 z&e}r3@F4^F#@4G}-^y5ZZNWbK>>D`!MObE};G+`@ahGdt+QjNSL(mghII4~DCbxKM z#_QV#g9i_B0u?Eol-6*8iJys#*&v~tVVa4rA*$kA_m&Z32impQ-@r;hpLpfgmxhL4 z{rqPzXLZe(G1CTA9KpfhX7hiR1I+9dtd@LXE&ZKyZIk~CkSa8-WrsHxB= zQ}j)Ocj1MX(84`>^%^v!{{#2^G4+eM_5dTc+G?xU&UtO(rkm}#`)>9s*n&&9S~2L+ zqx<7eK7H)5$NNcad|gdl@b?5$zbLOLg_}ihM!PY0&L{I$T5z#M05j|XA zG#;0hR|d8Xbv$_k`}aHNtTSiMS%4tkhZaZyZvH1(p%_viy0F#3fN}we#ltq0F|IGF z|NMz3o)|OAQpqUP`()1SlTSKnI0OqHZzx)ZlUP+;o^N(iC zobv9Jl~<097!q;AV&BEW? z?@VWZaJ^Nw38`cI5=En)F1C2dA~m`$_30;`JYe7bI(BU9B&Pw?229e<*RXKmlJ;%e za8vkjF!yEB#!d6)%su_|lZOoH&&BDpG^Dz^w&vA8zqbAcYiru8e|`%Q0&IQ#n{U76 zGohC5_uhA(S6+M7+qUIxk!!bIcQI#s_SqLreS<6o1-d*#dCxs}-ENz$A9>^vTcC~J zl!@h@sqei<&v)zAamO9Ex0=WOD!*lCVBdQ4o!PTKab*`pqzAft01dru4PQ@zJQRPK zN_1-5wpIM#l&Z~XgaliR)P(iY%dWQaw)*NTkDD;T@OD44}4@PA1 zCaxsvxZ_SVWXzg5gS}zo^~z3k*AuL{_Ug6uO=q2Xww(wJErROWuy*a*-gNy9Y>YUz zSX^vn%kY%^V@(BR(P0f7f>B0K@l-`N_98c1Eq$xaD^1|+6B#pRj6LlPBEf*d!nyJ0 zTVOJO{=!b39H)=*D=v^USLA_9>Y5Qkk*gXsG~w9RXqbE2$g|q2tLMv6P21$R+9o}B zReh6$w_X|bB^miUeQ1`;>#ukWQL^Mc~e$i$@1KCtIe@H1U}te z$4d`D@S;=qGfB#IJ{z|hXDwkL~ zHxw;de^gHVu|8gSI;jU*G|4mK0lTl>eyak{c!17QoJvv@- z$-sdFxkU|WX5Q8WY}`^XvZWP&Fm+(?mBlANy$v)X!!m~rI1)XDEJNPXWI4a$snQUy z7SVLJ7R#kfpFVxn)mCzX;+}i%H8w9zi&0q-Xq~dqkZt!p_YgVjoO3`(yH3IemGa6f zulcfyX`5|qFpT_Z@o>Vp(J(d9GNO|(pPpmlkS%5}MNN!fCB@ZnDYP&Yip5ec!#Y<-94Da2;A~f&8Bk$wL(GS6C>hPMaH- z*7y>)yAw0lWEi>9%4EhYOWc@eK;3xUMz%Adsvd+XRTY)<=gvhygB*4sV@PaW4Am>H zFr4y~GxdvD&7*d+tqGJvL747x4y1nk@y8Xkr6hBi0ZI?bX?=M7_>K8HoF4#?U|4|i zR%U#pnAHdkIir^Nj6@x|g)lkcp>xOSAx9qW_DiP5DW{y>seRliHFL&CI#KtYy)Hce z%*BhBeD{bW_>{F*)e5?1$7K_KI+*7_ez=`>*`-6rN|U|Oqt_cXYCYKI?bb0NYq|cU ziDi7={)f06GJGcip{EHjMr#Q&=-G_9KoAoU*We<)xR8I_k(-vuE}1 z-xrKO|M?9|oE9IpO-J>zcuK$Y(koo0!7`d0cEzb#K+IsRrwto6 zSi2s5{4p?PR?t2%&QP~az&6CbBz8KnY}Q?8jf!raY$Tyc_^i1h91w!1SK6+w+_eqv zoD_zawbx$T%uS2JN>2NhGl^XMd(lM~!AfeUd!08fE9NYQ1s+G>(L3riL)QlwwMzP{NzaPSb50YEfDPVlQLV_O7ilt_AYD^Z#j zK{ZFK#3LZ!l&8;4VYgR_S3YaJEt+Gxf~2TVpB^gYx>{wGk?fPBk2>^cKQD18&XzWd zF%1o&m#7JKP{ttO^&NNoZtncgtme&`%dVLVh(uRtIFY{1R-3-_&Xk}2{1;iFku-}3 z;9J2XnHeP*s#-jEjpb?XKPm73`LvB6H2(g&Ir@OEi%h7N4LIXRneWNC$;~(18XK&% z3>`i!b5Z}14V9zwG%45)nSH>)RN7T+1j0Aa^gu3@MkZKHTH-8L?>;?$aMB5F+LT>; z?G45ZGC_$nH@ES9YgZV!23`NQux_qsNg?m#R*DzbPw+W(-Ax!5j-@S^#0UhEgqQ8w zw#j?{GE*@fn_&nOO2H_F<$Q{7zx$49n{D5DajYt>hK0Y84l**?)t2P<&9~pRXJ+pF zc}(ZHrkwSe+ze4yb8Jq~BASzhkgpqIA2NK^r4C=m0wa)3`V8tzmc+tHd0FLo=bqoE zch{-YW}2?@?{#T&5{b4ZW@5^{Fg}E_64wkz9gKmR{4DH*$pLJCG6;d}2iopc# zf%z9fW2I2^Fk#LfcGw|c)>qfsZ?>em!5kG;gUUA|rcHF@%6wd*O$KKtwocinY2W7W@Iy}H_&qo-uqc3&mglSdQa+@_)uCMG$0 zs}JaO=+F*sj_4eD#G%Gr)fiL~)oYcNhyCIgml=s+sN)N{3-{{P>}HmMfXO51u1R8J z7l1_S$h3{x@zduJ+O)9^xxz7e)bpuHpiE5_C!(vYva+h`>KZ=(d@3UZ^aj4qU+`(xKelwCyn?12giwa^vN-eXM%E#N23mWYK5Z&V=+vRTk5Y!b)z@1W z#VRXBY6)mbjJy&u!a3qeS_F|$k8zBr{N39dRU>RyG)#4jlpBw{Kt5LZkwO ztolSv+p2c(DJ_nbaPBz;;idsH=aE3W`so0#^RA6un z7T{Mh!pt`RvvyBp%KZO-qBb((7YYv=FktxbK?@g!fDInhA8@sU6{;HfoUv&8Qn zarn@ogGC;BqBq?>@7qlS>nj`@yGM0PoGXQP5wzmx1K#J%1h`+OWBx=;1cCzN8-MM&Tvt6 zSb4+|NA9!FKI^WtrdPlC)#cPB6`7B{sTVXJEYfFB6a>JL2m(GDR{extus0o3@$@#_ zUdy&3$2VKqpb91lDKh1;5p%+X2|Drp_y2J{PK0*t6k)UW?>FeZ>C?oktCtcOJEark zaACMCUavGT>k$B!`|=y7NKsgUS|l^M)$r5LJiAY?9q;27Tl~=3zxAEd1>A4`+M;|0RoJdPc>VxjDmQ z(eeAo9HW-%y6`UPs74)RcM~Rq6#~9G0KIUIw1(xUz@R~cFqkS!q7@P-kOZtTDq|~M zL_CsUgy~6L6F>jsKE*F*3?e1LN<7k&q?0-y3*y(=dNOhTl)D%t5`+cHhsQ;`CPPAP3$897i?O%gN&aCIpP zJreWq!w&97_i(e#HlI6p z-iIH~&_id>|16(AW%3bJW}$uiWB?k()=#a-lEd`Z?_kcm2Vurc-o9b6clhwZR(f*} zwe}7@+2RU{6rzt56+u-xtqbjZPE}`FxVXk}X@#Dp;jLFhUemgEPuIc~6dZE!0q;$n z?y6PWL}X|U%S!Q}!otjbASl1z+K*6H8= z{d?ONW`h8>l9TevxJWEcMVM}thCi;V(vkQYL#SyMuyoBb7e9$fnwdJaVbZINzar|* zwdacHNke%W0*GPQ;eao1WB+OS|7Efmw}KV=CR=S|ZOq&(g1Oe->Q_;7_!M=;RaaTD zrmpGU`|nE&P|Zc@Za1Gt_r+UN0@qF!+kqU64^IrzBN;-Ye%EfDPd)92pUj$V6tQa` zd-6WRigNa74Dd3$kx{AOeOet-BS`{*lz6&`OhgLATxK8+&yc_5ahIr|YCw8_>K+GzA02(V%}K- zpaU}+;*%5%S|5Y0YS-50vA{4!+;9LuNuyH3eH=b+Oz}05kmLf!2V=DAt+(DGg^IVW zD0k!Sb=Uniizy6OTYc5hqt^%IjAb7xXex7ier+x5VZHS(C#zRob(L-wAKH$u55$U% z^}F0;rM?JcI*b+nja+FZr}SxIj#c+kV2WnyAn2pIGp8CM7c;&<)R*#{Y&(J~{j$Hp{|gh0={wW6xBz9F_-{O1Ie zB@F0EOtqTx9%)5Q+L4i9FvYrd?fCoO|KXOKZp0Dmu4vn-Yqz!6THRz@!G?5S=z<0F zIlJ{QOK=W=ktAiSYZf=xG(7*zv!-q4`Ac6E{q-$f+ z?igb%YXjx!tw7#F(wdv;{gY4m;pd+(Jm-S*nSZvtl$3HqG&|tQ43$lfQ(I|CSTh=~ z_lanZJ;TKQgZDqMN|%WVqZSc`KqR_>B#0b4fm!~baa`!6R&egP^Uf}vIwi}v)_xC> zMw+al0o`>#O=DHVu%tZh9vnY*lg&4u;ATzdg=T&HiB=P7>A5%M7PUVAehMHj;-Mk# z2xJMVJ&`mi@MX%G*a%*M9J1#cn^HYt*~v7C)zvn7g=;q0VY^4#MDX5}sZTxijQk+S ztMZD+9t)i&KmHPo49!zWOpHiNdd`{pV>8>Aw7frUYRA=A<1Vo#_S93)S!C@S&*@8Ri+b|kjp1wLGk&irR+8Vxw0@<`=`KI^(WoTk6t`S_v-Q6_iiqWSY ze`14m*Q02P%&2|XFpb5Qk@Jv|r)}6rj0r!31T3~S7(nH89tC=jAn9Lprfa3_s*QEH zn8h`jgW0jnAvkj76*e5R(IuDsRJP-f|K5}-(*XyNEiP*|V0!lK>LOFJ^x?;!J@n8+ zSqK3qIYfnKRtp6$g>dq`s3@94OMmbIHv##9k~{_-MZl3W`S)W=sR%2gv?TW9IoC(W zGNsDHhKbcSw*!3i(d>f`I!Jo2K7GzT_Z(fuH;Moxfi_DG8Z_t!KRm@pbQdqFwc!); zY%N%Q4F_72|2qoc4t5|lUNCVf0lda6q9vlF^n4{4;)f)q6d4d)2KmECPU|QbB+;v^ z%F>3L!dm+v3SxPUUChH}yAU6+JYm^4V||$1wq}O%i7R+{ufka3A)<{XLJu?;`aZD; ziIvh~f`O~&#RA_8)bwYfEExRE@Wv7q{=WH}H5wo9o;t4!J%IHyP{;i`j znb={nBP-@sRM-tdIDF|V=q}O0rw8x5Kjfe=w$;gn`gU>f2xePNrw3Nxd=;`ZV5hQ5 zVXyq&rt}!zV1mbtIhZ6g;{mb&0LhaxS6$V%(l!`9pKriI?STjEGjKqkv17+R_~3(i zuDOQ4*7UN*N%v;o z9!nndZ(=Xgp#Q6Yk|sx%f{ao$4|6a}sM)M4y_JH}v8tB(0#PL-20zob!Gi}9VB2lc z+1@9nTZc~VFv4XXJQO-;m`$-L;g^r|2DCc65lYMWP)|MeF zT}0>oYY8kXYwJV@2oy(tReGL%EE<`&ouBM*70Cl1 zGB{(#EQ#v%lunX!SsDB^bfT^C*Bsd^hei^FQa4p5+zJc=6%|B8)GJu7^`c%2e$=aYvC9=H7c9I;69pU6yYyZI1dh1u_?tXimvy8xLokW%@UmJ=*s@bG`)Gycx z&)eR1h$d9uS$i8=SECMbSsLOV&OiSg0;!YlN^(LNQ@2(Hx%?z%VUm291rSybn`os= zkW$IZZWm=0p=aw^9J-f~nBt3I8sAH5EhaY*6OXDhwO&9*R|F7(gC zJzkWBK8ochp@nO(Axtp5d39{k8oF+#PY>H-=zHFMw2stOf4A=-pWt#&X(n z*ie)fzp{W01y&|UW2ld0O@-diilw!GyYe4Q0ZprEhuR;$wa^-wNEJ4giTcQX`dUY$ zs^)~4Tkm*)*cdbLMhqPmhg!{rMNAisV1*qrP%vqQ6e@~m{YaHv)KrJUu$rp39{QGX z+wgQxb4E_XEh-wf+N?0Kw=34 z^E7vuv{3J8@9%#1yB|9CnD@Q+-IW!Ffm_W!zwX8x8iGGC7`NDqb8UxL&!-g)TYK}>fz7B|%u zmsdCXY~m*z*R7RfW9E}j{qP589Cp}Y)22Fk%Oa zpj&J+RZ-R0RF5R-qJO9qJ&ZA9#&A>{6)v`uk%8v+E0tQ-@jD6*IIT`l6m2>^4C0iv zmi*|4KiYlTlm+u&TKeiM%a$x<)QRI2g>dRu{`2LR7k}ehr>P+Boxovh90e~4$3mX* z;~&A9tArZEcdYAB?@>bro$1o?j(-QtEeubE@tpYWhtayE+YL9cL}1v+(G$*cEL&L{ z>O#kB#~rs#>vKXvlgX>YsDTI;dXc?Zvu1f#gI=LY7XaHnlPEJr;;Uf1c_j`}iTM^i zH+#00U5Nb*C z$DVqc@a#5qvX@WJ44>q`?enHl+mAGP@}(E&1wVLc7<vi|t35 z_(sAPr%8$eZxWpk+!&&K!)z#35WIY$AIA7wSr?pjp?1ue;6IF?D&l$tK9;Du+u#jZ z=4&kkQcKY>n7R!=^(o9>9XocPz4y5Nj(e}U?)sqmd^oW60mOwB1X8O_ARl|`*%x1a zrK#1B6_G4mxngw4j8aY9VVdyjtSt+(Df`?+UHh4BIs^7CJwWnkKvyZt;IBY)m+ zev{^ROqn!k+LX!9&wBRZ2k+C_z>9T6j?jpe9xBw1+0I!#)g1E);g&DZ*d5nGb* zstWybFC7J>!$wiphP}#*TPl%itlwkzsie=|r@BTy5TAx!4fwQu)V$m*$&Y^YcoQWE z>X*NK>Kon=rV5{P_PN@%CZmn9?l>s-~Dk%;(De)1E8 zH;Wc8Hh8a*YahkYn{-4~eK`23rKM)jAZu87+i|AG7d%z`}iB`m*JmREqwXKVXMrv z92QGSWU(qHaDv1KAq&s0RB&%aQx;2c@#8_)u%bK+cLiA5Cy#}$XIx{ZHQg~T9kv|r zsi$T={q)oLi{Qk$pv}#?KGfg*`HO{XPy>3gj^v1-EM$j>yO-vDnG$I-TV;9iWtaWY zMETEsE*wMTC?quT0G4N-dBzBqC{DwSjp5S)Bb(|L?!rU*z?K) zVdaGtGsX}&7(e>akG|mz!_|U4JOG&NcHTCF=vtaogM>kCI>8AARl&FR?6c3p2XT{C zjy&=Ra^?WsbIv(OG?8V4IQaCIJqsLKIur^UmQsX|5piq;L9J+8 zO(f2Y8PmnFg(>!QU&rsfQ)7Ld{*YlB9VUT98d=}Fv1(;8A1O$0b8JXjTRFYA8acvD zp>KTS8zxMKZhyXF%L=*#hAM-e`Vs&-b?O;N0q{6NF9Hp7zybU0y6Yt4K0L;1N}$Wc zDhG~ zb=O@o3JF6eCtN@Dyl@tCt>!}#bTl5oOY

!tZ;CYHP`zs%5L9s@Bf|BnDpS3uFEr_Ny=71yO`A3x2<`+6 z?(XjH?(XjH?(Xgog1bX-C%C)2liYACeWxCJqImCIIj{`I< zL~!EKGHV~ni>c2n`sO#CCtuHwAqrji5~O3Tl&3nlH!$PWPmVn4Kq8R!ZXEr`BzNi;B)P(TZQUub|LN^ZZC z$(U6)rHmX+{<4N!xZT%nmtBex1)@d}MDNS_ZNWL^_fI~zxjb(<#?vXaH3r!q(P>(g zknz8e%r~xepcRGNPtQA5IxA8|%Q84z#6?)(E!Po)Q`|r!T=h}IWU{jT08sjq1^H!r zbXp#hqk+Eg9X)0RAw`LpwFs*pfIa*JP~MMan2T~oEreh9 zhbvu{wqW}-NK8i&xdaNbAPz+xEGw;i*$9+yOv?yblFA2Zw?jw(r~3DC&toxd7=qW) z>2b9ciXZ`45`vHdz49xDUd~VM^lq5jV9~;Fn}?}<87X7pa~9@jQF}l0eV&uX>9ZM) z#Y|s&g(jBLujX5YcR!qF?UK^mxYqm+?o0OgMr^>u4exE=1q)G84i(f}s5F%jME?${k+p!sB1n3T9~KI+!39-KFy16W84T08FG=#FB5K-}eK4$-*ZA)aPmDi1&7bey zswWn{2;lM7_8Y-q zL}(p(USF=Gp^Vx0MsN{lki?yIBGdR#?oe2>_-qYGMZPc!R=`p>#7^aBvce9OFpgm~ z3oy5g_({nzDG~=NwMnpcSl`91FR-5ku+ivtO8lxjB)kSU5CDTKMTpACU}=dB;-F(W zKgTkg_Uj9-c0}aZA$X}WDtv>%MQ~{Sz!C88L$LirU_4pfZ5I{o0TYsE8K_Xr4BeN2 z@>|fD_!f9&fBW5L|8e5E19}B_5zK0ym=&}EXrTn^pBrl{*&zl;V#i~W$@wd6i*5vXqJH=Fl`>k(Ugt3wbEa=`B z-PkRTrj@~H%}ev?{O<=SiyAN)!mY(hLY*w z#7(d92pl44Ux64+&*hFqjX4&I1Hz4t$z&HH!uhGYqMnAm4%qfl{Qy%Se2pvUoh8_B zk1jc<#6rR6Xu{k>MM_#o+B~uOrhy1o+JLZLazw}T6VI;|MATmRejkH-sgfXAapPtP@#xDBRmSRT}h|KtWgs4UNqawbh1;<;AvxzzbW+qoE! z$TdEAI>Q6|-jj7iD6PT;8v+kuxQF1WS%!s=?78x?{jlYEJll9ox1dxSAEyAlJgv%F zfEHW%T)en3$cnm~tr$-fj$H4yOp(y-i@4u#je3y=>T==T(*lgQt-1err9PjS+))^-wMEkI! z7IAF8QJsRF4brscSWH@5DUc5V1(C>uAP_E+|8*C!H0Q>V@)T@7_2VJFlJ#2%TM9+q zsHM9N^nCZv2uK2>WhlYb!%Ai_6~`b7*79%4Jz0KCU;@_r)ml339?(O@aU-8H3!b`& zsFHg5W06-3!sLYvDw+fQI%PHzLpK!VE}M^wEW6}&NTE?F1|bC?jXtS!BuJs_RkyVi zG~V3BUQL>{%))Ak=VxXGbi|vF8*2Mp7~`)WZ7wHW}2Ggyr zU0Hg9Ur#}lD<^-8Gez#KtFHDki}<=fYg(n-wlN%Yfr3^^T@Lev|Nhd`^U+4{)Azi2 zZr_>94C!d8+STNR2$hBHJQHZY)Zdm74PYUdvOn@Vew*r^)L`P*;Yk=;u;{i>u<-VO3X8o$#{TY6V8AKwFF2ydCP; zNPQr69BgtBQqkIi#4Aw%IxqArTJjkML!r82N58@~n)>VMU!S5*DqtaHrZ|?SYlG9w z<_qA(=^ucrZW!r$wbp-$N;5vKl)f?(3Pp(Aqo^9mQ1R(d;1B>@S1CzBLoZ1B7PS%i zFKF#O$G-`(c+UnS@=PR;y4Sz_QkE5OrhJ_u-xzjF^N1M{T9_tvYKZ?PnFWd$qf(kMeOdTmdrnoQ5 z#I5P+9~-p?4`$>B@C(Ike;N;m9y)*SrZR{rUji)XGFD}2$}Yt(Pq4c_0)HOl@o9+g zMB~us2Jd7&(9AGlSAynw+f7}zZp)noJ%SU$MSYd_3qx!fv1&rr(Z+-FoJ=re1KAgw z2YFkponqd~k2iLm($eOy`G0gZW37QF8MrO&^erOL zw_WwaDmq`U`5sd1*N^AaS1HSJ4oMj|Rzddy#KONabcO1ws(aK(`I+S1QuUjO(H54M-m6%s(79bWLyU8iJ*Mf8+KzS zk6xHqZVU0>98TvB)#4Wxu4+)}d6Q*+$K)e(rA`kw4L7oabs^Eo3IISfckeIovix5|ipnE>zDVE$ zUjk2r9*c3d8j6Mb(}o)bfP^cIzqoPadc^d!ZSJ3C+RBq|>jQyA`tW*2nb zs`7=|>iqBNlGUskazh;um*+C}3Qvnid zjo#;1<3O0&w!=Iw8G0C*XTs*ez;pfjhwE|Ktnt>tfr2;rAZZN1hg|r2|B;LiIQgEtvH5@_kO`v*f$3RCl|*${yT zzQ>6nSwgvpVHKf-{YlVy4^^{VMQ7Elg7^<1ae@MI6w?<;XaL7P4v73bAJ)<>%E_;o zZjh$yF&>Au5pi@%=dgHz;A>?=PKPaPBVg|}iny8DGQUVkHbYiKLPvEuPs69iRgJIY zC3ncQ&i5j=ti3O``|Ek;ChlP9WfUsabi6|lvj80PD#Eq`VTjB7Vas|9x=E8z+b}=DIT)8}I;d2R?aWoIK>#3WEAbEq+)FbBv zTMh&8TvZjqTDw%UHh%WS?Ps;iWeV5G_0(atl0Oc2S>d1}tey7^GI~$6`PQW!)-gd zp1KO;tKi)vchcNM$ex{f3Ek)<=*l~x6Fz9cEd&$^iTf*6!s zTY&kjuNP)~X{gD%f-G!kBf1RAG$`|h2d3|f`s3Idnw&keLX4{I=-_Ba*p#?u8}fH` zeO$oYkD$tgrtY*EA52tL-1Q7c(QTsvybp)k<2)C`l7N*H$mibbXQUSEugriNx< zvZ`s|9-c6%d1Zn+}Ea{YU{&ZZnKyXC@DT*zVr0IKD7?sA#ml zrea5u3_=B_&(GZ51Z&M?_&~#ZX`IUJo}FTQ-xro&7V}6E`A`7f5UDV6h}2Kvs#3pJ zQ@;qja=39AP@rGt{iAfghHkDwtJRcoJze+5admQT*#+RXXXjF+w>cj}lXTIIeD$>X zfE!Rb-r=>g^0a#ZXmEU)U(6^4FZ#mqGntQ{ynnT0$Mh|2dSSnJb^Lx!4-%G{wP|sC z{>UjP1RQR^68o}mvZQat4LgY7>9pW7i5CXSPpgT=f4ui^&q8p=VZ{cT=V$*_`s!>j zk+ij4xewg9!6{Y5-n5?2yzBK@<`Yh%#Vu}AgqaxE5*E08DKANYsg~)4TQzWXr5OOQ zL_l|Of`OKQ7=vl*YPTTz1fE5}W=$k$OM5K@JteQ({t45zyHDL9l~XdJ`Jx|AAK_G3 zw(ULf;*Mj^_#Wr-9WN+!ehsxqM9r5jKPHj&_IUegs_?EQ1g^#{MezdiXCmvHiIWkB z{1O$eXJba`0T`jd;*8!!ybh)OF$MxG1@0qofk zYG{^qT4ugx#Q?Yni?NhZV1ltr*X3)rn611$n)H5N)r|0F*!!3pH+&op<-<9Mh{L&E z!~{jq4{f_7U%)UV^cYlP9+N(5KhAprSj)SK#NrNA7fthDldM>1BfqyR-z%+xsSI=}YVu}qnG##zLMiQtqX-I*(M$L`X5`LpV1>*N7JT7-Ai#@A z;G|ln=}agZKuc4(U$kz_v>nvNKJqS{TwKKiRKA`D8-dOC;ezknkxCn6*|Uge$PXPk zj$IC}{^vDV`c4I>FGyfSS*q3pl?`AOx{gXFskGdXN(JTM_sU=&*%5oNf54pz*=h8! z_(l%)qe?gxg+*jUva+ybGFGj|4FS7{90w5*1m@`=NoC6-NZH+MbB)AeMP)F4#X7fN zYu2R-C>`>-RpTRi&ztu2B*Rz|O&8zxcI!=GUU z%oy6ND*}%e`ygdY4K?Atj=%PLj+B*2xcg7#JlTBSAH)$cTaU-jt(Vc6K$b*eNAA;FqWg1<9-)U4`924dVJ3e(3sL=R${P=b&Q>8Nz*b=Bs` z$Nfw>6F;d$ltcm_R({yBGb5e`=cl~zgB#e!UqkZ0;uDdOK_JCvF& z8jCwdgkDFRHFr+veK;l7O2-LaeLs}se^fHL+@soX%Qh%NgP`-h22T#|HZX;$kfx+R(PO zvGjg@W9B8ZgkFGa83WDNtA{OuNvTd|yHZwro}BM)K4kbw4v{>)*=BoxKYDDxB>wfD zAyY4PHCGkny0DJ0_Q&Th4WD0$Mgzc^WL%yL5?_-QzF0T}>R46~BH9|ER2}}PWcWOd z^x1$ERaxjJO|LxH;9b;NnsiJE2ZJbtCqmZ-_JG>+nTP~g8T|sY#(052Awg-k-g7me zT}X|JC6+Y%1ApvGx?bV5YADF-k7NxcL18RD6v*(KR0TPbpVUfcg5PFCX4WINd*@8Y zUEGrrjFT!q+^4~<@I;Z%gLU%OZ(6Sw^@~ByO{izUPd`~(=m}n z_rLNJZFd#1c)syqUo{&@n4pmZ_lil{O7%QV3%qi89Ost1A50w=I2y_ntJ^XCDl9au zy~5(Z2IAK$)I~=~b4UuPv7{H$yQoj}*Kzj(=v}uB$MtBscDN5Bg&&GmK^L>xMbgd# z+3L#1Q=JGIjDsZ$Oj(k#>(_W(e}+Y^+8Tvi4vye?Tp$#Np;EtO|rzgLOpilvG~ zL}@k#j!UQ&cx^1sDMKMizbi;yCUxX%4t|onn>}fxOdYV4L(+T$B!~|q!iZ&v+H01o z!JKH_=F*y4))4juzU>cL=dG(=+_CT{fp)(!TnqJR5w+Rt-SYHQ)rEwu74K#&PvMbI_tQ*qM*!3T8|nolk#&@6rW|~Wd&upM&=%eZQ(g;M$k|- z!i+=))71Uk*4?`9cjpV83>PdlW36JSlC?EQY$Qu}q~LDJ0v0zkqyE)&EU<5?vU6KFiy{XJG-u1b%V0xZrWN;S0PhG%|(- z&Lne+5PnnDSp&ZwVf7V*Y!mB*9me)D1vfKX29UWL%Ao7|@5?T62Tpl3Lg8)bUUdQ{ zC#c)~qPJsrU3A?ZWXZwNpC=uDFCO&VAS$}sH2Ln`mor+SP%$TwYFAFBz{Twku1EuIHI<{LtxHK90cTzY zA6>a;Z;awLU`<$drU)Dx3Pbzo+MYm#Z6~Fmat~kyG&qz5`7s8UmiM6x_H~Hz%q@Vs zRwzj{NoBHHFKL?RLq5GBa3s{}x?H1i^-W+4Nqm9o3UwGJPw&)n2hu30yTG@%GwWae zSGxcfK!Q&H^QE)-v>JCoLzSoZy(;D?-C|ZJLrDf8?3KNJz{PMNNyR`}ZAEHHM4pD4 z?_e~c3uQ$jg_HTk)&6iV^=4@?l(*^xkgmDs*Y_~wqX(((woGF-J=?xZ6ir1fl=wnW z9bGQFN~6IeavoMlNIz4{8p^KsojPZ8#8cN+V-FnNVO5jmWH)Li)umXJi~&(q=)M`u zT~>nyv)S6~idRGZv!MctC}U*TVd{hX165A*4xv|eEKQ;(y)TW8Sy36*7{8mit?(j+ z**8pamIFC5OCBLp4fX}^6A7DM(f7lm^B{yH)z&p~V<$L#reZAg1FML=W1OV}ja79W z=0TWz21^_=K0Q;$krD1)RI0UX18-}ojGHf7aKX|t`ypOCYfL84)dvj*Cdi8QzDnpR zOh(3Y3RhpMbyh-(7A*_VW+#N*|0#vj3Ihqs+aj5AGrnPr#Rtyq(VE?r zzvPnhGV9!q@fDW~A_uMfSPE+2BBlJuzx#}SO<7A9QS35-v5`}R476l6t7~E5D};ZS z*G^zK=7UOWmPk0VYah5_2_s?soX2T{7oSxj?c7`!sBGSs?Ow3!+hmonQwXfO8P5n? z_a;a*$EPtaZ(RSK&p)?(&UO7?=kuXsrWHX@Nv?MivO;TV_@U$;MW8H|TxlI5Nw zy1?wa-dY%Vbn#sHp6$JVCenBQ*jYQb--+e}fVr6_h2r+&CKz;DW=Mkc`GIGJWbF&l zZwM1Uy{~{FW^WmDkd1=J#EGq|1OV#yl!cf|gx}WUfeQTOUO)xmg31-1@c5vLe_|l` zyIjP))w`ulAFh^Ve}{YfDQ{PiUz9+a#44JwAkt<|NNGutNtNPiNDv(vOw=JBcb2K~ za5SuGkHiu~Uv_jvo-r1O_t_!ikXq+vA($31y98p|mcOEuVXPa^txMGa8TcH>GOb2l zOMZh@`^7ZkkuSZrOt;(TFh~@3`gyUI)6r;R<`V%Ps^G=mdKI(J7sLE`mJ3{jC}^wV zO%&Shkzc1uo+mDB zA}oPg4!e=x@I%NK+%0B>DeEqoACQz*+1VeEhvL=rzeUEmC(S4uJ)UOT#dZZcjGzTm zhOn?HId~*9v4p_2c(5?E;%&w3j1wV6&J+-veG#!|&HqIy0ygV%J!|P57cq($@ToKML#lU%)orSBMMa>7mgSAIx;cMI{};ZoLzi6(1~Y_-yL*#^BB1;VWHFI>Pc<(Jz*tba6P5-ifspF7FOshIU%H{^NB=? z(mM#e+nDr^Cc1sWyzH!CaF55`@EeIMgZ+dik8?a{#0yMl^q=Tt5$fvTC|Y2 zLmURc{!yXKPBIi9b)jikllOWr7Ol;>uXNtCnWt#SPJ%oN{Oqu36)`4{CcXvg1T9cG zH*nX>CQ8fjEW-WkzqJ5TM}(`seS1(uioh3rU>=fm&mec3`6DGpRCvT0it)X9QBLvO zk)}+oQ0!0J?_a_wC6|AjU5ruqdPVX*i70=o>=iRo>XstWhe9<8n>_lg^M2NFhe=jG zoG~&&MB3dawXJ2){FW@9AiftdfRM}K$YUqVx@Zqf1-F@2B3vZ13&SL0QZr9`82t8- zTKggaIsE>}h>@p>sPP$GgJEO?t?0|$8 zCXXbQ`c|{%=bfJgz29L*l?O;}32ml=^U@$uPHKJPY#Fjr#tB~QUv%0bdDc}8S5G2= z*<%kQ3}(ALUVz-)f;alPusP!gfn(iGl(J+mjq)Pttuv8;i7k9 z`4&GApYK9s|4^mbXyGj_{Wuo$(s2tXT{!|H{m4s_)>I+1k_inKX!e>#X4{nLF&@F= z9V%R_AOT>OR#H_gMi}pr*2wzM?>aT>hpJ0`_E5BAaau&-dG+Bd?^uhysYb#YN?npl z=O|f8RDX)yndflrRg^)oDt*Ib)mG>%0?~BE*ayQeIS#4Vz&!4cb*{iwQVHN?Bui)! zWE+eWQZ2(Gym69WNI)YTn#D*JkwI3nO`>4r?rDejpCGA$@znf7eE`Vjws?aUTv@## z&N6BGr{H;Ke^tf&G~^yM=Ujn@Xd;SM64fVKu!09OU1=s;J!MYx9R+jkaj$^`e3U>s zn~NCCN;ist=)G)jCs$hDwrd!yp2P}+Injq<`Xpz;8&;Db(nqJkbTdv^f{4~JHw9~n z$^&Neg5vA<@Xn}U#6Gm)mah)iF~|eOgd`AO(@i?U*wOh}R^P|3iA$OjmM5E3_RW zL8cmLgt?UTI?ILqoZ*yh#=MpzjkZKdj=WT{&YPbWXrI;}oj4gWTgQqg5w6cNA`L$T z0f~I<>nN3?hhl>{RSi@rYkcrRg~|b?IVJ2v!`d%fQ0gCyuTd=%Nzylq)Z%dctRDKi z|Eoz9&LAZpT7RlkV9kKw+WHXbu>1+gAY6yUyP1}^DJ9ueH3~`&AN*+_$0Od|IiW7_ zDNMjBx%Y93IvPy;S}Gy2RO(fDV+}rWxglCsE+7L81Y5cT&aj{tqptms!@}u zOS*bRuiw!+j5Yf!54nZhh^nirCpv`BPU>Gdfy(||Kxo?7?E4|ia|fC#Z|G}bIOc%yp^$t}(VkdQkXT;gm(j43DxA?FKS57%YLI5G(kHZO7#9J&=%;E&>m4&%QWKXf&D#XD?&=%9{TgM(CqBT6_cM7 zXg_I|cTV)zc8xq?Hyqa3$@I5tc`R_ml~@x=#l%Q?;M`LQZ$hfX`j#bMQNOB)gO|aI%ozxd zO|7$53{2lu%=myM#tHikmRApKEFH@uzs&nOXW70%mri-aW?#BJFom0gF@e^?f(gAO z*2W0*2ov0EO_Vj^J$AngJXEyP(~+T*v+)aGAU3ah_uuyq)gMrDes|3UFUfPE@qR~o z&V@1wV+O?xTt)-+owBjcHkhdNo*?s~MC*_x-8`qyDme)oI1R^m?|om^eM9 z6jJY_zOEo-Ua!a987mhaF&d8?mfPPP^)W^E+f}0d+4x1Vny`tOgi%d>><3qyYEDx) zB*OY>NGp&1uWH;|+xX}9*LA%I73J*Gh}>~``>RH`U)f3LRvr)^jvXVeTom(!auYwO z+rK*_tT&$X3=8a;Ejya;NYAr7`FF zCv{zXbLq`Z+3~dUbUq9z`{?*|s^NZ$!&LsLA?)>WRq5bft+JNBSg2 z@IlXOe2&^A*`%BKO+O+HUr!vWssMYLLemSo$#nVN`FE4P?sV}v<1&TM`zj)`25Eg| z>rMHPeovGA``&}=I~%`HX7GPidIaiD7;MGnf-c6};kxCzf^oRY))@Gm^CQf$u|&h! z#`2D-l#Ni?D}s8fJIOr!=dvp<5rY7abuO(^!-1JaUaj24b8GD_+@G^3srT`0)wurm zo!mE>TSWoIfZ~JeSaFnxJ{u8L?pMTj>`-9q->s%K0RQ{0VaK|Cs`t;0b z^&)epu;tc%Y7b>etxNvi3qM)eGx%Ghly}nkXJ@;--=HNcMiy~&Bi^R_&c~0kVl|Qz`W2vAimmbXYGwJz*?{DojPY+jg=Q9W;=kU zMkZQ@W}DY$0MnABU27aOiFfKtj^=+|SrsQhpJ|I=P?xSMDtTW2n}1C({DHV-NpoOF z>a{3L(7K+>`$=8QAQ+iIl&;Yi4sUs3A?7RN_s*4a$4=MXlWLY%nJt`5E1I@}q*(Z= zGUK48C4Gr8UL^!^qReI6 zVDtx2P28BP*EZSW$J+YN=c06Qk8-i6z4g;&$!*~_PTFC^Ik=OB@ux4r`4ipuj6z!~ zP!m5_-fg9`!L}9uU+BE?epx!WhdekX$HY$4Z<#92ys;n8hlS}AY%*nj?Te~kSEK_Y zdlr&4_-mhR#lBHPC9vS5F-qSYahBu#sUi7Y!x1XOn84BZg_9o6&s|+CbLx}$w?c!` zBa!I5gC2s{E(l~Zn7KS0js`l1jC-G2)xmS_!XjN|btcM{W>dbQQ%f8rx?h^pe^?ei z=kQ@t6U@AL@r^$n4fQD8<9Th^NT=qqWaWjV&MYo2mR}!PNkj1Rh5X>!n@b#j%|Sll z0+l>y+CxZoMdqAtPom_Ry_VT(murk>gaysHNh+^m41i}&0n2hhCGC1?{6!Sbxpw{~ zFlcACX@Le;`hX)RGCzSNmQoI}d^JUM>9$t-^ei}(DuS_3T1g$rLrXn^8rnymLH}FM zAm8~@-Y3p^9c9spXRt9YiU1G7X6%LTcxNFQUdH5Tq;N5{LbW0 zM%-A|l_sXXPVQm`(h()_(cXxy-0ACDuCow^*49K9v2kU^n5cg(m5>%0;m;IrB&QjU zHDe{eh=)QIv9L{)Q!>vhiXM5A+-~O@mYELiwr?c}DA8%i`;E@PoOnB+_)_|JqEy8#>h&DA{RT5DA94jQHZ3f|NeSeZzj5W9=sv@M%%z&pNBS1PuESQa zohIkj9Cq&MszyWtIt zuFcRQrDVHeRab3IJC<5%(W`*QyH1GcCv&lH=TJx_RAiCK5UD$DFl^d_yFoLI3BJUzPSBlLyncZKZ zA-RfMKO9m>Qz)Hh8^f!P*%3x_DyX3p3M8kKkApl=T=&uk`M}APHYpw?yU2qik4#B^ zRvmXJS#wT>5h*AvORm6-zPTiJ;mrZ@qby{@eh7)y-WC9j*+zCPwVKTAYoVdg0gY_m zbu+)Y4k|97S?1Q0VFADX|+;?G8pW+F9kQ$9gunKIB9#;qA5Z?fc;f zkY9-qjH(L0CSARpdQCQEe-%V;kQU)F;q8g^I662N4^S&rIlZOW+$9r9BDn=u)ZtH* z^~pBT)6<-`CraXcf*=&Q8l;cVPx9o~#TF@zPE1SLv1T`4lYE>T!VX@5bo0^%4+_=em*obZh@9x zw!X_Si+s|m z=$LNg()Dd3@J8!`(EdCX1B2PSB-G_CIBv{wS2Jb!Q-S+()k=Q#o8}K5@P?*=$7aGD znZrniUc^-6>9?^B#(_4 z*iu3(tKS2KF=cI#ZHwEIb@&|xf2N1nw`HV}hD~dQ;}|x2P@oU>UY&n+1q-CzZuPZA z17FcrmqhcNnqqpzi0fMPsT0>|bVpsy)-c1dbq{hF{#j_@D8OKdjjU6=a;e;7IX2&& zb2EW@UUHZRWn%!LWMg~?{pzx9L2J6?BK_8@<~IUmg98fQM#V$I1>U#L(SV(6Wy`h% zwQ4cOX((o33-&BwUVqhQYN_85=QL76Jd>$Yd=>O)>m{aJR0qNTRfD)F+69P6KpkmC z$IB1C9Iwu)yX{K8VRrvmv4$|nidWY<!DL@$(muw+U6jJ z3A8IxAUjR}jrl?r!buM^a7zSO54S|PkDJ?&Mu1x-{LZkq_g?2Z$^}+t-Vg!t!=ya+ z^ez(j<)g8#@SRDM7aCA-Nohor+UbTY%yB3i7SLR1H^F!Iteas{I4xjth#jCSU2_0~ zaoQRO)-TVB%E?gwu`Xr%>@&wEtRpVGI<+0wfgzewpe69Ypf1f))+e)Hjs$s**C3H3 zF0JtmNE#E6PyE1=^mJdk+x{*$ziRho>S3Yo8hXt+^$X?NBltIL`d2qLE{c%cMMA0s zE6(}3S=W(dA+*OP%KN5L291^_k25d>|0iQL0rp=1{53Ej>J5-WxA*n+_4MT2pBxa= zw#$`Evazud=_)7?gs2%ClOi0|z{&V=tn_!o_OE-;5h1j z3n5ju$U?5}h{66c3dbkGY0)VlkNZ~;y5ay6a<|gMlj<7Y`CA*ff`x zmc|B1>&`om{&Vetr;euS=)(cTOF*}ZhHIT88{X@jdA(C^INQd`%4%Zd^*Y`^XR-x^ z!nqBY4gYTg0xw>#R^wg_{E$I1L$$NGlmCR7CG7vl z#tRJlbQ^b|CSf49E> zCm4`$0k(Aroz!E{|M09g*g%_>``YKR4YPkY;AaG&5dH_%H28mL-)9WaRhx7D`_#6{ ze>Xk^4p4~gpqdAp^G}Zbzk&s}Mf6||t4lp+)Xv%eE`;L%3fXolcrZBrV?|9GtNj<% zkJ$cQ_|*Z*q|vrl)sxQQe{%c(dG1UP(ukS%M@8*~?Y|2dc7Ve5fXW-4o&VEzz~68F zgb9-^@2dKl>;En^=>1y=qJG%c`>%G75%>@y$hLi}>}G2HcVTaU@DA%lOIR300t+i^ zTWd=T0*8lF;D6{pAk!l5^|G?GOr+a{<%dmC@_1goZbK^A7j`rs{;FJERaJ%5+}76C z)P&l$x3?!`08E|#;cdVSY(_RP*Up8bCPdSl_H9h-dRKC3Uje)iA)(O zP}0}eS5-YET(`lkAD{kr*aCl7G7{Lyi=msF8xt{7{EXwE)g@P0YhN|pEW${@-+oCG zh4cTL@&8W{Rgi&EQ7|o61K4z zZ>Rs=VShJ$ClQ|@v67>BhqR29NQr4DlVxU;h^L(UZq71%Vvm8jsU(X>fgM9RD`g%) zfHa%*R|}GUO#J6I1qF>^99A(kE#}4^6V}z;%rwtCE#(*;Ak$&tpYKX=y9}3`Y&kHI zw(BqBqwyYINCRvbWP7hmKAeaTh{XZGa$wzNEre8SM@BV&17oS8w~+-El&|4IjyojHC9@Zn5?m(U&CrsR^+tW5Nv#bMYSmH z5X~G-u5UFAGe2e^Nbo1tLn|v7NFUC6&ii{vnNw%Mh`p5>?-W^Y#V8FM+;n1b(3MTn1fVN(z9#u8$j2#5wy;1o@OzE zJ#}y~y{N17bQkCGIeTtmYfVALP)||ctt)FTsxK%g>Z~F`CrvG_wi%+V;%1s+`Ddo- zg&-0TJiTY!pirV3myM|8KqR*%NUAM8S#_Nkx1L|X)y2naVd-x0dAeaq7H3~JZ~$^{ zJ$$GWme!=>oox^J@;Ll6>p@RngE@Su`ikx(`>3q%wK9+lnc)MpvFy;N)@Q5_9zh7E z9gfg@35lAzyc!bHj*D$nMxrMgFlk0WqiNk#8D3=hlBGBKdPfGj zy1tZcVK1QP7*TAx+JH92Wp86sQ-QUxu%V@;HoG#XqoiVVDf%}gM5v~CtTW15{fhmc z$)x^`#0F+pvoh5u)+ zWX`j5xWEhB^Fp*NHHs{%%ud@M3;0pi40o9>^f$c3S6%`H6Oz{Ox~58#$1Mn}2)>qb z@jGyl+h^^22lU@tkt}Gb0EJpBss-sX^a{#YFl8OQ7_Q=KKBLt80`0zaGq{fK?%Dp` z_BF3xeHM+R7(}-;e5h!xE`87&_&SAG>Sh1L_>2j9e%GQ{7nN8G5-qTe1A|+)SYNTz zE@<{!C9}&oQo{ONT%M=?JJAKD$pWdzT9P@@HZ$lOPGH(zS`q`A?V>O3s@}aK!-djs z=W33p=o3;fBUx}|+3NDpAp44{qDR2}d9S~sx)NJOSJF4r|0_GkFKtYD2+ukS2)>mmHFF36?mSZ`qIe(`Ke}l zf|=H}h3)_e{9Qr!{{EI{hH(lw-E7}MlL76QBI38GE9$>7;(@RQd~j_ECvuIodRIj-b$0Wv3M+CG@pmA^ME6tS9%ikgbs$^ZsRmQixj zaF`igzgr?KY1G3y6?M(;t9;H;pl2ZvKxf6AVTZA8Q@H{^mp--?or?g=-+4$e`)B2J z>q$jjUxIlLxEc=&3p>j_r|7q$qsLPAC+rbVkZn=*_OH{17JT-*3)P^BgKaxag4~yw z_<{5-P~Ia6geB{iKa%oE_P49A>>28Vo+VY$-KPGChDg@nXo#B50sv=~WGZ7kTL%c< zoKMnUqvz0utKaS{!+V2bEywKET{cFdGLxRh{uzGRp9718*4Mh-AdHB=rePdd8xYML zXDtS5!k^Q+RuOL&3&mS@)!&ZW2@>32euW#At9vG0x7h@>!HDd|e`HH>{}n2_!b4bJ zse7X1o+uNyqzpx3n^Kj_Hn~uXs$#(Qihm>~#;@IxbxGOFwD~^^kPQ{^_O+Bl*%>{v zn9bF*uN`@wd_}#D$o+0(W>2(*owmW2SH%jrc5AD7Y%zS{e0WBN$~AjC-kCo+ahBeX z#+kY@@6RMkl5>z-toKWLvPC39IY7wre5TBq`;n__6&WJ|S^ z+hzsJuo`vRx7v48M#jner7N9lZ2G_RLys=Pgf3g(GO=Z5zDWmbXuW)!wtFRCMr;i` zIEbbG3`S!&fagzL+nID5PCF}&0~cd6;!0uR#8s!8|9mBC@zpa1cC>?*3m ztNFf|4Ary!Cg~roB|x){c~Q699R_X#W;|o znlDb!D(TxDwZYFg-Wxl-Jo za%-l?O5WM*>}qN0tZe4~0Ic8kX1A${C9L`&T3fq+>PB>bI9?IM(NLRwDmTxRN?9L1 zkd1%c%Fz1bBzr*Syk%xh8g;wn5)U(9+ZmQaLRP8Pp({hRUtP~9A^Nx+coYjldy!AN4q@9vJyDW2O2K#Z?3sui%ZKBP{Y%;9uinx9Td zO-=Uxxu1%fo}P*hcsp;6`OO5rtm2mdAjtSlvZjgB!l^!rY!lo}E#8Xk@hx&{FB-Nf|HD5pzqRf~mOF8R3J+iRq>+xJIHRB7^< zhS;LgXx}X_=CHX}QNj`H)5^l~9q-oP?jT6rvq!?V*FN1NW7LjftBU?ISMBF&V>q83 z$4s+!+DbXSnB4MamA;EaF6p|Awbv`Tz7azqdTF_wDM{!c`@YN{%%0jxFab_g$zQc6 z()j6VEp>d)Gs9I2{;>n&r@SsTG;C+pO#;%k!pcDygW=t*kuf0$PfrNu)LqZQ<|Y(y-ZQ z%=u3ffXahw|5XwxHKvH{q-Z?P&7-{kjk8!*EJZr4zE>{@q)dKy{uRK~I@kmRyS%qw z^xjaka{$087v1X{Y0Jj9BxD&BP;6|huhOM{Ptx2Mb+irNQ&Z3v7h9u_jN&aF83U*# zHLM?J;f)-J@)WF}DRm+&VyMkDgq`OBDWS;Eh&+N+9%tsKr`~7d z{hCZhE9V-1Y!vqo2SVaF%t?}`siPGD$&QKkr04B%y&N_5_#GNBEc1EsSG$rTT9X{Xd$$kSm zb6==U_umAsJ4T=mMM|nH=xmIteX0(bcOcDz8I9=t@+daW@~q(D5cHn;{}J_#!F9f0 zv~kkdb{gAhY&5oQ+qP|^jqRqfZL_hH#>Rd7``R ztld11>%RpZ+KT!9sDWw^Do@zpk8@df8mI4m-TZ6UIH~4*H1*kwcEBi~ z%Y6d<=W|QF>n1fU>_td*k=JG-1Bvjpt6ce9rfq#9b6UrFl0C=iFaPOr=fm1w*(1K| zYi=u}hbi@IMWLOkrswn0y8R~*!r0x>v=2m%asTbOy|aG+ynBI_^y~Lw{7}&Iw!N7+ z>e1pbXA(%BSc1Wyy{zkD(*NG|?dg2}+oSKps`YHq;ODKtC+llyTavS<@1=7-PzI!^ z^8H>uCCRf?Vq+(jOXc_uQqa;F?cbgmr}h&o33;EoKhC<{@SAgGWm8=i5Z9^N_wns8 zQV)iGuU3F0caznI)X&%M&(|JsBw&KK3pfG1P4UD(13uP3%wFI>8zem-trhS`c~7R4 zUvXXj0=(mi#pSo;+p7zE@3W8B3unOXeZ!$Yww6v)Nly=G*IY))({)@%#kf6{OJzP@ z)a89WcgFMI@65BJXi4I6`B%fEFo~QVYjjg?|HKFqiT4bEY|JuMJDTrfT=P!!dF{9b zS1SY{I8j58_t;{g)yk7p)m$uNv0m3>szW|3Ju38-k6+3_DN0nj_(sD1)yu9lISDK0 z+R?)BchxtNVC!rA2477-xfZ(MmZF}*v9zeBQWhsko^1~r=3@%+!uF5cnO{uKT-Skd zNOUZy*Mo=O3-sL9v@Y%MH9xpnVuhO=A@??Zy#QSNdXsAX-_J-{i!@w-P3|>7S=N|H z)(Qj@{~6Xn$VY33w|FrcZj{EfGtk#^}(pTUnG2Z5zPo17Z)>En%j1gxm zdTN@335Kc~`efd%l7s5va(2pyqdPF;%ox(_OV$|R{I#$D`LaA9m8_983R__f<6R%| zFy-EbmS|o3dgS}KIozYIsQo$*1QflN0*9{(TRO^e>Sy~&ineX@;`$#y7%O1w8_8@k zD|Bj{v3r8@OW;nwHTwRB^R%hHPym2&c)6H}{GJ>sYM!m4hNw1yxPq1yqdMvz(t5gx z=IA;nfg)49&b&GfbBiS}jah6tAmUed5BmolwXlvIg zChOPs@V}~1GLJLfzKVrIdtB+Bho%Uzt|{hD9#FctQ@;cB8t(M;2d9chVLIaeaaU($ zEY6C*kwC*hgJTUbk1(_DhtJTK?CQ5RR&CYc5X zYO1w4?DUyRr^jN~L-JgFyb{^i+R@N6lvC0A{_&0*+Szm$=)slY12>uNet!TIgb)2d zpav;V%t@0c?cwe8^gsJBJ_D(dF^p#CqX|47FCIT>kf7f`n+ANQ=H^Na?P#=#89x-yxV_l z;GHW(mNv~;kP=J#Yb;QXHH*^6_rrLhcg1L&197b%LDE4keofB?p zU-7S&6l#wDGCcua0Qw*8Ok_oUyJ8Ge)iq_P%25qis#q8^F=2$TkbEB-o1B&oOF*{G zYvmQ-x%@?@o*FBTZ9J--8bgE`Uh~CYMbmP%#eU_bzGxVmlvHw@tHCLzz0zvN08`pR zLR*thJUh5>&|xl~S(j;up8x&z&tqd1ord*6s^Oo+LJ?@@oEE~iRH3uoxnuXJ79$7k z(9lCeXi1l(d<474HPM4p&#yZsSEuFP+@ZIt;QrvQZZT~@TWkIsC+0~}!zt}hlzhHZ7VAYzy! zAVgDA(;4fz#i!fq6-iNd!X(&}E%~pBeqjN7WPlJTlC} z+^lEPt=paBZd$@_G+vv!^J#$R8Ir-NxxCkUeXr1{?DR%BTCVtY;nx^9DDCMMF>g4i zrQLBq_xD!?{h&Mv!ML5B)yxEk3jLSl)8TkLZL@*diQ8YgX4sDK&T9Rg)`TO-tor|G zX?s$Dc>gz!TeL?upl3=LlkQiMl4;}&`L$lC_v>h85e8H8+YjlGg>IO%)Y#X(uDDSz zL#GA!8X-{worR$3${+h#1K)>3N!6z&vg*cKg2>hvPdT69PM(aRTor@|dOdK3wpb zwvr?aazzx2gIM|<(|ES|EYE;1$1xC|V3D4PoJ1jm(DNSRB!j1pre|}AQ z`L@irA_zeZse=FfJ10G0JtQ?zx4Z*mIE?n#BcR#=~NE1ph6+t)=c-s>Q}4wIs|9b1j_C?brO50lkh?NU;!{CdJW(dKL(Z5&$@f+#Ds zV8OJ8+3ZL#)&G-MHpYJs@3C)M;Nv>JKz)zAty|?fi&Z%tr|DdJexPKHA;urWaDJWo@WMh!Fg%(a34GA0fy>S zf0cciYFg4Xq6Fb=$ZPrPlCZT!aIBKb*AkU#+?Qi*kxA`~;w8m8s1@>ySx#XiB9%6{Vcg5gA**+gv_(YQAjV zn~l@LmmZN_Q7aVDC4}!JdGY)&7W9w6!u33GAL%MLhROwWD%m{7gI;fvpf}LlLH3PQ zhpm4>JL)r~Bni?xl{=Z-@H(rGB!5i7^#09a(-I(atoSSF1P-5&9Z$6%GaNK?&dJ+3 zD&D}CEt~l{G2UmtLEvL_?VG~zrI-Qrf3-s~;OJR?I)g^Dq<0plo9d)7)&`t?&AU+=)Xrt%B=aV)z@Dr z@#XJnymi52wOpPL{D0rgNlT9h2Zk>$PW9V35guMC%fF+NDU!e!=K8(h#PdHe$Hg5Id(95q;zgdp;4xzI$TeA&(uj4{!{JO_yAesd% z46sLPgC_LxdEBHV@O#>k7kF<Opu z#iG+`@*B`lpxWEmWWANr)>A~Gpfyq`;16FkU0e*l#|WV<)p>UVHmK8L1NjP@I`G_m*jK4LLltcJyt^nU+Wjg(+&|_o1*ovTR8|Ki1JGSMH6`_8IYJw8JkF zxy)pL{vl#eBz@;i%a$8@DIBr?H!z-z>-qDM2t0C@tXqBk_qh&FIR4K;Mx4@yXqe%4 z&m?{y4!lm2&_&SK3x9ymz=3|9gv2WL_4;#@)|%t78{U1@CZFs7@%OxZ++Iyh$>%|{ zJCDbE>U!AUU~OSk**%-r`LGedtX;300KN~er-aVQK#*)+yd?XJFMqE6%a`|Id) ziZ5L0`;npFcE*n=tt{I_VP#M&z{uxD&~|92r4AY+l^nx#&RWVv_$?DOQVsBxIaXX>!-^Vh zy=Wn`Y+TV`v+KMcA$og!v{CozM`-={cir4WaBu`)`qwHTK{GiSu)df>P$la zjaPSEPOtRbc>lx9RlRRW%HU0(AKt^aO!htIrk&sn-yc2`@ z&v)h`jxlkI;kF6cHpe(QPKM~y85?HlnG^qM<57SE>?%qoU=Fc{JY$y`#p*I*5L|$O z03U-IE_%i-lfiXD@Ye$f-}zHekHx-9h`S(_-1T_q`v*umH}rxp_vGJC5P8^e#&tg5 z70{V8F&;=WsAgs=+A--f$T-$8bYQR2ZX6#`AS>6lVV02)>bJB<48+oPnWYqXjs!Bo zZj;+n@~(zBYjegT#+TYEsklifak@xwoaArWyq-atUyTc|B@{Bt(~IE~MK zB+?ZJ?&mvjBwTi@c1FMJ=%YOEnoJIEDyaBawB-erE14*2`kDY`#jTbw1ZguTZk1kb z%>YRnls?oJg#spoMM7}IZ4T?X5_-UWEWGB|X)PM1oX>Lmmg_|`C-X|3m3RVSqzZ}H ze|If^Oo07TPwX{y8d7#Z-t{Oa`?YzdsP3S*{CG3l9JH)9BGJnZl7EK4DS!=FEEO_E zOA@uTvOeDb2zVqHkQA>e`j;d+-UqfXK4)*A;9REO#u4fi<(iL-}+SlhIcf5g$&L? zZ*av314w!b6<#XQxe1A3mhTSl1lKj0DBO|ZkQ6Z_`i%$x`RdwGfbRdWCNRf8UsMpz zJo@?f?-@KMg2CfM;FjIVzZCQJ9lu}JXUstV)<4EdKp<>gjfIXUAU zmNAZOt1)%)g1=-6YKF`eC##Md73GU27FoUFI;yIjMJ-FDtyeq4!L&f;%uH66(~;WV#GA$@yu=E8Vs% zd99BlhlvnG`%2VO;jlX2PAjFw0lICRK77?0HuQ9CtXkZrc^S`LouQ+-xVq{m>cz7E z1ha&(>zmvjW>*8Y`a&%Xp`On*`6WL&tj%z2=+RVet1(c&CvWVT7Fmau8R~e)X=(7X zC(EGKbu}#^6Ht_7Lcz$KYyQHi9x{c+1$gfn1MR{3zg@3(t($H+>Pvt@?$e%H^9j)I zhUJAodFP5HEmexLI#MypegKB~$=MGZ$%#Yom9_RAFQ;w4aV-FQPPNwl<7O0{>aKkX zQkLnDYj?e7xHH@{u<5L~urQ(EitejWMwwM#PB@x8ueUF}0g$aRi?ul~&B5mQY(vby zc`hSpovG`sgm|$B6L~)1g1Z`+Jm_|SY!h1gkV*HX@u;=bIW@I#aPT{lJ3<@99;ZB> zS5G+I3g~4zjkU|1m^gco_kbk6RK&9m+GZc}Y1%E*#j~Lv zdF(KVc6~=0!ypu2FdDo!vXahRRu)Jg*1#sT-V_ezT#O zNopP1*fQypWmlJfGfCW~lH3RtbCbnIEN3b>AN|f|?ORzLRy4EnRNEu9@e9%xMv(EE z8o$z|s%a(>Iqc%dFpOg)B0Hwsg?Tf40p6AeiPdV`qH%}Adwn|{pyr7FN$PydSXgL% zp+V{M(_~n2DDzV`yg$Jox4df)C!c;oEo#da$cY>~52z{kmuH&mdZdzi6bsC5REXIu z+~F7;63=Pi!YpxfJ8+PjG}dd}$?Ti%2q{NOak=%!o5QQ9@#tnnS|k;=j*Owduf5a- zlMgjjmCHAB*cll~VUmt4=)#b`-~yR~0?Nn)nMDc54%pl++JA^KWQ99PO^&)d>bfE! zGtA&ZH}JBu^Rijj4eeSqt~ZP*LC-mwRn%3oE-eu7)W1IL*C2rgE)*MVo^WPJm!q#p z+KlU}Ps9-0wayTfBdpu6MS<*1#u`?BW?<&sb91aLh11e}(N3j8k<<9KOLmOfzySkD zzyURzHq5}L3l6+gG5TwsroE7I@oLhYp0q1KUY)wHd3Ly}N~bf_RBE4`VTMEfNH066 z!%&t^tS6}msBpxp$$%%U5M&D^EQZXF?#Owd_0{EVc6l^C2Pb_R*Y~C(Kp|7vdC_5QWv<4iCQggoN1+>Qv z@5lD7`#9iU^s!JO${Kol*mTcw?5V5)nge3xU7(NQaHXSnBs6n1Rkf8KVbd}lQ*s-^ zF_#P-<&KX10m@-iSr{u@eP~3Lg{(!8&m=j!fdQJV*Ot9(2c#W**HTi0w93#hM&M** zX3R>pf$!LDm@6KS6@xO?m|WoGxI%cKe;(Zc#3{W0MqXE>37{HSU|Rf>jpSzK*Yk&~ zZ_F!rVuk`p_Vc>R74+!J5fnPnq-8%bG!(vC$9%uJZ`cdRQDGiy!Ej5Yz?Kx9N25-DQVw=Y zOO>Lb-J}3;QX`rY^)hOdf(^8csLZQbdl+wjiQ$5;UQ9NUn_Lv7TX+vw=Y2W!Y!_P> z4UKR?#}L+yH0Pqb)%j=w>x$a1m(P`D_N(+2GY*=xn z3hZ;{uC|L9d|pXQkpw!UXvkxHW=Ys0xll_;=Ml=tb1A@Jsoy>u-7!JbFttIt2=JO* z=r+kaiHQ-wps1)KisbX7rbWe61nYfQka!f3@dgBi5*olE;Z;P_-HUFSqu5J2DW4p40x5l z)ub8EO5xuPjRB7&&jZp`kym#KnDP z<$Hhn<}9yO9G@f2Y*P*1e+J-R;*V13Di{<<5By5BSO{dI=dLz@C=*QCJPa0d_*E=l z_uWMwaR-AiI@UAPHe3uR`0!BT0Zx{lxxIV^c zUz}O5wv`POY8YpJBO1GM#UH3Qm;-1uVKYTM!$Y!du)~fuW0&Xn5qK#Wzr(9`oiyqi z5XA~sU?@ogAm5Gb5ZVI5#)8*)`v!0;dNG%@|4z*hmJ5xTeRyVMkU)`s{~kgG>w)ZW zOjY-N<$D>82~HvE9DyY?C^)LckV(rmZ#g_scgR23qb1v%3|Rhkrn+qG?{%&L5Vh@UzdP;mjuE4 zBJ}433~5H{H^}HRDsDA+u!7$rBL{e}&=pzK_oPt-wb9eB=oFhqbSax%*z9%KBeRlSKMPViC#?GB%!V7 zMO8I{B8Xd_XU!86G83*>*u9CtD;7BrJ>sq$pb$R%@swgm=(8yG?5LpFwmqYA)qm2Z zLpzG(2=7>{oo7jv%8bZTQq<7PC?*Yh3<~xQ1;rBX8L@ehTLCHv;j8h_TW z)@c4fElm?juR9L52!PEil>2%kGvYmFRRJ?e0vROEA#09qi$b5QMm3wmQ7VcgE~_Bn zR^a!3uRcdot)svSi)!N3#f_AlRTwKM_8y_MG5W&*88kBba73O%62}M+46*5UQC*)L zPc}IaT9BNdsnBIKMjYm1(iQk`}+BoB>Qy&U$0ny}mC z_E$ATP+t;0E5hkd32t!ce&ni9m!54KY(0{^*`l!6Al&+mz}U58xNn8O4I&E|dqj+S zJu_Tlvj|RkCzj1dJu~uB*iO8=nq)!`S+JR~C86N4>*;aCdwUd|n2E!vNZ}k&!bP7o zVc<{^pa-i4DZD4}>0|pw4J9bmnkK|GchFN(;iRe07^2yxoQjefBk!ZDHavD$4Vg6B z#K2S#hU}^4JcMzE_)uZ{`FcQmQhs_2fJ3Omjx~fRBf)Xj%|ZxcMgEes+5CNRzigh! z;6O7Z<`&G%prlsd@MVA5y``!gO|oow&n-;E$VMt!P%M>A{`1#}Aji!%y*#aVAkDW4 zQzio@1z~28>KRgqAXq$(R9f|b?}7-D0@nj*>#g?jpoQm8Pw%3}r!$4R(Q2}l%TEtb>#jgH2|ef6m@&Y0sE>N;KC?wB>>JZ|R& z!PzZu^;U}&=Q?lRd!)y;-8Gx_tgSYy3nU_8$V901n4~g7zd3-x<;T0119nfGt+pi` znZh?wlD<)hT?K^wCMpY|?SYq+c}87qx`G zx8&cDl4HL?1tBJ_{@+U=u&8xE8JZtFvRBY?IN*?eAVll})7iYxR5NsEM!SQz2evMb zu%MJ~vBQ*{qI60g*1Pp*T|-h|E_Y(HOW3|E0l#R8V-t%A|5su$pw5#iWVx9HeU3~738o30%fZb# z>_2g#AQpinWj1v#OZ+4z({Mxov&q&_TXl|?n`NCr2=HA+MzYak5<3(tvhO2J=(VCj zY1gr0o`_Iy^%es}Fb#JN11zVzkR>k4ke&Oi`_+1FnyJmi5YB?!a7dAy>x2J6_(daFt)68U&IbiCuT7*W5O*ktTO~jplVugh zoq`~qG)^)GIsHkg>SM+1zYx+4kISYo)x2`#s&o&{IK`zqSU!yE4g8Nyd&>L^Qjj)Z zAfSYY^HBcqH-QDsRZ$O%EDKaRg81~E}Q*Bbgjb?eBcOB?bIq$f`f;= z+~c7NCao24r1bqxTEb(q(dzcQAQ6$XUasL=bUR%DvM#IfyUVkOz=FmK)f8Awa~Q@M z2W@2>zHF5xrA{HB!1%YFE?NT`-!{9=7`aT!yNk_eaNd)(qkLb*dLvV|AOO%jJiqKy9K4W+IYry zT;lNDeSd_x_AyI09@1B+RbG#l=7$O!_WCpJyZsh1?0BH7)?zPLZoTXg0$+2tuy1ZJ z;b&o&NOV{DIoOTL1s5%!ex7y=th}Hj>D8sd#j>l{_xE&FO$`(I%P`ilYptqCq8E%Y*wIOmy^GG7(Uypyg#Yr9eR>c$mRF5fHS>mz41mW# zK9?h1N2aElUw%D2cwVVGAm-XVcWzQlyibr6s`3NI)n);ieBK-r5U!`z$20RQ4hP3A zz;o&q*mRkH0-mJ6^M3Ll-$w#*S?aO%Kyh+W6D~VNsdfc?1_TW45e?9K6yH_T^j=Fx zmh+>0Kk@Ws+XUlg*E7+tvrZJ$#OD4ESuVk#!GWk@p!`0P2<~jgkw=C_CVRXxyv-hB z=_D>$EWE(Y1JIs3*TY2dwqM1Qo|Z^`h2jc0B8a*+@X>W9PKdvc_YjDls=w(OaKOzR@sgeWUQMzL-P zkqaA2Hm>-iFdqSbyR0U7-=0dn&D)5==ArG_tBj4v?Q7V8#Z z<^n726BBX3rCOqlAJ*n_QUVBu^MH93G4eLD@^xarIZ{S1O^!$@My;njQ=az%liFSf&LpN7bQX| ztf*j6aIu%zIz?IV9$8HkRT+NCsp(h1#8$Kb$=S$gJesNRFa-6R^CP=Wvk@ zggXJh9D2AF;1r6BJ)}!Z5xFfv?t!6Q1R$FxKyf??C!%iog4Iqu9BMsPRS;T394XWn&1QAq$LjpSJ&fPLIGm{%T(yp7Xc+^JBX= z7?-o=arjUc8)xX;h)OQhdZ|jY`+*Y%okglt?m`kB50pFxGI)1X+@d&>)m#aQ6b)kz znJI#*EQH)CiPSxNGMzH7$C5fvYms(=`!C2kYp1%tU#KW9q!^H-!h4YtNWhIBuU4%bj;LCxCYB_MyjgFJWrBTCPcbsmBhPyu zBTnt^N?4LAsIkyb-U$bJ+^4SZe|sO5`ZK^*EN9X)Bhq=27Z3g`0aT2=_8dYaXxUdo zK~{*WNe7UZ%+%D}SwQ|3Ke@s0>m`%Jg(BfLDW72L?`y7UdSa?+dSEuV*a6vvLp3?G zSudA7@;zRNj2(H##{WJcJbG=U&T>8u&?}}xw`g4pLBrGZF2U%*szYZ$IlX_pQmml3 z1iNptXRern$op+Wpc1MO&NeENFgYZ`P=*jt@FK6VW0MKPP2|4%iHkRnGvEc�R;g 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

ddeE*SWKS`wD5C=M^ov`A=E-e{k-D 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 literal 0 HcmV?d00001 diff --git "a/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" new file mode 100644 index 00000000..bce7de80 --- /dev/null +++ "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" @@ -0,0 +1,73 @@ +*斜体文字* + +_斜体文字_ + +**粗体文字** + +__粗体文字__ + +***粗斜体文字*** + +___粗斜体文字___ + +*** +* * * +****** +- - - +------ + +~~删除线~~ + +带下划线文本 + +# 一级标题 + +## 二级标题 + +### 三级标题 + +#### 四级标题 + +##### 五级标题 + +###### 六级标题 +[链接](http://a.com) +![图片](http://url/a.png) +> 引用 +* 第一项 +* 第二项 +* 第三项 + ++ 第一项 ++ 第二项 ++ 第三项 + +- 第一项 +- 第二项 +- 第三项 +1. 第一项 +2. 第二项 +3. 第三项 + +1. 第一项: + - 第一项嵌套的第一个元素 + - 第一项嵌套的第二个元素 +2. 第二项: + - 第二项嵌套的第一个元素 + - 第二项嵌套的第二个元素 +水平线: + +--- +带反引号的“内联代码” +``` +# 代码块 +print '3 个反引号或' +print '缩进 4 个空格' +``` + +> 区块引用 +> Markdown教程 +> 学的不仅是技术更是梦想 + + +SDFGSDFGSDFGSDFG \ No newline at end of file diff --git "a/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" new file mode 100644 index 00000000..12f85c9b --- /dev/null +++ "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" @@ -0,0 +1,615 @@ +# 部署说明 + +> 此文档以开源版本 T-One 最小单元部署举例说明,不保障系统的高可用及性能等 +> +> 若期望大规模集群化部署可以联系SIG项目组进行具体讨论。 +> 若遇到问题请参照文未的 FAQ 文档,或进 SIG 群联系我们。 + +**组件说明**: T-One 包含多个自研组件和几个开源组件,此文档以开源版本 T-One 最小单元部署举例说明。 + +* 自研组件:tone-web、tone-agent-proxy、tone-agent、tone-runner等。 +* 开源组件:mysql、kafka、redis、zookeeper + +**机器要求**: + +* 硬件要求:推荐使用 8c16g 以上规格机器。 +* OS 要求:推荐使用 Anolis OS 系统进行部署( 暂不支持debian、ubuntu等)。 + +**部署说明**: +- 主要分为安装环境、项目构建、项目启动、数据初始化等几个步骤。 +- 该文档以x86_64机器为例, 如果您的部署机器为其他arch类型的机器,则需要将docker-compose.yaml中指定的第三方开源组件镜像更换成对应的镜像源。 +- 可以自己指定安装目录,该文档以 ~/tone目录为例(推荐)。 + +# 部署步骤 +> 后续步骤以 Anolis OS 8.6 环境为示例进行行详细说明。 + +## 1. 环境准备 + +### a. 安装docker +``` + yum -y install yum-utils + yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo + yum install -y docker-ce # 若出错:yum install -y docker-ce --nobest --allowerasing + + # 启动docker + systemctl enable docker + systemctl start docker + systemctl status docker +``` +### b. 配置docker源 +``` + vim /etc/docker/daemon.json + { + "registry-mirrors": [ + "https://6kx4zyno.mirror.aliyuncs.com", + "https://docker.mirrors.ustc.edu.cn", + "http://hub-mirror.c.163.com", + "https://registry.docker-cn.com"] + } + systemctl restart docker + # 建议使用国内镜像源。 阿里云: https://6kx4zyno.mirror.aliyuncs.com,网易: http://hub-mirror.c.163.com +``` +### c. 安装docker-compose +``` + pip3 install --upgrade pip + pip3 install docker-compose + docker-compose --version +``` + +## 2. 项目构建 + +### a. 下载项目源码 +```shell +yum install -y git + +git clone --single-branch --branch master https://gitee.com/anolis/tone-web.git ~/tone/code/tone-web +git clone --single-branch --branch master https://gitee.com/anolis/tone-runner.git ~/tone/code/tone-runner +git clone --single-branch --branch master https://gitee.com/anolis/tone-agent-proxy.git ~/tone/code/tone-agent-proxy +git clone --single-branch --branch master https://gitee.com/anolis/tone-storage.git ~/tone/code/tone-storage +``` +下载后的目录结构: +``` +~/tone/code/ + ├── tone-web + ├── tone-runner + ├── tone-agent-proxy + └── tone-storage +``` + +### b. 集成前端代码 +```shell +# 下载前端代码包: +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/tone-front-latest.zip +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/toneagent-front-latest.zip +# 安装unzip命令 +yum install -y unzip +# 解压到指定目录 +unzip -j -o tone-front-latest.zip -d ~/tone/code/tone-web/static/front/ +unzip -j -o toneagent-front-latest.zip -d ~/tone/code/tone-agent-proxy/static/front/ +``` + +## 3. 项目配置 +### a. 下载 docker-compose.yaml +```shell +cd ~/tone +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/docker-compose.yaml +``` + +### b. 设置并替换变量 +执行以下脚本(需手动替换`必填的`变量): +```shell +# 部署机外网IP地址(必填) +server_ip= + +# 账号密码(必填) +db_password= +redis_password= +tone_storage_password= + +# 镜像版本标签(非必改、默认latest) +version_tag=latest + +# token(非必改、可自动生成) +toneagent_access_key=$(uuidgen) +toneagent_secret_key=$(uuidgen) +admin_urls_token=$(uuidgen) +pub_api_token=$(uuidgen) + +sed -i "s/var_db_password/${db_password}/g" docker-compose.yaml +sed -i "s/var_redis_password/${redis_password}/g" docker-compose.yaml +sed -i "s/var_tone_storage/${tone_storage_password}/g" docker-compose.yaml +sed -i "s/var_toneagent_access_key/${toneagent_access_key}/g" docker-compose.yaml +sed -i "s/var_toneagent_secret_key/${toneagent_secret_key}/g" docker-compose.yaml +sed -i "s/var_admin_urls_token/${admin_urls_token}/g" docker-compose.yaml +sed -i "s/var_pub_api_token/${pub_api_token}/g" docker-compose.yaml +sed -i "s/var_version_tag/${version_tag}/g" docker-compose.yaml +sed -i "s/var_server_ip/${server_ip}/g" docker-compose.yaml +``` + +### c. 启动docker-compose +```shell +docker-compose -f ~/tone/docker-compose.yaml up --build -d +# 注:如代码有更新或首次部署,需要加 --build 参数才会自动重新打包镜像 +``` + +## 4. 数据初始化 +### a.初始化db +* 进入`mysql` docker 镜像中,`docker exec -it {数据库容器ID} bash` +* 连接数据库:`mysql -h 127.0.0.1 -P 3306 -u root -p` +* 创建 `T-One` 数据库 `tone-db`,`ToneAgent` 数据库 `toneagent-db` + ``` + CREATE DATABASE `tone-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; + CREATE DATABASE `toneagent-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; + ``` + 也可以直接通过 mysql 可视化界面初始化数据库 + +### b.初始化 `T-One` 数据 +浏览器或者curl命令请求接口($admin_urls_token可在docker-compose配置里查看或更改) +```shell +curl -s "http://${server_ip}:8080/admin/migrate/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8080/admin/init_data/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8080/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." +curl -s "http://${server_ip}:8081/admin/migrate/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8081/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." +curl -s "http://${server_ip}:8081/admin/import_access_token/?token=${admin_urls_token}" +``` + +### c. `T-One` 关联依赖配置 +**系统执行任务还需对以下配置进行设置** + +- 配置 `T-One` 测试用例 +- 配置`T-One` 测试机器 +- 配置 `ToneAgent` `token` + - 在 ToneAgent 系统-账号管理中增加一组 token + - 更改 docker-compose 配置中的toneagent_access_key和toneagent_secret_key + +## 5. 验证 +使用浏览器打开链接查看: `T-One` 页面:`http://{host}:8080` `ToneAgent` 管理页面:`http://{host}:8081` + +## 6. T-One 多生态使用 +`T-One` + `TestLib` +### a. 创建 `TestLib` 数据库 +- 进入 mysql docker 镜像,docker exec -it {数据库容器ID} bash +- 连接数据库:mysql -h 127.0.0.1 -P 3306 -u root -p +- 创建 TestLib 数据库 testlib + + CREATE DATABASE \`test-lib\` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; +- 创建 TestLib 数据库表 +### testlib数据库初始化 +

+ 点击展开/折叠脚本 + +```shell + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; + +-- 表 test-lib.case 结构 +CREATE TABLE IF NOT EXISTS `case` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试用例名称', + `creator` varchar(64) NOT NULL COMMENT '负责人', + `type` enum('FUNCTIONAL','PERFORMANCE','STRESS','LOAD','SECURITY','COMPATIBILITY','OTHERS') NOT NULL COMMENT '测试用例类型', + `priority` enum('PRIORITY_0','PRIORITY_1','PRIORITY_2','PRIORITY_3') NOT NULL COMMENT '测试用例的优先级', + `suite_name` varchar(128) DEFAULT NULL COMMENT '测试套名称', + `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试用例执行方式,手动、自动', + `run_model` enum('SINGLE','CLUSTER') NOT NULL COMMENT '测试用例运行模式,单机、集群', + `is_available` tinyint(1) NOT NULL COMMENT '测试用例是否可用', + `tone_case` varchar(128) DEFAULT NULL COMMENT 'T-One测试用例,当run_method为自动的时候生效', + `device_type` varchar(128) DEFAULT 'unlimit' COMMENT '设备类型,可多选,默认支持所有设备', + `device_arch` varchar(256) NOT NULL COMMENT '设备架构类型,可多选,默认支撑所有类型', + `labels` varchar(256) DEFAULT NULL COMMENT '设备标签,多个用,隔开', + `desc` varchar(512) DEFAULT NULL COMMENT '用例描述', + `pre_condition` varchar(512) DEFAULT NULL COMMENT '前置条件', + `steps` json DEFAULT NULL COMMENT '操作步骤', + `custom_fields` json DEFAULT NULL COMMENT '测试用例扩展属性', + `parent` int(11) NOT NULL COMMENT '测试用例分类节点', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`), + KEY `ix_case_suite_name` (`suite_name`) +) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_label 结构 +CREATE TABLE IF NOT EXISTS `case_label` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '用例标签', + `creator` varchar(64) NOT NULL COMMENT '标签创建人', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_label_map 结构 +CREATE TABLE IF NOT EXISTS `case_label_map` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `label_name` varchar(64) NOT NULL COMMENT '用例名称', + `case_id` int(11) NOT NULL COMMENT '用例ID', + PRIMARY KEY (`id`), + KEY `ix_case_label_map_label_name` (`label_name`) +) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_tree 结构 +CREATE TABLE IF NOT EXISTS `case_tree` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(16) NOT NULL COMMENT '用例结构树节点名称', + `parent` int(11) NOT NULL COMMENT '父节点id', + `level` int(11) NOT NULL COMMENT '树结构的深度', + `path` varchar(128) NOT NULL COMMENT '模块完整路径', + `children_nums` int(11) NOT NULL COMMENT '子节点数量', + PRIMARY KEY (`id`), + KEY `ix_case_tree_path` (`path`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device 结构 +CREATE TABLE IF NOT EXISTS `device` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '设备名称', + `arch` enum('X86','ARCH64','RISCV','LOONGARCH','NOARCH','OTHERS') NOT NULL COMMENT '设备架构', + `ip` varchar(16) NOT NULL COMMENT '设备ip', + `type` enum('UNLIMIT','VM','DOCKER','PHYSICS') NOT NULL COMMENT '设备类型', + `sn` varchar(16) DEFAULT NULL COMMENT '设备序号', + `status` tinyint(1) NOT NULL COMMENT '设备是否可用', + `label` json DEFAULT NULL COMMENT '设备标签列表数组', + `owner` varchar(256) NOT NULL COMMENT '设备负责人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device_label 结构 +CREATE TABLE IF NOT EXISTS `device_label` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '设备标签名称', + `color` varchar(32) NOT NULL COMMENT '设备标签颜色', + PRIMARY KEY (`id`), + UNIQUE KEY `ix_device_label_name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device_label_relationship 结构 +CREATE TABLE IF NOT EXISTS `device_label_relationship` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `label_id` int(11) NOT NULL COMMENT '机器Label id', + `device_id` int(11) NOT NULL COMMENT '机器Label id', + `is_delete` tinyint(1) DEFAULT NULL COMMENT '对应关系是否删除', + PRIMARY KEY (`id`), + KEY `ix_device_label_relationship_device_id` (`device_id`), + KEY `ix_device_label_relationship_label_id` (`label_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.func_result 结构 +CREATE TABLE IF NOT EXISTS `func_result` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `sub_case_name` varchar(128) NOT NULL COMMENT 'tone job名称', + `sub_case_result` enum('SUCCESS','FAIL','SKIP') NOT NULL COMMENT '功能结果', + `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', + `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + `current` json DEFAULT NULL, + `expect` json DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ix_func_result_tone_suite_id` (`tone_suite_id`), + KEY `ix_func_result_task_id` (`task_id`), + KEY `ix_func_result_tone_case_id` (`tone_case_id`), + KEY `ix_func_result_tone_job_id` (`tone_job_id`) +) ENGINE=InnoDB AUTO_INCREMENT=479 DEFAULT CHARSET=utf8; + +-- 表 test-lib.outline 结构 +CREATE TABLE IF NOT EXISTS `outline` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试大纲文件名', + `title` varchar(128) NOT NULL COMMENT '测试大纲的标题', + `owner` varchar(16) NOT NULL COMMENT '测试大纲负责人', + `tid` varchar(256) NOT NULL COMMENT 'oss文件地址', + `remark` varchar(64) DEFAULT NULL COMMENT '测试大纲备注描述信息', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + +-- 表 test-lib.perf_result 结构 +CREATE TABLE IF NOT EXISTS `perf_result` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `metric` varchar(128) NOT NULL COMMENT '指标名称', + `test_value` varchar(64) DEFAULT NULL COMMENT '测试值', + `cv_value` varchar(64) DEFAULT NULL COMMENT 'cv值', + `max_value` varchar(64) DEFAULT NULL COMMENT '最大值', + `min_value` varchar(64) DEFAULT NULL COMMENT '最小值', + `unit` varchar(64) DEFAULT NULL COMMENT '测试单位', + `track_result` enum('NA','INVALID','NORMAL','DECLINE','INCREASE') NOT NULL COMMENT '跟踪结果', + `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', + `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + PRIMARY KEY (`id`), + KEY `ix_perf_result_task_id` (`task_id`), + KEY `ix_perf_result_tone_case_id` (`tone_case_id`), + KEY `ix_perf_result_tone_suite_id` (`tone_suite_id`), + KEY `ix_perf_result_tone_job_id` (`tone_job_id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +-- 表 test-lib.plan 结构 +CREATE TABLE IF NOT EXISTS `plan` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `title` varchar(64) NOT NULL COMMENT '测试方案名称', + `req_id` int(11) DEFAULT NULL COMMENT '测试需求id', + `req_title` varchar(128) DEFAULT NULL COMMENT '测试需求标题', + `content` json DEFAULT NULL COMMENT '测试方案内容', + `status` varchar(16) NOT NULL COMMENT '测试方案阶段状态', + `cases` varchar(256) DEFAULT NULL COMMENT '测试用例,多个使用","隔开', + `tasks` varchar(256) DEFAULT NULL COMMENT '测试任务,多个使用","隔开', + `reviewers` varchar(256) NOT NULL COMMENT '方案评审人列表', + `owner` varchar(256) NOT NULL COMMENT '测试需求的负责人,多个以,隔开', + `report` tinyint(1) NOT NULL COMMENT '测试报告是否已生成', + PRIMARY KEY (`id`), + UNIQUE KEY `title` (`title`) +) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8; + +-- 表 test-lib.plan_review 结构 +CREATE TABLE IF NOT EXISTS `plan_review` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `plan_id` int(11) NOT NULL COMMENT '测试方案id', + `reviewer` varchar(32) NOT NULL COMMENT '测试需方案的评审人', + `status` varchar(16) NOT NULL COMMENT '评审状态', + `desc` varchar(512) DEFAULT NULL COMMENT '评审内容', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.product_category 结构 +CREATE TABLE IF NOT EXISTS `product_category` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '大类名称', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- 表 test-lib.product_plan 结构 +CREATE TABLE IF NOT EXISTS `product_plan` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `test_product_id` int(11) NOT NULL COMMENT '测试产品id', + `plan_id` int(11) NOT NULL COMMENT '测试产品实际复制执行的plan id', + `executor` varchar(256) NOT NULL COMMENT '测试产品执行人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + +-- 表 test-lib.requirement 结构 +CREATE TABLE IF NOT EXISTS `requirement` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `title` varchar(128) NOT NULL COMMENT '测试需求标题', + `outline_id` int(11) DEFAULT NULL COMMENT '测试大纲id', + `outline_title` varchar(64) DEFAULT NULL COMMENT '测试大纲标题', + `content` json NOT NULL COMMENT '测试需求的描述内容', + `status` varchar(16) NOT NULL COMMENT '测试需求阶段', + `owner` varchar(16) NOT NULL COMMENT '测试需求的创建人', + `assignee` varchar(256) NOT NULL COMMENT '测试需求的指派人,多个以,隔开', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; + +-- 表 test-lib.task 结构 +CREATE TABLE IF NOT EXISTS `task` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '任务名称', + `status` varchar(16) NOT NULL COMMENT '任务执行状态', + `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试任务执行方式', + `owner` varchar(256) NOT NULL COMMENT '任务执行人', + `plan_id` int(11) NOT NULL COMMENT '测试方案id', + `plan_title` varchar(256) NOT NULL COMMENT '测试方案标题', + `cases` varchar(256) NOT NULL COMMENT '测试用例,多个使用,隔开', + `desc` varchar(256) DEFAULT NULL COMMENT '备注', + `run_result` json DEFAULT NULL COMMENT '手动用例执行结果', + `config` json DEFAULT NULL COMMENT '测试任务配置', + `device_id` int(11) DEFAULT NULL COMMENT '测试设备ID', + `device_ip` varchar(256) DEFAULT NULL COMMENT '测试机器IP', + `workspace` varchar(128) NOT NULL COMMENT 'tone workspace', + `project` varchar(128) NOT NULL COMMENT 'tone project', + `job_type` varchar(128) NOT NULL COMMENT 'tone job type', + `test_type` varchar(32) DEFAULT 'others' COMMENT '测试任务类型', + `cluster` varchar(256) DEFAULT NULL COMMENT '测试机器集群名称', + `tags` varchar(256) DEFAULT NULL COMMENT '测试机器标签', + `tsn` varchar(256) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ix_task_plan_id` (`plan_id`) +) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8; + +-- 表 test-lib.test_product 结构 +CREATE TABLE IF NOT EXISTS `test_product` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试产品名称', + `category_id` int(11) NOT NULL COMMENT '大类id', + `origin_plan_id` int(11) NOT NULL COMMENT '测试产品对应的plan id', + `desc` varchar(256) DEFAULT NULL COMMENT '产品描述', + `test_method` varchar(256) DEFAULT NULL COMMENT '测试方法', + `test_requirement` varchar(256) DEFAULT NULL COMMENT '测试要求', + `need_config` tinyint(1) DEFAULT NULL COMMENT '是否扩展配置', + `owner` varchar(256) NOT NULL DEFAULT '' COMMENT '测试产品创建人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +-- 表 test-lib.test_suite 结构 +CREATE TABLE IF NOT EXISTS `test_suite` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(128) NOT NULL COMMENT '测试套名称', + `creator` varchar(64) NOT NULL COMMENT '测试套的创建人员', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_case 结构 +CREATE TABLE IF NOT EXISTS `tone_case` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `tone_case_id` int(11) NOT NULL COMMENT 'tone用例ID', + `tone_case_name` varchar(256) NOT NULL COMMENT 'tone用例名称', + `suite_id` int(11) NOT NULL COMMENT 'suite ID', + `suite_name` varchar(256) NOT NULL COMMENT 'suite用例名称', + `test_type` varchar(64) DEFAULT NULL COMMENT '测试类型', + PRIMARY KEY (`id`), + KEY `ix_tone_case_tone_case_name` (`tone_case_name`), + KEY `ix_tone_case_suite_id` (`suite_id`), + KEY `ix_tone_case_suite_name` (`suite_name`) +) ENGINE=InnoDB AUTO_INCREMENT=603 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_job 结构 +CREATE TABLE IF NOT EXISTS `tone_job` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(100) NOT NULL COMMENT 'tone job名称', + `state` enum('PENDING','RUNNING','SUCCESS','FAIL','STOP','SKIP') NOT NULL COMMENT 'tone job状态', + `test_type` enum('FUNCTIONAL','PERFORMANCE') NOT NULL COMMENT '测试类型', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `tone_job_link` varchar(100) DEFAULT '' COMMENT 'tone job链接', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + `server_info` json DEFAULT NULL COMMENT '存储tone job的机器信息', + PRIMARY KEY (`id`), + KEY `ix_tone_job_tone_job_id` (`tone_job_id`), + KEY `ix_tone_job_task_id` (`task_id`) +) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_sync_pull 结构 +CREATE TABLE IF NOT EXISTS `tone_sync_pull` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=76149 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_sync_push 结构 +CREATE TABLE IF NOT EXISTS `tone_sync_push` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.user 结构 +CREATE TABLE IF NOT EXISTS `user` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', + `nick_name` varchar(64) DEFAULT NULL COMMENT '用户昵称,具有唯一性', + `email` varchar(64) NOT NULL COMMENT '用户邮箱', + `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', + `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', + PRIMARY KEY (`id`), + UNIQUE KEY `nick_name` (`nick_name`), + KEY `ix_user_user_name` (`user_name`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; + +-- 表 test-lib.user_open_source 结构 +CREATE TABLE IF NOT EXISTS `user_open_source` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', + `nick_name` varchar(64) NOT NULL COMMENT '用户昵称,具有唯一性', + `email` varchar(64) NOT NULL COMMENT '用户邮箱', + `password` varchar(64) NOT NULL COMMENT '用户密码,前端对密码md5加密后的值', + `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', + `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', + `token` varchar(256) NOT NULL COMMENT 'api访问凭证', + PRIMARY KEY (`id`), + UNIQUE KEY `nick_name` (`nick_name`), + UNIQUE KEY `email` (`email`), + KEY `ix_user_open_source_token` (`token`(255)) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; + +-- 表 test-lib.user_role_op_record 结构 +CREATE TABLE IF NOT EXISTS `user_role_op_record` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `applicant` varchar(64) NOT NULL COMMENT '申请人name', + `applicant_id` int(11) NOT NULL COMMENT '申请人ID', + `apply_reason` varchar(512) DEFAULT NULL COMMENT '申请理由', + `signer` varchar(64) DEFAULT NULL COMMENT '评审人name', + `has_review` tinyint(1) NOT NULL COMMENT '是否已经审核', + `review_result` enum('INIT','PASS','FAIL') NOT NULL COMMENT '审核结果', + `review_reason` varchar(512) DEFAULT NULL COMMENT '评审意见', + `method` enum('APPROVE','UPGRADE','DOWNGRADE','DELETE') NOT NULL COMMENT '操作方式', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; + + +``` +
+ +### b.TestLib 服务依赖 +### c. clone test-lib代码到~/tone/code目录下 +```shell +git clone --single-branch --branch master https://gitee.com/anolis/testlib.git ~/tone/code/testlib +``` +### d.增加docker-compose配置 +```yaml +# docker-compose.yaml service下增加test-lib + test-lib: + build: + context: code/testlib/ + dockerfile: Dockerfile + args: + APP_NAME: test-lib + ENV: daily + image: test-lib:latest + ports: + - "8005:8005" + depends_on: + - mysql + - redis + environment: + <<: *common-variables + # db + db_url: mysql+aiomysql://${db_user}:{db_password}@mysql:3306/test-lib + # redis + redis_url: redis://:${redis_password}@redis:6379/10 + # app + tone_host: http://${server_ip}:8080/ + tone_token: tone_token + tone_user_name: tone_user_name + main_domain: http://${server_ip}:8005 + oss_url: http://${server_ip}:8005 +``` +#### e.重启服务 +```shell +docker-compose -f ~/tone/docker-compose.yaml up --build -d +``` +## 7. 独立部署 FAQ +https://tone.openanolis.cn/help_doc/12 \ No newline at end of file diff --git "a/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" new file mode 100644 index 00000000..b09df7d0 --- /dev/null +++ "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" @@ -0,0 +1,70 @@ +# 一级标题 +## 二级标题 +### 三级标题 +**粗体文本** + +__cuti__ + +*斜体文本* + +_xieti_ + +下划线 + +~~删除线~~ + +上标:Xy + +下标:An + +> 引用文本 +- 无序列表项1 + - 第二层 +- 无序列表项2 +* * * +1. 有序列表项1 +2. 有序列表项2 +--- +[链接文本](https://gitee.com/suli01/community/edit/master/sig/T-One/content/%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97/%E7%94%A8%E6%88%B7%E8%81%86%E5%90%AC/test.md) + +链接名称 + +'''python +def hello_world(): + print("Hello, world!") + +![示例图片](https://pic.rmb.bdstatic.com/bjh/gallery/03e17cba710868d9153176b50a5fca0d1090.jpeg#pic_center=100x100) + +| 列1 | 列2 | 列3 | +| --- | --- | --- | +| 单元格1 | 单元格2 | 单元格3 | +| 单元格4 | 单元格5 | 单元格6 | + + +| 左对齐 | 居中对齐 | 右对齐 | +|:-----|:------:|------:| +| 文本 | 文本 | 文本 | + +
图片名称
+ + + + + + + + + + + + + +
值班人员星期一星期二星期三
张三李四王五
+ +- [ ] :待完成事项 + +- [x] :已完成事项 + +
+ 图片名称 +
diff --git "a/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" new file mode 100644 index 00000000..d0a3a7f0 --- /dev/null +++ "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" @@ -0,0 +1,2 @@ +# hello +![测试外链图片](https://up.enterdesk.com/2021/edpic/0a/13/7a/0a137aaa28f48af0349cee1e568c0a57_1.jpg) \ No newline at end of file diff --git "a/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" new file mode 100644 index 00000000..e5d110a5 --- /dev/null +++ "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" @@ -0,0 +1,2 @@ +# hello, 欢迎来到聆听 .md +## 阿斯顿发射点 \ No newline at end of file diff --git a/sig/T-One-copy3/sig-info.yaml b/sig/T-One-copy3/sig-info.yaml new file mode 100644 index 00000000..5031512b --- /dev/null +++ b/sig/T-One-copy3/sig-info.yaml @@ -0,0 +1,40 @@ +name: T-One-copy3 +en_name: T-One-copy3 +home_page: https://openanolis.cn/sig/T-One-copy3 +description: T-One兴趣组主要目标是建立OpenAnolis社区的质量保障基础设施(包括但不限于一站式的自动化测试平台T-One/Testfarm,Bisect缺陷定位工具等各类测试平台), 支持OpenAnolis社区的各类测试活动。 +en_description: The main goal of the T-One interest group is to establish the quality assurance infrastructure of the OpenAnolis community (including but not limited to the one-stop automated test platform T-One/Testfarm, Bisect defect location tool and other test platforms), +to support various test platforms in the OpenAnolis community Class testing activities. +mailing_list: t-one@lists.openanolis.cn +meeting_minutes_url: https://etherpad.openanolis.cn/p/t-one +maintainers: +- openanolis_id: yongchao + gitee_id: yongchao + name: yongchao Zhang + organization: AlibabaCloud + email: yongchao@linux.alibaba.com +- openanolis_id: sULI01 + gitee_id: SULI01 +- openanolis_id: jacob2021 + gitee_id: jacob2021 +- openanolis_id: eeeeeeee + gitee_id: suli01 +contributors: +- openanolis_id: fuyong + gitee_id: fuyong +- openanolis_id: woohello + gitee_id: woohello +- openanolis_id: maozzi4 + gitee_id: maozzi +repositories: +- repo: + - anolis/testfarm + - anolis/testfarm-front + - anolis/tone-web + - anolis/tone-runner + - anolis/tone-agent + - anolis/tone-agent-proxy + - anolis/tone-agent-front + - anolis/tone-front + - anolis/tone-deploy + - anolis/tone-cli + - anolis/tone-storage \ No newline at end of file -- Gitee From 74471ef4de23c9da60b4c1161e2504a9a99c512a Mon Sep 17 00:00:00 2001 From: WB01533938 Date: Mon, 20 Jan 2025 13:44:51 +0800 Subject: [PATCH 106/135] =?UTF-8?q?ci:=20=E6=9B=B4=E6=96=B0=20T-One-copy2?= =?UTF-8?q?=20SIG=20=E6=88=90=E5=91=98=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改成员 suqingming 的 OpenAnolis ID为 sULI01 - 修改成员 suqingming 的 Gitee ID 为 SULI0 --- .../aest.md" | 16 ++++++++++++++++ .../test2.md" | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 "sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/aest.md" create mode 100644 "sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/test2.md" diff --git "a/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/aest.md" "b/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/aest.md" new file mode 100644 index 00000000..9dca95d4 --- /dev/null +++ "b/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/aest.md" @@ -0,0 +1,16 @@ +HCT密码计算套件的目录结构如下: +阿斯顿法师打发斯蒂芬 +44444444444444444444444444444444444444444444444444444 +hygon-devkit/ + + ├─ hct +  ├──pkg +  │ ├── hct_1.0.0.20230224_rc +  │ ├── hct_1.0.1.20230512_rc +  │ └── hct_1.1.0.20230730_rc +  │ +  └── README.md + +\* pkg目录:内含各版本hct密码计算套件。 + +\* README.md文件:有关HCT的简单情况。 \ No newline at end of file diff --git "a/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/test2.md" "b/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/test2.md" new file mode 100644 index 00000000..9dca95d4 --- /dev/null +++ "b/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/test2.md" @@ -0,0 +1,16 @@ +HCT密码计算套件的目录结构如下: +阿斯顿法师打发斯蒂芬 +44444444444444444444444444444444444444444444444444444 +hygon-devkit/ + + ├─ hct +  ├──pkg +  │ ├── hct_1.0.0.20230224_rc +  │ ├── hct_1.0.1.20230512_rc +  │ └── hct_1.1.0.20230730_rc +  │ +  └── README.md + +\* pkg目录:内含各版本hct密码计算套件。 + +\* README.md文件:有关HCT的简单情况。 \ No newline at end of file -- Gitee From bf6dd1114d7ef5c2aa24b8117ef9a184190c86e0 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Mon, 20 Jan 2025 14:46:49 +0800 Subject: [PATCH 107/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9545-?= =?UTF-8?q?=E6=A0=B9=E7=9B=AE=E5=BD=95=E5=A2=9E=E5=8A=A0=E6=96=87=E6=A1=A3?= =?UTF-8?q?=EF=BC=8C=E6=96=87=E4=BB=B6=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...23\345\214\205\346\211\213\345\206\214.md" | 63 ++++ .../aest.md" | 16 + .../test.md" | 16 + .../test2.md" | 16 + ...345\244\226\346\234\215\345\212\241API.md" | 1 + ...06\346\210\220\346\211\213\345\206\214.md" | 282 ++++++++++++++++++ 6 files changed, 394 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/ToneAgent\347\274\226\350\257\221\346\211\223\345\214\205\346\211\213\345\206\214.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/aest.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/test2.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/\345\257\271\345\244\226\346\234\215\345\212\241API.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/\346\265\213\350\257\225\345\245\227\344\273\266\351\233\206\346\210\220\346\211\213\345\206\214.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/ToneAgent\347\274\226\350\257\221\346\211\223\345\214\205\346\211\213\345\206\214.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/ToneAgent\347\274\226\350\257\221\346\211\223\345\214\205\346\211\213\345\206\214.md" new file mode 100644 index 00000000..0949b8e7 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/ToneAgent\347\274\226\350\257\221\346\211\223\345\214\205\346\211\213\345\206\214.md" @@ -0,0 +1,63 @@ +# 1. ToneAgent编译 + +## 1.1 环境准备 +Go 1.17 及以上版本([下载地址](https://go.dev/dl/)) + +## 1.2 下载ToneAgent + git clone git@gitee.com:anolis/tone-agent.git + cd tone-agent + +## 1.3 编译 +`-o` 后面是二进制的名称 + +### 1.3.1 编译 AMD64的二进制 + GOOS=linux GOARCH=amd64 go build -o toneagent-amd64-v102 + +### 1.3.2 编译 ARM 的二进制 + GOOS=linux GOARCH=arm64 go build -o toneagent-amd64-v102 + +# 2. Linux环境二进制打包 + +## 2.1 RPM包制作 + +### 2.1.1 RPM环境准备 + sudo su -c bash # 使用bash + yum install rpmdevtools rpmdevtools # 安装rpm打包工具 + +### 2.1.2 打包RPM包 + rpmdev-setuptree # 创建目录,会在用户目录下创建rpmbuild文件夹 ~/rpmbuild + cd # 返回用户目录 + vi rpmbuild/SPEC/toneagent.spec # 修改创建spec的模板文件 + mkdir rpmbuild/BUILDROOT/toneagent-0.0.1-AMD + cp ${二进制路径} rpmbuild/BUILDROOT/toneagent-0.0.1-AMD/ # 拷贝二进制到RPM目录 + cd rpmbuild/SPEC/ + rpmbuild -bb toneagent.spec # 构建rpm包 + +### 2.1.3 RPM安装及启动 + sudo yum -y install ${toneagent包位置} # 安装 + sudo systemctl start toneagent # 启动 + +## 2.2 DEB包制作 + +### 2.1.1 环境准备 + sudo apt instsll -y dpkg # 使用二进制打包,只需要安装这个包 + sudo apt install -y dpkg build-essential devscripts quilt dh-make git # 扩展安装 + +### 2.1.2 打包DEB包 + mkdir toneagent.work + cd toneagent.work + mkdir -pv toneagent_0.0.1_amd64/{DEBIAN,bin} + cp ${tone-agent二进制} toneagent_0.0.1_amd64/bin/ + echo "Package: toneagent + Version: 1.0 + Architecture: arm + Maintainer: alibaba + Installed-Size: 100 + Depends: + Priority: optional + Description: toneagent for SUNXI devices (A10,A20 ...),example is Cubieboard. + " >> toneagent_0.0.1_amd64/DEBIAN/control + dpkg -b toneagent_0.0.1_amd64 toneagent_0.0.1_amd64.deb + +### 2.1.3 DEB安装 + dpkg -i toneagent_0.0.1_amd64.deb diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/aest.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/aest.md" new file mode 100644 index 00000000..9dca95d4 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/aest.md" @@ -0,0 +1,16 @@ +HCT密码计算套件的目录结构如下: +阿斯顿法师打发斯蒂芬 +44444444444444444444444444444444444444444444444444444 +hygon-devkit/ + + ├─ hct +  ├──pkg +  │ ├── hct_1.0.0.20230224_rc +  │ ├── hct_1.0.1.20230512_rc +  │ └── hct_1.1.0.20230730_rc +  │ +  └── README.md + +\* pkg目录:内含各版本hct密码计算套件。 + +\* README.md文件:有关HCT的简单情况。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" new file mode 100644 index 00000000..9dca95d4 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" @@ -0,0 +1,16 @@ +HCT密码计算套件的目录结构如下: +阿斯顿法师打发斯蒂芬 +44444444444444444444444444444444444444444444444444444 +hygon-devkit/ + + ├─ hct +  ├──pkg +  │ ├── hct_1.0.0.20230224_rc +  │ ├── hct_1.0.1.20230512_rc +  │ └── hct_1.1.0.20230730_rc +  │ +  └── README.md + +\* pkg目录:内含各版本hct密码计算套件。 + +\* README.md文件:有关HCT的简单情况。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/test2.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/test2.md" new file mode 100644 index 00000000..9dca95d4 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/test2.md" @@ -0,0 +1,16 @@ +HCT密码计算套件的目录结构如下: +阿斯顿法师打发斯蒂芬 +44444444444444444444444444444444444444444444444444444 +hygon-devkit/ + + ├─ hct +  ├──pkg +  │ ├── hct_1.0.0.20230224_rc +  │ ├── hct_1.0.1.20230512_rc +  │ └── hct_1.1.0.20230730_rc +  │ +  └── README.md + +\* pkg目录:内含各版本hct密码计算套件。 + +\* README.md文件:有关HCT的简单情况。 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/\345\257\271\345\244\226\346\234\215\345\212\241API.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/\345\257\271\345\244\226\346\234\215\345\212\241API.md" new file mode 100644 index 00000000..6be2fe13 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/\345\257\271\345\244\226\346\234\215\345\212\241API.md" @@ -0,0 +1 @@ +参考文档:https://tone.openanolis.cn/help_doc/7 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/\346\265\213\350\257\225\345\245\227\344\273\266\351\233\206\346\210\220\346\211\213\345\206\214.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/\346\265\213\350\257\225\345\245\227\344\273\266\351\233\206\346\210\220\346\211\213\345\206\214.md" new file mode 100644 index 00000000..67b07c6d --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\345\274\200\345\217\221\346\211\213\345\206\214/\346\265\213\350\257\225\345\245\227\344\273\266\351\233\206\346\210\220\346\211\213\345\206\214.md" @@ -0,0 +1,282 @@ +# tone-cli介绍 +tone-cli主要用于测试套件(testsuite)的调度及运行。 + +# 代码仓库 +https://gitee.com/anolis/tone-cli + +# 测试套件构成 +测试套件主要由套件本身和集成脚本构成,其中: + +- 测试套件可以存放于gitee或其他代码仓库,也可以是一个系统中已经包含的命令 +- 集成脚本由两部分构成: + - 适配脚本 + - 测试套配置文件 + +# 测试套件集成 + +## 测试配置文件 +测试配置文件位于`$TONE_ROOT/conf`目录下,与适配脚本一起为测试套件服务。 + +为了便于组织,当前根据测试类别分为`functional`,`performance`和`stress`。 + +测试配置文件主要用于描述测试的参数,以netperf为例: + + test IP runtime send_size + TCP_RR ipv4 60s Na + TCP_RR ipv4 60s 16K + TCP_CC ipv4 60s Na + TCP_CRR ipv4 60s Na + ... + +第一行描述为变量名,后续行描述的是变量的值。tone-cli会将测试套配置文件按照配置进行执行: + + $ tone list netperf + test IP runtime send_size testconf + TCP_RR ipv4 60 None netperf:test=TCP_RR,IP=ipv4,runtime=60s + TCP_RR ipv4 60 16K netperf:test=TCP_RR,IP=ipv4,runtime=60s,send_size=16K + TCP_CC ipv4 60 None netperf:test=TCP_CC,IP=ipv4,runtime=60s + TCP_CRR ipv4 60 None netperf:test=TCP_CRR,IP=ipv4,runtime=60s +在后续的脚本中,conf中的变量会以参数形式传递给适配脚本。 + +> 注: +> +> - 没有任何变量的测试套,仍然需要创建对应名称的配置文件,保持内容为空 +> - 对于某个参数,如netperf的send_size,在某些状况下不需要传入参数,则可以置为NA + +## 适配脚本 + +测试套件适配脚本需要存放于`$TONE_ROOT/tests`目录下,创建工具对应的目录,如`$TONE_ROOT/tests/netperf`。 + +tone-cli将测试定义为以下几个阶段,可以根据需要来决定是否需要对应的阶段: + +- 测试套件获取 +- 测试套件编译安装 +- 测试执行 +- 结果处理 +- 测试套件卸载 + +适配脚本需要最少包含`install.sh`,`run.sh`和`README.md`,其中: + +- install.sh: 定义测试套件获取、依赖包、测试套件编译及安装 +- run.sh: 定义测试执行过程,结果处理方式 +- README.md: 测试套件必要说明 + +其他脚本可以根据需要决定,如:将结果处理脚本单独编写,在run.sh中加以引用 + +### 测试套件获取 + +当前支持通过URL下载或git方式获取对应的测试套: + +| 方式| 参数 | 说明 |举例 | +| :--:| :---: | :---: |:---: | +|URL下载 |WEB_URL |测试套下载地址 |WEB_URL=“https://gitee.com/anolis/tone-cli/repository/archive/master.zip”| +|GIT仓库 |GIT_URL |git仓库地址 |GIT_URL="https://gitee.com/mirrors_HewlettPackard/netperf.git"| +| |BRANCH |git分支| BRANCH="netperf-2.7.0"| + +tone-cli将根据提供的`WEB_URL`,`GIT_URL`,`BRANCH`等信息拉取对应的源代码 + +### 举例: + +`netperf/install.sh` + + GIT_URL="https://gitee.com/mirrors_HewlettPackard/netperf.git" + BRANCH="netperf-2.7.0" + +### 测试套件编译安装 + +tone-cli提供的标准安装方式由以下几步: + +- 执行安装前额外的操作:extract_src +- 安装依赖包:install_pkg +- 编译:build +- 安装:install + +**extract_src** + +用于在安装依赖包之前进行必要的准备,如centos安装epel源: + + extract_src() + { + logger yum install -y epel-release + } + +**install_pkg** + +绝大部分状况下,不需要重写install_pkg的方法,而仅通过设置DEP_PKG_LIST的变量,tone-cli将自动进行依赖包安装。如netperf/install.sh: + + DEP_PKG_LIST="automake gcc texinfo" + +**build和install** + +通常状况,build和install都需要根据测试套件进行重写。以netperf为例: + + build() + { + local configure_flags=( + --prefix="$TONE_BM_RUN_DIR" + ) + if [ "$(/usr/bin/arch)" = aarch64 ]; then + configure_flags+=('--build=aarch64-unknown-linux-gnu') + fi + + export CFLAGS="-fno-strict-aliasing -fcommon" + + ./autogen.sh + ./configure "${configure_flags[@]}" + make + } + + install() + { + make install-exec + } +### 测试执行 + +测试执行被定义在`run.sh`中,主要的步骤有: + +- 测试准备:setup +- 测试执行:run +- 测试拆除:teardown + +以netperf为例,netperf测试可以划分为: + +- 启动netserver +- 使用netperf命令进行测试 +- 拆除netserver + +**setup** + +netperf测试中,netserver启动主要逻辑为: + +- 判断是否设置了$SERVER,如果已设置,则认为netserver将在对应的server上执行 +- 启动netserver,启动netserver的主要逻辑在netserver.sh中体现 + + setup() + { + [ -n "$SERVER" ] && server=${SERVER%% *} || server=localhost + echo "Run netserver on host: $server" + + if [ "$server" = localhost ]; then + source "$TONE_BM_SUITE_DIR"/netserver.sh + else + ssh $server "TONE_ROOT=$TONE_ROOT TONE_BM_RUN_DIR=$TONE_BM_RUN_DIR IP=$IP server=$server $TONE_BM_SUITE_DIR/netserver.sh" + fi + } + +**run** + +netperf测试套的执行逻辑,主要根据测试套件配置中的参数组合,设置netperf命令行参数以执行测试 + +> 注: +> +> 在执行命令时,使用logger方法将netperf命令行输出写入对应的日志文件中,以备后续进行结果处理 + + run() + { + export PATH="$TONE_BM_RUN_DIR"/bin:$PATH + + [ -n "$send_size" ] && test_options="-- -m $send_size" + + opt_ip= + [ "$IP" = 'ipv4' ] && opt_ip='-4' + [ "$IP" = 'ipv6' ] && opt_ip='-6' + base_cmd="netperf $opt_ip -t $test -c -C -l $runtime -H $server $test_options" + + # check online cpus with cpu_affinity set on multi-processor machine + if [ "$server" = localhost ] && [ "$(nproc)" -gt 1 ]; then + check_oneline_cpu + # the last cpu is reservered for netserver if test on single node + cpu_online_num=$((cpu_online_num - 1)) + cpu_online_tpy=$(echo "$cpu_online_tpy" | awk '{$NF=""; print $0}') + cpu_x=$((1 % cpu_online_num)) + [ "$cpu_x" -eq 0 ] && cpu_x=$cpu_online_num + mycpu=$(echo "$cpu_online_tpy" | awk -v n=$cpu_x '{print $n}') + test_cmd="taskset -c $(echo "$mycpu" | cut -d- -f3) $base_cmd" + echo "run netperf on cpu: $(echo "$mycpu" | cut -d- -f3),"\ + "socket: $(echo "$mycpu" | cut -d- -f1),"\ + "core_id: $(echo "$mycpu" | cut -d- -f2)" + else + test_cmd="$base_cmd" + fi + + logger $test_cmd & + logger wait + } + +**teardown** + +netperf的teardown阶段,主要通过执行pkill命令杀死netserver进程 + + teardown() + { + pkill netserver + } + +**结果处理** +tone-cli当前规定的结果规范为`key: value`,所以只要符合这个输出规范,对应的结果会被收集并存储。 + +以netperf为例,其结果处理的`parse()`调用了一个awk脚本: + + #!/usr/bin/awk -f + + /^Size.*Okay.*Throughput.*Demand$/ { + unit = "Mbps1" + next + } + + /^Size.*Throughput.*remote$/ { + unit = "Mbps2" + next + } + + /^bytes.*secs.\s+per sec/ { + unit = "tps" + next + } + + $8 && $0 ~ /^[ \t0-9.]+$/ { + if ( unit == "Mbps1" ) { + printf("Throughput_Mbps: %s\n",$(NF-2)) + } + else if ( unit == "Mbps2" ) { + printf("Throughput_Mbps: %s\n",$5) + } + else{ + printf("Throughput_%s: %s\n",unit,$6) + } + } + +执行完毕后会输出: + + Throughput_tps: 91336.30 + +# 公共变量 +tone-cli提供了多个公共变量用于在测试集成时使用 + +## 测试套配置文件 + +|变量名称| 用途| 举例| +|:--:|:--:|:--:| +|nr_task |设置使用的线程数,可以使用百分比形式表示,当设置为百分比时,框架会根据当前测试机CPU数量进行计算 |nr_task=1, nr_task=50%| +|cpu_affinity |设置CPU绑定| cpupin| + +## 测试套适配脚本 + +|变量名称| 用途| 举例| +|:--:|:--:|:--:| +|$TONE_BM_CACHE_DIR |测试套件cache目录| /tmp/tone/cache/netperf| +|$TONE_BM_BUILD_DIR| 测试套件build目录| /tmp/tone/build/netperf| +|$TONE_BM_RUN_DIR |测试套件run目录,可以将测试套件安装于该目录中,而不用安装到系统目录下| /tmp/tone/run/netperf| +|$TONE_BM_RESULT_DIR |测试套件结果存放目录 |/tmp/tone/result/netperf| +|$TONE_CURRENT_RESULT_DIR |当次运行时的结果存放目录| /tmp/tone/result/netperf/1| +|$TONE_BM_SUITE_DIR |测试套件脚本目录| /tmp/tone/tests/netperf| + +# 公共函数 + +tone-cli提供一些公共函数已方便脚本编写,公共函数主要归档于$TONE_ROOT/lib目录下,在编写脚本时可以按需引入。常用的函数有: + +|函数名| 文件 |用途 |举例| +|:--:|:--:|:--:|:--:| +|logger |lib/common.sh |记录日志 |logger netperf -t TCP_RR| +|set_cpu_affinity_server |lib/cpu_affinity.sh |设置服务端CPU绑核,会将server绑定在最后一个CPU核上,注意,需要通过server_cmd变量进行传递 |server_cmd="netserver" [ -n "$cpu_affinity" ] && set_cpu_affinity_client logger ${server_cmd}| +|set_cpu_affinity_client |lib/cpu_affinity.sh| 设置客户端CPU绑核,会将client绑定在第一个CPU核上,注意,需要通过client_cmd进行传递 |client_cmd="netperf -t TCP_RR" [ -n "$cpu_affinity" ] && set_cpu_affinity_client logger ${client_cmd}| \ No newline at end of file -- Gitee From 9dcf4f20b0db2eb07ab9b36c15e22ef826f35218 Mon Sep 17 00:00:00 2001 From: WB01533938 Date: Mon, 20 Jan 2025 16:10:49 +0800 Subject: [PATCH 108/135] =?UTF-8?q?ci:=20=E6=9B=B4=E6=96=B0=20T-One-copy2?= =?UTF-8?q?=20SIG=20=E6=88=90=E5=91=98=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改成员 suqingming 的 OpenAnolis ID为 sULI01 - 修改成员 suqingming 的 Gitee ID 为 SULI0 --- .../test.md" | 70 +++++++++++++++++++ ...26\351\223\276\345\233\276\347\211\207.md" | 2 + .../\350\201\206\345\220\254.md" | 2 + 3 files changed, 74 insertions(+) create mode 100644 "sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-cpoy/test.md" create mode 100644 "sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-cpoy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" create mode 100644 "sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-cpoy/\350\201\206\345\220\254.md" diff --git "a/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-cpoy/test.md" "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-cpoy/test.md" new file mode 100644 index 00000000..b09df7d0 --- /dev/null +++ "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-cpoy/test.md" @@ -0,0 +1,70 @@ +# 一级标题 +## 二级标题 +### 三级标题 +**粗体文本** + +__cuti__ + +*斜体文本* + +_xieti_ + +下划线 + +~~删除线~~ + +上标:Xy + +下标:An + +> 引用文本 +- 无序列表项1 + - 第二层 +- 无序列表项2 +* * * +1. 有序列表项1 +2. 有序列表项2 +--- +[链接文本](https://gitee.com/suli01/community/edit/master/sig/T-One/content/%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97/%E7%94%A8%E6%88%B7%E8%81%86%E5%90%AC/test.md) + +链接名称 + +'''python +def hello_world(): + print("Hello, world!") + +![示例图片](https://pic.rmb.bdstatic.com/bjh/gallery/03e17cba710868d9153176b50a5fca0d1090.jpeg#pic_center=100x100) + +| 列1 | 列2 | 列3 | +| --- | --- | --- | +| 单元格1 | 单元格2 | 单元格3 | +| 单元格4 | 单元格5 | 单元格6 | + + +| 左对齐 | 居中对齐 | 右对齐 | +|:-----|:------:|------:| +| 文本 | 文本 | 文本 | + +
图片名称
+ + + + + + + + + + + + + +
值班人员星期一星期二星期三
张三李四王五
+ +- [ ] :待完成事项 + +- [x] :已完成事项 + +
+ 图片名称 +
diff --git "a/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-cpoy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-cpoy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" new file mode 100644 index 00000000..d0a3a7f0 --- /dev/null +++ "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-cpoy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" @@ -0,0 +1,2 @@ +# hello +![测试外链图片](https://up.enterdesk.com/2021/edpic/0a/13/7a/0a137aaa28f48af0349cee1e568c0a57_1.jpg) \ No newline at end of file diff --git "a/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-cpoy/\350\201\206\345\220\254.md" "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-cpoy/\350\201\206\345\220\254.md" new file mode 100644 index 00000000..e5d110a5 --- /dev/null +++ "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-cpoy/\350\201\206\345\220\254.md" @@ -0,0 +1,2 @@ +# hello, 欢迎来到聆听 .md +## 阿斯顿发射点 \ No newline at end of file -- Gitee From e26d6ad7888f79c569710782adf8687152fe253a Mon Sep 17 00:00:00 2001 From: WB01533938 Date: Mon, 20 Jan 2025 16:15:15 +0800 Subject: [PATCH 109/135] =?UTF-8?q?ci:=20=E6=9B=B4=E6=96=B0=20T-One-copy2?= =?UTF-8?q?=20SIG=20=E6=88=90=E5=91=98=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改成员 suqingming 的 OpenAnolis ID为 sULI01 - 修改成员 suqingming 的 Gitee ID 为 SULI0 --- .../atone\351\203\250\347\275\262.md" | 615 ++++++++++++++++++ .../test.md" | 70 ++ ...26\351\223\276\345\233\276\347\211\207.md" | 2 + .../\350\201\206\345\220\254.md" | 2 + 4 files changed, 689 insertions(+) create mode 100644 "sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/atone\351\203\250\347\275\262.md" create mode 100644 "sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/test.md" create mode 100644 "sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" create mode 100644 "sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\350\201\206\345\220\254.md" diff --git "a/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/atone\351\203\250\347\275\262.md" "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/atone\351\203\250\347\275\262.md" new file mode 100644 index 00000000..12f85c9b --- /dev/null +++ "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/atone\351\203\250\347\275\262.md" @@ -0,0 +1,615 @@ +# 部署说明 + +> 此文档以开源版本 T-One 最小单元部署举例说明,不保障系统的高可用及性能等 +> +> 若期望大规模集群化部署可以联系SIG项目组进行具体讨论。 +> 若遇到问题请参照文未的 FAQ 文档,或进 SIG 群联系我们。 + +**组件说明**: T-One 包含多个自研组件和几个开源组件,此文档以开源版本 T-One 最小单元部署举例说明。 + +* 自研组件:tone-web、tone-agent-proxy、tone-agent、tone-runner等。 +* 开源组件:mysql、kafka、redis、zookeeper + +**机器要求**: + +* 硬件要求:推荐使用 8c16g 以上规格机器。 +* OS 要求:推荐使用 Anolis OS 系统进行部署( 暂不支持debian、ubuntu等)。 + +**部署说明**: +- 主要分为安装环境、项目构建、项目启动、数据初始化等几个步骤。 +- 该文档以x86_64机器为例, 如果您的部署机器为其他arch类型的机器,则需要将docker-compose.yaml中指定的第三方开源组件镜像更换成对应的镜像源。 +- 可以自己指定安装目录,该文档以 ~/tone目录为例(推荐)。 + +# 部署步骤 +> 后续步骤以 Anolis OS 8.6 环境为示例进行行详细说明。 + +## 1. 环境准备 + +### a. 安装docker +``` + yum -y install yum-utils + yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo + yum install -y docker-ce # 若出错:yum install -y docker-ce --nobest --allowerasing + + # 启动docker + systemctl enable docker + systemctl start docker + systemctl status docker +``` +### b. 配置docker源 +``` + vim /etc/docker/daemon.json + { + "registry-mirrors": [ + "https://6kx4zyno.mirror.aliyuncs.com", + "https://docker.mirrors.ustc.edu.cn", + "http://hub-mirror.c.163.com", + "https://registry.docker-cn.com"] + } + systemctl restart docker + # 建议使用国内镜像源。 阿里云: https://6kx4zyno.mirror.aliyuncs.com,网易: http://hub-mirror.c.163.com +``` +### c. 安装docker-compose +``` + pip3 install --upgrade pip + pip3 install docker-compose + docker-compose --version +``` + +## 2. 项目构建 + +### a. 下载项目源码 +```shell +yum install -y git + +git clone --single-branch --branch master https://gitee.com/anolis/tone-web.git ~/tone/code/tone-web +git clone --single-branch --branch master https://gitee.com/anolis/tone-runner.git ~/tone/code/tone-runner +git clone --single-branch --branch master https://gitee.com/anolis/tone-agent-proxy.git ~/tone/code/tone-agent-proxy +git clone --single-branch --branch master https://gitee.com/anolis/tone-storage.git ~/tone/code/tone-storage +``` +下载后的目录结构: +``` +~/tone/code/ + ├── tone-web + ├── tone-runner + ├── tone-agent-proxy + └── tone-storage +``` + +### b. 集成前端代码 +```shell +# 下载前端代码包: +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/tone-front-latest.zip +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/toneagent-front-latest.zip +# 安装unzip命令 +yum install -y unzip +# 解压到指定目录 +unzip -j -o tone-front-latest.zip -d ~/tone/code/tone-web/static/front/ +unzip -j -o toneagent-front-latest.zip -d ~/tone/code/tone-agent-proxy/static/front/ +``` + +## 3. 项目配置 +### a. 下载 docker-compose.yaml +```shell +cd ~/tone +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/docker-compose.yaml +``` + +### b. 设置并替换变量 +执行以下脚本(需手动替换`必填的`变量): +```shell +# 部署机外网IP地址(必填) +server_ip= + +# 账号密码(必填) +db_password= +redis_password= +tone_storage_password= + +# 镜像版本标签(非必改、默认latest) +version_tag=latest + +# token(非必改、可自动生成) +toneagent_access_key=$(uuidgen) +toneagent_secret_key=$(uuidgen) +admin_urls_token=$(uuidgen) +pub_api_token=$(uuidgen) + +sed -i "s/var_db_password/${db_password}/g" docker-compose.yaml +sed -i "s/var_redis_password/${redis_password}/g" docker-compose.yaml +sed -i "s/var_tone_storage/${tone_storage_password}/g" docker-compose.yaml +sed -i "s/var_toneagent_access_key/${toneagent_access_key}/g" docker-compose.yaml +sed -i "s/var_toneagent_secret_key/${toneagent_secret_key}/g" docker-compose.yaml +sed -i "s/var_admin_urls_token/${admin_urls_token}/g" docker-compose.yaml +sed -i "s/var_pub_api_token/${pub_api_token}/g" docker-compose.yaml +sed -i "s/var_version_tag/${version_tag}/g" docker-compose.yaml +sed -i "s/var_server_ip/${server_ip}/g" docker-compose.yaml +``` + +### c. 启动docker-compose +```shell +docker-compose -f ~/tone/docker-compose.yaml up --build -d +# 注:如代码有更新或首次部署,需要加 --build 参数才会自动重新打包镜像 +``` + +## 4. 数据初始化 +### a.初始化db +* 进入`mysql` docker 镜像中,`docker exec -it {数据库容器ID} bash` +* 连接数据库:`mysql -h 127.0.0.1 -P 3306 -u root -p` +* 创建 `T-One` 数据库 `tone-db`,`ToneAgent` 数据库 `toneagent-db` + ``` + CREATE DATABASE `tone-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; + CREATE DATABASE `toneagent-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; + ``` + 也可以直接通过 mysql 可视化界面初始化数据库 + +### b.初始化 `T-One` 数据 +浏览器或者curl命令请求接口($admin_urls_token可在docker-compose配置里查看或更改) +```shell +curl -s "http://${server_ip}:8080/admin/migrate/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8080/admin/init_data/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8080/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." +curl -s "http://${server_ip}:8081/admin/migrate/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8081/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." +curl -s "http://${server_ip}:8081/admin/import_access_token/?token=${admin_urls_token}" +``` + +### c. `T-One` 关联依赖配置 +**系统执行任务还需对以下配置进行设置** + +- 配置 `T-One` 测试用例 +- 配置`T-One` 测试机器 +- 配置 `ToneAgent` `token` + - 在 ToneAgent 系统-账号管理中增加一组 token + - 更改 docker-compose 配置中的toneagent_access_key和toneagent_secret_key + +## 5. 验证 +使用浏览器打开链接查看: `T-One` 页面:`http://{host}:8080` `ToneAgent` 管理页面:`http://{host}:8081` + +## 6. T-One 多生态使用 +`T-One` + `TestLib` +### a. 创建 `TestLib` 数据库 +- 进入 mysql docker 镜像,docker exec -it {数据库容器ID} bash +- 连接数据库:mysql -h 127.0.0.1 -P 3306 -u root -p +- 创建 TestLib 数据库 testlib + + CREATE DATABASE \`test-lib\` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; +- 创建 TestLib 数据库表 +### testlib数据库初始化 +
+ 点击展开/折叠脚本 + +```shell + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; + +-- 表 test-lib.case 结构 +CREATE TABLE IF NOT EXISTS `case` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试用例名称', + `creator` varchar(64) NOT NULL COMMENT '负责人', + `type` enum('FUNCTIONAL','PERFORMANCE','STRESS','LOAD','SECURITY','COMPATIBILITY','OTHERS') NOT NULL COMMENT '测试用例类型', + `priority` enum('PRIORITY_0','PRIORITY_1','PRIORITY_2','PRIORITY_3') NOT NULL COMMENT '测试用例的优先级', + `suite_name` varchar(128) DEFAULT NULL COMMENT '测试套名称', + `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试用例执行方式,手动、自动', + `run_model` enum('SINGLE','CLUSTER') NOT NULL COMMENT '测试用例运行模式,单机、集群', + `is_available` tinyint(1) NOT NULL COMMENT '测试用例是否可用', + `tone_case` varchar(128) DEFAULT NULL COMMENT 'T-One测试用例,当run_method为自动的时候生效', + `device_type` varchar(128) DEFAULT 'unlimit' COMMENT '设备类型,可多选,默认支持所有设备', + `device_arch` varchar(256) NOT NULL COMMENT '设备架构类型,可多选,默认支撑所有类型', + `labels` varchar(256) DEFAULT NULL COMMENT '设备标签,多个用,隔开', + `desc` varchar(512) DEFAULT NULL COMMENT '用例描述', + `pre_condition` varchar(512) DEFAULT NULL COMMENT '前置条件', + `steps` json DEFAULT NULL COMMENT '操作步骤', + `custom_fields` json DEFAULT NULL COMMENT '测试用例扩展属性', + `parent` int(11) NOT NULL COMMENT '测试用例分类节点', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`), + KEY `ix_case_suite_name` (`suite_name`) +) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_label 结构 +CREATE TABLE IF NOT EXISTS `case_label` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '用例标签', + `creator` varchar(64) NOT NULL COMMENT '标签创建人', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_label_map 结构 +CREATE TABLE IF NOT EXISTS `case_label_map` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `label_name` varchar(64) NOT NULL COMMENT '用例名称', + `case_id` int(11) NOT NULL COMMENT '用例ID', + PRIMARY KEY (`id`), + KEY `ix_case_label_map_label_name` (`label_name`) +) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_tree 结构 +CREATE TABLE IF NOT EXISTS `case_tree` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(16) NOT NULL COMMENT '用例结构树节点名称', + `parent` int(11) NOT NULL COMMENT '父节点id', + `level` int(11) NOT NULL COMMENT '树结构的深度', + `path` varchar(128) NOT NULL COMMENT '模块完整路径', + `children_nums` int(11) NOT NULL COMMENT '子节点数量', + PRIMARY KEY (`id`), + KEY `ix_case_tree_path` (`path`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device 结构 +CREATE TABLE IF NOT EXISTS `device` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '设备名称', + `arch` enum('X86','ARCH64','RISCV','LOONGARCH','NOARCH','OTHERS') NOT NULL COMMENT '设备架构', + `ip` varchar(16) NOT NULL COMMENT '设备ip', + `type` enum('UNLIMIT','VM','DOCKER','PHYSICS') NOT NULL COMMENT '设备类型', + `sn` varchar(16) DEFAULT NULL COMMENT '设备序号', + `status` tinyint(1) NOT NULL COMMENT '设备是否可用', + `label` json DEFAULT NULL COMMENT '设备标签列表数组', + `owner` varchar(256) NOT NULL COMMENT '设备负责人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device_label 结构 +CREATE TABLE IF NOT EXISTS `device_label` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '设备标签名称', + `color` varchar(32) NOT NULL COMMENT '设备标签颜色', + PRIMARY KEY (`id`), + UNIQUE KEY `ix_device_label_name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device_label_relationship 结构 +CREATE TABLE IF NOT EXISTS `device_label_relationship` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `label_id` int(11) NOT NULL COMMENT '机器Label id', + `device_id` int(11) NOT NULL COMMENT '机器Label id', + `is_delete` tinyint(1) DEFAULT NULL COMMENT '对应关系是否删除', + PRIMARY KEY (`id`), + KEY `ix_device_label_relationship_device_id` (`device_id`), + KEY `ix_device_label_relationship_label_id` (`label_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.func_result 结构 +CREATE TABLE IF NOT EXISTS `func_result` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `sub_case_name` varchar(128) NOT NULL COMMENT 'tone job名称', + `sub_case_result` enum('SUCCESS','FAIL','SKIP') NOT NULL COMMENT '功能结果', + `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', + `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + `current` json DEFAULT NULL, + `expect` json DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ix_func_result_tone_suite_id` (`tone_suite_id`), + KEY `ix_func_result_task_id` (`task_id`), + KEY `ix_func_result_tone_case_id` (`tone_case_id`), + KEY `ix_func_result_tone_job_id` (`tone_job_id`) +) ENGINE=InnoDB AUTO_INCREMENT=479 DEFAULT CHARSET=utf8; + +-- 表 test-lib.outline 结构 +CREATE TABLE IF NOT EXISTS `outline` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试大纲文件名', + `title` varchar(128) NOT NULL COMMENT '测试大纲的标题', + `owner` varchar(16) NOT NULL COMMENT '测试大纲负责人', + `tid` varchar(256) NOT NULL COMMENT 'oss文件地址', + `remark` varchar(64) DEFAULT NULL COMMENT '测试大纲备注描述信息', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + +-- 表 test-lib.perf_result 结构 +CREATE TABLE IF NOT EXISTS `perf_result` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `metric` varchar(128) NOT NULL COMMENT '指标名称', + `test_value` varchar(64) DEFAULT NULL COMMENT '测试值', + `cv_value` varchar(64) DEFAULT NULL COMMENT 'cv值', + `max_value` varchar(64) DEFAULT NULL COMMENT '最大值', + `min_value` varchar(64) DEFAULT NULL COMMENT '最小值', + `unit` varchar(64) DEFAULT NULL COMMENT '测试单位', + `track_result` enum('NA','INVALID','NORMAL','DECLINE','INCREASE') NOT NULL COMMENT '跟踪结果', + `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', + `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + PRIMARY KEY (`id`), + KEY `ix_perf_result_task_id` (`task_id`), + KEY `ix_perf_result_tone_case_id` (`tone_case_id`), + KEY `ix_perf_result_tone_suite_id` (`tone_suite_id`), + KEY `ix_perf_result_tone_job_id` (`tone_job_id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +-- 表 test-lib.plan 结构 +CREATE TABLE IF NOT EXISTS `plan` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `title` varchar(64) NOT NULL COMMENT '测试方案名称', + `req_id` int(11) DEFAULT NULL COMMENT '测试需求id', + `req_title` varchar(128) DEFAULT NULL COMMENT '测试需求标题', + `content` json DEFAULT NULL COMMENT '测试方案内容', + `status` varchar(16) NOT NULL COMMENT '测试方案阶段状态', + `cases` varchar(256) DEFAULT NULL COMMENT '测试用例,多个使用","隔开', + `tasks` varchar(256) DEFAULT NULL COMMENT '测试任务,多个使用","隔开', + `reviewers` varchar(256) NOT NULL COMMENT '方案评审人列表', + `owner` varchar(256) NOT NULL COMMENT '测试需求的负责人,多个以,隔开', + `report` tinyint(1) NOT NULL COMMENT '测试报告是否已生成', + PRIMARY KEY (`id`), + UNIQUE KEY `title` (`title`) +) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8; + +-- 表 test-lib.plan_review 结构 +CREATE TABLE IF NOT EXISTS `plan_review` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `plan_id` int(11) NOT NULL COMMENT '测试方案id', + `reviewer` varchar(32) NOT NULL COMMENT '测试需方案的评审人', + `status` varchar(16) NOT NULL COMMENT '评审状态', + `desc` varchar(512) DEFAULT NULL COMMENT '评审内容', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.product_category 结构 +CREATE TABLE IF NOT EXISTS `product_category` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '大类名称', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- 表 test-lib.product_plan 结构 +CREATE TABLE IF NOT EXISTS `product_plan` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `test_product_id` int(11) NOT NULL COMMENT '测试产品id', + `plan_id` int(11) NOT NULL COMMENT '测试产品实际复制执行的plan id', + `executor` varchar(256) NOT NULL COMMENT '测试产品执行人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + +-- 表 test-lib.requirement 结构 +CREATE TABLE IF NOT EXISTS `requirement` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `title` varchar(128) NOT NULL COMMENT '测试需求标题', + `outline_id` int(11) DEFAULT NULL COMMENT '测试大纲id', + `outline_title` varchar(64) DEFAULT NULL COMMENT '测试大纲标题', + `content` json NOT NULL COMMENT '测试需求的描述内容', + `status` varchar(16) NOT NULL COMMENT '测试需求阶段', + `owner` varchar(16) NOT NULL COMMENT '测试需求的创建人', + `assignee` varchar(256) NOT NULL COMMENT '测试需求的指派人,多个以,隔开', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; + +-- 表 test-lib.task 结构 +CREATE TABLE IF NOT EXISTS `task` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '任务名称', + `status` varchar(16) NOT NULL COMMENT '任务执行状态', + `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试任务执行方式', + `owner` varchar(256) NOT NULL COMMENT '任务执行人', + `plan_id` int(11) NOT NULL COMMENT '测试方案id', + `plan_title` varchar(256) NOT NULL COMMENT '测试方案标题', + `cases` varchar(256) NOT NULL COMMENT '测试用例,多个使用,隔开', + `desc` varchar(256) DEFAULT NULL COMMENT '备注', + `run_result` json DEFAULT NULL COMMENT '手动用例执行结果', + `config` json DEFAULT NULL COMMENT '测试任务配置', + `device_id` int(11) DEFAULT NULL COMMENT '测试设备ID', + `device_ip` varchar(256) DEFAULT NULL COMMENT '测试机器IP', + `workspace` varchar(128) NOT NULL COMMENT 'tone workspace', + `project` varchar(128) NOT NULL COMMENT 'tone project', + `job_type` varchar(128) NOT NULL COMMENT 'tone job type', + `test_type` varchar(32) DEFAULT 'others' COMMENT '测试任务类型', + `cluster` varchar(256) DEFAULT NULL COMMENT '测试机器集群名称', + `tags` varchar(256) DEFAULT NULL COMMENT '测试机器标签', + `tsn` varchar(256) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ix_task_plan_id` (`plan_id`) +) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8; + +-- 表 test-lib.test_product 结构 +CREATE TABLE IF NOT EXISTS `test_product` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试产品名称', + `category_id` int(11) NOT NULL COMMENT '大类id', + `origin_plan_id` int(11) NOT NULL COMMENT '测试产品对应的plan id', + `desc` varchar(256) DEFAULT NULL COMMENT '产品描述', + `test_method` varchar(256) DEFAULT NULL COMMENT '测试方法', + `test_requirement` varchar(256) DEFAULT NULL COMMENT '测试要求', + `need_config` tinyint(1) DEFAULT NULL COMMENT '是否扩展配置', + `owner` varchar(256) NOT NULL DEFAULT '' COMMENT '测试产品创建人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +-- 表 test-lib.test_suite 结构 +CREATE TABLE IF NOT EXISTS `test_suite` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(128) NOT NULL COMMENT '测试套名称', + `creator` varchar(64) NOT NULL COMMENT '测试套的创建人员', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_case 结构 +CREATE TABLE IF NOT EXISTS `tone_case` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `tone_case_id` int(11) NOT NULL COMMENT 'tone用例ID', + `tone_case_name` varchar(256) NOT NULL COMMENT 'tone用例名称', + `suite_id` int(11) NOT NULL COMMENT 'suite ID', + `suite_name` varchar(256) NOT NULL COMMENT 'suite用例名称', + `test_type` varchar(64) DEFAULT NULL COMMENT '测试类型', + PRIMARY KEY (`id`), + KEY `ix_tone_case_tone_case_name` (`tone_case_name`), + KEY `ix_tone_case_suite_id` (`suite_id`), + KEY `ix_tone_case_suite_name` (`suite_name`) +) ENGINE=InnoDB AUTO_INCREMENT=603 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_job 结构 +CREATE TABLE IF NOT EXISTS `tone_job` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(100) NOT NULL COMMENT 'tone job名称', + `state` enum('PENDING','RUNNING','SUCCESS','FAIL','STOP','SKIP') NOT NULL COMMENT 'tone job状态', + `test_type` enum('FUNCTIONAL','PERFORMANCE') NOT NULL COMMENT '测试类型', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `tone_job_link` varchar(100) DEFAULT '' COMMENT 'tone job链接', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + `server_info` json DEFAULT NULL COMMENT '存储tone job的机器信息', + PRIMARY KEY (`id`), + KEY `ix_tone_job_tone_job_id` (`tone_job_id`), + KEY `ix_tone_job_task_id` (`task_id`) +) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_sync_pull 结构 +CREATE TABLE IF NOT EXISTS `tone_sync_pull` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=76149 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_sync_push 结构 +CREATE TABLE IF NOT EXISTS `tone_sync_push` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.user 结构 +CREATE TABLE IF NOT EXISTS `user` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', + `nick_name` varchar(64) DEFAULT NULL COMMENT '用户昵称,具有唯一性', + `email` varchar(64) NOT NULL COMMENT '用户邮箱', + `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', + `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', + PRIMARY KEY (`id`), + UNIQUE KEY `nick_name` (`nick_name`), + KEY `ix_user_user_name` (`user_name`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; + +-- 表 test-lib.user_open_source 结构 +CREATE TABLE IF NOT EXISTS `user_open_source` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', + `nick_name` varchar(64) NOT NULL COMMENT '用户昵称,具有唯一性', + `email` varchar(64) NOT NULL COMMENT '用户邮箱', + `password` varchar(64) NOT NULL COMMENT '用户密码,前端对密码md5加密后的值', + `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', + `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', + `token` varchar(256) NOT NULL COMMENT 'api访问凭证', + PRIMARY KEY (`id`), + UNIQUE KEY `nick_name` (`nick_name`), + UNIQUE KEY `email` (`email`), + KEY `ix_user_open_source_token` (`token`(255)) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; + +-- 表 test-lib.user_role_op_record 结构 +CREATE TABLE IF NOT EXISTS `user_role_op_record` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `applicant` varchar(64) NOT NULL COMMENT '申请人name', + `applicant_id` int(11) NOT NULL COMMENT '申请人ID', + `apply_reason` varchar(512) DEFAULT NULL COMMENT '申请理由', + `signer` varchar(64) DEFAULT NULL COMMENT '评审人name', + `has_review` tinyint(1) NOT NULL COMMENT '是否已经审核', + `review_result` enum('INIT','PASS','FAIL') NOT NULL COMMENT '审核结果', + `review_reason` varchar(512) DEFAULT NULL COMMENT '评审意见', + `method` enum('APPROVE','UPGRADE','DOWNGRADE','DELETE') NOT NULL COMMENT '操作方式', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; + + +``` +
+ +### b.TestLib 服务依赖 +### c. clone test-lib代码到~/tone/code目录下 +```shell +git clone --single-branch --branch master https://gitee.com/anolis/testlib.git ~/tone/code/testlib +``` +### d.增加docker-compose配置 +```yaml +# docker-compose.yaml service下增加test-lib + test-lib: + build: + context: code/testlib/ + dockerfile: Dockerfile + args: + APP_NAME: test-lib + ENV: daily + image: test-lib:latest + ports: + - "8005:8005" + depends_on: + - mysql + - redis + environment: + <<: *common-variables + # db + db_url: mysql+aiomysql://${db_user}:{db_password}@mysql:3306/test-lib + # redis + redis_url: redis://:${redis_password}@redis:6379/10 + # app + tone_host: http://${server_ip}:8080/ + tone_token: tone_token + tone_user_name: tone_user_name + main_domain: http://${server_ip}:8005 + oss_url: http://${server_ip}:8005 +``` +#### e.重启服务 +```shell +docker-compose -f ~/tone/docker-compose.yaml up --build -d +``` +## 7. 独立部署 FAQ +https://tone.openanolis.cn/help_doc/12 \ No newline at end of file diff --git "a/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/test.md" "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/test.md" new file mode 100644 index 00000000..b09df7d0 --- /dev/null +++ "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/test.md" @@ -0,0 +1,70 @@ +# 一级标题 +## 二级标题 +### 三级标题 +**粗体文本** + +__cuti__ + +*斜体文本* + +_xieti_ + +下划线 + +~~删除线~~ + +上标:Xy + +下标:An + +> 引用文本 +- 无序列表项1 + - 第二层 +- 无序列表项2 +* * * +1. 有序列表项1 +2. 有序列表项2 +--- +[链接文本](https://gitee.com/suli01/community/edit/master/sig/T-One/content/%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97/%E7%94%A8%E6%88%B7%E8%81%86%E5%90%AC/test.md) + +链接名称 + +'''python +def hello_world(): + print("Hello, world!") + +![示例图片](https://pic.rmb.bdstatic.com/bjh/gallery/03e17cba710868d9153176b50a5fca0d1090.jpeg#pic_center=100x100) + +| 列1 | 列2 | 列3 | +| --- | --- | --- | +| 单元格1 | 单元格2 | 单元格3 | +| 单元格4 | 单元格5 | 单元格6 | + + +| 左对齐 | 居中对齐 | 右对齐 | +|:-----|:------:|------:| +| 文本 | 文本 | 文本 | + +
图片名称
+ + + + + + + + + + + + + +
值班人员星期一星期二星期三
张三李四王五
+ +- [ ] :待完成事项 + +- [x] :已完成事项 + +
+ 图片名称 +
diff --git "a/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" new file mode 100644 index 00000000..d0a3a7f0 --- /dev/null +++ "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" @@ -0,0 +1,2 @@ +# hello +![测试外链图片](https://up.enterdesk.com/2021/edpic/0a/13/7a/0a137aaa28f48af0349cee1e568c0a57_1.jpg) \ No newline at end of file diff --git "a/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\350\201\206\345\220\254.md" "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\350\201\206\345\220\254.md" new file mode 100644 index 00000000..e5d110a5 --- /dev/null +++ "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\350\201\206\345\220\254.md" @@ -0,0 +1,2 @@ +# hello, 欢迎来到聆听 .md +## 阿斯顿发射点 \ No newline at end of file -- Gitee From 42406df0ba7e94f1d5903f17eeccc2681ca40dd2 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Mon, 20 Jan 2025 16:48:26 +0800 Subject: [PATCH 110/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9546-?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../000000000130_anolis.jpg" | Bin 0 -> 47154 bytes .../T-One\346\246\202\350\277\260.md" | 30 + .../assets/Dingtalk_20240614165831.jpg" | Bin 0 -> 6459 bytes .../assets/jiagou.jpeg" | Bin 0 -> 366652 bytes .../test1.md" | 73 +++ .../tone\351\203\250\347\275\262.md" | 615 ++++++++++++++++++ .../test.md" | 70 ++ ...26\351\223\276\345\233\276\347\211\207.md" | 2 + .../\350\201\206\345\220\254.md" | 2 + 9 files changed, 792 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/000000000130_anolis.jpg" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/Dingtalk_20240614165831.jpg" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/jiagou.jpeg" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/000000000130_anolis.jpg" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/000000000130_anolis.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..25e606c9c5d28fccaf9f6caa351e3720570e4162 GIT binary patch literal 47154 zcmYhiW0WXM6D&HmZQHhO+qP}(v2EM7vB$P;duEUCKIgo9zxS(q^`EX48JUrhRiz{; zCPvi`0H7`^q@bq2L4f!7eeMn<2axIvcp8{5LLf`Bgt(NV6wzxQ0TI&FZVS{Tr-Owt z_RTr+pn~i}Z87TWLF&hn?b~9+tqzf&fBN#k|LSSrg81WA-d-i|m5aaolgr%y z_2=hj_HKAy_Gfkz_|MO`yk+11&&}VD*R$J?KM!>`-kPrIhcm0+99~nmVdpky9@?(B z4?dm#lS}^Hcq4u7el6~1?=7CJKbPm`k4_qoTBtdm!=2askzov~vCvpS(=2_6fKf#p z9rWLiz~|Gy%$+cqgu&jLff zTz)IYo*w!~c5F_-vzg(j$wz9S!&vtkccdmCH4_Pd%DU~?UmvBdt#;fag6DST`_P~n zt7VuWz_Ox6Uawkys+#LL+QrtRrNve9k*t1}>aRMg8PDbh$2EpoGM$juI&QA|o;Q;5 zD<>61Ns|Ue&p(MPr&Q75i#eHsmf*Sb5f}wi2veg!;6603k$sp<;LqlB;Ol>%nV*vA zN&ad_V1o}M!W+VVtU-FmX!|d&za8N8 zOs6B-u_AxtHE~n1IPK6{oSws{hp1e*if_s^AsLB^^q5-wVDeQ8S{+x5q*G0ArrVnW znmx#~dTn_K^x=-+C}te5UY;F)pm)P01{c%rV#Qyud83aYX`CoG-?J_&)L8#vUX9p3 zP^OzS;RQiH=^e0~Jb z`HOPiM2b!nF4ND~_>(kw3DVY9k`0U15A`h0*@T6i!GQ-;)6R8)UINdzGq_~&v8wiZ z1VQ$!EK#VDag-STVR^sYzeE@omV^)Z?ar{~as=o?Q0x_|k2}eKcKyi31igA3YVthy z?k3}t_FXQC^RiU^&}SeN#+z<9RaeDjVzdVYFGh9GO4iiJB6Zn<{XM6d>cY@+8N1ar zkGZGL3ruzo9d~R~GKVIDFO?f3uxF!=@`Y5vLEh-=*?;W3vA~SO=5Hep755v?t1p&W zfMPx)F<1l5_@Asexbo$XtiJ4#(ZOY|G(6tf*mPEh%MM^%OZ+K&x4;I`Vbg#F!1Wur zsK)$oN;uHI{pu6yKv$-}Y>Pf8@$vC6u0Y_JnE0f2Z3n5+#cn6aRg-Oo2?Wv%Fo5AYO2kr3D24)~efU}`+ zX>wWV5GP8if%-3fhSgk8dM1R(?=-r2bPGSpTmP^Jn@jt+`5@iW{4$rPi1sRZm+oS% zM@dy_9{b?GLgP0e<_y@$w@1LMyZRXg$__V)Q+J(U2}75(|pRzUuq+D2E)?E z17nPq<+PM+nLR$2Ki#m!s^w%7=J7{xm3FR>*>^O-81mVQic~fs`m5*{B0bRWHy^pc zKuv2D_+Tp8D-Zz@cOS40?QFe(S}6h@W8uN&DYIL|N9u9&{RYg#t|nPr6eHIG#giWA zxUZ{I7uwjg+q|8>)#opK|CU-@x@B1>dT>OL(+6wgpYAx3U2L$*dnkez2(xJ3EW0~W zIZa5Qnwf1CZZZ)Oq^A$UJtT3q_uJyKHZX+c%?{O0KA>>K8sq8voxcm$OkVtYo(H@U~`Tl_^{{NQ>yYQ9-Z zlbNt;#UJyp=+N#P7_OjAl5TOoPb0b*JI09rPBsS>?NVjLG-g(?A?)bpt$z5mAao&O zP*b*@E`rG`cmPMnAx`Rbhb#P$?hHz-l#x-yHG|lQu3FYWAxO8cUuwy--37jn#BH)Q zGKd*W*VS7dVrT!72*1Z!j!xS}WMJ(;GcE934hW$SjlFH-tHdxH+fW2OmSAD@A6mP< zCi=^MUc-9w&*E}E#a1cyCFLtwzF7SyK+&?nN2`CX8I{+fo#&(KNWe2R5a_6GQ~}CH z+liQ)y00}wU@fT7Obr9K^$lp&e`&BtHlJ>ZmK(BuG?D7Mx!RA1pHlL@Za39bVfTHH zcB~dBF^Wd^##IbCgPyXggYub2^X!TQhl3TCXZvelOm=jcXKU9k{`p5pHnl_q_x1`f z9qyDySg6C3`m_^!IhIQxOveXx=|~z(<56OpB9w?5=oaj#RJldWd>ev;MzlESIBgw8 zS>yd}j;Bb05%|`*i|YyKrWUkg%xnWx2wzA$2b@2Gg;vp$i=awSkd*BPfQ4f{Jd{;s za8mMmL0+%`s{ZyP1Y=P}8Zsx8EzQYnV}HYE`RV8SZ_j|LbZUy!&i}Y>he^k6d6A=i z+yq74cJsYgu0tJHiZoF|kLocX1lEa?@q-Wb6=!2l>l4$o!FSwa=quMC=ld-&m^i#G zIn;EHD*_wgvgm*mW*W@rcnBR2qZ*Kim>l2kP#qhgWl=wVl)5!vHlB`O-iTxg5%r?4 zysrT05rk}LX!4K3zAbC6{spRPEcx`OCb~jOU#(*axE8HKo^oma*W+g!$nY%F!K0~m zo|bE%mz!kjAgg}Z@A8xd`~2jcGTIT}fx+AfXiBW@z(ax=4;cg0(scRAeUj^Bm3+3; z39;@AH)-%U-hStZxZq~d45)Ib()(Hf`xnoqf={^+9yDFL|El}HiFRdQWnO!40}Dbu zs$YjB)egLwIaPq#Xl#lgqPFZKj7Ufg_I3TU1mfn3yRjaSZ<)V~zpFzj%Q;=v?xMdu zECzLM<4t~hc`Z!E*zMYZi1i0;50nV7KCZNa8lXA)k455fj+@r!*0&QoJ4fIJJw9CU z9ho{KuQw(;Yi*EdpjIiDN_PAXv~Od&U;9)i?EmDrRnGWZE_Iz$ITb^onQn00rWPQ{ zTiGS<$FVP@W^UilatJ|j*NH$NFXHrN;7t+GiKU2jE03mLw6zpM9!XLL z603aO0enm3ciz%n2>ECEn$%DxM`TXozL-qoyjNWI&e7Oqq!72>y6l zWDTeK9j@F#>S~6RNUN$l$l{B1*b&D`;BT5 z!8OUUit#A4mJO8uGk0h`B@d-A2vm4 z_Zn5BU6}WmA9Y!n4T+CHpIdla4=~yqsS_em!hBD_b?yOGnyA|FS5m!;VMt+7Xj@OQG#4aMDcBpWW^ z-H#X#ao9?b(vs(3b zj}K9Nm0ZHBd-YL$bxghaG9^6#XFw^(5#2@SVs^uSQ@Z(Ee|vFLfYAOVc)lz;2pDmvJmCwF?wgEG7j9oV*^7_U%lXnezy1^_}g zMg56j1BnM6Lzc-Iczn9MBTQ>FAKcn5qs=MOT{+Ub-QtFQETH+l)Cyu~3SyMDvDWsivfd}@L0mH?^ZM-00G$q0C zs9XuwrFAMq+ziimrZ^kl|5HYp2kvL{MU#VT+NN28TC%XS`iMprvPq5XAn1Gkw#e zp7TQ|$*<2TyW9optBPRVhr3!2745576w-21`uZTYSk-8%Csd^xT$W4;ylF^i7Y2_I zvnCJ$8u@$B(hCJO>4Rq9-?Vy&K00`rip6lbV%Gm_h1d>xLlA%s8UJCtnj{mTSVMMP0tbrZzl$4;b_|q?|*j`k)T-oW^ ztzD$&U_udDP>C)};gA|L<8VRkK#Mc0^>|skhS2btSG-e!TDkK*w`;=z0ET<4FxCof#8auWk1wY*;ePscogO?*ryWHk6t23r zj@4(dGJncj^RGd|QchmeTLjL$tW^EMoi`@<(Nwud0Kv^Xwe9x;Z>OFa7ZCB5A1ExI-FyIR0qiINCA$1BXwB zS~5sn29XfO344kLi=bTWPf#&G^I09{cpsuZ$q*~LK6!lzJf<lj0`$Jr3G*a+r<%G zu9DL1i`&6WFBEeayXm5bqaxfj*3dQ*7nxG$+cGLK?$@Qsk+wqwt9QEAdUAn;L$u#_ zvLG|*WR%B7*80S|nbi+F)TAhzjRuEW)2U4I&fU5FY8d>67I;1D!vo86xK*Fn@tcWM zQkaVp4LB5e5ukDGJEgICic2czgueJX(w|J-5AW=)KcLyX2ut%o{{LnY9b|Yxie~IZ zQ!PoCBRW2h*M2#^ z3=&pk*|qemr5~C)`=ZAj?oV`OZot)mR}ZTOvQ6C57C*T$C*913Q15FteXs~DW%$SQ zPKk@0$r>F7EZzsU#8KM9zX+NoCT2S}WDAr&8=dMXQkCBXhVUY`v@<_q65%Hb&4+1_ zzPg0Sdp#2Gw?FwA`vc6XzOMuVDE4^$2xT=&*#FcS7K}9bI8JwD693=XQ88RAk9^ho z`V;noWtdVsETW!~Lo#bzaSNPl8*{bB`70Pq6)|7osh)y5Re2ei)imDLT*O+L5_)>9 zR5wWKR$xqMPK;_n=)<+!8C(^A`V|30eq|~|ZRu$kGDX(~&06U9zG^~-7%Yd};sf?0 z6L~xKujj+k)j03R`78~PHIkKt-ljm)7Nza0jYMQ|zpDRhS{uK;dWL&4*c~!e*MPdA zV!I=}Z^Z5PdW5g*&G1d&B4G$75jtPoC<)8%NUqrG%=@;|krvZsK{RsvSY_0X%If1Z zV>=FqW={7*iM5Rj6-bPe&bJ+F^}~DlV9=x(Yj@utRoBc5m|ky+o|!K#8ppzUe@ud) zhCUuMgFv1Gy#DBUO-T#4WplSJa&m`(<`L8o7=fLwP~#zf-<#@Cu~5N=W24lu7HFxSXRp0?Ak!3S#lPKETF)bjeJ?t@Ckx}sK5=@~-m|Lk#9#+8efh6v?SkITk`jE{ zQNl)yqThF`$2?cHbhF{AK8o?4XOP1?pEFAWz9Se0x@@=CtHpSwi{2wU*)lV;u?7&U z9y)K#c;xIHV8A33av`cJx5_6Uq^UIIA5_Ic81>2=-W?yi(SKe;7gEGEuTd|{5{tzK zLsLJSjD(01SWzXq%`S1w)79%L8Q}H(>uIM!@2kNIM>1Cm6eRqxYH2bqm{k4n!U0LF z^(MTC2Clv_G($|MJ}c#MV0O7-u$GOVVyO8W(fGvMFvNMQ{@5;Er`J%o8F?@nSpVL1 zhu#U8?FW8?m9lGzu)B@1o}8DZdN3R0jxczam3riEa@lQxaXIv^re;dI9?%~gF8IO5 zAesaG-Qtr74dE}yUPq2nh5_;IEx=bd6GVQrQYfcUr2bEeYkEDFd}|~(G-Sh>R)_IR zR>_vuZcA3c^eoyB-y%z|f-KGEgLkcTQE?xn8##woKS&PhVCzc7Nxb)XleU22gC!=J zE4W}zS?DAPpAy(KpgY5yG%T@Q8EOWmY+uNzFGXpHAU8T*g6T|}yCl~6rH0v(NT{}@ zMx7G6K!<$&t_I28@JT`tH?l{zb4Ix~I$>>?+3U;-5%3~cr7F<3!-r^+@DJg^HJ;=L z?^*116)R`Hw`E~Sq+x8cTy=Dp&&;*9U?>cpO5`uKn)7=>$(wP_a-C-uzLuv-=&Cz) z7nvzw5f;LX%uVW(e<=H+E`vaiHY>&iySw49E^xG25Z z)eTI@H=ivSM(2C!dukbeW3PH3uL#UK{OjO5rQiS>1TRjw?Z^k}n!HQj z(ekIwgRvU_2BsgP(>5>`L8CltRWx6HN9V1sXREvx7vS@AA3Zai+MU+#7VVn%La z$%B{p!t0RrlN>BG(@Sxoc9H_l2F;0+@z zeppD}y)UXxKtDMBRXXhFySZak=g>SmK(;Vi+xS<-ZTQpkK{D34BCbvnfFFL zSJU$(6!wS;9^kGmRf28YA81j$D{FZ9+adZ%DoV3>=K3j-DHHYN;8F_PN)Nj|XfJe5 zBE%MrfjX9-WFPStd&aj|Lm%z}z_g=;SbZ0WMuJd4!=jt!MmPdM(J1(Y*aRvYpLu?h zrdYRu-@31NkS!OE;uGEW928qp@^y;zG4Yk)i7=Y9+I*P^mn(2k?@wzaY=NQZtzH_H zgJS($syGB3_TrI@h{p40WBNO;Fb; zmsy^gO0<`f1iDeIMNT@p97tKn3eLQ(Pt}9$0u78JvF{@-SkF;Jd6AIjxs(Daqeu&y zm1EL?WLSe-J6-Zrc`ETr#WKc!9f_eGoe`6M4Ce0f>AmV@d{8C%BscBRBika(-r08g zl^qFbMXSGv#|<-N`P%{XPL7#()B;oe$QG%x8Io_`k1$L_>byE&1%G*LhGuq-N3N3u zT!!tGo(sHc4Qb@3xJYYqzTmO9pr!8a=*MoRqM(n0Zj>C`rHj2=T!p2(mx}tTnuE}c zR_hpy`mCVRFg@^qL5s2LQn17}DXp)M;j~wy5SU<}eQ5U&fKIQwqdD*7X7wOhdHzSL zgWnJbP5Iq*x1Wt7&wMJESqw3}_wd7Wz<&Li&7OHKSKRfll-#yKP{MxF^i83kkUkdD z2ny|B$${TGRwGLZhfC;H*k$@NT?~GNOoZN=8*}vuZKIao>)6D%6u$MazTg}hZyh-B zsA~HgU5B`B`qb;hQVMzkjP!I7O+>Lp{v29d+_MiNBb(4-9ECj@pK z@?EuA&qT)uY$k=j>8dB3$_Ew^nY|B`Z;$r@xOg~qC#3J%E9!~@am7cVy(B~P=Odlv@2r$Kr?0N>Opeye3l|NZM%eg2}Jy90(>D zk&K=v0$*P5A=d9V3B#TQv`lA7jcSz#`9x-jS(*-i&X=laG6v+ViURgi<)+9+eHp;2 zN6d2ce`e~7PweDTLo{-L%CkZCZf>Aer6EsRk#8^1Ckr0}@)VQI@^>GD#|ovx_}N0(!On3CVN0ZI5a^Gv5YYT(oRbM#peR5AXS9%j$a@7Mqn6R1 z`D66#eAyEl%Zdp$*dKt1ziC%VHA9A&$5#zHh9aZZ{+hF62_l1|W%+9^`1bH=ZOc~s zx?OlP!im`Bt1LVGir%4??;v_1$O(~w0+V#F68h^@93?$ktY~o8+X|kFFo!Qh99W<7 zxcH^`k6Xv*q}V6zWzNb5DZHDLTPtYugGb3f;d0h^ML$U^cfq6wknEZh=spJr312%E zc|SkinM4)w9M`dd@!EbZ(eF6Rdu%Kxi;`1F=e|7B7(WN>0J_nfD$!@vqRxTx7;gy; zXnp-n;R6-@R;T_S{aE>?>Yq7P)o*lVDRL+DfQi5^p1YTv^MBf2_dndrq9Utp)MO4T z+A!*r1MTcP%I`*>vk~f$5N!#q@AI|;)b#Ae9GX%Qhylt?3?c^6ZLFf45%Eu0{T|#; zjwox~LGPk+VO~fb@)scG=+S#lRcT6{WlIE{y(t`I5o&(+Q^NU`c(7?MUJ_o=p|6q_(KT4gfy%_ChHh{q|GYW1 za~af}f2vF>BNyGjH;hDiGZ)dXZd|ejU+hNVT~EUJH}s=ir(pO9=RE6|Vb00uWZ+WK zL7Zzm3qa)(Ox6EtLwEf?g@M+hnSb%PcWE96E*Sr^hg`?nJGF=Q|C#;);Q#z2zyyoD zJ2Mx=Ri%=N6jKF||G5d{sq|-O6WI)Iw|Z`9(g6?gAC%mpDrq<=aP4g)858jmQ{%f@ zU5TpEVv(G5cMuZg(8M|k2%7U=Ni*=tBK*caO&8Qjpa4EAm6U@dSoqh{%m@dhzig`KVYPU*DMV ze?-6;>{BpSQy$VWPhAp$|Mq!@{%odB?nBsH%^m!%uMwJkL#k5cqRiF1-Trd_3GdOa zQeaiX$>82k0~aR@iCcm=k^(MOXVV&8>p0Ov!(p_Ui5E#H*G|qzR`|PF4-r8~;p(-| zzjLa7#~*@{9)#M1=0r)H2In*`249m5Z45+>S7o6%|;g-@{$Y;UUy#ZfnaC) z;!SEfGdnrOlBklRv4>xO0mkTHYAu#BLw^sB;*>C{nc18N-OSi&`m-6;KS zHcq&6vdSL~DOBw20EDST?5xR`O(c;*np+L>#T$Hx3{)rJIh)G-XVPmInf>sUq&+as z*B%BN{p=h`vAiE zHs4?1d6!VJOKmGa&4`qPFLRopSPDRL-*qAW#IW<8j~uE``Ic0&a38WSp81JJT{Uad zjD6dyT3j^(=5hcJ-`q#EO9i#NAX78y`bzO`>=2Wk`1AEsOs z3;s(nQ7ZBBPnJyUi%_`yG!egqKg97wYztufo<|4c5qhZU0A^qeEQvjul0YnRgcRzO zNAi00f#v8T9DJlDnPj{_KLvFS*+~Y!o#X!6=e83*XJ246KJmWRs$MB$ce*I^nv+bB89Q+(;VQ$=5Pnvk(bl=P6?THe6e zL0OEF3%BQQPv?W4qjxW9BgEp(h0d{W_~p`*xC5HI{2?QD?+jXcCJI{8css!>^UJGp zp<}o+Vq}sZoBw)J7jU5H?!_zh1$!ssGHFubwqzv=53$ZMd6U1vi!)}iJe9@qM@KYH zaF-P7s&X&SlC^MOv3yTRr%JJpP%Pmx|MEzs;#OzQcMNFK%!w5Tj5*kUpvsR`jCPn? zbzedTr{{4hoz7|@_A(Ag7mexrd(Oth-2M$52i`-$o3-_*tzkXOa}5OVIVMNO54uys zw$kNyrBT40qbzGVu;Rvdo$=Km5Szlj=Y{ms-JmQhe)?+oSx^&xrK@5mm~HMGCOV4j zs3DZqc|MbU`q-6X3e;52p`0#jlx@*?piGRsJ) zAUhgs@Y0RBQ0`Fcl-L>suSzIh5GTzMVVhKS@fOT1u?y-j6$>~G^ z9aRG5z76tG1S8^La-4&7{z(BP`l-pt3cN2Dmt5^5ig9Qg3e5}rAYIcE$A$mMNI6Pd zpn=ba^2CKQZRbi(#RCuEiEQRPLa%}j+yN6U%(08upOGN$mO+FmglDHk@SX_wGXmfH z0R#1Rr3@wKbWV=#q*f!!>fo^2X8DUC*~U5IP6=Ydr<;`02CPL?|gkgbM3)!`nG>6(wd1=I4QSWASg|JKxnN4*Fpe_MZ*Si8pk+`+^y>aAitgX8@IrX0>F=G zAd#(K-hdOtA9rYB6t8KzSl0P$56KmuYx#$}9yf8xQIklwAqR>yZJkZ6rI>oE6y@O5 zFpg-?fjlJ23p1S$XrT8a=d9{^yun2~W`P4vVBRH_Qyo{DQXux^Vqk_JqGHhS_lDxT zbmNn?Wb(at#xNf)73}F+8|$rTORJv_;LrO0McP?Ep^vlvbP5nF8_6su7->_hO}_&x zx`f5i&9$|Z6b-ehHGQmK!*vE0pV0N!v3lDhb=$gWWub|j1~`hlFe?r9<=o_1?sUk% zN%0^9>XVeqa>@@)HXf5op4|B8z|;}p+jD$tX%ny2e8fvoeEy*Q#A_4sIDnl(rvFl} zu`D{t8Xy9`$;bug_Hz>uZfz8r39OjCQnHkn@oEj( zfc{c4moO=g!p$y1$TYlrK?)D3J%Z2QZ?5tLLt}YK2AI`aS0)jeQ9iv@#qsxx3K^`{ z>%|ax;EWwQ@{$kP-kIIibE{6I1c=hb(sj;&bZs}j(AxIip=~;C1ViGp*J;tFP4>;2 zZ?oCK+@=35I{z+QH?Lif@+H>wlL*jjufa!wtlC?zF*qI$z5*Z7CB2*E5z5=JzTo(v zynH;=N%K#L0Dw=T$uS3q#od9HrKKtMM`MRCgRicVMgw`JX<%FGH&s;CME&CU(FLHW zOO9A5urJ&I-9_n&sj#+@SwMyN^Ow3c=VM9-v*^5$%VWa~4(d$ySGz$w6Q=szwYSk) zD57-fibghyn`Y4PlJ-qidR;v}EE9(s1}+{0FWZ?pSM*35yI0i2%z2xVW9j><19EuH z?Lg>(NRHb4&+9Ug?#aMLKs=)rB~NYWwB6_-192cARHzREPe(V-k*n5WK2e$!PMgy| zGLFQn?a2rZ_&uT6FgC3YRYH#!3C!mR>OdI4cKY3C?G6@0`jL4#z);g$dxr4q)h~&|? zXJ6(owJDa=eqSeUw7K*-hK6fnZo#hwlk$k( z2Dz8yIc`lV=hg$m`d8#mILP|P@S_9IN(2w0Z4Z9Qb>=CryJQ2YA;Qg2!e_%|!?$HK zely^19fD8CH}E@)qN`W#&G?v)ba^MkmN014!t=#;B0jH5yyvcmQH$jXE>%HLi+B9w zyhH>i7}hW)it`%k0^?B=TyZnnTUC;fcxN$l8Xfdmq<$L|3kF*Gs4mX7?Fc_Dc17y3 zQRyxmv8}m{HrsAxs5m)#5B)oPuC*!OUt9{5Vi;b~9g=>KbdIO2ggR>lmmf{~SN~we zRe(6oS>*l@MFfgczWp(f0YtGqFcAji|AZb9kVnwJgxZhf6N)}UYKXRM_z`_foWX&6 z>qQxhMmBa}@vy|g2~sM29c`rgQ0mg}b~G6|A;qwNYQ{yZ2u-~MI=6TWhQ#)IK4nOW zPwfmM3CZ~61*W9%YPIkpApCY&$a?CWtqAu4h@EuNu}s(U$7ad5M|bLVmJ3Gs-5*TI zn2RH&^!FI7tBE@8>s8+{$u(EyyZ)H(39nKRsZdjz;m=r5SLkRqLz0(ihB*;N6J&#a zIQQfwi)K>6Taq)cFpwh10WSN(ab0~!a!1*cn7!?dcFvm6pF|RM@#&zYKm~{{4iZBe zu5*)qCllKS12~nxq$%O3arg@i&P@^lEHZ)G2mC!vSuv0OK6xfLzLFu?tvixSb)N)- zB<&YZ;TU%3*$z!<0l(64>2yReQ#^UwveZ};bE^^HLFq@2ud)nyQt>(dKI_eGD4<#C z*cM>Lp~S&#oI7v@kUuw;J#;-jxbg)OYNfXYia=gv`%~aKh4R9-@v-jN8*_6(x*g^~ zHlUH^X*OHz*b|6FPbqQG^ZZ>RlifM4F&Nb)w>so)ArPXq6%>~OILzx1Qu6jvdZ5KR zD>8r|0ITzNuM}dV{eTc5TsaT z>=fR`iy<;&_RxezHb`WZ5(D5{1a5Xa;kX8vQSYR<-{<@}P#!3tTJa6`)r7EqbHZpk0J{H5%X8~by=1BoRC}fT#wu|j?}lAF z{`@YA6{HK94WpX*e4kf4SX{~`1LWR!>d;D6iP)(K8rQ}Dg!ZTW{aiJjgeQh)d#U&( z6A{1g%r0+`g9QA`lY2X|sfp;(z)D#j?Mb2-(_Zqq^@~|TBpv_|S25==o_rNeH>pl~KLIaE&|7qp$~)glCzpHH^B#bFOxa_nV_|DH~% zdo+Z9HP+urKw?sCH+G{Zn%2_;lP(rs>YFZXP2J9N%LPSb72rDGxr=siy_#9tl&zzn zm18$At0@E7#`p?#Mq(DwaTv$82g$&s3sjfPTX94>SJx<+*VN_^;)UdAt+2vPLaaD` z&UmJ=%-Wfkm?Sz;vl-`HN`ow@7ni9QxI+mt!9Yjt>C*p<)kBHkPhcr=>I&o*001QU z7j{DtE>Knj2>+~lwdSPu-851eKQ$`>ae1qTk)^uqVB=;Cyf2PX=xO+By7Z|#pGr4C zMnEc6h}oL70Rjj`Of@=wo<5v}>F=gMhAlw}FgH>YqpWQ1q9LQyLKIB0TR1P+U*ArvB`pZS!>=j@_I=YeMz*0F5!E8o>56!Pym4PR;qXS?J%Yz_5WZAt#L_ zvW60Gt@E#?BLu@pEJPnu(NU<;EXi{2+YB=3D*UxX4pkPPI(yVyKr%tBSL+(55sf9y zs`Az@J%-t2P_H=XzG-3y-Z! zTw|3K901vMC21yN1w0ZDc}-j|eqoB^@fG3^&!eUx_S{lM-TI(TocmQ|bC;ky9(-^r z4)?Kxy!q8)M9JI%I|(wr`X-*%-V&3Om8>dubm2+=o}*Gf0l+JMo-T5(&(ptone*yI zNt2Q14E9Q$Mn>_DKsQo--SleA-wLFi^l-<>I0s{2YOG=2_hEAr2zJYQU~jSHzBovZ z#+xZ468C+Jmgo}&y~a$eeXAQyc9qCYB+%Lb{648oN97ckbUyEOozFf87inJHpC9q% z_z^I<75M_fVmgnp%MvVD4-^FCEF<%lyZsucDF1tpLHrN&O}g3OCf0oeOKw8mCZ4q4 z@mfQI?5jG9JLMAy6z+quVzCXpIVUHfBQWdc^{o|tx(gX7CpJN9*Ertz4i9g_u zw^Jk|Q;RG7^5j>PRDOS>#%wtU08lKPoYv`Q@#;zZ045AP#B6w4>-n@sXeMMh16l~+ zoG(X^`M?3v%Xj(n?SB}9g8w@~lt*UtF?0F8V6@!}A@RqlpM=>Y%175X1K;YypD{3_ zrwJ|c?k5<=SN0PAAc?KJe~~c$po}B9D>NUme|~{Enpw(E+wlu0m^|H-p35qriiZjT z^5x`EdYkJ$EE_Kw--MU>o~ZiO2En$yt9S%tBjtVspR{>k66u$zi34G9)OdYxd}a%S zK`@BGaaY?u5OOxsi(H5iX(k9#3lD!_#f)9}?Jjlv)L$;QCi#RC7#vPubucUMO?(u$QFXvrPh9!6O6Fj4rjJ-y_EXb#Yx&SI@b6ODObfJXTV)%n zoI4~Qy9ZJL_V0QvU2OKa*%U-MP$ES?Mfrp8VbdSc=^q6Ll{#0sBPpQ+08=Jz5NF7<$3u6D{-C4>aOmZrZ28q#+m5|SgPlcRDM+c7l6jcO zq^etD1rOpO)Wax^zTAER4e^6owCNVwC}k`(S6J+w?qGpWXPPDc76*LWc&k^e2m#Wq zy!J(#`{vIdnC>y|jI5h4LUa?ckUwjJkkEZ#!29ss>C1gY$y7fxbrc??y zq?r?;CE#UZfVuldb!3BJ6NDw8#M$RVvAcz8Zd+4B1AK6ROcY+&ol_%S?+Aw@l%!V=1~>gA~}D{I6{D zxLZY_`Zjv%$&^~*2UnG+Xta(fpS&{(af!d%0)nVJ5CMM`1n~>=Z!P+eox;@5+`e-n zL|(c|?M_cnkC`~8lYgDlIbF3pLET~t4}N*-iEi#11a`?q5^AO_gCJVKq)R-mU(0KIz4dyU2NWaJ))5# z_Z0eWd}+oVwevul4LG`-+lYhZO`^B%YAqqUk8@f7AwNa3Gr>#J-2S3}UE#8Z9!>Izh~yK1jNoCm$(Z%S0d;6D}Ius6p2{y$e!W>lf6>=n>~P%#WlKxp{} z%&=3rdPU#wI((VgU*Mo;E{Z*62DPlC@Hz)lk?}jLr;>i{X67Rt;i6Q2y;RdrAh%-9 zW@Jf|p4sG}#T1FeEV;|}FL&Kb3na4bFyUe_gG|S+F5&7Re^x+Cp8231)?0Wdu1Ktn zoAxB8q0+Uq+18+UQ`GDIkGkof?wLmiH;H@4zJ>6nbABEKL|kSY$`jpZ0KJOUc>y}l z;z2hdWBQC}WSdC`JPM{Kwr?0kQvyQld-6<6uAe?ku$`hhYI@3|)Xe}4Ix^ox;Z<(C zDBA0fWMOgOBxIe18;HZGw{3SbFz2`BC|+7H3U`Y5@@7(3*cr{3sU7$=-Spqy%lRR_ zSy`IEE(-vT`0||0jG7xRXA*x|QX_s{VIr1gM65M#*&g6ClrMb#!qp|x3YIuJy8`_+ z2mk=$FXjROFi!sAImI=P{*WvT?LEB0g<_~P@ctQq3yUYWV}p!USGVJ%_u`;pzrX5H zEuT0?2QJ%c@M@`Be1=gwAZA&RP0<6eTPf%*TaVFY4-3qXf3TM>cYMbeOF+vF=-R<{gsPE7~NJh*f-SjEo?A9W=N1+bS5aFaabEQB?rb zOxub=jS`ivTeoqRHAYUtzv?#Wi8!Ib?WT$r;K@o+&M>ksGs1>R zY?fYjw#q=BRvaV4x*7FVJh_Q&n$_o?=4o%s-I&cRlN29Z0mf1$}0r^5rVq1IZgoN zr3ltIay~SnQ7= zFdB6e26n@|5tRJ@D7>v^HZm|ttZ~PhL1iS1n=~CKw+>TxXzK=@!jkk{8VZ=jGJicE z*L0~^M)I>MIZ6axd?Q|%_VlJC0CD)1kdRX%ZC{|l#ZU@%m-~{Z24n&o6~U(ti2#z) z+casg6b^HnbhebDWmnfXVYYbrP=Z$RVB9v(u3a0POlkGdPdcFzK>WD zi#R5T;q*&O%L1DxFAi!3qnc;7%0SC_&8D4^*Uj$Vx=}hXPuZG2XSH z#IGUExvoMnT;dXw0Qi&zlU^^K!(QGz-rfHlUY+@nx}}<=tkixaJAc-3^hS`K3cvhbZd)S?r)~5hhz1 z;?yV1y`I=O+ ztbOPQ;`%#l0F3UyPQ`=Sap)iX0;d84^!GJuh}}5}(s*4o<7o2|c1)>y`UsS{=GsOO ztJ-AXJsVt6gQQw}Y%|`C6?og3vDn~-Gb6X#TvgS31O}Xc z1+*BxXo!{;&N*C|!_#Xr7V&DX8MJ6zf-I*xh`yo+JSs0|QF+Z=*a$UrJ9WT|H}!3C zHx|jwM%txXY$F#%45RPx(Sk0RG|&HVBFFlBMDM;e;oBl~*U@}Q>=QQ8(;8EWY0
w{4Os;7bBJFdc<&xkn4FS$fb?&kiXSE#OXYevk?s*A|}Nj5j*6RQjUJC*ptlj zUAphrs?{sGX{SP=b=oVA5pog9HfEM=T?ScA=~SK`OgyEUPGoUr9Wc=jCFijsgl?s97h3mB ztrscMJOc%7d2;R_YIWe*F%Dzoq#=U+>=rT7qtO!LNcrhN1~U1pM$_Fc{|^9DK&-#U zMNgf#LtUjObYU)=o%HCsD=3EQ-_fw}vLxQB2X&~so(#Aktzw6g1ILFu^&!w@Ah(1X zF3?1reQ)m6@i+Tr8j$-NuBK7~jLr<~sR;Rb+uFx?pRcp+JG)Bd0gQArIf1X|I_3)! zlG?1*$6QVN)D|?VWor!!VR|w00058ZkN^M^$FlI!l|9yyRT^x=C<61UV%{N|^)nMJqoI+k;poOa(1!t!irmf*&_s#A0 zCdZr^c;Y-d1eSAlK`%YqD}hKDef~ciob!B7g*t6*p4s&_{3s-hRqsag!(s?#Te)N3n>NRO!q7!4{r118r!$?$yL<%3!vsFrT+YkviJcQ>%x)`mjrpUgHxdhIcYw#$#^Y61gERzng8B9ml(=KL3crKzW!YSPyu zOZc>4R=t&nIO1eIZGWdN*+R|{Xg(PuIvW`#AK(jc00V?=_y7Sdg)|yM_uI&E22|EC zOurj5K%wmVqgQx!?6gTs5S7i!3&jGh9GjQG<-4^cBf8IiV5s+s!FA`5``z9`*Gz39 zLb(SbSwM+6Y@nAwVn&(A--tJY^87k2At@k|W%2S}jEUEQOa7l#U@n`r3COK#-Ws8v zk!mA&*+I8Dqs-hVc4G}fOgkL1-lkN#- zTVZGty4Kt zgMN=F-OIbRmvLEBux~eluFy8PVAV%`FCe5C>Fp`xNoX!=?Yo>a>OoW(cWH44SaQoq zOdm`z60d&@RQ!kFKD;};{XWATBJP**mcp{MCX0JAL2T_t)Y<{fB*!M zMsxrGDQNAH}{;4D2}6H~SSd zg0FHzW&MrXQM#gUpY7DvXh0-5H?m`mGdx#9-^y>D6I7+wv6@AsMyEJ)k-&dKBJPKJ z&4C(O-4TkHiPQrJXLOnHna;VJmuRX(`O<(tH#z&xbOFa+U$$A zd8=@WDqu+Fd)3x$Ws@G~lF4+SB^uzC#_*wR=ymcONQ=>Elzjlt5;%5-N8-yCqx;2{ zcQmMQphI~kB73j#4J6Y}L!rcBodxJ_IaWBV$;2USoj)Nmim8=_HPpZ4@_tyF6SWZ;i zsK+AhCZ$Bq)!%cpLMs(F4W!f#o8?DtHf?I~(l|mTc0{xj29jnj-Sqy( z8!3-of_nR(QaJc~JB{#evDjq;s{ha#H}ssO{mn)`qb%= z=ijb*yCFT+URf(Bu$L{w#pU&Q4j;RV9&^Fo#6 z*vq~_l@`Bz$rRE9o-PAOpr4{>ub5A4y4@gJ}SDZ9@NELoC2!p zGBAZR7~rISMwu+^mc^5v!SeVY6CtP)|MTt!FtRo zuiLcvPk7Tf5pfzCKma64GoSzfJ}pk@YvQ(vWk{!u{X1&!9A#6OI9cTcG4p+(wjRQ! zmhJeabxa+ZS>=VCSXw2l_WHg!>T@${R%GW%uM>T{p3b3 z>u9tHgi1J^bK*1IzTi4>IW9kVUR|1_Jj0OF@ z;v%uq_sXAv4Thj#aKpXWwK-`iG_h`KW|Ml=1C^7sjNw-5M(b<=AB80z+s#s_K9h8dPk;%y%4!5*f&i4Et||-CaMtfOm@icV&|Wu zg?QjdY$cayE*Lh$Z<5ZvK1As1>86HRSbBsR#IiZ6*PDTBFugZa0NVxS2j24do!rB^|jZ!{MbJ zshZz1qt?R92TmAe7z=`(tFPBn+aoRN;7-_5&rCX=hm-&?1^6>>XTMbd07vv^KmY&- z_sf)-M-rMKLh(x*7!~PxI37+#j|BS!(uI0F>P%U<^@_X>j<~{{TI_V1W)3I}wlJ11#_u&zb zof}DPK&})B{(MNv+x*{C;k8VGt2iIOD@q(6Y#8?KN!s&dRIiblT1f6M=__-Gc&!cJ z^sV}Q{%;40qv(*oceRO>S3nuBMl_yyI`6_8^CIjv8hogRj)KDmc`OfYs#}ko+ORDK zBv{hT574hZGCj}*Gha3m$Z;X4m)DO_z3j*EK0N492hrSH%@?c8d$}O_t*)9{8{LHv zQa_FBDRfjUjQ)cc^joJfZ#W|IE2xvMPza1kV1yZ*ZbW_3!YDCdY;QP^JJufbd9pH` zz7h8tWe(zBZki|(b5K=rEKxI*kaUPeiRQYk({6hU3x{yBa6{mfvTIs9{|r#G%N+e? zBobkZ3Ci^o^x5-0Yb<$Iyxn+ZqeKCD5yNR*cBN<&ct&MTZeLv@z4&{axw5HX{S}2R)LnU}Bu%DB8lD~%ff#pJ6* zn|I&<00o(PG=fBn5nXH#!-#7Djolrg z)!{H$`JrUdW~dEOU@DgLR{tqnVCk)%!SGXJZo!NA1&n)=;gA5%gacn|8>zom0)kSg z{cdpkaV)j_%xBPCC+_@crq8tEU|h$$c3pkUqzl-68p5~%a8m_O1uH4#$QpESL{BnC z*q&!vyPS>)RkRC$eonRcAx>IXogRDZjJKrpfRyZOkmASx!|L5@5h!as`VvH&j?BcS zNuyL%M$~=t8!WLClYvoHFrs}Aes5$`;H~)= z*~lFjD1h%~wdT_>=@fD_Wl`2ujf04|5z(Qq4?=4%1$H93@_f^@T^g!N9ToBR!U*zc zwEat^h_|t8&hv*ud#y^x+~GMI1r+Z2Qf)+=iZ7?9ZE88)U33`AL0@5eN~dY9ChG)g zP3iT;C6EEq83{IzT0%U5BltOE8thpoH%wlP%sR(UORagADv=6EUP~pLAEiZ4zf1Ib zMg&g!efRt*%LQ4B?R9bO3?y4CCMWN_xY11VHhJwCc1+e@mA?z9p``p!1h0~a-ZrgF zu&uvFgdUi)cmH~tJ_;nf{F4O-ndW+#TrnNy7jD{ean7td^;sOVj)qKnU;qf} zjOYLW6VhUY`pW*Bdele)k#yZ4(7<7_v5mWdIvj~3mPPQtWCX#Eu3r?C0!6l1{s-6r zUjPF@aiIu{5{UVUC^Q+wpfa;P9Gi7fc;N_vFwNqV`_@tZrO8y*ff&D3m+dRx#kCgF zV&b_^F5EW6R`!j;8ZDt^)C=`;m0^RB*=_@k@AF)xlK(q0@FzoLqar`3q9dGp9E_c# zIN8lmMl^G=ruhepd)LMKaMSg+r7mzL%+su6m@l>KlM2d3c;66Dv2?>G|B<7($p5-^ zHMDzH1x-hNv)`S>?Dr(FPa5+cCbD=C%!j@COGvbCHOPbpDhG1d7ep>rQfiglJKv2NH{U%%A zE0P6U-zRW~hH>!IA0A=SZ->}&Iwh`++*nH~ceP@=9d&<2{Y-&-!l-B^Q_38Y6m?F? zxbqViA#w;h5#fAx!?#z1}RhlaoTKS_sK|66z_mPlv*%zHZ*BTgs0<{Gl*AM*u z&ac31-~ONgBdzrS000V7_ZIus1h$U0xQ{f`nuDUs@yh}bBO=r2GTD_prTZvmbI4yQ z1HPCOdIhaM#z71;Ebuu6)v@|Nk!L`#_Zb{QUBZ_=w8nQ2#UP&dPk9Y?OQ)WN7SZ32 z`hmXa4K-PYs^dJX+6OND)#QgeBqS`3^^PRXN8OhVfb99@XuZz*ddmYDVmtRtNXR(a z323?AYl&Mslxqrnu5NUJwgf>)vD4TxEi?)DriSQi2lTri0wSM%-LIhMy+UWwQ>Fw{ zzgVr3>L)}#B`y!)2U*ojsWcZB!)Idl<4CAM%{G1DUgZ0qxKB z+y-1+5WqvW??Fij+3ydpo%apdZCp>irleBIu;$U}lphEHqMi|mq3z)@N9d0igO)j* zkyaDLb9?-57$)5fh~x`0PD>aL*ab--%_tkqU&U<7}YR#Mc&cjh0p_bT`My9mjS53&(*XQihL^05n&?iQoVL3IGk_m!>SAV_U+?fZk9ykOeCegyj`TP zFgKl}nAczZqnW~QWaRyFBI6v$T;$pO%}3Y=?rLx>)dU0;J6uCKdJQsI+*W@9 zc^c4ZWM!Jb@Md1(%XETpoP8}5)y{Nv6h+_e-!y*Bre2#_=OPWm?oeg)Udys>$53tk z-zOev9Wvf>z`M(p?MMkq(d(!@8dLLs+OaSlb-z{Y28EEvZ-kH#WS4>tGXD-vHo5$E zH)y?fmH|MIh{$N|B^aRJnU8hIrtwW2-={m_Tiwz9n#)F~R5;@_X;JlRL7ufv@`)1@ zfowu|Zz+M0(`N~kC%+Vmm@!e|LI47S!!!T@02f|*c?XJNw*szP$kMo%1N!CtHBbID zFw;JP#ZGAQ;=20t^M6@vo_5A<3}4tOedzNR-teHCx!l)4H8o?yw|ezSa!!vZNzVYL zb#L6Kbu{e}3=GKw zj`pr1gQ2H><%#=+-y8j17!I+Ga`2Zia>CUw0zM(0Nr{OIyy=0^7jysvSZL}U2E<#( zHd7eL?CJ2%vwKr#dg!KAK0>J>XWk>#2E7E)d3_EZ#K&@2@yRA=)EV?ar_7 ztZ-U{>)0>*6-qx^0MP##Tw4b|8;a9sZAx03~;nCtNRXMEFs{PO0a6WN@wuGyiw|+`ho_UWj5N>p#{Udu%S)~%J_Ia!1&#XxL z-7>2bk@=`HR?Qn_o0yW#AC4?)J0@kPz5|aX&j&8iA%&kZ(UND_UBdtZ&un>Z)`pC2 zbWV^b?nuYIbBpu!fY1P>FofizlU)Q481BOPR&2gqIyu1sbqYg`EY!Fy72DRU zhLKHL8bA%+Z&U*eG(tS&voY5f%I(s?0ICPs0000z3t7pLQ_GlnwE{TR-U33CjX7-nYD&JOK24i>we zBZ|+X2}l%shdr=IOuB0~Go_hZ->Fhs+V$%beE0052q=qK=*B2@(ow|B)-@e0fSCh5U(HQJfAE zPr4@7Vgfjqmob5TLT?D8;K4)`W+w-&yrFfJDpN!tGK5`Xmt6|b%k2rWC;;3BSC)5~2KJb4`-3PLG?oW)ILBlnbh(($0i zJ~@NkAkQS&R@iwGi)DHg>uyvaEoIaw*(l1XX6ZPzPAHOWZO4y358lh&k6T-Nx=&h_ zEjmyL_~+vt6#cD8YOZ=ixwLN_g3cJfLoNmXytE`2l4|$>000M78*HWCy|^|)vyKbo z`e&0etNvk70-fu&PGEp`-h%K_$+u-|>KYMl7IxGplv`VvB{@KNW5#s7$O3L0&xbX2cJJcS>EGiO}XNgM-JT6P^(ZNzPXqs|@ zO@ynQf{M=CScxQ~4MMJ+^Q=p1Igzt95JiDNv-g0}XOn+aw$Y2ia2Z4Slit%M>rl^Oj@1Ugw@;4wFQ)!G=ybst+u!c*1Spgx;d%J0z|=5@&%I2 zyYn{Iyp~{+X@Fa?m&jQKIP$AS6g$$%fDlUfvVf3fUP=K!7KQ1zM3rY#JG^jIV_QPfCxZiZ~y=T*f|Ylyo-ONf4kHK zZP!@T*0mb7dtE8HRp#%RT>;(^hw;$GB{3dewu1hD#jNH9wTPZT&-;i}(Ma8y#=z7; z1oD^2Rc+DIzW=8Np6sbs30Cx6^kqyLJ7%;QP#TJhe~aYcf^?^O#bQ?N+F%GSs0uVx z-9NKY2KK+B-5_B6M6(8zNtz$cwV>S7W>P-kxCBgu|08@N^_1VRkmmwvIV5${6V~s- zmo7iZkE!9Wx!{2!5{mRbfj*3+Q$rEBk$@F`9Linw$pTRCun}DB#@nOapq1%Q8fUcs z_h>(4{~@7E18^Y(Wjhc)AauRmxMUGhdXml+O9+HbzO=4oYh<3T5 z50xTFeQ3*&*?-~Ee=Ns%`)DB3ygf_9veGbqyH|x=S=@IBrJC^~O<`4A+*W?X;5L6t zZpH)Ng>NwAm{g~JxVYja#e56?lk3!p?wvcP9YdPDMo$Em^?7!qOz2op?N-IG`=_qb zOa;wDdMlkV+3`)?=WlN0C)qp>QXt1oD0YTsC>_NBzqFfR!$yvqmEuvp zE*OFsWP$Ao(@&$x@39<)gfxd@>qm~laLF% z8jf_DixEJ&JHOY!iB1I%SdEx57|?TpBTEFfwx2Qba-j_}{~S)rql3xC>az)Mbx|u| z(Rgfz3d=AH>qaShn*DDppN0{RL2oDbb(1V_+ zIPl)y|NS%!>e>7tvh4WV+ZfIiDK@`wuFb;Cvu8k_PGJPg;qcDC z2hkdbeTs(b+{|E_6B9w@E=m*Yj02LI^}%(z(P|kZ$X}52Rj~Lq;ZwI3ebe4Y#c*7L z>m*;!oxP*O1>GAlRmgs7-u=5`<&7mD4h^LWSwT3}b8o6CkRyeUDO@p@)9YpxH}oXr zPKHCuio&B{n5r_cp-d@&&X8ur%wXX*Wn<2(seBBC;5OLbkKI~S(bd=$PGn;A0;rV~ z$;Xh8uVon${*fr?68z|#pO*kB)0=<*1^9_ZSOQ`KjDc)LCZzJt{8v0ikhQ%<5`xOG z^bM#V$K#3;UD!g_gr=Su#3r$7y;BJ-s^x>pjNmBO+u~AC>n_%X`T}w0J9bmhP5c^V zss+i3<0<&L-#Llxf>1hqV`*%c{2;Orh#|Kj4;L>JZe%>MB}2E#+=dpo1Ax zyp*Ij=G0-!NXayz1d&pFlOpw9062)xGt}H^VXvyB?4JzVL)L#DYj|lHnns#0!}!I# zjyK!rb~O=kBZ! z_jnl7icgE=2PIczo3XHwbn*!?gdk1)22i$lElhSP;AhSL_(^XlL{7ys6kkCYd_m~q z8hV2{6Dmj8-bPT+Ip3j{#sL4e?(Li%QjQ4%^RD0PAK#hoD@kYL3-sVtS^3uQ7wNj= zMfVRk$$;r$e}3X*U=c2_niRnd%YJIfR17Z`bm+$S)5K6Fm4?^ZA*-Q&yE=~ckPJt6 z-~a|g8*OSl+}kDK{!4l_f*>Z6iHOK&3P3b(Pas7wgfPudEflp9$R953Q#QiX2E0F$ zuBA-NF_q7_ z18F~9DknS#0gCI7c}Z+I>Dv+1?`ST7_x|@^UV0Pa7a0ajt!vqcW)}4#oo#*+e?xA_|{mlRI9gA&fY6YZR!@r z%a>Y|gwS|lF7R`jHjiv`=bq!EXd+PjS&B#tHt3Ms3A~GUR+)y)6KgY9#cMLVo`pfZ z>DXT3upAspe6WX~Q62Xp8<14B+Kf-;0tov+000(j$jQ;CbGLHk@`9K?QJ1dvP z*+@ZKJ?&X~S(1c&?N;%f;oq<{EXA(O$MFrMtf4eN~^L1bO3g?wqDFq)q+U}52+ z?Syx=Yl^8eKNvpcbg8+_2}lwjB_o$Hls#n^>zEk6h|Fy_@X3h;7O4-FZhRiyL<$x2 zqymL?)>dOFkU3zWIn!0KNp(b+9lc6!$ZQTXwjkG)m}a1iEpp9^x0K7oD85Ck0$KfO z27KwyZxqfzWJy^GcV`UL>`6(C}3#vApij-i^8)ktg_5EAuII*ctXMi(7A{5Zwm<$V43qq;T zlHcaI+A)=7>*~TcNP@kKEzV(=O2}yxsId`Y0s9^f&rPxhsO&o~kc$N1>4ufDDKg$f%xORX=pTgSjB`3$i_*rMcr7Shmbx$^hM4GjMeP>005AmhT!-TQ%Wx+0~hUzA{m{$>!O&+`1p3^1Aa3Av>GGkUWm8XM;gAfibxAUYe%ywx&w@b^i0(wr1hB{)V4_wM&vasj*3}EK zvdCD2TW#XWP0B5>(x%UQyN{pBn|D4sX^Pp!<<4ZqpvW>h0Wfj)tN;D-dwyQGBxHR? zBj87Ymv`fhSS6fDAm+3gEO0}sX9z%>g7rhiW=i${wC-=`#>xpk21C*(IZxHmJ7ax8 zZu`^L-XyRg688EVrD=7fgUsbJRcVp(MI5L}*5&I>BiBHN?z;n8@GELd3bafv?tU26 zG37KY8y7dyU2}F-nDX}Zi>+9oCDtAC$oPZ98qb$(K)>~+oWjxOcl|l)%RS8!g;&*V zCt3X$#@9G1Z#<)N#@o}#tf$mk|Ib+1#35XH{U>s2l9z?`4>Tq_ZwJ|#smDd)3L=NL z>Rc75_v>psQwinkqfHy$o62DOyDW?Fqu-u|zDgZ;33(xLuU8-D6NwN_Wx8K;F=dAk z+wiz1H1^(@(HPABDXC?5`si8(GZ|(*LLjw#PG0;W;Y@@s=+wdR)%W{I!PlqzjYW|m zR6F9u_YC4dScx6thY9|o&(M2~+TK4mg1sajOCp(y;&WtVi2?reg482xzOjjt=bOkO z=rKfu9ih@HIbkD-h4U9SZwGyHy@NjvqlK-+O(buV4VF1_6(FSEN)>%BS7DRcMnU0B8iHeoN`Wr3(KMilm6hB44XgdIADH_LSjGWF#g~a z0xhr?^NjZx^5z@L4k8fgWXAMxIU74w5>#_O8g?%TO0NT7+ZRVNUrfG&l>8Xv-ECL0 z-hI&)NL^0m^$|oA;_AOO!VI7mjF~bx2S?W^1xvFqy|%n1wj9B4u?f!x(H|qA#SSBg zI=$z1QySlUOMmt?SE7QjRHkkTtxZta_&~_1CoMvl$L0Bt^&C1KTct#it-hq{*=VW- zSG|(6oP>4^W?gH#q94^X%t)VAw9Y;$st-o=^;U}LUciD#@)OO}_F6A@O+X;*gmh42tnNxCD(bUpKV$b1z{gP8A3|f7S zBf`6hBc;xZ0mY+UzELu~`EKp-oO>v-T)PB^=&Cog6`eC(%cMFDdd z(-h)T$1p?n+mW2O84CC1Qn~{rl0}_NO>h7Ne@1iw2PYlI6ej753hTQrNpD;~*)$(h z4?wO&j5Dvza*+A*X7|qubMK2m(~#PjD}mMFdq?c5a3sby=5n3~K=n#*&n7PAu0FMU z!gnEcXz#$9rs_r`#H6S3Z$F30(VrUB34{yMn!Lj?m}528StAWb!WaCqE|o^Y->m>o z-4vryDZNYV@Xf20Q^t^IE}3I>kt+5Q&y)s#dNtrxI1)~QP@$gof)#AhiCYm##qKtR z>G(DqtS7vpGZE+wt5COpM7iqf!|e1go#SNitA6b9%Z>Q%2X!NLN@tMwPq0lBZuZoV z7_z(h_?NjDlj7 ziaQ_Kd}<8l!rl=><<>6ob0r10DrY-NR-K-_fg=@VWnM&)P_XnP=-Yca znvSC!dL(w?OBtao*@s+oQ9AmFW^Je1$G`f5i$LkC!8LL+*~oLz@WZv^fRs1WXjH~k zpH*c3Sggy({}{HCQZGrLoUTmykGazAk&@-Sb*J2x5hC9z zk&ONr%A*C0kmdKw23LmRpqlf1r4}i;w%Cgtx{@$*Hs}h{>^(>EE&eT zz430tqFWVPv?M^b51E8!_pjC$O8?we(0ou@{j$}@Q6EUrKqbSQELr5Nc1T(V{{vA@U>y1gbcD z0jSxxG->2Kh945!P^`$lqijayo`Jaj)0(O^mi`QduI|czb5yRS6(uOl7EUSvy<<%V zIB00uzMz1Z*I02Iaa5g)G6-@Y=&sb<@Ra`L7w*_^#cdZawTvN0RO9xCqpskSLd1w;JyRF zcOIv}a^_*F38ovFN@u2mKCqjLnn1n;y(dhEqEYy4e}t!+;hmq6K;1qJmYgwRI~ zY)8ab1f5N{w(wg}dO~TEq3YhcL^}Y_TOh!Ur7~(MysQX2#9D@2NSp3(mz>X!cur_i04HifqI7QFw=x3zC86!3)#u7zu2YgB zNd)6gp;(UruFhPYFuGHb{}#$RTCy{=(CuR9%tk>Trh5HlQ!VHq1X08M$84LCxY@Qh znHS2YZNv@lsM|Bu$`- zTV)(885QwdMqdA7AQp-@CF-+I)-64Ev;gl61pMRH-i;~#BWCr;iFG(-Lrbp=YUl>k z^aLzg@$CddRMAPjR6=Q!c3IKl>OtxSJF3^PRAQSO#ePa$F8Nptt1`{HnLf+mVvF5E zK)0A+w0r=;N%BRGCfk74HqCNFe1J59;<@>hd<3O>kxYI1k+@y2>tA z%h8;c!Hu7}bK|lEqlUkm+tUpGXL)p3rhwn|9n^Tg1xlx+q*oG|aEdCr*ve$szI;Z8 z^66*rm3L&bFJI?JsWul{)_?J9r{DK$4oXLGAc9q6F7?1u9kLeyb>)%z_N6OlDlo-O zFbzOh3p7j`@N@I(eJZ>PACB(JW7x1vp2uqL@OpR8Ft7|w^oPfqs7xV`K(?RHHh#Y61DukSlL{!x5P1mOEEC!8!`P#Nfc(I7PmJ;TW z6%Wixo);>Sf~fC(wrCu4mfg*KozH2!xGc{uQ_j@i#!FX z?a&it}yYIA8vHH;C^ua-hLmvQYH`Us>lRNr>1yrSUY+fS$Eim)M!!+d*ZP z;3#bL862lq{7im4;7)ApAlBk_+oCy7n4C6_gyF% zk3PP#Y5>%u{MN$RjE_5o0(rssZP?$h57qbfwx5FH-<=JrZQ&xD63$mgzg_OhjXL|r z_b>)h`a@x+&J+3Qgm(;#?~cLAtssf_#ax71K{HA%dNa=w-J-4$3fzFFqNb5jRNxXy z6}`g);4UqOR|i}am;>_u{A?2}ic&0UPO|>C5F$RgV9})W^m5D=EDCl7#-ZA>m1YRP1#IWpuD#GqV&A281j?*a2TEm^{YTM!uZWH+U46h!P z2U&RE7TqLKBr}rGAJtU=T{FIQ8G(uNx3E#OjWsySC~}Ml^_yW5+sAb`QzN9)q~!1; zOLq*&k1V?f0>TjM)$Q|5?c$^ZI>RST0)9uI50^Bl{t7kbobHHeKN^AFL~?bIZ@7f$ z9{oaml^W-dABUW@gAeF%bd!hk6XIO-#)cJ1ThLpVYDPUVohA>t=lI~CCO!b!L`p;2Gi zVr9_s?C$@GVR|J=cA?OAmu2%oDmiMg1j;9@qHeC$qZHoL?BX(&XKN)9M~x`IeudGgzRGq(SRhY!B)t&sfMbvO;*$?OTX7zX{>D!(#;*GDiJjjG(K zm;oXh_973?gqW)Jy28-AotPX!PsmJxEnOWGzB7kp8?wcvrb5K|D-$G%<^md^0qar8 z3X3|=dVEUiE&kK4rWOA8JUo4)bjilipGJnezn)J~U=Ivn6b7+j{f^5ya&}hLi%QUd z<*UnR^qu&X^~q;(_nIaBp1zDV-r33hT!#>5txtYkWzKjhcs-V`y&M2KX((?(vy3%D z1IfTc94t;ulfhzB4$_Qi)kX-@$amD@93%9|k0L})_P6yM0Q8ab{%py1GwQ!bv;%!h zslV@&1kT!pBg9H9{s?0Iqnl{goLE98{{mIOCt7w?o^^<@IQRXfN2MI62zr?2+_^L3 zST4Z;0jf|kQWarMz*B(hw&(0M$_u-BM9V;!43>}6dRGUzdYNstgm2h#)!IXnz&aow z+guxh>FdQF;P6!?2;Cvc81hwch(k*de}kNut5w_T3r|}R2(eWJ{I=voH{L3CsAgFM zMZRrgtZf9#W8U&ibWg4!)g6SoKH7=Ny33ZvmW+4R8*_{_vo+mM*D(i>xfqygfF4EB zvl4}x`5-I<2CR?j5g+xJ=>)y4E z+VRXcj~Uk4Y?DG!P$_Dz!R`hcPrKPV)|O!y!zY^wl^xR;qH+W=S?Ks~7>uh08W(^{ zuzK3=EM2Rm1$wy5r(UIQRjE0R*WTWcEaQuPC+=3ZS{`WD{6LGzK)1*$@K1Gm5nQUI zbk6<{*i-wYv>zF*K-%F&6Wth}6X(s1b7gO*wJ65>SiC?9s|VqOJOpfr54Zugfrl9S zb_WUoiyF#66AK>r?*e>bQ|FsSEmYqeX3+7?x)6JdbYKKTcVW#Uj8a&(t{m1U(8EUF zO@v5~WL^F)AOKwFMAyC|aE2Y91)(N(Y63%&Q^8q&i|IHP1626Y> zx|m?^x;rgtKj$i&bTL*w<+|VsbIMujwPz2<;uOnk@6m9mNalZS8;KgJ$8H!MU?URI z0b`Jn{n|f+(q=8gFIhj$Nf_UZ3jfwsw*$ne9O&=42zKHGg2%pr5o^LE+$AYcG--Im zJFKRt3b49_*+2}$Ga5`mO%OnlG~I%tO##J3T&O7>+=a?2O{13OqTY5Eq8YkY2;X;p z4CM6KWc~~&1TE7X(OTvNgbo)4)tU$kMYjii|8sgqt8{FU6I252QqES2GYi&=gFt5E z;BaI?yXb?*?KLd_^%)1L`-y1MY`f9#5M3#kze2$TiVM`p8>Y{Xp<@ducwUpZ_ZXY_) zO|kqju)8&@3AFuj*E2^O0rSs?A9dUnlhaQTse?SQ)yVP5UPmxu&Z=slh4)}k;w~u=5WJ5aJ|NnNT5>q(~hGC!HaF6d9G{aV1pgQ5L!unoOQFNiZu{~BItiX z#Or{8vPgs(Prl<{mBa7sO%P&7BcuCC@_Efv5)=-x!H>>f8Tx|N;BGG9dU#+kI~TUs zb2T(0HM`CPdG%}sUV8=STgvt*N2hHk(`8;h#HIBoL>gCJKEICcNA6g!;I2Hse3Y~< zMG>hO@H7LVA5VYV?}U;~mB}Ts_ZZ1oIwGZJ$bU2jMDGgXoh^-bD({o!f(fJe!J-#l zWZ75OKCFN#Uz~R0CqH0?Q_SH=BjoNZX!(-DaHtMKE)c&|zAjAr+}FP}dqe{;k}d(C z$^%Xjga13mWStqEVGTEBFyaPnay)o(QU$+mE+CfoM5@mdxU4;c^{-If8PT-Su#C4d zPg23O4(Ji~E>Cnb0f0WhDFrxJ98D42O{6Zf`4pJ@*rmbjXcX5NF!?NFlG?93>4IHk zsj5y{Pntod5cKV57XPCTEQy_)ompl7lJ;#e*}W;S$a`qMr_bB&{K39X0$lsHqmJ!; z7wqdpC&9KB108MM>%gJsz%F?opO<&(UlXR+Hl-y+ONgZuU7p9a;&K!W=}PvxHijt0 z_n4bE^^bGAB=FSt91?+nPPf~+Ir*zI6WG*_Ha){G&%R$>P~36{LEF;paThw40?!=8 zAKcxE{{nEu6#=>xmiu$HcK2-U43|3RQoVI8AOo(axtM#1>^{1B(>)^^jn@T0DkcA+vChyOxf9YBkJd9(C)9rJj#{0Y$MN+GFPMy zvDP~rjuyo=#c^iKUro~D(a(qG?01?YebHaR<#-Os{JVO{ncspdH5V4z8krw3-U9hb zPqaDnwa&ESmRI;*%Vr(!TG_I;P$X|G4;pwHa%v1;Uatl*k{LNeGMVCF zj>y;fcgi97if2p=jNK>w@*?Z7s-%wnSeX#muIFCZ`(YQ%E<-*m-^#{q8-jIegXjOX}f#{`u}? z-H}qffm=q11{9(YpA;Gu*|gcj36}TJ1)h*V>J-zW;kaiG%^WvTZNXwjzA-Qh_zrwa zmb<|l7?)9!gy2+HGfiVRubjQD5FGdxERF&*0iP=}4?%@JIxZqvlm4l@c_R9ZD)F&( z%8|M*Gi;}DmS5?FRv%y>EP;9hl2SaMagzO-D_&dThaa5Jv0763<;{0-sQC%$_3~PD zC2`MTN3ecL>mOt?VFIs`oI7pHBu)<-h%W)kHZ{pvz?m|o_|#-ceB~KK zKW)o{Zixi$0?^V%CGS;s_;M}7jBKyAKH{z496?^)_!mF-{Et$;2Lv+7`0E?+n|jpt zTGJG6!@(B9cNTEVX=)6@MOcTMZ`6LwU8FaJ5yHGMIV%%Iool&Yi_Jy!E=oX|#BRlw z0`X;PVWhFu2ElyY>>Ej%7yyUBmFp)GLIVf@5t5YCzc~}ruRpd0<|Y#wRY?Jh_iKIA z=Vc~|CNOAYtvx-9IGkbEk@g=pE$^OGpg#Ogae`Qg>dP8!CE1_Y>viX5TPXfj4Y_N<`|@DWySe3zcRl* z7|e|Iqyq;Ri{NNT_9N-H3;%!MHXBTFK!}B)QXO!E;LB#!E8%m-%HIo80~=*d&eevV zRidi;50_}HvR$Z*d{}0743+R?(MyT9O*tAH7-NCo3it22CF=cIMu%lPM==X(jCLdBPA#B&8>JF#B%c<5n5u;x<^ zAH!xl-)jLS#PN?{1>k_Avtupa-XfITq^=pf5MqtN`C_mLZ!eZk=52Y z=GbI<(c1xwhD)8iOu1YPB2rOfq%o7I>kNn(Se^ZE>BhcJr@vurdjUtav9PRsN%gx_ zYKYSS$qoq#J2Q$=!BF>l7M;(BiDsoE1#<8PfNYw+`Zz0__Y4t;fi5S%!w5+|(lEys+D zs~A&vxBJEGjz0>TAhCzpVC>xdcb3LaQ^>TQbl^$$#9GcxQfWB6w}_AUI^!b8hI4Kr z>+8qa1eeTPh%9LK!y$<#`SB}lPtH9lp^&jV;ld6iwLD5hXDERM65l{iM@_;bfvHKdZKJOl!ol6h}aKf z>7X0GMHO6i+lT2rax`Ul2#L1P!%b4r+AtJ+7qTN8nmP*BoV?l)EjrVs&e(TZsnny} zV{&ZCm)dECfl~o=TX`pJzi|#}0cpkDny)`T(rO_zbnPsrY#p60g*bKW~S2$M$Bg&GuM z3ml4W(W3Xwm+CUyHKQ zIW!Utd`3Kw7R?rGDd?sOYP-8)6nQd_cMYfVt=M3$um(dJ zi5q-Ool;vi(}S4nC!3s%H_Lwjf}Bf_aP?Ex!b`j8UD`!SOZ;xN`U>S4Xl((~YZpJX z4ZEU}`L0BLD8M`0f4FChM`9-tMawdzt(~Hbu2PKe*D6!iogg~FvAA@FvXU`>mYt)F z5|Uk$l*n%8xwH(%a1`F0)-|W4VBO*RleYe~3iSuzOCNwX1YZR z@MXeO{I@^ftEt|>YiX-xW!|TA9@<1V{A@^-TNt0$lLYHSYuzJVt@pzyTUXbhbPYYo378`MrGcQ9~eG*W{Z)Y2~S_R}%7 z@W|;>8)N=@sc%D}DN?+DXELAEp&>(LeCE-i`<;XYkHn%;eQspiq_<`dUFOJEZVkt` zQ+HtrEVBI+qOl2oLb3#1TXXiS zr!}ReNst`N#=qMe9eqf=ZQvMEN#Wu}`BC_X!UwP1G$}o{t?e@t@=>V5R^tI;F4~=7 zmFfTb3L>m$JWd>7h2UBVt(0CJbCsAv94KfhdhRP6rr)Q~#>`?W-?abDrx^B5KQ!91 z7+LJ(GdJOehpJrQk67w3RI1C~=B5{N6k`1A>#2X0QL%pmq6n9XiAIOZD7S03kJh^> z@h>-Q>W2})Fpx+t$>x=N&ym;gGJ9GQt&1YH#8%DhA3UVJptr?rQK-w;P1J}T66+T< zk>JYMmw(J+aESe6>4X3U8vrURpt8ptxXo-(oC%~SnrE1=m`X5!PU9nL>I=pTPtE#gQy^KWmP zJ~KTh-_+~XMRBmk{M`qu<|qA~+a3nMUb6llte&L=5Wuhi!ZA*n@d0bP;j#TW)pbFf zBMM2>jx##vf73;m41MHKN``dXxcK_R0)ByW+Lh8`*|(^lz)tLC@1@SF(O- z!x94;d$DBVyCFmJ$g|}kcY9mHQajxgSy79zH4k4R4h68?w0I8~Vi=h{JP+$ud}^f5 z^Og5v0VgBU^;nSR3E&1f_ew(C5hWGIl*YfLeBJWT;iNjMr zj$%Vuj|}ac*3QLVpNq%Iu^oB9mv9%kLSY`6_lFM35$tyJ*WBXbs!HpKA+RkT73mlN+Tt{ zd;l)AG~RJb+x7j2AXMO9dNFVnt8hvi6%Nb%Nv&WN^J%904F#XreLKY-C?JW8H`sKh zL5Ds{@Cj`ZvUYEt@3cIs?;;xP&jL>!sCf+C7KpJpq0K$xw9ta>CHegb+B1e&?(yJY zv3F{65rWFl8EdYrDnk88x2kmdLX0h}WXcdx_7S|M)~THdgW3X6tHdB-jv`Cyh^Se! z6`x0JdxfMl;MrlIj!DSL2cQ#&#*%WL+{PesEV)Pc-tYiOP2shSokaj*2eNs3b7w@9 zrcFS3K}#=oLbl-&yTZ6n!z-a#LU)}9m&%Oq^>SmA+t0M}j%ga-lNX*NkYB?y6=WLD z;zNU(`J+{6bd9K}V>&<}^s5LDRx4N@rovaKoGWWN~a90@u`Q9MTe9(QNW7iiUmzf9&+91VjfGO*P~jlS$p1wHpR*RJtU?)L7M0G1NLrs^xO* zCm&($irdVi#c8obqz$XYs9SnjKg;eFvTu3bi!Pbtk56yRfHvv(lN1Hz(5yFv9E2>k zj7HK04o9ex!6h)-CAO7nlUu)UIWkeUMAHTe5iNEzM2xCAt%5|^GRhp<&qp)ycrZZ(`n=rd~i`AghJBy_+k zav}+TqLJ!lEXQtCvgQtpq6(mXyx!1ZksL+iw10+h0jEs1R|f@2%;@XWfB0?x>qC7@ z;=5yxkTaj3hS|Votlp_n#$|@>c^23NngR(dYxICkk*cJ9(x+=}&dq=tS)57a1v9lq zLf26K8NE%#*oax>slOKrMbI?W!st@6l1DJ+;g*E;{jgSXvSv2Kl40aweXBP15@G5i z+=;^xHE@~HUi4}XH06`9Bf@vNZ@%g??PS8=)Oym=$6(o4t8_uKn7yYaAh{xB_vdFD zAgAPdK%Exc{`z07U!1Dfw|Y3wiEmU0H$Wnj_*IOj)b)RU@-SdVe}!(TmyG6n7eph? z&^02;4cq+?JX+hQ07F#BiE*ZW0eAL12_hPZM3o!Yd6JtpHY=fb4Q6Q0X2T%x>Ri#+ zBC1%==`!MWH$OQi=&6bKA$J=M0PGs%0M+HJ-)P9yh~J+O* zw;_IA+L_b&ccO6KXsG%G27=L}_0zUJ&1-gT59e}W#_*w<`g)=x0A!t$=1z!%4dWgO zaBiNy(;6pa;2$v={(HwF;zrvc#oJ6t_>-5Fqt%=snR(2@y0f8{Q#v$rF?y=4EJ-9- zlIHm0z-~M zf6X+FZ}8`#T866Yd!EoOAmxBTLtTVNjzg+5Q-ZARipWu$ch)}s@wOL+6=8I_u@0{- zaZg~~Qzu?AN%47Sx(&1t$5na|Yx?ehELr;0lC{}zT=#N>fUkN1*%?~*5gS~Op&+@+ zW(LOpXh37iW{N`_b^pG1zp(A?Z0G7+cD{k*FD1XUOZ(G28$10H^Fi9CXmY2dKo2+D zu^0Fu<>rjMbroIz7_6JPULZSRsF{nLkTi8PH`&zX`|mVZsQu7gk)aGm)+bnA0vdIh z@UtYhc`QM)bhyF!!4bWWvg8&)QHno&q(&Gan2_$ZvkWaY^qnXiv{cSZ$-{8GEKdzh zO%jl$_+K~A!}xJ+L8brLA3eXraEYGuK%+WgD-VfS%+2*B#>d0wkR$?8z+TA7g9A@0 zPxnA2qVZ@Ie-DsOZ&e>BePr_ck8Wv2wp(Pd$X^ z??iK~HRARqQ|l0!&K;E71;ISww&lr?kBPib`fZb*95e9(DwsH0EcE30GLq_=u9lbpu z#%+%e{3Czt)yY)fI06do{TpjD_jcm>B_cp4eqbi#}al3!#sM6ztZmmC*^G2}$i&9Eo!hpp>UWu2dvh7;?bQ<}G@InRqnet&EH z^>pM7TqT@x_6O5*1mg<97)VBw9~Vbmo*1tg{$6zVh~eq_#H>GSVryv;p}sUl++&9j!s%0B2l znWsQR0(Dy{lIjJes1X>O?-USq*r>mXUIYK32;(~xI_`xeMng>!8Y8%L(w(M}s(K{J`lgAYfti3#szh?{9O|LFu6+jBP5FUp&}~ zS4UvWc&SdW?e0|@$PtWNEiyBcq$LLGPhS)y8s|k58s`K>Cto#(K1$W^-hm&&m81y- zHTAhgk+&lfF^6{rAQml$&YKAw$Jr$gYt|@yGZ%;opTft>y_!>SOe=4Rc26Rpt!(xH z33U=&xc&sUtB zLEjfrHPdQN3`k);BpP!O-;E$UukdL2O|()0|35bf684TJ`+;Wc@v!JT;}9G%i}618 zlHy@_X2pgyjpc8}<80HY&djH+Et%cjxoo514~qix$?R7w#DYN?8n&EkzCmPk{oA3c z?0PJv3&q_wb0~s`*zgT=<~yvm(+laAk*p&XUKU)GdiBeOE$oDQPC?t6m}Tm>OhLI~ z_#WU(gv8^K;t7AL!!Lo67Urx0(ZWeX$jP6?y03MhdDy#CfQd@q7ou4>w%L2!9yWOb zni|#2?s%5+)M1MzG;W2>5D|Sk#=mbO0Wyzlg%ntRqT17x@4fH!%oP;}!-7sxi8-@+ z7}hlf;+%uR_3QYB8CoHwS?C-yQXYt*)f;Se3xZb(W>>-K*yqrrf9C{4A zMz{P9+0a!x!ATxtI{pO^hfa7LxnIjantA|H19n37;3hVevL6LC;j4n_*i}IG%mE0}OhgM@1Y|q>3qQ$gGKT)*~^ianSRsaNJc*mJN2@h58Wx4#NNnhYJ=30G z55L|4y(%|a+2!+wD->WiMnV$7QI7O5{^vUKR7Jeh$ zrGea3PP(ABv7Qp9dD}uZ=&?17tVZ^7Pu}5LEx}o6(xLU(Cw&?o6338$og#NYP#v{r zlDek6*{18nSn8rc^&z@(F~~($L~OTrH@+Mpol=j{D`lC4WXUt5At0k+C6TX&5Z5HzIX`O?#tUX{j+fa)SJhp?m&-jQ=5O zVI=c$kR~N4U;Bq7>uoj`3XzXm4ohu)x_}?`t*|1>$uQ6zsA{t(FJEwRQHe}t7i&_m zGqJUIfo_lvY%G%AC4A!g+B9$0<#hJ^s{3UGx`rk8CbwZ!G9{VoX@AI|osWO^M77Uv znQeK)z>k6-+n&i5fFZ*R8=l&3cSBTcTc%{coQ!NM%ymuQo3E)y1Yn`V>I?e7pG=ey z7M(n|f~MjUV-G442s#qmy=RY@Ro=|lK2q10TT)D(2h-2^b}y5t+YC9wIT__-kou8c zB1h7_0@VIp0t#OL3|Rs09$icz%Ig5HD4){^zUCFT+<$l^er?`wa`zqz`1DevjfSUz zC3~Dl;Ns6JnkcGD^{;lsmJ2d&YyUJJ*+i;i&S{q{L#6>PvC})(*Z7Ec;#wkV9!c$9 z-K#G~WJb-hya8DcQG{#<;U`1@u@ClJ(LAOpvxLdo*FJk z9KIU38d7lXoSAVfka2~_+-R=k#%Kg1FnIbsW~7C7y6=lp51J!Y0Ai55TE(2yJfaqa zHPz5B)4v~w7P%ccJl%@lIWn1U1g@}VtV4%ntJ&sH2G**ZXp9u%Ibrh9Z`YRpXwz3d z{Hyic_#9;ZdBPj+mRrxfNHI%t_Hj;S4@`w7*x zzkTiGWJ@W^oJT9^LIE&}q+*?;&i=x-IfhQqP|qFFZ@#|&Kq_4QtBOvFsN`Z0KEzt- z8eTZ_mXeHDkfkgb}8!XDEjW0_n3s_g| z0}=!Ik+qEB68VA2*f9&AE9%<&Clv}a%eU5es76clTZ^3g@M2XYRYc)y8~a>C!(R#S zFVCAciDIQ_)z-TI0E)YdEVk?F4luw{-#^Jl)oHa{O^#mkfv@6kO~N-Nr0UR3kCA}3 zowrnS<(;3{>LLr#p+M)U_s$&NnQi}vTcZ?}Hn9%#N))v>oWJtJh*z+8R#3|D0e`*o z_B|D38;siU5}?p_9W(5#f1vSc+TY(0@Z$Xx!Nt97o6?8Dp@9QxhfcT%N)E#0j)bS+ zIwI6Tg7;i`u_DK@4{w=J$9%7yCoGH6283gHlI?9^**iy1ikX*j95&9_e|)7dCRXCX^m0D-wb<#D$T2 zhe2&EGOGe)Xq;a1zrp7xlE@*M^)7mUuwysaTirXl>1<>8bC9l$j6(zr)lFTrv#O9Uk*wLM=_KUd zS01^U@Nq+Xyz0edGPQRm5TCNzvYc%y6Of*zG~~`86vm0qXD>^{>hN!U+SXl@?X?LqfUIvnKGidq<%{z2VV=%7iqn8K8$Ay@so#BfBh2pE zbK`1Q%Y3x{cimr4VuY{4(R^de@2|x!=eq$QgKviSa4p&&>x0f26$9U#roGEP?w(nd z?_Wp_z8<2+4%g^)@_p!T9*-6xu6eWOw)Q=JEQa9m&@e;oVMiJ5Sani$q$LU#e8Fr! z_cHWFl{eDlp3jwyr9v0&6jE+0gO^bG$rKp4>bV;<+n;_xUS})n5Jflbo4QT<7Zhp1m(dl0zBx086X7 z4eTUfU{g*_JoYGvT;RD2Xb~0Z4{>}Pw(U-s5P3Z61l<0=6EZQZ`?<`t0{B)VNd)rI z$?ZDJC9jB!c|$OR3%5{z8pyyZ$#u(q{vJ7E)h})}5Ut;yf<)+(v-5U*P4E%OxFpgt z>?b&1HyJ-NC%4m;s9c!esjJbzk-O|6BGlzuWHkV*)Fn;quM@!h9;NRenUOG%+ZWN9 z)n3mHT0@+6oP03C?YONy$eVqafr2y33%$``LT>doVEm5mEfBy~$wZ*m3IBSPh^nwy z3N(}mnwU_l9q4#O!3@hD?A!F6{^lv3>W~0;(!SU&1<+5B6AnGF>(zCMZz|QNWi8*A z313}1*kgnfS7G5#@`|~q9RwR#yY5;Jiz99h_k&ZULMMF_^S|VF^(!iQVV+67Ky=Dp zMt00foUto#g7JIGdBWVAt4g1RgM%t%)pEyU{kGAc+bTE?Q-KZs-Pw;NHVxnX6aF&| z_>JV{*#Sydlbz+W}#Y-5_X7|*UC)~7*khJM$#9T30D0AQS z_7E0r)VKvZTi4asDX-Z`vu2hgjF5VM1*NWekRYdn$MtGI%68pPZ`d6JL7nKY<0zK; zTx<0JWxx;}B(1Zh>3m9EDwGSzjYJs=0BcJOrZfcy7Byr+6d%E z^_sT)>{g^PAx{01sLpy|iWSTGHhW_M&vs?ts&*b{pPX05fCYQcf^T~<^rxzynuVK% z?6dY_i;TQ5EgKJE(L-E(A?0Bra#%g)#T3}dyl=@?+_JJ%zt6^TBZhm6E2nPG$Ak#n znWQh#=vPcNndT*t=D58K-Jkz>|KSG@108XOpps)2uf91=pslQthU>LBY7K9LAmb4U z9^WS!tbB==rJx&0$m6`9ZP7StzhGBNWE zd5Oei7Oj;EkGpeh>Pa653Q)e1kbvDWB>z26&Ri?)ZoKot3>rYV^;EKzC!y4%c+tn% zH^v%z3rBJMyW_0!laZx@8GZL2lsV7uz}lpUjls8e6ozE0yM?>WcGuJ${+PMU`(|dO zXd2#28;=!a#4DSoN`Ebn%VbzitgfWnmsu-%{Zbx6mVe!3`2=sE$FLQSqL)MlM@u9|IvjR zM>WbvJlt<(xcX@)bU|94K#Nuc%-H?|Mc)X`Q10I=P{Y7ZR!zVPwK3XHpE zqW?w6Xzd)gbz4yy6x5!Ur2)-m5Ab65t-?WyGQV_W7#2#n@}k!F-tQdLig`w5C11TMobmKrF~ZH zU`>-)cxYi6P=y6Qu)FI!vC-V09j>;J6Q3651IH92HH+-)DjsT0X9}5|+;6uF0Gu_Y zq||t#c`2p;5_ceDpP_SGkD{dDxW=fNN>BSkgMF4Ca57>mSPdWp(}?`euI*$&ott7+ zGoM-%m~N)xkE-L*cIW82*pr;+-A7^Zz%Wg*?+7ZWcs1pwuegy%YQT&=W`P*CNnhkH|?-hM(5dVeOFquV1G5ZGk=I z<A7=J4ROw?+&jQk0X%`4A^kJvJ=!a73l-LIKaI#$ggfhF`%NUi)0i zhlFPsGcP@`wnJr4LMK~_keZNk1*1r^wwW4z97=%7go%a%3hn2pb^g!L$`gnht6p2X z7kJPg$JUIicR+28+HLSA14JQ|VpGl@CzR)=)>tzxJlsh@Ahj7kjF=MNsxJ&&Aq4 z_G)^I5FY>7@XlIQLbP5iE{EB>I*@=KS-@Z-9C(zRhl{G05DG@}6u7diL{%$gh?Su- zs=u7DNVZbKk8|z{?N3cn{b&P5ycS_SHeY`xR9AX(%7d4r%HFXzQBSmw=q3PRaxccx z%W?`@Q0SEWBurvrLGD1;)yw2wu&igJQYJ)%4RP}qJVT$;WM~GLX!fXjQr3xp#RP_}~ zv8{6mcOjh)NObV2sA1HK1t2g7dExrGJ5WT~){aCI@#URNx5k3!wrm7n?X1LdMDK!n zUtfgW;YrYV^R@pa{(;@gohXO|s?+m05m0IGbH47%K;;1}RlUF@SYLIJ3@Xt$cZXt< zktS0`f)Lz6(LfSkE29##Hfn3H!}FbmRyGty*E(Az>M}<$9{Cj?g-xHAQ6A(n<*6v) z^F1aR=u54^g`U}Ib23HWM{t1wr*_TY|5fvJR^Q#}oz@GC-i68@XnSwqEs3W78b3*K z$v2nkAaGb7LIfcZ(2%Thy&G0jYUggSW1MFVi@*V?5k|x&IT~Dr({em&FuLHfU!WE; z7@^?Esy@(q?%`o4jYDFGCYvg}-1+o}MlX#{^*YPDF*BX;a@k_`PXICXqd5(3IdKh@ zg_D1?dw?OmQm5j_nl`kpz)st4Ao7(tsi;&Cis-k0#gxqFStc9>O82JZOQqjb<^K;Ce#LW6oUS8QUM+ zxGnhJ6ZC*G9iG>{v5c7nL=kblkA#wJO=~%V(PhB9pkmiRx7$=L!CoGJ6ZuXhz8 zZ|^=)oCwVim0JsCkoLwn{G-9ps|BW8WbXU%VRjp|uRZXb4kC&ZOQmo^yi7@7f`}9#c+ojD%_VY(d4kmq3JTD=NCtZ^=NTuV_(hU?6 zj%PTKBsM3DYvvsRPZYZF(_e*wIjGzDAOz9)Wa={=H!MtUUg|I4x$2`=iv-Pvn^g6= zJ#0rr8}F{ME`s(0lh6g0^17CfVJ~B+4he@@5#Z!^VP|QeOe~(r-Fsa~3fwjJho1>w zUTlfM*+`8uXrM*uqGA*}`qm_rXl#%-{yqT<;6LOfns~-2bCsjtG*VQ)BfQwldAP+_ zDaAPrauX@6=>|!Us%oAhK^BwDJ`QP`Ws)P9;aeMMfBFEWv9x<{EGUW%m<{ZF!LYBL z#;yw1lAt=npP-_RPVg7<5!6#2fn(pQ=?$CVik0S*H?G>#d(bRDvRPgeQ5I@FG56Ut z30LwIn{;BuG_B1%ZG;Uks&GVJYz!{37XsFYHiQ8!B`>R_79Nc$J^{JXEU>%B+W^s% zsSrd2|7%nfsPtR!27*M{Y3cKTRKEaw;cNBy=yXSr?;e)op(Y`G4u4wcdgNnG^q~*vjl96|szv5AQCfw!tKr^jSUu!!Bh(qOF305>tEfpWn$mEUl+b44GtR{@)}8{($Wzf9q14w{?RQ@OT6a zjvIp&?+~qBhT-RbpKL{dsOB6buzBbkmm7rrpP4WDv$oV_U!mS3DTiMQgoUKQrlAbO z`vDXF{R@)A|IW9|@S8mJHWR-6>vI&#B^ZE^WhojlSBsu*GF~wt;_z8t`C5*ZEKM4a zg+W|IZsHySt$@PT`WgcKHJ%j9Wo4rfH1zWJhT0ET5@iL#+jlz3MIUM?STsvc8K3wg zk-C!7u`6XMhHHh@hA;sJ-E}$wg6)i8rW+4^VLQ*klCzm2(~&j%FNg}{?4fF41uG?* zPq!SKxxRitchA=T$TPQYQ2khn70#i^w6$JG3derl`;SB}$SX9pRindDbyb~(&Tofk z{q%+a%fC5Dxz@`8SEFrc>5NG3K^9X;DKcIzn*a(Mv5DnbBX*WO{dN{M zzG^+cXaYxgQdpk(>3qx##2eCTnBjq#Ua6QM1HV`fl@ERx#n6`U-*ukqfa<7G#z1k@ z5DK)R)w#T;Tk~G>#zfll6ri-i%Xo2`KuNhU^*D2Nl9xLVTCc1U3&s|MS+wLRflUCAtT_y~IqQGog_#-9h2J{ho~zW|e5ywO8>6-?@Yu-94R_(!$0 zd`0&A@B+AvZ5mM3_|@rp7Ev(k^FcP{3gJgmOj@Zwh)@EPI060_y4@ajXl<=K((8C* z4#%LtX@Z082YBoc(53nWcWsXAW~lxi#%_Wa;p+h*@mkX2%~_ zY5dy0NSRKx#{JK4uoyDdR-5CV!+i7;`>@Oh>){kkC|}}-Wa%~aNr1F`f1mR=`hG^L zPouG6bEaj<@%<0YeW;ZtU#84WvfwL0(zG(Ac4;OnC123ph|%8fwZP{YNr6la`630* z1eyBH>TchyTPu?G{i;`DF3{X>Vtv3@^UxbEs1^alX3Sz?rdi3Bnv{ik1#o#)AGKvP zSO5%Kof&BUogrq2;^B|#sI@``igF4t2dL81e=-FTU?RDOUCK0LqSApZT^Tq@3UzRS zz!Mgo#W)Apd(Ek(z*u2Mnf5pW%$}$h%lBjU!hi#jZ6tYAo=O)%2f~2Y${)VH(=lpB9uH_(^mk1S4BlgceaG_6%s?1yhMHzo=20PScxB_bK!%>p0 z=pmm#QN?;{H2Is*koxc3Pda84g>ifrT~KZ6i1_~3FMv>;$o&tX2F7ip2wdHJ38%pD zi0nm+BbLpm@Gaj4PhQ$GA)1J65bq8=6rUHfdf9c(;KNo@XJeaQc+A^jp@{Rs{OcW{ zy!5}^q-h}z_$@Om>W!B%lecjO{3DRt7T)yTmcAna`ZGFgT>f!&7^I!M+B%HlK72ApbJZnR@t{U4{B$baCkU@2tF;$qDcQ)B%5}; zYPd}Q12;3Un`qPbyf;)~QxQgc&tY$mB5mOtDxdQJIr6oLGaom8WayS0Iejg{T&|ur!1N@4xDEqkgqY!unA^P#Cd7_AN zdsX@oG0FlQ6ce*4W{?QnpO^G{ zPsVHpbFxzPx-#+2;_x1ajVjXu<-+y{>XdYYJa|_?Q5+;0<%-7!;obBb(`cF>WG7^? zV?lZ4Q`C%|6DeE54Mq^32ug5;Z%OgUp#3Ezp0|%p9Z}<54@)~|_YBBxP@u!4QM39` zQfmY1WmWmw5EaWyC9)o{v~16WQ~$tWqC;>!QacB5qG3uL^2Qz58RFSGMG$LS_B05A zC zD;BLI5+Dl!)G2{f+>pr% z5B5e4+o=NnsmRp;)!u)0N9(DU+WFa^$=D}v<`&d~3obIp_slhGF6uRAp6wUQpJ=$L z=QQvZ7xE}1&p;Jfn;UVwdD^=zJl-N2AGCgHq`Gk z_k`>9VG)XQVXAuvt{r-!$s2lJ59{$(IDmpb*r90da zW0y*0V$;+_2s*b{eR=H3*XR-)=O+$83iBT{AM;*nB$r<95bjyPE>}(55|TM~&&m>m zbDaf1thVUn(Jv|0`e|>k1dLBOT!hw6#BwjNSq4HJTcIJR)f-{Pw)I#`NaI7%+vKPN zjz@UA!ir-`wl{76x1U(aQ@Z!1KlkTD*a*uYC;$+0&Hx87vv5)9suFcx#D`}9*VU{e_xID)PB_mq z*K6zGKmldu3NAf5v~QTOCckjHTUoBNhT2FbCzO}L$2p}&pG})GbMMo_vRtmR9VD2d zF%5wsgv6nM3n?W`A#)V&S~PKr>ye{N=s?J^Buz-~_x3ET`W-XWGSl|s2g=PJuz=xv zR(U7A)5m-W5`JQ9e8YY!s1r)jlp8(0dr+)*Ze|JCM@TSR{mZz!x5=_uSZbA(;0E@g zKIN{-#f>#~&jU(t;Ujb+%wgY7Eh`>jXPmkZE=SE*y-<%$S|D?O66ar-es6BRhmf$r zpjwLy?hujBDI2nk6@eHO#g6CezYS^6H&dNT+)EKDlYYCbg=btlrr$PuiET7lO@nS` zs%9ExBZ}`38Lsj8JM9rwNKO+WNm7oUmD5%edNZBmVGhc}yf81Rr_HXoC&~BGEpmMM zY-k6@#uX&~r=!p;%kDwj+X+p9+g9gmY|{R+y^e^TkZy^L84Nh(4L%3Prfgo$r!Iof z>EWS(C;UaBNeu5N_r~UhSuePwEj+i+Sim9QsysHo#}XfzP8s<8fxouWz?-m)Zet$jZpl@_5~iYp#S>cWrf*z|{n+R{C-eC-cUWTp`Al7UV_DsqAA^7jKP+HjbECJ-b2WNJzf z$0_ArXg@t1TE)vId!8nASsU$$&mP{s$*y@KwBL-P zTNr$c{Fr9}wr-7ljg3%biUb$tiMp4vTxxE|MpT>i0T!sWvuP0;KvuM(({s7z;s$Uj z=?gUuuonMtgbU=;2ptiwN({>DZNAmy(Fmw?f-2hwu*6Ql5k1b$x_S{W*qfy!&)G$V z0=S1G(YcA@6cltaWee9@WBy~Gr&P<}I-%57#e~}2GpL83c^>oU3IIe8WM7{TRmf%5 zz?3Z$H{^}o+hY7w{B)lBx35}_HQJpt?Z?fVbwFvuhG-X%qRF3fV%KWc$)crZxM+rS zr#wt=bw$Z{<(pu~)Z&>bH^YEXQs|RSU&boOe>xkysSBc-M8!mE_3U9+cjJ=>w7UKz zL>xhz>IIlQyrD2Pc*Z9U7K-ZI(^(OC#$7a_GeNP+f&BdQETnzo7kHCxV_ChJdx<{* z8XxV!-Ym(u3ai=M9G;M1& literal 0 HcmV?d00001 diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" new file mode 100644 index 00000000..74f3dbc4 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" @@ -0,0 +1,30 @@ +### T- One是什么 + T-One是一站式的自动化质量协作平台;打通了测试计划、测试准备、测试执行、测试分析、测试报告、覆盖率检测、智能Bisect,环境服务等流程的闭环,为社区研发提供一站式质量服务。 +​ + +### 平台架构 +![](assets/jiagou.jpeg) + +### 核心特点 +- 一站式质量平台:平台打通了测试准备、测试执行、测试分析、测试计划、测试报告、覆盖率检测、智能Bisect、智能巡检等流程全闭环,为社区研发提供一站式测试支撑。 + - 支持多CPU混合架构(x86、arm、loogarch、risc-v) + - 支持多操作系统类型(龙蜥OS、centos、debian等) + - 支持复杂环境测试(企业内网、独立隔离、弹性云虚拟机/容器、应用集群及多种混合环境) + +- 质量协作能力:通过分布式的业务架构和独立租户空间能力,支持多企业、多团队的质量协作模式。 +- 数据分析能力:平台提供了时序分析、对比分析,以及聚合生成测试报告的能力,在大量测试之后对数据进行分析以发现软件问题。 +- 开源软件包CI服务:社区开发者可以将自己的软件包(可来自代码托管平台如github/gitee/codeup等)注册到Testfarm, 平台会监控软件包的代码变更,一旦有变更则会立即触发测试,并将测试结果通知开发者,方便开源软件包引入。 +- 开发者资源服务:社区开发者可以reserve测试环境并登陆,方便在测试环境中进行测试及debug。 +- 缺陷定位诊断服务:对于发现的软件缺陷,平台可以提供了缺陷的自动化定位诊断能力,可以发现引入缺陷的commit地址。 + + +### 应用场景 +- 场景1:OS发布测试,每次AnolisOS的发布,社区测试团队会根据发布测试策略进行大规模测试,保障产品发布质量,外部用户可以在Testfarm查看发布测试数据。 +- 场景2:开源软件包CI,社区开发者可以将软件包注册到平台,平台会自动监控软件包的变更,一旦发生变更会立即进行测试并推送测试结果。 +- 场景3:自定义测试,社区开发者根据自己的需求可以在T-One平台进行在线测试,或者使用命令行测试。 +- 场景4:离线测试,对于网络不可达的测试环境,用户可以使用离线测试模式测试并上传数据。 +- 场景5:独立部署,外部用户也可以在自己环境下独立部署平台,测试并上传数据到Testfarm。 +- 场景6:登陆测试环境,社区开发者可以根据需要reserve测试环境登陆进行测试及debug。 +- 场景7:缺陷定位诊断,一旦测试出缺陷,平台会自动诊断缺陷引入的commit。 + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/Dingtalk_20240614165831.jpg" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/Dingtalk_20240614165831.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..925bf2945891170613821e8e7dbc9e4206d17c8d GIT binary patch literal 6459 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

}E@Hj0_{W?|f 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

FG!grkAXdJNt$uIvKqhcJq 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 z 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[WR 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ⅅQKHz};_SkLL8?V2PS1YROEdQ3~XQxay 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ċXdTaw*%m;m5ZDbWgJ_XqbT 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�R;g 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

ddeE*SWKS`wD5C=M^ov`A=E-e{k-D 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 literal 0 HcmV?d00001 diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" new file mode 100644 index 00000000..bce7de80 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" @@ -0,0 +1,73 @@ +*斜体文字* + +_斜体文字_ + +**粗体文字** + +__粗体文字__ + +***粗斜体文字*** + +___粗斜体文字___ + +*** +* * * +****** +- - - +------ + +~~删除线~~ + +带下划线文本 + +# 一级标题 + +## 二级标题 + +### 三级标题 + +#### 四级标题 + +##### 五级标题 + +###### 六级标题 +[链接](http://a.com) +![图片](http://url/a.png) +> 引用 +* 第一项 +* 第二项 +* 第三项 + ++ 第一项 ++ 第二项 ++ 第三项 + +- 第一项 +- 第二项 +- 第三项 +1. 第一项 +2. 第二项 +3. 第三项 + +1. 第一项: + - 第一项嵌套的第一个元素 + - 第一项嵌套的第二个元素 +2. 第二项: + - 第二项嵌套的第一个元素 + - 第二项嵌套的第二个元素 +水平线: + +--- +带反引号的“内联代码” +``` +# 代码块 +print '3 个反引号或' +print '缩进 4 个空格' +``` + +> 区块引用 +> Markdown教程 +> 学的不仅是技术更是梦想 + + +SDFGSDFGSDFGSDFG \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" new file mode 100644 index 00000000..12f85c9b --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" @@ -0,0 +1,615 @@ +# 部署说明 + +> 此文档以开源版本 T-One 最小单元部署举例说明,不保障系统的高可用及性能等 +> +> 若期望大规模集群化部署可以联系SIG项目组进行具体讨论。 +> 若遇到问题请参照文未的 FAQ 文档,或进 SIG 群联系我们。 + +**组件说明**: T-One 包含多个自研组件和几个开源组件,此文档以开源版本 T-One 最小单元部署举例说明。 + +* 自研组件:tone-web、tone-agent-proxy、tone-agent、tone-runner等。 +* 开源组件:mysql、kafka、redis、zookeeper + +**机器要求**: + +* 硬件要求:推荐使用 8c16g 以上规格机器。 +* OS 要求:推荐使用 Anolis OS 系统进行部署( 暂不支持debian、ubuntu等)。 + +**部署说明**: +- 主要分为安装环境、项目构建、项目启动、数据初始化等几个步骤。 +- 该文档以x86_64机器为例, 如果您的部署机器为其他arch类型的机器,则需要将docker-compose.yaml中指定的第三方开源组件镜像更换成对应的镜像源。 +- 可以自己指定安装目录,该文档以 ~/tone目录为例(推荐)。 + +# 部署步骤 +> 后续步骤以 Anolis OS 8.6 环境为示例进行行详细说明。 + +## 1. 环境准备 + +### a. 安装docker +``` + yum -y install yum-utils + yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo + yum install -y docker-ce # 若出错:yum install -y docker-ce --nobest --allowerasing + + # 启动docker + systemctl enable docker + systemctl start docker + systemctl status docker +``` +### b. 配置docker源 +``` + vim /etc/docker/daemon.json + { + "registry-mirrors": [ + "https://6kx4zyno.mirror.aliyuncs.com", + "https://docker.mirrors.ustc.edu.cn", + "http://hub-mirror.c.163.com", + "https://registry.docker-cn.com"] + } + systemctl restart docker + # 建议使用国内镜像源。 阿里云: https://6kx4zyno.mirror.aliyuncs.com,网易: http://hub-mirror.c.163.com +``` +### c. 安装docker-compose +``` + pip3 install --upgrade pip + pip3 install docker-compose + docker-compose --version +``` + +## 2. 项目构建 + +### a. 下载项目源码 +```shell +yum install -y git + +git clone --single-branch --branch master https://gitee.com/anolis/tone-web.git ~/tone/code/tone-web +git clone --single-branch --branch master https://gitee.com/anolis/tone-runner.git ~/tone/code/tone-runner +git clone --single-branch --branch master https://gitee.com/anolis/tone-agent-proxy.git ~/tone/code/tone-agent-proxy +git clone --single-branch --branch master https://gitee.com/anolis/tone-storage.git ~/tone/code/tone-storage +``` +下载后的目录结构: +``` +~/tone/code/ + ├── tone-web + ├── tone-runner + ├── tone-agent-proxy + └── tone-storage +``` + +### b. 集成前端代码 +```shell +# 下载前端代码包: +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/tone-front-latest.zip +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/toneagent-front-latest.zip +# 安装unzip命令 +yum install -y unzip +# 解压到指定目录 +unzip -j -o tone-front-latest.zip -d ~/tone/code/tone-web/static/front/ +unzip -j -o toneagent-front-latest.zip -d ~/tone/code/tone-agent-proxy/static/front/ +``` + +## 3. 项目配置 +### a. 下载 docker-compose.yaml +```shell +cd ~/tone +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/docker-compose.yaml +``` + +### b. 设置并替换变量 +执行以下脚本(需手动替换`必填的`变量): +```shell +# 部署机外网IP地址(必填) +server_ip= + +# 账号密码(必填) +db_password= +redis_password= +tone_storage_password= + +# 镜像版本标签(非必改、默认latest) +version_tag=latest + +# token(非必改、可自动生成) +toneagent_access_key=$(uuidgen) +toneagent_secret_key=$(uuidgen) +admin_urls_token=$(uuidgen) +pub_api_token=$(uuidgen) + +sed -i "s/var_db_password/${db_password}/g" docker-compose.yaml +sed -i "s/var_redis_password/${redis_password}/g" docker-compose.yaml +sed -i "s/var_tone_storage/${tone_storage_password}/g" docker-compose.yaml +sed -i "s/var_toneagent_access_key/${toneagent_access_key}/g" docker-compose.yaml +sed -i "s/var_toneagent_secret_key/${toneagent_secret_key}/g" docker-compose.yaml +sed -i "s/var_admin_urls_token/${admin_urls_token}/g" docker-compose.yaml +sed -i "s/var_pub_api_token/${pub_api_token}/g" docker-compose.yaml +sed -i "s/var_version_tag/${version_tag}/g" docker-compose.yaml +sed -i "s/var_server_ip/${server_ip}/g" docker-compose.yaml +``` + +### c. 启动docker-compose +```shell +docker-compose -f ~/tone/docker-compose.yaml up --build -d +# 注:如代码有更新或首次部署,需要加 --build 参数才会自动重新打包镜像 +``` + +## 4. 数据初始化 +### a.初始化db +* 进入`mysql` docker 镜像中,`docker exec -it {数据库容器ID} bash` +* 连接数据库:`mysql -h 127.0.0.1 -P 3306 -u root -p` +* 创建 `T-One` 数据库 `tone-db`,`ToneAgent` 数据库 `toneagent-db` + ``` + CREATE DATABASE `tone-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; + CREATE DATABASE `toneagent-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; + ``` + 也可以直接通过 mysql 可视化界面初始化数据库 + +### b.初始化 `T-One` 数据 +浏览器或者curl命令请求接口($admin_urls_token可在docker-compose配置里查看或更改) +```shell +curl -s "http://${server_ip}:8080/admin/migrate/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8080/admin/init_data/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8080/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." +curl -s "http://${server_ip}:8081/admin/migrate/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8081/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." +curl -s "http://${server_ip}:8081/admin/import_access_token/?token=${admin_urls_token}" +``` + +### c. `T-One` 关联依赖配置 +**系统执行任务还需对以下配置进行设置** + +- 配置 `T-One` 测试用例 +- 配置`T-One` 测试机器 +- 配置 `ToneAgent` `token` + - 在 ToneAgent 系统-账号管理中增加一组 token + - 更改 docker-compose 配置中的toneagent_access_key和toneagent_secret_key + +## 5. 验证 +使用浏览器打开链接查看: `T-One` 页面:`http://{host}:8080` `ToneAgent` 管理页面:`http://{host}:8081` + +## 6. T-One 多生态使用 +`T-One` + `TestLib` +### a. 创建 `TestLib` 数据库 +- 进入 mysql docker 镜像,docker exec -it {数据库容器ID} bash +- 连接数据库:mysql -h 127.0.0.1 -P 3306 -u root -p +- 创建 TestLib 数据库 testlib + + CREATE DATABASE \`test-lib\` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; +- 创建 TestLib 数据库表 +### testlib数据库初始化 +

+ 点击展开/折叠脚本 + +```shell + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; + +-- 表 test-lib.case 结构 +CREATE TABLE IF NOT EXISTS `case` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试用例名称', + `creator` varchar(64) NOT NULL COMMENT '负责人', + `type` enum('FUNCTIONAL','PERFORMANCE','STRESS','LOAD','SECURITY','COMPATIBILITY','OTHERS') NOT NULL COMMENT '测试用例类型', + `priority` enum('PRIORITY_0','PRIORITY_1','PRIORITY_2','PRIORITY_3') NOT NULL COMMENT '测试用例的优先级', + `suite_name` varchar(128) DEFAULT NULL COMMENT '测试套名称', + `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试用例执行方式,手动、自动', + `run_model` enum('SINGLE','CLUSTER') NOT NULL COMMENT '测试用例运行模式,单机、集群', + `is_available` tinyint(1) NOT NULL COMMENT '测试用例是否可用', + `tone_case` varchar(128) DEFAULT NULL COMMENT 'T-One测试用例,当run_method为自动的时候生效', + `device_type` varchar(128) DEFAULT 'unlimit' COMMENT '设备类型,可多选,默认支持所有设备', + `device_arch` varchar(256) NOT NULL COMMENT '设备架构类型,可多选,默认支撑所有类型', + `labels` varchar(256) DEFAULT NULL COMMENT '设备标签,多个用,隔开', + `desc` varchar(512) DEFAULT NULL COMMENT '用例描述', + `pre_condition` varchar(512) DEFAULT NULL COMMENT '前置条件', + `steps` json DEFAULT NULL COMMENT '操作步骤', + `custom_fields` json DEFAULT NULL COMMENT '测试用例扩展属性', + `parent` int(11) NOT NULL COMMENT '测试用例分类节点', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`), + KEY `ix_case_suite_name` (`suite_name`) +) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_label 结构 +CREATE TABLE IF NOT EXISTS `case_label` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '用例标签', + `creator` varchar(64) NOT NULL COMMENT '标签创建人', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_label_map 结构 +CREATE TABLE IF NOT EXISTS `case_label_map` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `label_name` varchar(64) NOT NULL COMMENT '用例名称', + `case_id` int(11) NOT NULL COMMENT '用例ID', + PRIMARY KEY (`id`), + KEY `ix_case_label_map_label_name` (`label_name`) +) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_tree 结构 +CREATE TABLE IF NOT EXISTS `case_tree` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(16) NOT NULL COMMENT '用例结构树节点名称', + `parent` int(11) NOT NULL COMMENT '父节点id', + `level` int(11) NOT NULL COMMENT '树结构的深度', + `path` varchar(128) NOT NULL COMMENT '模块完整路径', + `children_nums` int(11) NOT NULL COMMENT '子节点数量', + PRIMARY KEY (`id`), + KEY `ix_case_tree_path` (`path`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device 结构 +CREATE TABLE IF NOT EXISTS `device` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '设备名称', + `arch` enum('X86','ARCH64','RISCV','LOONGARCH','NOARCH','OTHERS') NOT NULL COMMENT '设备架构', + `ip` varchar(16) NOT NULL COMMENT '设备ip', + `type` enum('UNLIMIT','VM','DOCKER','PHYSICS') NOT NULL COMMENT '设备类型', + `sn` varchar(16) DEFAULT NULL COMMENT '设备序号', + `status` tinyint(1) NOT NULL COMMENT '设备是否可用', + `label` json DEFAULT NULL COMMENT '设备标签列表数组', + `owner` varchar(256) NOT NULL COMMENT '设备负责人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device_label 结构 +CREATE TABLE IF NOT EXISTS `device_label` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '设备标签名称', + `color` varchar(32) NOT NULL COMMENT '设备标签颜色', + PRIMARY KEY (`id`), + UNIQUE KEY `ix_device_label_name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device_label_relationship 结构 +CREATE TABLE IF NOT EXISTS `device_label_relationship` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `label_id` int(11) NOT NULL COMMENT '机器Label id', + `device_id` int(11) NOT NULL COMMENT '机器Label id', + `is_delete` tinyint(1) DEFAULT NULL COMMENT '对应关系是否删除', + PRIMARY KEY (`id`), + KEY `ix_device_label_relationship_device_id` (`device_id`), + KEY `ix_device_label_relationship_label_id` (`label_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.func_result 结构 +CREATE TABLE IF NOT EXISTS `func_result` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `sub_case_name` varchar(128) NOT NULL COMMENT 'tone job名称', + `sub_case_result` enum('SUCCESS','FAIL','SKIP') NOT NULL COMMENT '功能结果', + `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', + `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + `current` json DEFAULT NULL, + `expect` json DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ix_func_result_tone_suite_id` (`tone_suite_id`), + KEY `ix_func_result_task_id` (`task_id`), + KEY `ix_func_result_tone_case_id` (`tone_case_id`), + KEY `ix_func_result_tone_job_id` (`tone_job_id`) +) ENGINE=InnoDB AUTO_INCREMENT=479 DEFAULT CHARSET=utf8; + +-- 表 test-lib.outline 结构 +CREATE TABLE IF NOT EXISTS `outline` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试大纲文件名', + `title` varchar(128) NOT NULL COMMENT '测试大纲的标题', + `owner` varchar(16) NOT NULL COMMENT '测试大纲负责人', + `tid` varchar(256) NOT NULL COMMENT 'oss文件地址', + `remark` varchar(64) DEFAULT NULL COMMENT '测试大纲备注描述信息', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + +-- 表 test-lib.perf_result 结构 +CREATE TABLE IF NOT EXISTS `perf_result` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `metric` varchar(128) NOT NULL COMMENT '指标名称', + `test_value` varchar(64) DEFAULT NULL COMMENT '测试值', + `cv_value` varchar(64) DEFAULT NULL COMMENT 'cv值', + `max_value` varchar(64) DEFAULT NULL COMMENT '最大值', + `min_value` varchar(64) DEFAULT NULL COMMENT '最小值', + `unit` varchar(64) DEFAULT NULL COMMENT '测试单位', + `track_result` enum('NA','INVALID','NORMAL','DECLINE','INCREASE') NOT NULL COMMENT '跟踪结果', + `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', + `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + PRIMARY KEY (`id`), + KEY `ix_perf_result_task_id` (`task_id`), + KEY `ix_perf_result_tone_case_id` (`tone_case_id`), + KEY `ix_perf_result_tone_suite_id` (`tone_suite_id`), + KEY `ix_perf_result_tone_job_id` (`tone_job_id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +-- 表 test-lib.plan 结构 +CREATE TABLE IF NOT EXISTS `plan` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `title` varchar(64) NOT NULL COMMENT '测试方案名称', + `req_id` int(11) DEFAULT NULL COMMENT '测试需求id', + `req_title` varchar(128) DEFAULT NULL COMMENT '测试需求标题', + `content` json DEFAULT NULL COMMENT '测试方案内容', + `status` varchar(16) NOT NULL COMMENT '测试方案阶段状态', + `cases` varchar(256) DEFAULT NULL COMMENT '测试用例,多个使用","隔开', + `tasks` varchar(256) DEFAULT NULL COMMENT '测试任务,多个使用","隔开', + `reviewers` varchar(256) NOT NULL COMMENT '方案评审人列表', + `owner` varchar(256) NOT NULL COMMENT '测试需求的负责人,多个以,隔开', + `report` tinyint(1) NOT NULL COMMENT '测试报告是否已生成', + PRIMARY KEY (`id`), + UNIQUE KEY `title` (`title`) +) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8; + +-- 表 test-lib.plan_review 结构 +CREATE TABLE IF NOT EXISTS `plan_review` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `plan_id` int(11) NOT NULL COMMENT '测试方案id', + `reviewer` varchar(32) NOT NULL COMMENT '测试需方案的评审人', + `status` varchar(16) NOT NULL COMMENT '评审状态', + `desc` varchar(512) DEFAULT NULL COMMENT '评审内容', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.product_category 结构 +CREATE TABLE IF NOT EXISTS `product_category` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '大类名称', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- 表 test-lib.product_plan 结构 +CREATE TABLE IF NOT EXISTS `product_plan` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `test_product_id` int(11) NOT NULL COMMENT '测试产品id', + `plan_id` int(11) NOT NULL COMMENT '测试产品实际复制执行的plan id', + `executor` varchar(256) NOT NULL COMMENT '测试产品执行人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + +-- 表 test-lib.requirement 结构 +CREATE TABLE IF NOT EXISTS `requirement` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `title` varchar(128) NOT NULL COMMENT '测试需求标题', + `outline_id` int(11) DEFAULT NULL COMMENT '测试大纲id', + `outline_title` varchar(64) DEFAULT NULL COMMENT '测试大纲标题', + `content` json NOT NULL COMMENT '测试需求的描述内容', + `status` varchar(16) NOT NULL COMMENT '测试需求阶段', + `owner` varchar(16) NOT NULL COMMENT '测试需求的创建人', + `assignee` varchar(256) NOT NULL COMMENT '测试需求的指派人,多个以,隔开', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; + +-- 表 test-lib.task 结构 +CREATE TABLE IF NOT EXISTS `task` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '任务名称', + `status` varchar(16) NOT NULL COMMENT '任务执行状态', + `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试任务执行方式', + `owner` varchar(256) NOT NULL COMMENT '任务执行人', + `plan_id` int(11) NOT NULL COMMENT '测试方案id', + `plan_title` varchar(256) NOT NULL COMMENT '测试方案标题', + `cases` varchar(256) NOT NULL COMMENT '测试用例,多个使用,隔开', + `desc` varchar(256) DEFAULT NULL COMMENT '备注', + `run_result` json DEFAULT NULL COMMENT '手动用例执行结果', + `config` json DEFAULT NULL COMMENT '测试任务配置', + `device_id` int(11) DEFAULT NULL COMMENT '测试设备ID', + `device_ip` varchar(256) DEFAULT NULL COMMENT '测试机器IP', + `workspace` varchar(128) NOT NULL COMMENT 'tone workspace', + `project` varchar(128) NOT NULL COMMENT 'tone project', + `job_type` varchar(128) NOT NULL COMMENT 'tone job type', + `test_type` varchar(32) DEFAULT 'others' COMMENT '测试任务类型', + `cluster` varchar(256) DEFAULT NULL COMMENT '测试机器集群名称', + `tags` varchar(256) DEFAULT NULL COMMENT '测试机器标签', + `tsn` varchar(256) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ix_task_plan_id` (`plan_id`) +) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8; + +-- 表 test-lib.test_product 结构 +CREATE TABLE IF NOT EXISTS `test_product` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试产品名称', + `category_id` int(11) NOT NULL COMMENT '大类id', + `origin_plan_id` int(11) NOT NULL COMMENT '测试产品对应的plan id', + `desc` varchar(256) DEFAULT NULL COMMENT '产品描述', + `test_method` varchar(256) DEFAULT NULL COMMENT '测试方法', + `test_requirement` varchar(256) DEFAULT NULL COMMENT '测试要求', + `need_config` tinyint(1) DEFAULT NULL COMMENT '是否扩展配置', + `owner` varchar(256) NOT NULL DEFAULT '' COMMENT '测试产品创建人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +-- 表 test-lib.test_suite 结构 +CREATE TABLE IF NOT EXISTS `test_suite` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(128) NOT NULL COMMENT '测试套名称', + `creator` varchar(64) NOT NULL COMMENT '测试套的创建人员', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_case 结构 +CREATE TABLE IF NOT EXISTS `tone_case` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `tone_case_id` int(11) NOT NULL COMMENT 'tone用例ID', + `tone_case_name` varchar(256) NOT NULL COMMENT 'tone用例名称', + `suite_id` int(11) NOT NULL COMMENT 'suite ID', + `suite_name` varchar(256) NOT NULL COMMENT 'suite用例名称', + `test_type` varchar(64) DEFAULT NULL COMMENT '测试类型', + PRIMARY KEY (`id`), + KEY `ix_tone_case_tone_case_name` (`tone_case_name`), + KEY `ix_tone_case_suite_id` (`suite_id`), + KEY `ix_tone_case_suite_name` (`suite_name`) +) ENGINE=InnoDB AUTO_INCREMENT=603 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_job 结构 +CREATE TABLE IF NOT EXISTS `tone_job` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(100) NOT NULL COMMENT 'tone job名称', + `state` enum('PENDING','RUNNING','SUCCESS','FAIL','STOP','SKIP') NOT NULL COMMENT 'tone job状态', + `test_type` enum('FUNCTIONAL','PERFORMANCE') NOT NULL COMMENT '测试类型', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `tone_job_link` varchar(100) DEFAULT '' COMMENT 'tone job链接', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + `server_info` json DEFAULT NULL COMMENT '存储tone job的机器信息', + PRIMARY KEY (`id`), + KEY `ix_tone_job_tone_job_id` (`tone_job_id`), + KEY `ix_tone_job_task_id` (`task_id`) +) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_sync_pull 结构 +CREATE TABLE IF NOT EXISTS `tone_sync_pull` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=76149 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_sync_push 结构 +CREATE TABLE IF NOT EXISTS `tone_sync_push` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.user 结构 +CREATE TABLE IF NOT EXISTS `user` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', + `nick_name` varchar(64) DEFAULT NULL COMMENT '用户昵称,具有唯一性', + `email` varchar(64) NOT NULL COMMENT '用户邮箱', + `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', + `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', + PRIMARY KEY (`id`), + UNIQUE KEY `nick_name` (`nick_name`), + KEY `ix_user_user_name` (`user_name`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; + +-- 表 test-lib.user_open_source 结构 +CREATE TABLE IF NOT EXISTS `user_open_source` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', + `nick_name` varchar(64) NOT NULL COMMENT '用户昵称,具有唯一性', + `email` varchar(64) NOT NULL COMMENT '用户邮箱', + `password` varchar(64) NOT NULL COMMENT '用户密码,前端对密码md5加密后的值', + `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', + `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', + `token` varchar(256) NOT NULL COMMENT 'api访问凭证', + PRIMARY KEY (`id`), + UNIQUE KEY `nick_name` (`nick_name`), + UNIQUE KEY `email` (`email`), + KEY `ix_user_open_source_token` (`token`(255)) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; + +-- 表 test-lib.user_role_op_record 结构 +CREATE TABLE IF NOT EXISTS `user_role_op_record` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `applicant` varchar(64) NOT NULL COMMENT '申请人name', + `applicant_id` int(11) NOT NULL COMMENT '申请人ID', + `apply_reason` varchar(512) DEFAULT NULL COMMENT '申请理由', + `signer` varchar(64) DEFAULT NULL COMMENT '评审人name', + `has_review` tinyint(1) NOT NULL COMMENT '是否已经审核', + `review_result` enum('INIT','PASS','FAIL') NOT NULL COMMENT '审核结果', + `review_reason` varchar(512) DEFAULT NULL COMMENT '评审意见', + `method` enum('APPROVE','UPGRADE','DOWNGRADE','DELETE') NOT NULL COMMENT '操作方式', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; + + +``` +
+ +### b.TestLib 服务依赖 +### c. clone test-lib代码到~/tone/code目录下 +```shell +git clone --single-branch --branch master https://gitee.com/anolis/testlib.git ~/tone/code/testlib +``` +### d.增加docker-compose配置 +```yaml +# docker-compose.yaml service下增加test-lib + test-lib: + build: + context: code/testlib/ + dockerfile: Dockerfile + args: + APP_NAME: test-lib + ENV: daily + image: test-lib:latest + ports: + - "8005:8005" + depends_on: + - mysql + - redis + environment: + <<: *common-variables + # db + db_url: mysql+aiomysql://${db_user}:{db_password}@mysql:3306/test-lib + # redis + redis_url: redis://:${redis_password}@redis:6379/10 + # app + tone_host: http://${server_ip}:8080/ + tone_token: tone_token + tone_user_name: tone_user_name + main_domain: http://${server_ip}:8005 + oss_url: http://${server_ip}:8005 +``` +#### e.重启服务 +```shell +docker-compose -f ~/tone/docker-compose.yaml up --build -d +``` +## 7. 独立部署 FAQ +https://tone.openanolis.cn/help_doc/12 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" new file mode 100644 index 00000000..b09df7d0 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" @@ -0,0 +1,70 @@ +# 一级标题 +## 二级标题 +### 三级标题 +**粗体文本** + +__cuti__ + +*斜体文本* + +_xieti_ + +下划线 + +~~删除线~~ + +上标:Xy + +下标:An + +> 引用文本 +- 无序列表项1 + - 第二层 +- 无序列表项2 +* * * +1. 有序列表项1 +2. 有序列表项2 +--- +[链接文本](https://gitee.com/suli01/community/edit/master/sig/T-One/content/%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97/%E7%94%A8%E6%88%B7%E8%81%86%E5%90%AC/test.md) + +链接名称 + +'''python +def hello_world(): + print("Hello, world!") + +![示例图片](https://pic.rmb.bdstatic.com/bjh/gallery/03e17cba710868d9153176b50a5fca0d1090.jpeg#pic_center=100x100) + +| 列1 | 列2 | 列3 | +| --- | --- | --- | +| 单元格1 | 单元格2 | 单元格3 | +| 单元格4 | 单元格5 | 单元格6 | + + +| 左对齐 | 居中对齐 | 右对齐 | +|:-----|:------:|------:| +| 文本 | 文本 | 文本 | + +
图片名称
+ + + + + + + + + + + + + +
值班人员星期一星期二星期三
张三李四王五
+ +- [ ] :待完成事项 + +- [x] :已完成事项 + +
+ 图片名称 +
diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" new file mode 100644 index 00000000..d0a3a7f0 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" @@ -0,0 +1,2 @@ +# hello +![测试外链图片](https://up.enterdesk.com/2021/edpic/0a/13/7a/0a137aaa28f48af0349cee1e568c0a57_1.jpg) \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" new file mode 100644 index 00000000..e5d110a5 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" @@ -0,0 +1,2 @@ +# hello, 欢迎来到聆听 .md +## 阿斯顿发射点 \ No newline at end of file -- Gitee From 5877871043dc9538581058461b865601d8750db3 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Mon, 20 Jan 2025 16:56:31 +0800 Subject: [PATCH 111/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9547-?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../000000000130_anolis.jpg" | Bin 47154 -> 0 bytes .../T-One\346\246\202\350\277\260.md" | 30 - .../assets/Dingtalk_20240614165831.jpg" | Bin 6459 -> 0 bytes .../assets/jiagou.jpeg" | Bin 366652 -> 0 bytes .../test1.md" | 73 --- .../tone\351\203\250\347\275\262.md" | 615 ------------------ .../test.md" | 70 -- ...26\351\223\276\345\233\276\347\211\207.md" | 2 - .../\350\201\206\345\220\254.md" | 2 - 9 files changed, 792 deletions(-) delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/000000000130_anolis.jpg" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/Dingtalk_20240614165831.jpg" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/jiagou.jpeg" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/000000000130_anolis.jpg" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/000000000130_anolis.jpg" deleted file mode 100644 index 25e606c9c5d28fccaf9f6caa351e3720570e4162..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47154 zcmYhiW0WXM6D&HmZQHhO+qP}(v2EM7vB$P;duEUCKIgo9zxS(q^`EX48JUrhRiz{; zCPvi`0H7`^q@bq2L4f!7eeMn<2axIvcp8{5LLf`Bgt(NV6wzxQ0TI&FZVS{Tr-Owt z_RTr+pn~i}Z87TWLF&hn?b~9+tqzf&fBN#k|LSSrg81WA-d-i|m5aaolgr%y z_2=hj_HKAy_Gfkz_|MO`yk+11&&}VD*R$J?KM!>`-kPrIhcm0+99~nmVdpky9@?(B z4?dm#lS}^Hcq4u7el6~1?=7CJKbPm`k4_qoTBtdm!=2askzov~vCvpS(=2_6fKf#p z9rWLiz~|Gy%$+cqgu&jLff zTz)IYo*w!~c5F_-vzg(j$wz9S!&vtkccdmCH4_Pd%DU~?UmvBdt#;fag6DST`_P~n zt7VuWz_Ox6Uawkys+#LL+QrtRrNve9k*t1}>aRMg8PDbh$2EpoGM$juI&QA|o;Q;5 zD<>61Ns|Ue&p(MPr&Q75i#eHsmf*Sb5f}wi2veg!;6603k$sp<;LqlB;Ol>%nV*vA zN&ad_V1o}M!W+VVtU-FmX!|d&za8N8 zOs6B-u_AxtHE~n1IPK6{oSws{hp1e*if_s^AsLB^^q5-wVDeQ8S{+x5q*G0ArrVnW znmx#~dTn_K^x=-+C}te5UY;F)pm)P01{c%rV#Qyud83aYX`CoG-?J_&)L8#vUX9p3 zP^OzS;RQiH=^e0~Jb z`HOPiM2b!nF4ND~_>(kw3DVY9k`0U15A`h0*@T6i!GQ-;)6R8)UINdzGq_~&v8wiZ z1VQ$!EK#VDag-STVR^sYzeE@omV^)Z?ar{~as=o?Q0x_|k2}eKcKyi31igA3YVthy z?k3}t_FXQC^RiU^&}SeN#+z<9RaeDjVzdVYFGh9GO4iiJB6Zn<{XM6d>cY@+8N1ar zkGZGL3ruzo9d~R~GKVIDFO?f3uxF!=@`Y5vLEh-=*?;W3vA~SO=5Hep755v?t1p&W zfMPx)F<1l5_@Asexbo$XtiJ4#(ZOY|G(6tf*mPEh%MM^%OZ+K&x4;I`Vbg#F!1Wur zsK)$oN;uHI{pu6yKv$-}Y>Pf8@$vC6u0Y_JnE0f2Z3n5+#cn6aRg-Oo2?Wv%Fo5AYO2kr3D24)~efU}`+ zX>wWV5GP8if%-3fhSgk8dM1R(?=-r2bPGSpTmP^Jn@jt+`5@iW{4$rPi1sRZm+oS% zM@dy_9{b?GLgP0e<_y@$w@1LMyZRXg$__V)Q+J(U2}75(|pRzUuq+D2E)?E z17nPq<+PM+nLR$2Ki#m!s^w%7=J7{xm3FR>*>^O-81mVQic~fs`m5*{B0bRWHy^pc zKuv2D_+Tp8D-Zz@cOS40?QFe(S}6h@W8uN&DYIL|N9u9&{RYg#t|nPr6eHIG#giWA zxUZ{I7uwjg+q|8>)#opK|CU-@x@B1>dT>OL(+6wgpYAx3U2L$*dnkez2(xJ3EW0~W zIZa5Qnwf1CZZZ)Oq^A$UJtT3q_uJyKHZX+c%?{O0KA>>K8sq8voxcm$OkVtYo(H@U~`Tl_^{{NQ>yYQ9-Z zlbNt;#UJyp=+N#P7_OjAl5TOoPb0b*JI09rPBsS>?NVjLG-g(?A?)bpt$z5mAao&O zP*b*@E`rG`cmPMnAx`Rbhb#P$?hHz-l#x-yHG|lQu3FYWAxO8cUuwy--37jn#BH)Q zGKd*W*VS7dVrT!72*1Z!j!xS}WMJ(;GcE934hW$SjlFH-tHdxH+fW2OmSAD@A6mP< zCi=^MUc-9w&*E}E#a1cyCFLtwzF7SyK+&?nN2`CX8I{+fo#&(KNWe2R5a_6GQ~}CH z+liQ)y00}wU@fT7Obr9K^$lp&e`&BtHlJ>ZmK(BuG?D7Mx!RA1pHlL@Za39bVfTHH zcB~dBF^Wd^##IbCgPyXggYub2^X!TQhl3TCXZvelOm=jcXKU9k{`p5pHnl_q_x1`f z9qyDySg6C3`m_^!IhIQxOveXx=|~z(<56OpB9w?5=oaj#RJldWd>ev;MzlESIBgw8 zS>yd}j;Bb05%|`*i|YyKrWUkg%xnWx2wzA$2b@2Gg;vp$i=awSkd*BPfQ4f{Jd{;s za8mMmL0+%`s{ZyP1Y=P}8Zsx8EzQYnV}HYE`RV8SZ_j|LbZUy!&i}Y>he^k6d6A=i z+yq74cJsYgu0tJHiZoF|kLocX1lEa?@q-Wb6=!2l>l4$o!FSwa=quMC=ld-&m^i#G zIn;EHD*_wgvgm*mW*W@rcnBR2qZ*Kim>l2kP#qhgWl=wVl)5!vHlB`O-iTxg5%r?4 zysrT05rk}LX!4K3zAbC6{spRPEcx`OCb~jOU#(*axE8HKo^oma*W+g!$nY%F!K0~m zo|bE%mz!kjAgg}Z@A8xd`~2jcGTIT}fx+AfXiBW@z(ax=4;cg0(scRAeUj^Bm3+3; z39;@AH)-%U-hStZxZq~d45)Ib()(Hf`xnoqf={^+9yDFL|El}HiFRdQWnO!40}Dbu zs$YjB)egLwIaPq#Xl#lgqPFZKj7Ufg_I3TU1mfn3yRjaSZ<)V~zpFzj%Q;=v?xMdu zECzLM<4t~hc`Z!E*zMYZi1i0;50nV7KCZNa8lXA)k455fj+@r!*0&QoJ4fIJJw9CU z9ho{KuQw(;Yi*EdpjIiDN_PAXv~Od&U;9)i?EmDrRnGWZE_Iz$ITb^onQn00rWPQ{ zTiGS<$FVP@W^UilatJ|j*NH$NFXHrN;7t+GiKU2jE03mLw6zpM9!XLL z603aO0enm3ciz%n2>ECEn$%DxM`TXozL-qoyjNWI&e7Oqq!72>y6l zWDTeK9j@F#>S~6RNUN$l$l{B1*b&D`;BT5 z!8OUUit#A4mJO8uGk0h`B@d-A2vm4 z_Zn5BU6}WmA9Y!n4T+CHpIdla4=~yqsS_em!hBD_b?yOGnyA|FS5m!;VMt+7Xj@OQG#4aMDcBpWW^ z-H#X#ao9?b(vs(3b zj}K9Nm0ZHBd-YL$bxghaG9^6#XFw^(5#2@SVs^uSQ@Z(Ee|vFLfYAOVc)lz;2pDmvJmCwF?wgEG7j9oV*^7_U%lXnezy1^_}g zMg56j1BnM6Lzc-Iczn9MBTQ>FAKcn5qs=MOT{+Ub-QtFQETH+l)Cyu~3SyMDvDWsivfd}@L0mH?^ZM-00G$q0C zs9XuwrFAMq+ziimrZ^kl|5HYp2kvL{MU#VT+NN28TC%XS`iMprvPq5XAn1Gkw#e zp7TQ|$*<2TyW9optBPRVhr3!2745576w-21`uZTYSk-8%Csd^xT$W4;ylF^i7Y2_I zvnCJ$8u@$B(hCJO>4Rq9-?Vy&K00`rip6lbV%Gm_h1d>xLlA%s8UJCtnj{mTSVMMP0tbrZzl$4;b_|q?|*j`k)T-oW^ ztzD$&U_udDP>C)};gA|L<8VRkK#Mc0^>|skhS2btSG-e!TDkK*w`;=z0ET<4FxCof#8auWk1wY*;ePscogO?*ryWHk6t23r zj@4(dGJncj^RGd|QchmeTLjL$tW^EMoi`@<(Nwud0Kv^Xwe9x;Z>OFa7ZCB5A1ExI-FyIR0qiINCA$1BXwB zS~5sn29XfO344kLi=bTWPf#&G^I09{cpsuZ$q*~LK6!lzJf<lj0`$Jr3G*a+r<%G zu9DL1i`&6WFBEeayXm5bqaxfj*3dQ*7nxG$+cGLK?$@Qsk+wqwt9QEAdUAn;L$u#_ zvLG|*WR%B7*80S|nbi+F)TAhzjRuEW)2U4I&fU5FY8d>67I;1D!vo86xK*Fn@tcWM zQkaVp4LB5e5ukDGJEgICic2czgueJX(w|J-5AW=)KcLyX2ut%o{{LnY9b|Yxie~IZ zQ!PoCBRW2h*M2#^ z3=&pk*|qemr5~C)`=ZAj?oV`OZot)mR}ZTOvQ6C57C*T$C*913Q15FteXs~DW%$SQ zPKk@0$r>F7EZzsU#8KM9zX+NoCT2S}WDAr&8=dMXQkCBXhVUY`v@<_q65%Hb&4+1_ zzPg0Sdp#2Gw?FwA`vc6XzOMuVDE4^$2xT=&*#FcS7K}9bI8JwD693=XQ88RAk9^ho z`V;noWtdVsETW!~Lo#bzaSNPl8*{bB`70Pq6)|7osh)y5Re2ei)imDLT*O+L5_)>9 zR5wWKR$xqMPK;_n=)<+!8C(^A`V|30eq|~|ZRu$kGDX(~&06U9zG^~-7%Yd};sf?0 z6L~xKujj+k)j03R`78~PHIkKt-ljm)7Nza0jYMQ|zpDRhS{uK;dWL&4*c~!e*MPdA zV!I=}Z^Z5PdW5g*&G1d&B4G$75jtPoC<)8%NUqrG%=@;|krvZsK{RsvSY_0X%If1Z zV>=FqW={7*iM5Rj6-bPe&bJ+F^}~DlV9=x(Yj@utRoBc5m|ky+o|!K#8ppzUe@ud) zhCUuMgFv1Gy#DBUO-T#4WplSJa&m`(<`L8o7=fLwP~#zf-<#@Cu~5N=W24lu7HFxSXRp0?Ak!3S#lPKETF)bjeJ?t@Ckx}sK5=@~-m|Lk#9#+8efh6v?SkITk`jE{ zQNl)yqThF`$2?cHbhF{AK8o?4XOP1?pEFAWz9Se0x@@=CtHpSwi{2wU*)lV;u?7&U z9y)K#c;xIHV8A33av`cJx5_6Uq^UIIA5_Ic81>2=-W?yi(SKe;7gEGEuTd|{5{tzK zLsLJSjD(01SWzXq%`S1w)79%L8Q}H(>uIM!@2kNIM>1Cm6eRqxYH2bqm{k4n!U0LF z^(MTC2Clv_G($|MJ}c#MV0O7-u$GOVVyO8W(fGvMFvNMQ{@5;Er`J%o8F?@nSpVL1 zhu#U8?FW8?m9lGzu)B@1o}8DZdN3R0jxczam3riEa@lQxaXIv^re;dI9?%~gF8IO5 zAesaG-Qtr74dE}yUPq2nh5_;IEx=bd6GVQrQYfcUr2bEeYkEDFd}|~(G-Sh>R)_IR zR>_vuZcA3c^eoyB-y%z|f-KGEgLkcTQE?xn8##woKS&PhVCzc7Nxb)XleU22gC!=J zE4W}zS?DAPpAy(KpgY5yG%T@Q8EOWmY+uNzFGXpHAU8T*g6T|}yCl~6rH0v(NT{}@ zMx7G6K!<$&t_I28@JT`tH?l{zb4Ix~I$>>?+3U;-5%3~cr7F<3!-r^+@DJg^HJ;=L z?^*116)R`Hw`E~Sq+x8cTy=Dp&&;*9U?>cpO5`uKn)7=>$(wP_a-C-uzLuv-=&Cz) z7nvzw5f;LX%uVW(e<=H+E`vaiHY>&iySw49E^xG25Z z)eTI@H=ivSM(2C!dukbeW3PH3uL#UK{OjO5rQiS>1TRjw?Z^k}n!HQj z(ekIwgRvU_2BsgP(>5>`L8CltRWx6HN9V1sXREvx7vS@AA3Zai+MU+#7VVn%La z$%B{p!t0RrlN>BG(@Sxoc9H_l2F;0+@z zeppD}y)UXxKtDMBRXXhFySZak=g>SmK(;Vi+xS<-ZTQpkK{D34BCbvnfFFL zSJU$(6!wS;9^kGmRf28YA81j$D{FZ9+adZ%DoV3>=K3j-DHHYN;8F_PN)Nj|XfJe5 zBE%MrfjX9-WFPStd&aj|Lm%z}z_g=;SbZ0WMuJd4!=jt!MmPdM(J1(Y*aRvYpLu?h zrdYRu-@31NkS!OE;uGEW928qp@^y;zG4Yk)i7=Y9+I*P^mn(2k?@wzaY=NQZtzH_H zgJS($syGB3_TrI@h{p40WBNO;Fb; zmsy^gO0<`f1iDeIMNT@p97tKn3eLQ(Pt}9$0u78JvF{@-SkF;Jd6AIjxs(Daqeu&y zm1EL?WLSe-J6-Zrc`ETr#WKc!9f_eGoe`6M4Ce0f>AmV@d{8C%BscBRBika(-r08g zl^qFbMXSGv#|<-N`P%{XPL7#()B;oe$QG%x8Io_`k1$L_>byE&1%G*LhGuq-N3N3u zT!!tGo(sHc4Qb@3xJYYqzTmO9pr!8a=*MoRqM(n0Zj>C`rHj2=T!p2(mx}tTnuE}c zR_hpy`mCVRFg@^qL5s2LQn17}DXp)M;j~wy5SU<}eQ5U&fKIQwqdD*7X7wOhdHzSL zgWnJbP5Iq*x1Wt7&wMJESqw3}_wd7Wz<&Li&7OHKSKRfll-#yKP{MxF^i83kkUkdD z2ny|B$${TGRwGLZhfC;H*k$@NT?~GNOoZN=8*}vuZKIao>)6D%6u$MazTg}hZyh-B zsA~HgU5B`B`qb;hQVMzkjP!I7O+>Lp{v29d+_MiNBb(4-9ECj@pK z@?EuA&qT)uY$k=j>8dB3$_Ew^nY|B`Z;$r@xOg~qC#3J%E9!~@am7cVy(B~P=Odlv@2r$Kr?0N>Opeye3l|NZM%eg2}Jy90(>D zk&K=v0$*P5A=d9V3B#TQv`lA7jcSz#`9x-jS(*-i&X=laG6v+ViURgi<)+9+eHp;2 zN6d2ce`e~7PweDTLo{-L%CkZCZf>Aer6EsRk#8^1Ckr0}@)VQI@^>GD#|ovx_}N0(!On3CVN0ZI5a^Gv5YYT(oRbM#peR5AXS9%j$a@7Mqn6R1 z`D66#eAyEl%Zdp$*dKt1ziC%VHA9A&$5#zHh9aZZ{+hF62_l1|W%+9^`1bH=ZOc~s zx?OlP!im`Bt1LVGir%4??;v_1$O(~w0+V#F68h^@93?$ktY~o8+X|kFFo!Qh99W<7 zxcH^`k6Xv*q}V6zWzNb5DZHDLTPtYugGb3f;d0h^ML$U^cfq6wknEZh=spJr312%E zc|SkinM4)w9M`dd@!EbZ(eF6Rdu%Kxi;`1F=e|7B7(WN>0J_nfD$!@vqRxTx7;gy; zXnp-n;R6-@R;T_S{aE>?>Yq7P)o*lVDRL+DfQi5^p1YTv^MBf2_dndrq9Utp)MO4T z+A!*r1MTcP%I`*>vk~f$5N!#q@AI|;)b#Ae9GX%Qhylt?3?c^6ZLFf45%Eu0{T|#; zjwox~LGPk+VO~fb@)scG=+S#lRcT6{WlIE{y(t`I5o&(+Q^NU`c(7?MUJ_o=p|6q_(KT4gfy%_ChHh{q|GYW1 za~af}f2vF>BNyGjH;hDiGZ)dXZd|ejU+hNVT~EUJH}s=ir(pO9=RE6|Vb00uWZ+WK zL7Zzm3qa)(Ox6EtLwEf?g@M+hnSb%PcWE96E*Sr^hg`?nJGF=Q|C#;);Q#z2zyyoD zJ2Mx=Ri%=N6jKF||G5d{sq|-O6WI)Iw|Z`9(g6?gAC%mpDrq<=aP4g)858jmQ{%f@ zU5TpEVv(G5cMuZg(8M|k2%7U=Ni*=tBK*caO&8Qjpa4EAm6U@dSoqh{%m@dhzig`KVYPU*DMV ze?-6;>{BpSQy$VWPhAp$|Mq!@{%odB?nBsH%^m!%uMwJkL#k5cqRiF1-Trd_3GdOa zQeaiX$>82k0~aR@iCcm=k^(MOXVV&8>p0Ov!(p_Ui5E#H*G|qzR`|PF4-r8~;p(-| zzjLa7#~*@{9)#M1=0r)H2In*`249m5Z45+>S7o6%|;g-@{$Y;UUy#ZfnaC) z;!SEfGdnrOlBklRv4>xO0mkTHYAu#BLw^sB;*>C{nc18N-OSi&`m-6;KS zHcq&6vdSL~DOBw20EDST?5xR`O(c;*np+L>#T$Hx3{)rJIh)G-XVPmInf>sUq&+as z*B%BN{p=h`vAiE zHs4?1d6!VJOKmGa&4`qPFLRopSPDRL-*qAW#IW<8j~uE``Ic0&a38WSp81JJT{Uad zjD6dyT3j^(=5hcJ-`q#EO9i#NAX78y`bzO`>=2Wk`1AEsOs z3;s(nQ7ZBBPnJyUi%_`yG!egqKg97wYztufo<|4c5qhZU0A^qeEQvjul0YnRgcRzO zNAi00f#v8T9DJlDnPj{_KLvFS*+~Y!o#X!6=e83*XJ246KJmWRs$MB$ce*I^nv+bB89Q+(;VQ$=5Pnvk(bl=P6?THe6e zL0OEF3%BQQPv?W4qjxW9BgEp(h0d{W_~p`*xC5HI{2?QD?+jXcCJI{8css!>^UJGp zp<}o+Vq}sZoBw)J7jU5H?!_zh1$!ssGHFubwqzv=53$ZMd6U1vi!)}iJe9@qM@KYH zaF-P7s&X&SlC^MOv3yTRr%JJpP%Pmx|MEzs;#OzQcMNFK%!w5Tj5*kUpvsR`jCPn? zbzedTr{{4hoz7|@_A(Ag7mexrd(Oth-2M$52i`-$o3-_*tzkXOa}5OVIVMNO54uys zw$kNyrBT40qbzGVu;Rvdo$=Km5Szlj=Y{ms-JmQhe)?+oSx^&xrK@5mm~HMGCOV4j zs3DZqc|MbU`q-6X3e;52p`0#jlx@*?piGRsJ) zAUhgs@Y0RBQ0`Fcl-L>suSzIh5GTzMVVhKS@fOT1u?y-j6$>~G^ z9aRG5z76tG1S8^La-4&7{z(BP`l-pt3cN2Dmt5^5ig9Qg3e5}rAYIcE$A$mMNI6Pd zpn=ba^2CKQZRbi(#RCuEiEQRPLa%}j+yN6U%(08upOGN$mO+FmglDHk@SX_wGXmfH z0R#1Rr3@wKbWV=#q*f!!>fo^2X8DUC*~U5IP6=Ydr<;`02CPL?|gkgbM3)!`nG>6(wd1=I4QSWASg|JKxnN4*Fpe_MZ*Si8pk+`+^y>aAitgX8@IrX0>F=G zAd#(K-hdOtA9rYB6t8KzSl0P$56KmuYx#$}9yf8xQIklwAqR>yZJkZ6rI>oE6y@O5 zFpg-?fjlJ23p1S$XrT8a=d9{^yun2~W`P4vVBRH_Qyo{DQXux^Vqk_JqGHhS_lDxT zbmNn?Wb(at#xNf)73}F+8|$rTORJv_;LrO0McP?Ep^vlvbP5nF8_6su7->_hO}_&x zx`f5i&9$|Z6b-ehHGQmK!*vE0pV0N!v3lDhb=$gWWub|j1~`hlFe?r9<=o_1?sUk% zN%0^9>XVeqa>@@)HXf5op4|B8z|;}p+jD$tX%ny2e8fvoeEy*Q#A_4sIDnl(rvFl} zu`D{t8Xy9`$;bug_Hz>uZfz8r39OjCQnHkn@oEj( zfc{c4moO=g!p$y1$TYlrK?)D3J%Z2QZ?5tLLt}YK2AI`aS0)jeQ9iv@#qsxx3K^`{ z>%|ax;EWwQ@{$kP-kIIibE{6I1c=hb(sj;&bZs}j(AxIip=~;C1ViGp*J;tFP4>;2 zZ?oCK+@=35I{z+QH?Lif@+H>wlL*jjufa!wtlC?zF*qI$z5*Z7CB2*E5z5=JzTo(v zynH;=N%K#L0Dw=T$uS3q#od9HrKKtMM`MRCgRicVMgw`JX<%FGH&s;CME&CU(FLHW zOO9A5urJ&I-9_n&sj#+@SwMyN^Ow3c=VM9-v*^5$%VWa~4(d$ySGz$w6Q=szwYSk) zD57-fibghyn`Y4PlJ-qidR;v}EE9(s1}+{0FWZ?pSM*35yI0i2%z2xVW9j><19EuH z?Lg>(NRHb4&+9Ug?#aMLKs=)rB~NYWwB6_-192cARHzREPe(V-k*n5WK2e$!PMgy| zGLFQn?a2rZ_&uT6FgC3YRYH#!3C!mR>OdI4cKY3C?G6@0`jL4#z);g$dxr4q)h~&|? zXJ6(owJDa=eqSeUw7K*-hK6fnZo#hwlk$k( z2Dz8yIc`lV=hg$m`d8#mILP|P@S_9IN(2w0Z4Z9Qb>=CryJQ2YA;Qg2!e_%|!?$HK zely^19fD8CH}E@)qN`W#&G?v)ba^MkmN014!t=#;B0jH5yyvcmQH$jXE>%HLi+B9w zyhH>i7}hW)it`%k0^?B=TyZnnTUC;fcxN$l8Xfdmq<$L|3kF*Gs4mX7?Fc_Dc17y3 zQRyxmv8}m{HrsAxs5m)#5B)oPuC*!OUt9{5Vi;b~9g=>KbdIO2ggR>lmmf{~SN~we zRe(6oS>*l@MFfgczWp(f0YtGqFcAji|AZb9kVnwJgxZhf6N)}UYKXRM_z`_foWX&6 z>qQxhMmBa}@vy|g2~sM29c`rgQ0mg}b~G6|A;qwNYQ{yZ2u-~MI=6TWhQ#)IK4nOW zPwfmM3CZ~61*W9%YPIkpApCY&$a?CWtqAu4h@EuNu}s(U$7ad5M|bLVmJ3Gs-5*TI zn2RH&^!FI7tBE@8>s8+{$u(EyyZ)H(39nKRsZdjz;m=r5SLkRqLz0(ihB*;N6J&#a zIQQfwi)K>6Taq)cFpwh10WSN(ab0~!a!1*cn7!?dcFvm6pF|RM@#&zYKm~{{4iZBe zu5*)qCllKS12~nxq$%O3arg@i&P@^lEHZ)G2mC!vSuv0OK6xfLzLFu?tvixSb)N)- zB<&YZ;TU%3*$z!<0l(64>2yReQ#^UwveZ};bE^^HLFq@2ud)nyQt>(dKI_eGD4<#C z*cM>Lp~S&#oI7v@kUuw;J#;-jxbg)OYNfXYia=gv`%~aKh4R9-@v-jN8*_6(x*g^~ zHlUH^X*OHz*b|6FPbqQG^ZZ>RlifM4F&Nb)w>so)ArPXq6%>~OILzx1Qu6jvdZ5KR zD>8r|0ITzNuM}dV{eTc5TsaT z>=fR`iy<;&_RxezHb`WZ5(D5{1a5Xa;kX8vQSYR<-{<@}P#!3tTJa6`)r7EqbHZpk0J{H5%X8~by=1BoRC}fT#wu|j?}lAF z{`@YA6{HK94WpX*e4kf4SX{~`1LWR!>d;D6iP)(K8rQ}Dg!ZTW{aiJjgeQh)d#U&( z6A{1g%r0+`g9QA`lY2X|sfp;(z)D#j?Mb2-(_Zqq^@~|TBpv_|S25==o_rNeH>pl~KLIaE&|7qp$~)glCzpHH^B#bFOxa_nV_|DH~% zdo+Z9HP+urKw?sCH+G{Zn%2_;lP(rs>YFZXP2J9N%LPSb72rDGxr=siy_#9tl&zzn zm18$At0@E7#`p?#Mq(DwaTv$82g$&s3sjfPTX94>SJx<+*VN_^;)UdAt+2vPLaaD` z&UmJ=%-Wfkm?Sz;vl-`HN`ow@7ni9QxI+mt!9Yjt>C*p<)kBHkPhcr=>I&o*001QU z7j{DtE>Knj2>+~lwdSPu-851eKQ$`>ae1qTk)^uqVB=;Cyf2PX=xO+By7Z|#pGr4C zMnEc6h}oL70Rjj`Of@=wo<5v}>F=gMhAlw}FgH>YqpWQ1q9LQyLKIB0TR1P+U*ArvB`pZS!>=j@_I=YeMz*0F5!E8o>56!Pym4PR;qXS?J%Yz_5WZAt#L_ zvW60Gt@E#?BLu@pEJPnu(NU<;EXi{2+YB=3D*UxX4pkPPI(yVyKr%tBSL+(55sf9y zs`Az@J%-t2P_H=XzG-3y-Z! zTw|3K901vMC21yN1w0ZDc}-j|eqoB^@fG3^&!eUx_S{lM-TI(TocmQ|bC;ky9(-^r z4)?Kxy!q8)M9JI%I|(wr`X-*%-V&3Om8>dubm2+=o}*Gf0l+JMo-T5(&(ptone*yI zNt2Q14E9Q$Mn>_DKsQo--SleA-wLFi^l-<>I0s{2YOG=2_hEAr2zJYQU~jSHzBovZ z#+xZ468C+Jmgo}&y~a$eeXAQyc9qCYB+%Lb{648oN97ckbUyEOozFf87inJHpC9q% z_z^I<75M_fVmgnp%MvVD4-^FCEF<%lyZsucDF1tpLHrN&O}g3OCf0oeOKw8mCZ4q4 z@mfQI?5jG9JLMAy6z+quVzCXpIVUHfBQWdc^{o|tx(gX7CpJN9*Ertz4i9g_u zw^Jk|Q;RG7^5j>PRDOS>#%wtU08lKPoYv`Q@#;zZ045AP#B6w4>-n@sXeMMh16l~+ zoG(X^`M?3v%Xj(n?SB}9g8w@~lt*UtF?0F8V6@!}A@RqlpM=>Y%175X1K;YypD{3_ zrwJ|c?k5<=SN0PAAc?KJe~~c$po}B9D>NUme|~{Enpw(E+wlu0m^|H-p35qriiZjT z^5x`EdYkJ$EE_Kw--MU>o~ZiO2En$yt9S%tBjtVspR{>k66u$zi34G9)OdYxd}a%S zK`@BGaaY?u5OOxsi(H5iX(k9#3lD!_#f)9}?Jjlv)L$;QCi#RC7#vPubucUMO?(u$QFXvrPh9!6O6Fj4rjJ-y_EXb#Yx&SI@b6ODObfJXTV)%n zoI4~Qy9ZJL_V0QvU2OKa*%U-MP$ES?Mfrp8VbdSc=^q6Ll{#0sBPpQ+08=Jz5NF7<$3u6D{-C4>aOmZrZ28q#+m5|SgPlcRDM+c7l6jcO zq^etD1rOpO)Wax^zTAER4e^6owCNVwC}k`(S6J+w?qGpWXPPDc76*LWc&k^e2m#Wq zy!J(#`{vIdnC>y|jI5h4LUa?ckUwjJkkEZ#!29ss>C1gY$y7fxbrc??y zq?r?;CE#UZfVuldb!3BJ6NDw8#M$RVvAcz8Zd+4B1AK6ROcY+&ol_%S?+Aw@l%!V=1~>gA~}D{I6{D zxLZY_`Zjv%$&^~*2UnG+Xta(fpS&{(af!d%0)nVJ5CMM`1n~>=Z!P+eox;@5+`e-n zL|(c|?M_cnkC`~8lYgDlIbF3pLET~t4}N*-iEi#11a`?q5^AO_gCJVKq)R-mU(0KIz4dyU2NWaJ))5# z_Z0eWd}+oVwevul4LG`-+lYhZO`^B%YAqqUk8@f7AwNa3Gr>#J-2S3}UE#8Z9!>Izh~yK1jNoCm$(Z%S0d;6D}Ius6p2{y$e!W>lf6>=n>~P%#WlKxp{} z%&=3rdPU#wI((VgU*Mo;E{Z*62DPlC@Hz)lk?}jLr;>i{X67Rt;i6Q2y;RdrAh%-9 zW@Jf|p4sG}#T1FeEV;|}FL&Kb3na4bFyUe_gG|S+F5&7Re^x+Cp8231)?0Wdu1Ktn zoAxB8q0+Uq+18+UQ`GDIkGkof?wLmiH;H@4zJ>6nbABEKL|kSY$`jpZ0KJOUc>y}l z;z2hdWBQC}WSdC`JPM{Kwr?0kQvyQld-6<6uAe?ku$`hhYI@3|)Xe}4Ix^ox;Z<(C zDBA0fWMOgOBxIe18;HZGw{3SbFz2`BC|+7H3U`Y5@@7(3*cr{3sU7$=-Spqy%lRR_ zSy`IEE(-vT`0||0jG7xRXA*x|QX_s{VIr1gM65M#*&g6ClrMb#!qp|x3YIuJy8`_+ z2mk=$FXjROFi!sAImI=P{*WvT?LEB0g<_~P@ctQq3yUYWV}p!USGVJ%_u`;pzrX5H zEuT0?2QJ%c@M@`Be1=gwAZA&RP0<6eTPf%*TaVFY4-3qXf3TM>cYMbeOF+vF=-R<{gsPE7~NJh*f-SjEo?A9W=N1+bS5aFaabEQB?rb zOxub=jS`ivTeoqRHAYUtzv?#Wi8!Ib?WT$r;K@o+&M>ksGs1>R zY?fYjw#q=BRvaV4x*7FVJh_Q&n$_o?=4o%s-I&cRlN29Z0mf1$}0r^5rVq1IZgoN zr3ltIay~SnQ7= zFdB6e26n@|5tRJ@D7>v^HZm|ttZ~PhL1iS1n=~CKw+>TxXzK=@!jkk{8VZ=jGJicE z*L0~^M)I>MIZ6axd?Q|%_VlJC0CD)1kdRX%ZC{|l#ZU@%m-~{Z24n&o6~U(ti2#z) z+casg6b^HnbhebDWmnfXVYYbrP=Z$RVB9v(u3a0POlkGdPdcFzK>WD zi#R5T;q*&O%L1DxFAi!3qnc;7%0SC_&8D4^*Uj$Vx=}hXPuZG2XSH z#IGUExvoMnT;dXw0Qi&zlU^^K!(QGz-rfHlUY+@nx}}<=tkixaJAc-3^hS`K3cvhbZd)S?r)~5hhz1 z;?yV1y`I=O+ ztbOPQ;`%#l0F3UyPQ`=Sap)iX0;d84^!GJuh}}5}(s*4o<7o2|c1)>y`UsS{=GsOO ztJ-AXJsVt6gQQw}Y%|`C6?og3vDn~-Gb6X#TvgS31O}Xc z1+*BxXo!{;&N*C|!_#Xr7V&DX8MJ6zf-I*xh`yo+JSs0|QF+Z=*a$UrJ9WT|H}!3C zHx|jwM%txXY$F#%45RPx(Sk0RG|&HVBFFlBMDM;e;oBl~*U@}Q>=QQ8(;8EWY0
w{4Os;7bBJFdc<&xkn4FS$fb?&kiXSE#OXYevk?s*A|}Nj5j*6RQjUJC*ptlj zUAphrs?{sGX{SP=b=oVA5pog9HfEM=T?ScA=~SK`OgyEUPGoUr9Wc=jCFijsgl?s97h3mB ztrscMJOc%7d2;R_YIWe*F%Dzoq#=U+>=rT7qtO!LNcrhN1~U1pM$_Fc{|^9DK&-#U zMNgf#LtUjObYU)=o%HCsD=3EQ-_fw}vLxQB2X&~so(#Aktzw6g1ILFu^&!w@Ah(1X zF3?1reQ)m6@i+Tr8j$-NuBK7~jLr<~sR;Rb+uFx?pRcp+JG)Bd0gQArIf1X|I_3)! zlG?1*$6QVN)D|?VWor!!VR|w00058ZkN^M^$FlI!l|9yyRT^x=C<61UV%{N|^)nMJqoI+k;poOa(1!t!irmf*&_s#A0 zCdZr^c;Y-d1eSAlK`%YqD}hKDef~ciob!B7g*t6*p4s&_{3s-hRqsag!(s?#Te)N3n>NRO!q7!4{r118r!$?$yL<%3!vsFrT+YkviJcQ>%x)`mjrpUgHxdhIcYw#$#^Y61gERzng8B9ml(=KL3crKzW!YSPyu zOZc>4R=t&nIO1eIZGWdN*+R|{Xg(PuIvW`#AK(jc00V?=_y7Sdg)|yM_uI&E22|EC zOurj5K%wmVqgQx!?6gTs5S7i!3&jGh9GjQG<-4^cBf8IiV5s+s!FA`5``z9`*Gz39 zLb(SbSwM+6Y@nAwVn&(A--tJY^87k2At@k|W%2S}jEUEQOa7l#U@n`r3COK#-Ws8v zk!mA&*+I8Dqs-hVc4G}fOgkL1-lkN#- zTVZGty4Kt zgMN=F-OIbRmvLEBux~eluFy8PVAV%`FCe5C>Fp`xNoX!=?Yo>a>OoW(cWH44SaQoq zOdm`z60d&@RQ!kFKD;};{XWATBJP**mcp{MCX0JAL2T_t)Y<{fB*!M zMsxrGDQNAH}{;4D2}6H~SSd zg0FHzW&MrXQM#gUpY7DvXh0-5H?m`mGdx#9-^y>D6I7+wv6@AsMyEJ)k-&dKBJPKJ z&4C(O-4TkHiPQrJXLOnHna;VJmuRX(`O<(tH#z&xbOFa+U$$A zd8=@WDqu+Fd)3x$Ws@G~lF4+SB^uzC#_*wR=ymcONQ=>Elzjlt5;%5-N8-yCqx;2{ zcQmMQphI~kB73j#4J6Y}L!rcBodxJ_IaWBV$;2USoj)Nmim8=_HPpZ4@_tyF6SWZ;i zsK+AhCZ$Bq)!%cpLMs(F4W!f#o8?DtHf?I~(l|mTc0{xj29jnj-Sqy( z8!3-of_nR(QaJc~JB{#evDjq;s{ha#H}ssO{mn)`qb%= z=ijb*yCFT+URf(Bu$L{w#pU&Q4j;RV9&^Fo#6 z*vq~_l@`Bz$rRE9o-PAOpr4{>ub5A4y4@gJ}SDZ9@NELoC2!p zGBAZR7~rISMwu+^mc^5v!SeVY6CtP)|MTt!FtRo zuiLcvPk7Tf5pfzCKma64GoSzfJ}pk@YvQ(vWk{!u{X1&!9A#6OI9cTcG4p+(wjRQ! zmhJeabxa+ZS>=VCSXw2l_WHg!>T@${R%GW%uM>T{p3b3 z>u9tHgi1J^bK*1IzTi4>IW9kVUR|1_Jj0OF@ z;v%uq_sXAv4Thj#aKpXWwK-`iG_h`KW|Ml=1C^7sjNw-5M(b<=AB80z+s#s_K9h8dPk;%y%4!5*f&i4Et||-CaMtfOm@icV&|Wu zg?QjdY$cayE*Lh$Z<5ZvK1As1>86HRSbBsR#IiZ6*PDTBFugZa0NVxS2j24do!rB^|jZ!{MbJ zshZz1qt?R92TmAe7z=`(tFPBn+aoRN;7-_5&rCX=hm-&?1^6>>XTMbd07vv^KmY&- z_sf)-M-rMKLh(x*7!~PxI37+#j|BS!(uI0F>P%U<^@_X>j<~{{TI_V1W)3I}wlJ11#_u&zb zof}DPK&})B{(MNv+x*{C;k8VGt2iIOD@q(6Y#8?KN!s&dRIiblT1f6M=__-Gc&!cJ z^sV}Q{%;40qv(*oceRO>S3nuBMl_yyI`6_8^CIjv8hogRj)KDmc`OfYs#}ko+ORDK zBv{hT574hZGCj}*Gha3m$Z;X4m)DO_z3j*EK0N492hrSH%@?c8d$}O_t*)9{8{LHv zQa_FBDRfjUjQ)cc^joJfZ#W|IE2xvMPza1kV1yZ*ZbW_3!YDCdY;QP^JJufbd9pH` zz7h8tWe(zBZki|(b5K=rEKxI*kaUPeiRQYk({6hU3x{yBa6{mfvTIs9{|r#G%N+e? zBobkZ3Ci^o^x5-0Yb<$Iyxn+ZqeKCD5yNR*cBN<&ct&MTZeLv@z4&{axw5HX{S}2R)LnU}Bu%DB8lD~%ff#pJ6* zn|I&<00o(PG=fBn5nXH#!-#7Djolrg z)!{H$`JrUdW~dEOU@DgLR{tqnVCk)%!SGXJZo!NA1&n)=;gA5%gacn|8>zom0)kSg z{cdpkaV)j_%xBPCC+_@crq8tEU|h$$c3pkUqzl-68p5~%a8m_O1uH4#$QpESL{BnC z*q&!vyPS>)RkRC$eonRcAx>IXogRDZjJKrpfRyZOkmASx!|L5@5h!as`VvH&j?BcS zNuyL%M$~=t8!WLClYvoHFrs}Aes5$`;H~)= z*~lFjD1h%~wdT_>=@fD_Wl`2ujf04|5z(Qq4?=4%1$H93@_f^@T^g!N9ToBR!U*zc zwEat^h_|t8&hv*ud#y^x+~GMI1r+Z2Qf)+=iZ7?9ZE88)U33`AL0@5eN~dY9ChG)g zP3iT;C6EEq83{IzT0%U5BltOE8thpoH%wlP%sR(UORagADv=6EUP~pLAEiZ4zf1Ib zMg&g!efRt*%LQ4B?R9bO3?y4CCMWN_xY11VHhJwCc1+e@mA?z9p``p!1h0~a-ZrgF zu&uvFgdUi)cmH~tJ_;nf{F4O-ndW+#TrnNy7jD{ean7td^;sOVj)qKnU;qf} zjOYLW6VhUY`pW*Bdele)k#yZ4(7<7_v5mWdIvj~3mPPQtWCX#Eu3r?C0!6l1{s-6r zUjPF@aiIu{5{UVUC^Q+wpfa;P9Gi7fc;N_vFwNqV`_@tZrO8y*ff&D3m+dRx#kCgF zV&b_^F5EW6R`!j;8ZDt^)C=`;m0^RB*=_@k@AF)xlK(q0@FzoLqar`3q9dGp9E_c# zIN8lmMl^G=ruhepd)LMKaMSg+r7mzL%+su6m@l>KlM2d3c;66Dv2?>G|B<7($p5-^ zHMDzH1x-hNv)`S>?Dr(FPa5+cCbD=C%!j@COGvbCHOPbpDhG1d7ep>rQfiglJKv2NH{U%%A zE0P6U-zRW~hH>!IA0A=SZ->}&Iwh`++*nH~ceP@=9d&<2{Y-&-!l-B^Q_38Y6m?F? zxbqViA#w;h5#fAx!?#z1}RhlaoTKS_sK|66z_mPlv*%zHZ*BTgs0<{Gl*AM*u z&ac31-~ONgBdzrS000V7_ZIus1h$U0xQ{f`nuDUs@yh}bBO=r2GTD_prTZvmbI4yQ z1HPCOdIhaM#z71;Ebuu6)v@|Nk!L`#_Zb{QUBZ_=w8nQ2#UP&dPk9Y?OQ)WN7SZ32 z`hmXa4K-PYs^dJX+6OND)#QgeBqS`3^^PRXN8OhVfb99@XuZz*ddmYDVmtRtNXR(a z323?AYl&Mslxqrnu5NUJwgf>)vD4TxEi?)DriSQi2lTri0wSM%-LIhMy+UWwQ>Fw{ zzgVr3>L)}#B`y!)2U*ojsWcZB!)Idl<4CAM%{G1DUgZ0qxKB z+y-1+5WqvW??Fij+3ydpo%apdZCp>irleBIu;$U}lphEHqMi|mq3z)@N9d0igO)j* zkyaDLb9?-57$)5fh~x`0PD>aL*ab--%_tkqU&U<7}YR#Mc&cjh0p_bT`My9mjS53&(*XQihL^05n&?iQoVL3IGk_m!>SAV_U+?fZk9ykOeCegyj`TP zFgKl}nAczZqnW~QWaRyFBI6v$T;$pO%}3Y=?rLx>)dU0;J6uCKdJQsI+*W@9 zc^c4ZWM!Jb@Md1(%XETpoP8}5)y{Nv6h+_e-!y*Bre2#_=OPWm?oeg)Udys>$53tk z-zOev9Wvf>z`M(p?MMkq(d(!@8dLLs+OaSlb-z{Y28EEvZ-kH#WS4>tGXD-vHo5$E zH)y?fmH|MIh{$N|B^aRJnU8hIrtwW2-={m_Tiwz9n#)F~R5;@_X;JlRL7ufv@`)1@ zfowu|Zz+M0(`N~kC%+Vmm@!e|LI47S!!!T@02f|*c?XJNw*szP$kMo%1N!CtHBbID zFw;JP#ZGAQ;=20t^M6@vo_5A<3}4tOedzNR-teHCx!l)4H8o?yw|ezSa!!vZNzVYL zb#L6Kbu{e}3=GKw zj`pr1gQ2H><%#=+-y8j17!I+Ga`2Zia>CUw0zM(0Nr{OIyy=0^7jysvSZL}U2E<#( zHd7eL?CJ2%vwKr#dg!KAK0>J>XWk>#2E7E)d3_EZ#K&@2@yRA=)EV?ar_7 ztZ-U{>)0>*6-qx^0MP##Tw4b|8;a9sZAx03~;nCtNRXMEFs{PO0a6WN@wuGyiw|+`ho_UWj5N>p#{Udu%S)~%J_Ia!1&#XxL z-7>2bk@=`HR?Qn_o0yW#AC4?)J0@kPz5|aX&j&8iA%&kZ(UND_UBdtZ&un>Z)`pC2 zbWV^b?nuYIbBpu!fY1P>FofizlU)Q481BOPR&2gqIyu1sbqYg`EY!Fy72DRU zhLKHL8bA%+Z&U*eG(tS&voY5f%I(s?0ICPs0000z3t7pLQ_GlnwE{TR-U33CjX7-nYD&JOK24i>we zBZ|+X2}l%shdr=IOuB0~Go_hZ->Fhs+V$%beE0052q=qK=*B2@(ow|B)-@e0fSCh5U(HQJfAE zPr4@7Vgfjqmob5TLT?D8;K4)`W+w-&yrFfJDpN!tGK5`Xmt6|b%k2rWC;;3BSC)5~2KJb4`-3PLG?oW)ILBlnbh(($0i zJ~@NkAkQS&R@iwGi)DHg>uyvaEoIaw*(l1XX6ZPzPAHOWZO4y358lh&k6T-Nx=&h_ zEjmyL_~+vt6#cD8YOZ=ixwLN_g3cJfLoNmXytE`2l4|$>000M78*HWCy|^|)vyKbo z`e&0etNvk70-fu&PGEp`-h%K_$+u-|>KYMl7IxGplv`VvB{@KNW5#s7$O3L0&xbX2cJJcS>EGiO}XNgM-JT6P^(ZNzPXqs|@ zO@ynQf{M=CScxQ~4MMJ+^Q=p1Igzt95JiDNv-g0}XOn+aw$Y2ia2Z4Slit%M>rl^Oj@1Ugw@;4wFQ)!G=ybst+u!c*1Spgx;d%J0z|=5@&%I2 zyYn{Iyp~{+X@Fa?m&jQKIP$AS6g$$%fDlUfvVf3fUP=K!7KQ1zM3rY#JG^jIV_QPfCxZiZ~y=T*f|Ylyo-ONf4kHK zZP!@T*0mb7dtE8HRp#%RT>;(^hw;$GB{3dewu1hD#jNH9wTPZT&-;i}(Ma8y#=z7; z1oD^2Rc+DIzW=8Np6sbs30Cx6^kqyLJ7%;QP#TJhe~aYcf^?^O#bQ?N+F%GSs0uVx z-9NKY2KK+B-5_B6M6(8zNtz$cwV>S7W>P-kxCBgu|08@N^_1VRkmmwvIV5${6V~s- zmo7iZkE!9Wx!{2!5{mRbfj*3+Q$rEBk$@F`9Linw$pTRCun}DB#@nOapq1%Q8fUcs z_h>(4{~@7E18^Y(Wjhc)AauRmxMUGhdXml+O9+HbzO=4oYh<3T5 z50xTFeQ3*&*?-~Ee=Ns%`)DB3ygf_9veGbqyH|x=S=@IBrJC^~O<`4A+*W?X;5L6t zZpH)Ng>NwAm{g~JxVYja#e56?lk3!p?wvcP9YdPDMo$Em^?7!qOz2op?N-IG`=_qb zOa;wDdMlkV+3`)?=WlN0C)qp>QXt1oD0YTsC>_NBzqFfR!$yvqmEuvp zE*OFsWP$Ao(@&$x@39<)gfxd@>qm~laLF% z8jf_DixEJ&JHOY!iB1I%SdEx57|?TpBTEFfwx2Qba-j_}{~S)rql3xC>az)Mbx|u| z(Rgfz3d=AH>qaShn*DDppN0{RL2oDbb(1V_+ zIPl)y|NS%!>e>7tvh4WV+ZfIiDK@`wuFb;Cvu8k_PGJPg;qcDC z2hkdbeTs(b+{|E_6B9w@E=m*Yj02LI^}%(z(P|kZ$X}52Rj~Lq;ZwI3ebe4Y#c*7L z>m*;!oxP*O1>GAlRmgs7-u=5`<&7mD4h^LWSwT3}b8o6CkRyeUDO@p@)9YpxH}oXr zPKHCuio&B{n5r_cp-d@&&X8ur%wXX*Wn<2(seBBC;5OLbkKI~S(bd=$PGn;A0;rV~ z$;Xh8uVon${*fr?68z|#pO*kB)0=<*1^9_ZSOQ`KjDc)LCZzJt{8v0ikhQ%<5`xOG z^bM#V$K#3;UD!g_gr=Su#3r$7y;BJ-s^x>pjNmBO+u~AC>n_%X`T}w0J9bmhP5c^V zss+i3<0<&L-#Llxf>1hqV`*%c{2;Orh#|Kj4;L>JZe%>MB}2E#+=dpo1Ax zyp*Ij=G0-!NXayz1d&pFlOpw9062)xGt}H^VXvyB?4JzVL)L#DYj|lHnns#0!}!I# zjyK!rb~O=kBZ! z_jnl7icgE=2PIczo3XHwbn*!?gdk1)22i$lElhSP;AhSL_(^XlL{7ys6kkCYd_m~q z8hV2{6Dmj8-bPT+Ip3j{#sL4e?(Li%QjQ4%^RD0PAK#hoD@kYL3-sVtS^3uQ7wNj= zMfVRk$$;r$e}3X*U=c2_niRnd%YJIfR17Z`bm+$S)5K6Fm4?^ZA*-Q&yE=~ckPJt6 z-~a|g8*OSl+}kDK{!4l_f*>Z6iHOK&3P3b(Pas7wgfPudEflp9$R953Q#QiX2E0F$ zuBA-NF_q7_ z18F~9DknS#0gCI7c}Z+I>Dv+1?`ST7_x|@^UV0Pa7a0ajt!vqcW)}4#oo#*+e?xA_|{mlRI9gA&fY6YZR!@r z%a>Y|gwS|lF7R`jHjiv`=bq!EXd+PjS&B#tHt3Ms3A~GUR+)y)6KgY9#cMLVo`pfZ z>DXT3upAspe6WX~Q62Xp8<14B+Kf-;0tov+000(j$jQ;CbGLHk@`9K?QJ1dvP z*+@ZKJ?&X~S(1c&?N;%f;oq<{EXA(O$MFrMtf4eN~^L1bO3g?wqDFq)q+U}52+ z?Syx=Yl^8eKNvpcbg8+_2}lwjB_o$Hls#n^>zEk6h|Fy_@X3h;7O4-FZhRiyL<$x2 zqymL?)>dOFkU3zWIn!0KNp(b+9lc6!$ZQTXwjkG)m}a1iEpp9^x0K7oD85Ck0$KfO z27KwyZxqfzWJy^GcV`UL>`6(C}3#vApij-i^8)ktg_5EAuII*ctXMi(7A{5Zwm<$V43qq;T zlHcaI+A)=7>*~TcNP@kKEzV(=O2}yxsId`Y0s9^f&rPxhsO&o~kc$N1>4ufDDKg$f%xORX=pTgSjB`3$i_*rMcr7Shmbx$^hM4GjMeP>005AmhT!-TQ%Wx+0~hUzA{m{$>!O&+`1p3^1Aa3Av>GGkUWm8XM;gAfibxAUYe%ywx&w@b^i0(wr1hB{)V4_wM&vasj*3}EK zvdCD2TW#XWP0B5>(x%UQyN{pBn|D4sX^Pp!<<4ZqpvW>h0Wfj)tN;D-dwyQGBxHR? zBj87Ymv`fhSS6fDAm+3gEO0}sX9z%>g7rhiW=i${wC-=`#>xpk21C*(IZxHmJ7ax8 zZu`^L-XyRg688EVrD=7fgUsbJRcVp(MI5L}*5&I>BiBHN?z;n8@GELd3bafv?tU26 zG37KY8y7dyU2}F-nDX}Zi>+9oCDtAC$oPZ98qb$(K)>~+oWjxOcl|l)%RS8!g;&*V zCt3X$#@9G1Z#<)N#@o}#tf$mk|Ib+1#35XH{U>s2l9z?`4>Tq_ZwJ|#smDd)3L=NL z>Rc75_v>psQwinkqfHy$o62DOyDW?Fqu-u|zDgZ;33(xLuU8-D6NwN_Wx8K;F=dAk z+wiz1H1^(@(HPABDXC?5`si8(GZ|(*LLjw#PG0;W;Y@@s=+wdR)%W{I!PlqzjYW|m zR6F9u_YC4dScx6thY9|o&(M2~+TK4mg1sajOCp(y;&WtVi2?reg482xzOjjt=bOkO z=rKfu9ih@HIbkD-h4U9SZwGyHy@NjvqlK-+O(buV4VF1_6(FSEN)>%BS7DRcMnU0B8iHeoN`Wr3(KMilm6hB44XgdIADH_LSjGWF#g~a z0xhr?^NjZx^5z@L4k8fgWXAMxIU74w5>#_O8g?%TO0NT7+ZRVNUrfG&l>8Xv-ECL0 z-hI&)NL^0m^$|oA;_AOO!VI7mjF~bx2S?W^1xvFqy|%n1wj9B4u?f!x(H|qA#SSBg zI=$z1QySlUOMmt?SE7QjRHkkTtxZta_&~_1CoMvl$L0Bt^&C1KTct#it-hq{*=VW- zSG|(6oP>4^W?gH#q94^X%t)VAw9Y;$st-o=^;U}LUciD#@)OO}_F6A@O+X;*gmh42tnNxCD(bUpKV$b1z{gP8A3|f7S zBf`6hBc;xZ0mY+UzELu~`EKp-oO>v-T)PB^=&Cog6`eC(%cMFDdd z(-h)T$1p?n+mW2O84CC1Qn~{rl0}_NO>h7Ne@1iw2PYlI6ej753hTQrNpD;~*)$(h z4?wO&j5Dvza*+A*X7|qubMK2m(~#PjD}mMFdq?c5a3sby=5n3~K=n#*&n7PAu0FMU z!gnEcXz#$9rs_r`#H6S3Z$F30(VrUB34{yMn!Lj?m}528StAWb!WaCqE|o^Y->m>o z-4vryDZNYV@Xf20Q^t^IE}3I>kt+5Q&y)s#dNtrxI1)~QP@$gof)#AhiCYm##qKtR z>G(DqtS7vpGZE+wt5COpM7iqf!|e1go#SNitA6b9%Z>Q%2X!NLN@tMwPq0lBZuZoV z7_z(h_?NjDlj7 ziaQ_Kd}<8l!rl=><<>6ob0r10DrY-NR-K-_fg=@VWnM&)P_XnP=-Yca znvSC!dL(w?OBtao*@s+oQ9AmFW^Je1$G`f5i$LkC!8LL+*~oLz@WZv^fRs1WXjH~k zpH*c3Sggy({}{HCQZGrLoUTmykGazAk&@-Sb*J2x5hC9z zk&ONr%A*C0kmdKw23LmRpqlf1r4}i;w%Cgtx{@$*Hs}h{>^(>EE&eT zz430tqFWVPv?M^b51E8!_pjC$O8?we(0ou@{j$}@Q6EUrKqbSQELr5Nc1T(V{{vA@U>y1gbcD z0jSxxG->2Kh945!P^`$lqijayo`Jaj)0(O^mi`QduI|czb5yRS6(uOl7EUSvy<<%V zIB00uzMz1Z*I02Iaa5g)G6-@Y=&sb<@Ra`L7w*_^#cdZawTvN0RO9xCqpskSLd1w;JyRF zcOIv}a^_*F38ovFN@u2mKCqjLnn1n;y(dhEqEYy4e}t!+;hmq6K;1qJmYgwRI~ zY)8ab1f5N{w(wg}dO~TEq3YhcL^}Y_TOh!Ur7~(MysQX2#9D@2NSp3(mz>X!cur_i04HifqI7QFw=x3zC86!3)#u7zu2YgB zNd)6gp;(UruFhPYFuGHb{}#$RTCy{=(CuR9%tk>Trh5HlQ!VHq1X08M$84LCxY@Qh znHS2YZNv@lsM|Bu$`- zTV)(885QwdMqdA7AQp-@CF-+I)-64Ev;gl61pMRH-i;~#BWCr;iFG(-Lrbp=YUl>k z^aLzg@$CddRMAPjR6=Q!c3IKl>OtxSJF3^PRAQSO#ePa$F8Nptt1`{HnLf+mVvF5E zK)0A+w0r=;N%BRGCfk74HqCNFe1J59;<@>hd<3O>kxYI1k+@y2>tA z%h8;c!Hu7}bK|lEqlUkm+tUpGXL)p3rhwn|9n^Tg1xlx+q*oG|aEdCr*ve$szI;Z8 z^66*rm3L&bFJI?JsWul{)_?J9r{DK$4oXLGAc9q6F7?1u9kLeyb>)%z_N6OlDlo-O zFbzOh3p7j`@N@I(eJZ>PACB(JW7x1vp2uqL@OpR8Ft7|w^oPfqs7xV`K(?RHHh#Y61DukSlL{!x5P1mOEEC!8!`P#Nfc(I7PmJ;TW z6%Wixo);>Sf~fC(wrCu4mfg*KozH2!xGc{uQ_j@i#!FX z?a&it}yYIA8vHH;C^ua-hLmvQYH`Us>lRNr>1yrSUY+fS$Eim)M!!+d*ZP z;3#bL862lq{7im4;7)ApAlBk_+oCy7n4C6_gyF% zk3PP#Y5>%u{MN$RjE_5o0(rssZP?$h57qbfwx5FH-<=JrZQ&xD63$mgzg_OhjXL|r z_b>)h`a@x+&J+3Qgm(;#?~cLAtssf_#ax71K{HA%dNa=w-J-4$3fzFFqNb5jRNxXy z6}`g);4UqOR|i}am;>_u{A?2}ic&0UPO|>C5F$RgV9})W^m5D=EDCl7#-ZA>m1YRP1#IWpuD#GqV&A281j?*a2TEm^{YTM!uZWH+U46h!P z2U&RE7TqLKBr}rGAJtU=T{FIQ8G(uNx3E#OjWsySC~}Ml^_yW5+sAb`QzN9)q~!1; zOLq*&k1V?f0>TjM)$Q|5?c$^ZI>RST0)9uI50^Bl{t7kbobHHeKN^AFL~?bIZ@7f$ z9{oaml^W-dABUW@gAeF%bd!hk6XIO-#)cJ1ThLpVYDPUVohA>t=lI~CCO!b!L`p;2Gi zVr9_s?C$@GVR|J=cA?OAmu2%oDmiMg1j;9@qHeC$qZHoL?BX(&XKN)9M~x`IeudGgzRGq(SRhY!B)t&sfMbvO;*$?OTX7zX{>D!(#;*GDiJjjG(K zm;oXh_973?gqW)Jy28-AotPX!PsmJxEnOWGzB7kp8?wcvrb5K|D-$G%<^md^0qar8 z3X3|=dVEUiE&kK4rWOA8JUo4)bjilipGJnezn)J~U=Ivn6b7+j{f^5ya&}hLi%QUd z<*UnR^qu&X^~q;(_nIaBp1zDV-r33hT!#>5txtYkWzKjhcs-V`y&M2KX((?(vy3%D z1IfTc94t;ulfhzB4$_Qi)kX-@$amD@93%9|k0L})_P6yM0Q8ab{%py1GwQ!bv;%!h zslV@&1kT!pBg9H9{s?0Iqnl{goLE98{{mIOCt7w?o^^<@IQRXfN2MI62zr?2+_^L3 zST4Z;0jf|kQWarMz*B(hw&(0M$_u-BM9V;!43>}6dRGUzdYNstgm2h#)!IXnz&aow z+guxh>FdQF;P6!?2;Cvc81hwch(k*de}kNut5w_T3r|}R2(eWJ{I=voH{L3CsAgFM zMZRrgtZf9#W8U&ibWg4!)g6SoKH7=Ny33ZvmW+4R8*_{_vo+mM*D(i>xfqygfF4EB zvl4}x`5-I<2CR?j5g+xJ=>)y4E z+VRXcj~Uk4Y?DG!P$_Dz!R`hcPrKPV)|O!y!zY^wl^xR;qH+W=S?Ks~7>uh08W(^{ zuzK3=EM2Rm1$wy5r(UIQRjE0R*WTWcEaQuPC+=3ZS{`WD{6LGzK)1*$@K1Gm5nQUI zbk6<{*i-wYv>zF*K-%F&6Wth}6X(s1b7gO*wJ65>SiC?9s|VqOJOpfr54Zugfrl9S zb_WUoiyF#66AK>r?*e>bQ|FsSEmYqeX3+7?x)6JdbYKKTcVW#Uj8a&(t{m1U(8EUF zO@v5~WL^F)AOKwFMAyC|aE2Y91)(N(Y63%&Q^8q&i|IHP1626Y> zx|m?^x;rgtKj$i&bTL*w<+|VsbIMujwPz2<;uOnk@6m9mNalZS8;KgJ$8H!MU?URI z0b`Jn{n|f+(q=8gFIhj$Nf_UZ3jfwsw*$ne9O&=42zKHGg2%pr5o^LE+$AYcG--Im zJFKRt3b49_*+2}$Ga5`mO%OnlG~I%tO##J3T&O7>+=a?2O{13OqTY5Eq8YkY2;X;p z4CM6KWc~~&1TE7X(OTvNgbo)4)tU$kMYjii|8sgqt8{FU6I252QqES2GYi&=gFt5E z;BaI?yXb?*?KLd_^%)1L`-y1MY`f9#5M3#kze2$TiVM`p8>Y{Xp<@ducwUpZ_ZXY_) zO|kqju)8&@3AFuj*E2^O0rSs?A9dUnlhaQTse?SQ)yVP5UPmxu&Z=slh4)}k;w~u=5WJ5aJ|NnNT5>q(~hGC!HaF6d9G{aV1pgQ5L!unoOQFNiZu{~BItiX z#Or{8vPgs(Prl<{mBa7sO%P&7BcuCC@_Efv5)=-x!H>>f8Tx|N;BGG9dU#+kI~TUs zb2T(0HM`CPdG%}sUV8=STgvt*N2hHk(`8;h#HIBoL>gCJKEICcNA6g!;I2Hse3Y~< zMG>hO@H7LVA5VYV?}U;~mB}Ts_ZZ1oIwGZJ$bU2jMDGgXoh^-bD({o!f(fJe!J-#l zWZ75OKCFN#Uz~R0CqH0?Q_SH=BjoNZX!(-DaHtMKE)c&|zAjAr+}FP}dqe{;k}d(C z$^%Xjga13mWStqEVGTEBFyaPnay)o(QU$+mE+CfoM5@mdxU4;c^{-If8PT-Su#C4d zPg23O4(Ji~E>Cnb0f0WhDFrxJ98D42O{6Zf`4pJ@*rmbjXcX5NF!?NFlG?93>4IHk zsj5y{Pntod5cKV57XPCTEQy_)ompl7lJ;#e*}W;S$a`qMr_bB&{K39X0$lsHqmJ!; z7wqdpC&9KB108MM>%gJsz%F?opO<&(UlXR+Hl-y+ONgZuU7p9a;&K!W=}PvxHijt0 z_n4bE^^bGAB=FSt91?+nPPf~+Ir*zI6WG*_Ha){G&%R$>P~36{LEF;paThw40?!=8 zAKcxE{{nEu6#=>xmiu$HcK2-U43|3RQoVI8AOo(axtM#1>^{1B(>)^^jn@T0DkcA+vChyOxf9YBkJd9(C)9rJj#{0Y$MN+GFPMy zvDP~rjuyo=#c^iKUro~D(a(qG?01?YebHaR<#-Os{JVO{ncspdH5V4z8krw3-U9hb zPqaDnwa&ESmRI;*%Vr(!TG_I;P$X|G4;pwHa%v1;Uatl*k{LNeGMVCF zj>y;fcgi97if2p=jNK>w@*?Z7s-%wnSeX#muIFCZ`(YQ%E<-*m-^#{q8-jIegXjOX}f#{`u}? z-H}qffm=q11{9(YpA;Gu*|gcj36}TJ1)h*V>J-zW;kaiG%^WvTZNXwjzA-Qh_zrwa zmb<|l7?)9!gy2+HGfiVRubjQD5FGdxERF&*0iP=}4?%@JIxZqvlm4l@c_R9ZD)F&( z%8|M*Gi;}DmS5?FRv%y>EP;9hl2SaMagzO-D_&dThaa5Jv0763<;{0-sQC%$_3~PD zC2`MTN3ecL>mOt?VFIs`oI7pHBu)<-h%W)kHZ{pvz?m|o_|#-ceB~KK zKW)o{Zixi$0?^V%CGS;s_;M}7jBKyAKH{z496?^)_!mF-{Et$;2Lv+7`0E?+n|jpt zTGJG6!@(B9cNTEVX=)6@MOcTMZ`6LwU8FaJ5yHGMIV%%Iool&Yi_Jy!E=oX|#BRlw z0`X;PVWhFu2ElyY>>Ej%7yyUBmFp)GLIVf@5t5YCzc~}ruRpd0<|Y#wRY?Jh_iKIA z=Vc~|CNOAYtvx-9IGkbEk@g=pE$^OGpg#Ogae`Qg>dP8!CE1_Y>viX5TPXfj4Y_N<`|@DWySe3zcRl* z7|e|Iqyq;Ri{NNT_9N-H3;%!MHXBTFK!}B)QXO!E;LB#!E8%m-%HIo80~=*d&eevV zRidi;50_}HvR$Z*d{}0743+R?(MyT9O*tAH7-NCo3it22CF=cIMu%lPM==X(jCLdBPA#B&8>JF#B%c<5n5u;x<^ zAH!xl-)jLS#PN?{1>k_Avtupa-XfITq^=pf5MqtN`C_mLZ!eZk=52Y z=GbI<(c1xwhD)8iOu1YPB2rOfq%o7I>kNn(Se^ZE>BhcJr@vurdjUtav9PRsN%gx_ zYKYSS$qoq#J2Q$=!BF>l7M;(BiDsoE1#<8PfNYw+`Zz0__Y4t;fi5S%!w5+|(lEys+D zs~A&vxBJEGjz0>TAhCzpVC>xdcb3LaQ^>TQbl^$$#9GcxQfWB6w}_AUI^!b8hI4Kr z>+8qa1eeTPh%9LK!y$<#`SB}lPtH9lp^&jV;ld6iwLD5hXDERM65l{iM@_;bfvHKdZKJOl!ol6h}aKf z>7X0GMHO6i+lT2rax`Ul2#L1P!%b4r+AtJ+7qTN8nmP*BoV?l)EjrVs&e(TZsnny} zV{&ZCm)dECfl~o=TX`pJzi|#}0cpkDny)`T(rO_zbnPsrY#p60g*bKW~S2$M$Bg&GuM z3ml4W(W3Xwm+CUyHKQ zIW!Utd`3Kw7R?rGDd?sOYP-8)6nQd_cMYfVt=M3$um(dJ zi5q-Ool;vi(}S4nC!3s%H_Lwjf}Bf_aP?Ex!b`j8UD`!SOZ;xN`U>S4Xl((~YZpJX z4ZEU}`L0BLD8M`0f4FChM`9-tMawdzt(~Hbu2PKe*D6!iogg~FvAA@FvXU`>mYt)F z5|Uk$l*n%8xwH(%a1`F0)-|W4VBO*RleYe~3iSuzOCNwX1YZR z@MXeO{I@^ftEt|>YiX-xW!|TA9@<1V{A@^-TNt0$lLYHSYuzJVt@pzyTUXbhbPYYo378`MrGcQ9~eG*W{Z)Y2~S_R}%7 z@W|;>8)N=@sc%D}DN?+DXELAEp&>(LeCE-i`<;XYkHn%;eQspiq_<`dUFOJEZVkt` zQ+HtrEVBI+qOl2oLb3#1TXXiS zr!}ReNst`N#=qMe9eqf=ZQvMEN#Wu}`BC_X!UwP1G$}o{t?e@t@=>V5R^tI;F4~=7 zmFfTb3L>m$JWd>7h2UBVt(0CJbCsAv94KfhdhRP6rr)Q~#>`?W-?abDrx^B5KQ!91 z7+LJ(GdJOehpJrQk67w3RI1C~=B5{N6k`1A>#2X0QL%pmq6n9XiAIOZD7S03kJh^> z@h>-Q>W2})Fpx+t$>x=N&ym;gGJ9GQt&1YH#8%DhA3UVJptr?rQK-w;P1J}T66+T< zk>JYMmw(J+aESe6>4X3U8vrURpt8ptxXo-(oC%~SnrE1=m`X5!PU9nL>I=pTPtE#gQy^KWmP zJ~KTh-_+~XMRBmk{M`qu<|qA~+a3nMUb6llte&L=5Wuhi!ZA*n@d0bP;j#TW)pbFf zBMM2>jx##vf73;m41MHKN``dXxcK_R0)ByW+Lh8`*|(^lz)tLC@1@SF(O- z!x94;d$DBVyCFmJ$g|}kcY9mHQajxgSy79zH4k4R4h68?w0I8~Vi=h{JP+$ud}^f5 z^Og5v0VgBU^;nSR3E&1f_ew(C5hWGIl*YfLeBJWT;iNjMr zj$%Vuj|}ac*3QLVpNq%Iu^oB9mv9%kLSY`6_lFM35$tyJ*WBXbs!HpKA+RkT73mlN+Tt{ zd;l)AG~RJb+x7j2AXMO9dNFVnt8hvi6%Nb%Nv&WN^J%904F#XreLKY-C?JW8H`sKh zL5Ds{@Cj`ZvUYEt@3cIs?;;xP&jL>!sCf+C7KpJpq0K$xw9ta>CHegb+B1e&?(yJY zv3F{65rWFl8EdYrDnk88x2kmdLX0h}WXcdx_7S|M)~THdgW3X6tHdB-jv`Cyh^Se! z6`x0JdxfMl;MrlIj!DSL2cQ#&#*%WL+{PesEV)Pc-tYiOP2shSokaj*2eNs3b7w@9 zrcFS3K}#=oLbl-&yTZ6n!z-a#LU)}9m&%Oq^>SmA+t0M}j%ga-lNX*NkYB?y6=WLD z;zNU(`J+{6bd9K}V>&<}^s5LDRx4N@rovaKoGWWN~a90@u`Q9MTe9(QNW7iiUmzf9&+91VjfGO*P~jlS$p1wHpR*RJtU?)L7M0G1NLrs^xO* zCm&($irdVi#c8obqz$XYs9SnjKg;eFvTu3bi!Pbtk56yRfHvv(lN1Hz(5yFv9E2>k zj7HK04o9ex!6h)-CAO7nlUu)UIWkeUMAHTe5iNEzM2xCAt%5|^GRhp<&qp)ycrZZ(`n=rd~i`AghJBy_+k zav}+TqLJ!lEXQtCvgQtpq6(mXyx!1ZksL+iw10+h0jEs1R|f@2%;@XWfB0?x>qC7@ z;=5yxkTaj3hS|Votlp_n#$|@>c^23NngR(dYxICkk*cJ9(x+=}&dq=tS)57a1v9lq zLf26K8NE%#*oax>slOKrMbI?W!st@6l1DJ+;g*E;{jgSXvSv2Kl40aweXBP15@G5i z+=;^xHE@~HUi4}XH06`9Bf@vNZ@%g??PS8=)Oym=$6(o4t8_uKn7yYaAh{xB_vdFD zAgAPdK%Exc{`z07U!1Dfw|Y3wiEmU0H$Wnj_*IOj)b)RU@-SdVe}!(TmyG6n7eph? z&^02;4cq+?JX+hQ07F#BiE*ZW0eAL12_hPZM3o!Yd6JtpHY=fb4Q6Q0X2T%x>Ri#+ zBC1%==`!MWH$OQi=&6bKA$J=M0PGs%0M+HJ-)P9yh~J+O* zw;_IA+L_b&ccO6KXsG%G27=L}_0zUJ&1-gT59e}W#_*w<`g)=x0A!t$=1z!%4dWgO zaBiNy(;6pa;2$v={(HwF;zrvc#oJ6t_>-5Fqt%=snR(2@y0f8{Q#v$rF?y=4EJ-9- zlIHm0z-~M zf6X+FZ}8`#T866Yd!EoOAmxBTLtTVNjzg+5Q-ZARipWu$ch)}s@wOL+6=8I_u@0{- zaZg~~Qzu?AN%47Sx(&1t$5na|Yx?ehELr;0lC{}zT=#N>fUkN1*%?~*5gS~Op&+@+ zW(LOpXh37iW{N`_b^pG1zp(A?Z0G7+cD{k*FD1XUOZ(G28$10H^Fi9CXmY2dKo2+D zu^0Fu<>rjMbroIz7_6JPULZSRsF{nLkTi8PH`&zX`|mVZsQu7gk)aGm)+bnA0vdIh z@UtYhc`QM)bhyF!!4bWWvg8&)QHno&q(&Gan2_$ZvkWaY^qnXiv{cSZ$-{8GEKdzh zO%jl$_+K~A!}xJ+L8brLA3eXraEYGuK%+WgD-VfS%+2*B#>d0wkR$?8z+TA7g9A@0 zPxnA2qVZ@Ie-DsOZ&e>BePr_ck8Wv2wp(Pd$X^ z??iK~HRARqQ|l0!&K;E71;ISww&lr?kBPib`fZb*95e9(DwsH0EcE30GLq_=u9lbpu z#%+%e{3Czt)yY)fI06do{TpjD_jcm>B_cp4eqbi#}al3!#sM6ztZmmC*^G2}$i&9Eo!hpp>UWu2dvh7;?bQ<}G@InRqnet&EH z^>pM7TqT@x_6O5*1mg<97)VBw9~Vbmo*1tg{$6zVh~eq_#H>GSVryv;p}sUl++&9j!s%0B2l znWsQR0(Dy{lIjJes1X>O?-USq*r>mXUIYK32;(~xI_`xeMng>!8Y8%L(w(M}s(K{J`lgAYfti3#szh?{9O|LFu6+jBP5FUp&}~ zS4UvWc&SdW?e0|@$PtWNEiyBcq$LLGPhS)y8s|k58s`K>Cto#(K1$W^-hm&&m81y- zHTAhgk+&lfF^6{rAQml$&YKAw$Jr$gYt|@yGZ%;opTft>y_!>SOe=4Rc26Rpt!(xH z33U=&xc&sUtB zLEjfrHPdQN3`k);BpP!O-;E$UukdL2O|()0|35bf684TJ`+;Wc@v!JT;}9G%i}618 zlHy@_X2pgyjpc8}<80HY&djH+Et%cjxoo514~qix$?R7w#DYN?8n&EkzCmPk{oA3c z?0PJv3&q_wb0~s`*zgT=<~yvm(+laAk*p&XUKU)GdiBeOE$oDQPC?t6m}Tm>OhLI~ z_#WU(gv8^K;t7AL!!Lo67Urx0(ZWeX$jP6?y03MhdDy#CfQd@q7ou4>w%L2!9yWOb zni|#2?s%5+)M1MzG;W2>5D|Sk#=mbO0Wyzlg%ntRqT17x@4fH!%oP;}!-7sxi8-@+ z7}hlf;+%uR_3QYB8CoHwS?C-yQXYt*)f;Se3xZb(W>>-K*yqrrf9C{4A zMz{P9+0a!x!ATxtI{pO^hfa7LxnIjantA|H19n37;3hVevL6LC;j4n_*i}IG%mE0}OhgM@1Y|q>3qQ$gGKT)*~^ianSRsaNJc*mJN2@h58Wx4#NNnhYJ=30G z55L|4y(%|a+2!+wD->WiMnV$7QI7O5{^vUKR7Jeh$ zrGea3PP(ABv7Qp9dD}uZ=&?17tVZ^7Pu}5LEx}o6(xLU(Cw&?o6338$og#NYP#v{r zlDek6*{18nSn8rc^&z@(F~~($L~OTrH@+Mpol=j{D`lC4WXUt5At0k+C6TX&5Z5HzIX`O?#tUX{j+fa)SJhp?m&-jQ=5O zVI=c$kR~N4U;Bq7>uoj`3XzXm4ohu)x_}?`t*|1>$uQ6zsA{t(FJEwRQHe}t7i&_m zGqJUIfo_lvY%G%AC4A!g+B9$0<#hJ^s{3UGx`rk8CbwZ!G9{VoX@AI|osWO^M77Uv znQeK)z>k6-+n&i5fFZ*R8=l&3cSBTcTc%{coQ!NM%ymuQo3E)y1Yn`V>I?e7pG=ey z7M(n|f~MjUV-G442s#qmy=RY@Ro=|lK2q10TT)D(2h-2^b}y5t+YC9wIT__-kou8c zB1h7_0@VIp0t#OL3|Rs09$icz%Ig5HD4){^zUCFT+<$l^er?`wa`zqz`1DevjfSUz zC3~Dl;Ns6JnkcGD^{;lsmJ2d&YyUJJ*+i;i&S{q{L#6>PvC})(*Z7Ec;#wkV9!c$9 z-K#G~WJb-hya8DcQG{#<;U`1@u@ClJ(LAOpvxLdo*FJk z9KIU38d7lXoSAVfka2~_+-R=k#%Kg1FnIbsW~7C7y6=lp51J!Y0Ai55TE(2yJfaqa zHPz5B)4v~w7P%ccJl%@lIWn1U1g@}VtV4%ntJ&sH2G**ZXp9u%Ibrh9Z`YRpXwz3d z{Hyic_#9;ZdBPj+mRrxfNHI%t_Hj;S4@`w7*x zzkTiGWJ@W^oJT9^LIE&}q+*?;&i=x-IfhQqP|qFFZ@#|&Kq_4QtBOvFsN`Z0KEzt- z8eTZ_mXeHDkfkgb}8!XDEjW0_n3s_g| z0}=!Ik+qEB68VA2*f9&AE9%<&Clv}a%eU5es76clTZ^3g@M2XYRYc)y8~a>C!(R#S zFVCAciDIQ_)z-TI0E)YdEVk?F4luw{-#^Jl)oHa{O^#mkfv@6kO~N-Nr0UR3kCA}3 zowrnS<(;3{>LLr#p+M)U_s$&NnQi}vTcZ?}Hn9%#N))v>oWJtJh*z+8R#3|D0e`*o z_B|D38;siU5}?p_9W(5#f1vSc+TY(0@Z$Xx!Nt97o6?8Dp@9QxhfcT%N)E#0j)bS+ zIwI6Tg7;i`u_DK@4{w=J$9%7yCoGH6283gHlI?9^**iy1ikX*j95&9_e|)7dCRXCX^m0D-wb<#D$T2 zhe2&EGOGe)Xq;a1zrp7xlE@*M^)7mUuwysaTirXl>1<>8bC9l$j6(zr)lFTrv#O9Uk*wLM=_KUd zS01^U@Nq+Xyz0edGPQRm5TCNzvYc%y6Of*zG~~`86vm0qXD>^{>hN!U+SXl@?X?LqfUIvnKGidq<%{z2VV=%7iqn8K8$Ay@so#BfBh2pE zbK`1Q%Y3x{cimr4VuY{4(R^de@2|x!=eq$QgKviSa4p&&>x0f26$9U#roGEP?w(nd z?_Wp_z8<2+4%g^)@_p!T9*-6xu6eWOw)Q=JEQa9m&@e;oVMiJ5Sani$q$LU#e8Fr! z_cHWFl{eDlp3jwyr9v0&6jE+0gO^bG$rKp4>bV;<+n;_xUS})n5Jflbo4QT<7Zhp1m(dl0zBx086X7 z4eTUfU{g*_JoYGvT;RD2Xb~0Z4{>}Pw(U-s5P3Z61l<0=6EZQZ`?<`t0{B)VNd)rI z$?ZDJC9jB!c|$OR3%5{z8pyyZ$#u(q{vJ7E)h})}5Ut;yf<)+(v-5U*P4E%OxFpgt z>?b&1HyJ-NC%4m;s9c!esjJbzk-O|6BGlzuWHkV*)Fn;quM@!h9;NRenUOG%+ZWN9 z)n3mHT0@+6oP03C?YONy$eVqafr2y33%$``LT>doVEm5mEfBy~$wZ*m3IBSPh^nwy z3N(}mnwU_l9q4#O!3@hD?A!F6{^lv3>W~0;(!SU&1<+5B6AnGF>(zCMZz|QNWi8*A z313}1*kgnfS7G5#@`|~q9RwR#yY5;Jiz99h_k&ZULMMF_^S|VF^(!iQVV+67Ky=Dp zMt00foUto#g7JIGdBWVAt4g1RgM%t%)pEyU{kGAc+bTE?Q-KZs-Pw;NHVxnX6aF&| z_>JV{*#Sydlbz+W}#Y-5_X7|*UC)~7*khJM$#9T30D0AQS z_7E0r)VKvZTi4asDX-Z`vu2hgjF5VM1*NWekRYdn$MtGI%68pPZ`d6JL7nKY<0zK; zTx<0JWxx;}B(1Zh>3m9EDwGSzjYJs=0BcJOrZfcy7Byr+6d%E z^_sT)>{g^PAx{01sLpy|iWSTGHhW_M&vs?ts&*b{pPX05fCYQcf^T~<^rxzynuVK% z?6dY_i;TQ5EgKJE(L-E(A?0Bra#%g)#T3}dyl=@?+_JJ%zt6^TBZhm6E2nPG$Ak#n znWQh#=vPcNndT*t=D58K-Jkz>|KSG@108XOpps)2uf91=pslQthU>LBY7K9LAmb4U z9^WS!tbB==rJx&0$m6`9ZP7StzhGBNWE zd5Oei7Oj;EkGpeh>Pa653Q)e1kbvDWB>z26&Ri?)ZoKot3>rYV^;EKzC!y4%c+tn% zH^v%z3rBJMyW_0!laZx@8GZL2lsV7uz}lpUjls8e6ozE0yM?>WcGuJ${+PMU`(|dO zXd2#28;=!a#4DSoN`Ebn%VbzitgfWnmsu-%{Zbx6mVe!3`2=sE$FLQSqL)MlM@u9|IvjR zM>WbvJlt<(xcX@)bU|94K#Nuc%-H?|Mc)X`Q10I=P{Y7ZR!zVPwK3XHpE zqW?w6Xzd)gbz4yy6x5!Ur2)-m5Ab65t-?WyGQV_W7#2#n@}k!F-tQdLig`w5C11TMobmKrF~ZH zU`>-)cxYi6P=y6Qu)FI!vC-V09j>;J6Q3651IH92HH+-)DjsT0X9}5|+;6uF0Gu_Y zq||t#c`2p;5_ceDpP_SGkD{dDxW=fNN>BSkgMF4Ca57>mSPdWp(}?`euI*$&ott7+ zGoM-%m~N)xkE-L*cIW82*pr;+-A7^Zz%Wg*?+7ZWcs1pwuegy%YQT&=W`P*CNnhkH|?-hM(5dVeOFquV1G5ZGk=I z<A7=J4ROw?+&jQk0X%`4A^kJvJ=!a73l-LIKaI#$ggfhF`%NUi)0i zhlFPsGcP@`wnJr4LMK~_keZNk1*1r^wwW4z97=%7go%a%3hn2pb^g!L$`gnht6p2X z7kJPg$JUIicR+28+HLSA14JQ|VpGl@CzR)=)>tzxJlsh@Ahj7kjF=MNsxJ&&Aq4 z_G)^I5FY>7@XlIQLbP5iE{EB>I*@=KS-@Z-9C(zRhl{G05DG@}6u7diL{%$gh?Su- zs=u7DNVZbKk8|z{?N3cn{b&P5ycS_SHeY`xR9AX(%7d4r%HFXzQBSmw=q3PRaxccx z%W?`@Q0SEWBurvrLGD1;)yw2wu&igJQYJ)%4RP}qJVT$;WM~GLX!fXjQr3xp#RP_}~ zv8{6mcOjh)NObV2sA1HK1t2g7dExrGJ5WT~){aCI@#URNx5k3!wrm7n?X1LdMDK!n zUtfgW;YrYV^R@pa{(;@gohXO|s?+m05m0IGbH47%K;;1}RlUF@SYLIJ3@Xt$cZXt< zktS0`f)Lz6(LfSkE29##Hfn3H!}FbmRyGty*E(Az>M}<$9{Cj?g-xHAQ6A(n<*6v) z^F1aR=u54^g`U}Ib23HWM{t1wr*_TY|5fvJR^Q#}oz@GC-i68@XnSwqEs3W78b3*K z$v2nkAaGb7LIfcZ(2%Thy&G0jYUggSW1MFVi@*V?5k|x&IT~Dr({em&FuLHfU!WE; z7@^?Esy@(q?%`o4jYDFGCYvg}-1+o}MlX#{^*YPDF*BX;a@k_`PXICXqd5(3IdKh@ zg_D1?dw?OmQm5j_nl`kpz)st4Ao7(tsi;&Cis-k0#gxqFStc9>O82JZOQqjb<^K;Ce#LW6oUS8QUM+ zxGnhJ6ZC*G9iG>{v5c7nL=kblkA#wJO=~%V(PhB9pkmiRx7$=L!CoGJ6ZuXhz8 zZ|^=)oCwVim0JsCkoLwn{G-9ps|BW8WbXU%VRjp|uRZXb4kC&ZOQmo^yi7@7f`}9#c+ojD%_VY(d4kmq3JTD=NCtZ^=NTuV_(hU?6 zj%PTKBsM3DYvvsRPZYZF(_e*wIjGzDAOz9)Wa={=H!MtUUg|I4x$2`=iv-Pvn^g6= zJ#0rr8}F{ME`s(0lh6g0^17CfVJ~B+4he@@5#Z!^VP|QeOe~(r-Fsa~3fwjJho1>w zUTlfM*+`8uXrM*uqGA*}`qm_rXl#%-{yqT<;6LOfns~-2bCsjtG*VQ)BfQwldAP+_ zDaAPrauX@6=>|!Us%oAhK^BwDJ`QP`Ws)P9;aeMMfBFEWv9x<{EGUW%m<{ZF!LYBL z#;yw1lAt=npP-_RPVg7<5!6#2fn(pQ=?$CVik0S*H?G>#d(bRDvRPgeQ5I@FG56Ut z30LwIn{;BuG_B1%ZG;Uks&GVJYz!{37XsFYHiQ8!B`>R_79Nc$J^{JXEU>%B+W^s% zsSrd2|7%nfsPtR!27*M{Y3cKTRKEaw;cNBy=yXSr?;e)op(Y`G4u4wcdgNnG^q~*vjl96|szv5AQCfw!tKr^jSUu!!Bh(qOF305>tEfpWn$mEUl+b44GtR{@)}8{($Wzf9q14w{?RQ@OT6a zjvIp&?+~qBhT-RbpKL{dsOB6buzBbkmm7rrpP4WDv$oV_U!mS3DTiMQgoUKQrlAbO z`vDXF{R@)A|IW9|@S8mJHWR-6>vI&#B^ZE^WhojlSBsu*GF~wt;_z8t`C5*ZEKM4a zg+W|IZsHySt$@PT`WgcKHJ%j9Wo4rfH1zWJhT0ET5@iL#+jlz3MIUM?STsvc8K3wg zk-C!7u`6XMhHHh@hA;sJ-E}$wg6)i8rW+4^VLQ*klCzm2(~&j%FNg}{?4fF41uG?* zPq!SKxxRitchA=T$TPQYQ2khn70#i^w6$JG3derl`;SB}$SX9pRindDbyb~(&Tofk z{q%+a%fC5Dxz@`8SEFrc>5NG3K^9X;DKcIzn*a(Mv5DnbBX*WO{dN{M zzG^+cXaYxgQdpk(>3qx##2eCTnBjq#Ua6QM1HV`fl@ERx#n6`U-*ukqfa<7G#z1k@ z5DK)R)w#T;Tk~G>#zfll6ri-i%Xo2`KuNhU^*D2Nl9xLVTCc1U3&s|MS+wLRflUCAtT_y~IqQGog_#-9h2J{ho~zW|e5ywO8>6-?@Yu-94R_(!$0 zd`0&A@B+AvZ5mM3_|@rp7Ev(k^FcP{3gJgmOj@Zwh)@EPI060_y4@ajXl<=K((8C* z4#%LtX@Z082YBoc(53nWcWsXAW~lxi#%_Wa;p+h*@mkX2%~_ zY5dy0NSRKx#{JK4uoyDdR-5CV!+i7;`>@Oh>){kkC|}}-Wa%~aNr1F`f1mR=`hG^L zPouG6bEaj<@%<0YeW;ZtU#84WvfwL0(zG(Ac4;OnC123ph|%8fwZP{YNr6la`630* z1eyBH>TchyTPu?G{i;`DF3{X>Vtv3@^UxbEs1^alX3Sz?rdi3Bnv{ik1#o#)AGKvP zSO5%Kof&BUogrq2;^B|#sI@``igF4t2dL81e=-FTU?RDOUCK0LqSApZT^Tq@3UzRS zz!Mgo#W)Apd(Ek(z*u2Mnf5pW%$}$h%lBjU!hi#jZ6tYAo=O)%2f~2Y${)VH(=lpB9uH_(^mk1S4BlgceaG_6%s?1yhMHzo=20PScxB_bK!%>p0 z=pmm#QN?;{H2Is*koxc3Pda84g>ifrT~KZ6i1_~3FMv>;$o&tX2F7ip2wdHJ38%pD zi0nm+BbLpm@Gaj4PhQ$GA)1J65bq8=6rUHfdf9c(;KNo@XJeaQc+A^jp@{Rs{OcW{ zy!5}^q-h}z_$@Om>W!B%lecjO{3DRt7T)yTmcAna`ZGFgT>f!&7^I!M+B%HlK72ApbJZnR@t{U4{B$baCkU@2tF;$qDcQ)B%5}; zYPd}Q12;3Un`qPbyf;)~QxQgc&tY$mB5mOtDxdQJIr6oLGaom8WayS0Iejg{T&|ur!1N@4xDEqkgqY!unA^P#Cd7_AN zdsX@oG0FlQ6ce*4W{?QnpO^G{ zPsVHpbFxzPx-#+2;_x1ajVjXu<-+y{>XdYYJa|_?Q5+;0<%-7!;obBb(`cF>WG7^? zV?lZ4Q`C%|6DeE54Mq^32ug5;Z%OgUp#3Ezp0|%p9Z}<54@)~|_YBBxP@u!4QM39` zQfmY1WmWmw5EaWyC9)o{v~16WQ~$tWqC;>!QacB5qG3uL^2Qz58RFSGMG$LS_B05A zC zD;BLI5+Dl!)G2{f+>pr% z5B5e4+o=NnsmRp;)!u)0N9(DU+WFa^$=D}v<`&d~3obIp_slhGF6uRAp6wUQpJ=$L z=QQvZ7xE}1&p;Jfn;UVwdD^=zJl-N2AGCgHq`Gk z_k`>9VG)XQVXAuvt{r-!$s2lJ59{$(IDmpb*r90da zW0y*0V$;+_2s*b{eR=H3*XR-)=O+$83iBT{AM;*nB$r<95bjyPE>}(55|TM~&&m>m zbDaf1thVUn(Jv|0`e|>k1dLBOT!hw6#BwjNSq4HJTcIJR)f-{Pw)I#`NaI7%+vKPN zjz@UA!ir-`wl{76x1U(aQ@Z!1KlkTD*a*uYC;$+0&Hx87vv5)9suFcx#D`}9*VU{e_xID)PB_mq z*K6zGKmldu3NAf5v~QTOCckjHTUoBNhT2FbCzO}L$2p}&pG})GbMMo_vRtmR9VD2d zF%5wsgv6nM3n?W`A#)V&S~PKr>ye{N=s?J^Buz-~_x3ET`W-XWGSl|s2g=PJuz=xv zR(U7A)5m-W5`JQ9e8YY!s1r)jlp8(0dr+)*Ze|JCM@TSR{mZz!x5=_uSZbA(;0E@g zKIN{-#f>#~&jU(t;Ujb+%wgY7Eh`>jXPmkZE=SE*y-<%$S|D?O66ar-es6BRhmf$r zpjwLy?hujBDI2nk6@eHO#g6CezYS^6H&dNT+)EKDlYYCbg=btlrr$PuiET7lO@nS` zs%9ExBZ}`38Lsj8JM9rwNKO+WNm7oUmD5%edNZBmVGhc}yf81Rr_HXoC&~BGEpmMM zY-k6@#uX&~r=!p;%kDwj+X+p9+g9gmY|{R+y^e^TkZy^L84Nh(4L%3Prfgo$r!Iof z>EWS(C;UaBNeu5N_r~UhSuePwEj+i+Sim9QsysHo#}XfzP8s<8fxouWz?-m)Zet$jZpl@_5~iYp#S>cWrf*z|{n+R{C-eC-cUWTp`Al7UV_DsqAA^7jKP+HjbECJ-b2WNJzf z$0_ArXg@t1TE)vId!8nASsU$$&mP{s$*y@KwBL-P zTNr$c{Fr9}wr-7ljg3%biUb$tiMp4vTxxE|MpT>i0T!sWvuP0;KvuM(({s7z;s$Uj z=?gUuuonMtgbU=;2ptiwN({>DZNAmy(Fmw?f-2hwu*6Ql5k1b$x_S{W*qfy!&)G$V z0=S1G(YcA@6cltaWee9@WBy~Gr&P<}I-%57#e~}2GpL83c^>oU3IIe8WM7{TRmf%5 zz?3Z$H{^}o+hY7w{B)lBx35}_HQJpt?Z?fVbwFvuhG-X%qRF3fV%KWc$)crZxM+rS zr#wt=bw$Z{<(pu~)Z&>bH^YEXQs|RSU&boOe>xkysSBc-M8!mE_3U9+cjJ=>w7UKz zL>xhz>IIlQyrD2Pc*Z9U7K-ZI(^(OC#$7a_GeNP+f&BdQETnzo7kHCxV_ChJdx<{* z8XxV!-Ym(u3ai=M9G;M1& diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" deleted file mode 100644 index 74f3dbc4..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/T-One\346\246\202\350\277\260.md" +++ /dev/null @@ -1,30 +0,0 @@ -### T- One是什么 - T-One是一站式的自动化质量协作平台;打通了测试计划、测试准备、测试执行、测试分析、测试报告、覆盖率检测、智能Bisect,环境服务等流程的闭环,为社区研发提供一站式质量服务。 -​ - -### 平台架构 -![](assets/jiagou.jpeg) - -### 核心特点 -- 一站式质量平台:平台打通了测试准备、测试执行、测试分析、测试计划、测试报告、覆盖率检测、智能Bisect、智能巡检等流程全闭环,为社区研发提供一站式测试支撑。 - - 支持多CPU混合架构(x86、arm、loogarch、risc-v) - - 支持多操作系统类型(龙蜥OS、centos、debian等) - - 支持复杂环境测试(企业内网、独立隔离、弹性云虚拟机/容器、应用集群及多种混合环境) - -- 质量协作能力:通过分布式的业务架构和独立租户空间能力,支持多企业、多团队的质量协作模式。 -- 数据分析能力:平台提供了时序分析、对比分析,以及聚合生成测试报告的能力,在大量测试之后对数据进行分析以发现软件问题。 -- 开源软件包CI服务:社区开发者可以将自己的软件包(可来自代码托管平台如github/gitee/codeup等)注册到Testfarm, 平台会监控软件包的代码变更,一旦有变更则会立即触发测试,并将测试结果通知开发者,方便开源软件包引入。 -- 开发者资源服务:社区开发者可以reserve测试环境并登陆,方便在测试环境中进行测试及debug。 -- 缺陷定位诊断服务:对于发现的软件缺陷,平台可以提供了缺陷的自动化定位诊断能力,可以发现引入缺陷的commit地址。 - - -### 应用场景 -- 场景1:OS发布测试,每次AnolisOS的发布,社区测试团队会根据发布测试策略进行大规模测试,保障产品发布质量,外部用户可以在Testfarm查看发布测试数据。 -- 场景2:开源软件包CI,社区开发者可以将软件包注册到平台,平台会自动监控软件包的变更,一旦发生变更会立即进行测试并推送测试结果。 -- 场景3:自定义测试,社区开发者根据自己的需求可以在T-One平台进行在线测试,或者使用命令行测试。 -- 场景4:离线测试,对于网络不可达的测试环境,用户可以使用离线测试模式测试并上传数据。 -- 场景5:独立部署,外部用户也可以在自己环境下独立部署平台,测试并上传数据到Testfarm。 -- 场景6:登陆测试环境,社区开发者可以根据需要reserve测试环境登陆进行测试及debug。 -- 场景7:缺陷定位诊断,一旦测试出缺陷,平台会自动诊断缺陷引入的commit。 - - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/Dingtalk_20240614165831.jpg" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/assets/Dingtalk_20240614165831.jpg" deleted file mode 100644 index 925bf2945891170613821e8e7dbc9e4206d17c8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6459 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

}E@Hj0_{W?|f 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

FG!grkAXdJNt$uIvKqhcJq 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 z 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[WR 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ⅅQKHz};_SkLL8?V2PS1YROEdQ3~XQxay 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ċXdTaw*%m;m5ZDbWgJ_XqbT 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�R;g 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

ddeE*SWKS`wD5C=M^ov`A=E-e{k-D z0bY>1fD%-n!R|K!k6S>3AiO+RA=-yA(EM`li1QL20YQIX2!w`2?taR57)FMHrXadu)&&eygxTOZ zFevH;K_P&u=1oBB)VWy0IX6V9Rho7FHh}t$N1sIG4Mjs@;@@hQiP(-0RUnIcjI}Jw zxvA1wsjvn(Xrw;O3ccoDxh8y7HR?kB10Z{^$ulWK6bGao0IX!{3R925Q7-m4VS~~essk!~e z4A)cmHmN-S!vJ6`uz`qGggZ~0akSp#2Tm8kL>{59!%?|@R`}Mq%Cz7#~#psY_&8Qwb`N<^3b< z>8ILg(4(1xHx!6$wMC!|FG@~G@R>oUn7s=>xEui;fdx#Xkv9X^_9(;pm_uFsW8pe6 zj))NITp*6yDqRrTXrji^{iEmP%9alwS`7lIq`g~z9H!3OeR*-VQmOShz%V{mI&u!Xt++>K$jIFgWDHn{`cxOL z!d62STU#DiDpl@WPw-5gIuEH^0-p62+sUb{v1uuAZU0Z-;7!c*nE*=sJH^OxON4MR zx%6;(N}6?tG@i>W;fbWGTpoo>*NY|73G&Y@R`W}s%lK+kWHY)N!Ld;<(moW6s~AbK zz-s}jWdC`syd!%F{fdb6pr>kLClv$Aw}dOmnkB`nAOXWh)D2cm$dN+L)P5A=lR-0T;5eh-{A=7gC&Snk|ayRc!xAo*a_9-JnI#bqG}kf}(bsaHMeu%SE8VU~EY}a(l+G{6iw!mI7Rza}$Fkk_+cBUYp?xH5-c@fO9Xh0; zb*Df6;(1Q3b{Xt1YSy}5u8}9mQu&Vq8~#%)@o2c!{&%BC_&Tou@Amq%r_FyevKOHZ zay3F0Z*&Bny*qxh$0d}*0!hQ&Q>JXfcZZJuoNHW}a5-2_N((Jpv>28wcAkBp?`pAJ zVf^aWsGlzuKZEO(le3(9iUj!$Oi(abT1qKbrePv~Klq1(IhHd>wFBBHJ?PB9QON#R zPhO_j#ZG00K#P z4A!=5!%&9g7)JJ<8&CN#dRFiBe#{f_=l|L&5l?8Beh|LcjS87gK&#>a^KHT)$K&~% z(>@hP9+yf$5R5CZv$lKQ7(PD+c#0GR!Z@+BR=n5Sau%;71c3;%lB^)Bj-l=2fhS*l zdpNJ+V0I{oA4!lyd~J#HC|QOyjs3EE;N2+XhNA6$zS8C^f!P9YtJSRc+ofD=7oMjX z;B~d){;*YT&gP_+*aZg~hlAeQ67g*Oon?s;-g#*n#=HH&Wek!Ru!vp=$tt{LmS%{l zg6TBjbi7oM428UF3~UIJo={m%p4^;b8)e}Uvo0}sy>~tBMqeZJ2ZRUNloU~EH|+P@ z>GF`Z6y}o216~>5JTWz;_h}AzdQlPWLDvIQBwj2wAgwTW>qt19!!M~o8ol}cu#(+Z46nqeB+c&? zAJ8PJy?{CBx7`MTkQ5PS1`iSDV#?ds^UX-mVzFG!W7CV*3_lYYrW9UDRJF zo*M>3a8RDLhej{Z)sRKauV!zp{sUW_&$@pDhiy2rL~VgMda@ykNCF`zh)=Pn67Mab ztqufz=n0)FB9EV*kini^74S?va0U3pfGq;d>%epn8(?sA$v~B7K9Pz-I{Zv;2^443 zi0c4p!(gZCf^L_H)RD9jK_0iu;QE99r#zwW)^`>ujM{tG4$3TZTPBt{Zn*OVVGcpT zKvatqM!2a-+QQ)%f$NWVa0nQ35_XF1;9cHAQLf&935A;lV}vG_rO206XE}D`+dgl0+L>O4Qi{C?VJ}$bmslfD zxcYj1Dv>KPir2oUgqsMEVN=e&xA>dCZ|EYa)N#I@5_H z-VZGLXZ{fe8+Rg}%)bvSm(j-F3NNJxV+IHGbGJdeRj#^~>@+gD#}oRa1wt6K$ES@B z5=77Tt6#c|hk3>SusaxD|9d;ZdhXpekO0)oDgM+pDGLpfem&1=osA}!qYzf-7X%W# z{d9Z$e0fq3hNKsAKDhN8W471(w9jjDxW3#$(_ui#v^Z8{I>zJ}Gkdv|>0wAxJ2Vdt z6e9?(mB%>Q#1Qg+dg_A&=ioADwph&-14TMJ&!9-)=t1AE9GFXf3xmLDU6U9Z@K%o} zw=}~S&n6%V%{7cF$IT-Jg@xB<4uu6|7B!N(y5y5b`bBz5wEe`Olm>FN4-Zr;{nmo} z`=UQLkPCn#iV!9A79?>JrKn|UsZi4+Sv}-?k9Zl-AIBbjYC*qd*lHOH0F=Y0EZ|f8Ut{1X9!(P||h^{c1}c zG5-7MuSr0{lSs>cPL*h^)F7@R28hQbL?gE<58MC$_3 zj43mkH+P--MDI`L77isr69Y*mK&^1~GT%Q0#(Lq$Qk(M%m+e}iLHm5;@#Nccnh}Dx z^i&;bi9&=3F%xtl<%Ecqb8-txoafd@_S*y~ONrgl#FB}lo*q$&A#ahV1C7;#oaa3z zK{~+brv6>|=jlS(KxRII86G}O5dJ82e9}o`e9BZNkLBIkQJv8HBGzJ37T)_&)}bzb zpVZu7esdW*v^l`vI5=pd0;76j?*z1C@DZCb+0>Xu2fUsAZ8p$EK1oU3yobj|%wD%= zH8N6*9w|!?%4JoP_=U;R?-u;peXlM~PM(gA8IEbj*{rD-wOrlMc!$0*iaI6cHoOe( z&=Gg4hja?}WpYWwO>!CsFea=5?p9Dz`VW^jO|BxeXgpsQ!CdSMgtE3ce z%!X%uU!QIyJ0&6bOy;LP1Sa3=H>yKHFhekf#u0|1@z@?ljx1HGMsILTXiCC<9r2Tz znHoQ{I&+Nad{JI|QkeI>O2uqsHV=_VlVOJ|9*e=~ZX*DM!{@3K5u5>%&SMWECZ$P0 zBZ2TGL;@YaqE!B|2vHDGN86nwmr5bcH+q3s7~CX9(LfqD;1bS!>}T}#GUe`=RXjze zqmsnA2u-?#^@u?XOqcAF*sYOm5%9pz8Q-4CNF8>LPke zDbGiX**OjBj9G#L{=LK0r|{xlAvY=zP$ox-^oylU6Zn04lC8a!~zY#J1$UnNWAN4W!ovw z^#`>`4Yt2nr}a>+@i}}Eh^jc^fZJ}h4g%_>p7U+HqwLA$ZB_97*S9#uTtVxd-tM*w zR=p-@ujur5LSDyy1Ixj1PBS!pyMXJ(zu2jJKs^Rjxe1b%RMe&IL=!3`2Vx}Je|@5; zY`0s^?dq__N4w!zIYtT=w<54!HyDC}T5shsx>FlfM=C47aLG{?kf`k#!0V%ut3--V z&r45QW6P)PW{@7`W0YE3G-mnL97IN1<=gXPu=q?H0X9@@&DNl}agwo^8zEyt^n>|z zd?|xY&0>$rc5_dSQIoMr(2s}rhhIqFwX1IzW_pCLd!g+7Vu%G=oQq!mwqNX-49w`h zFRfU;19T*Pvr3fnWs&E$bcAr^T9)kP^cM4pl=hRoZyL}0aUzd5w4^uJ+w{Lh`|E?v zT2`txqKL}?U5w-B$ekL+Mf7_=)P&MmZ#9$y+{8Eten`UUf#6uhyB|F-w}i!#bgux} zZm?8$qovv*OK^AN*SB||m%VDcU(Cm42L*TUxLk!XPvC3N>abr}qL5!B(DEyKfaab6 z%2QH?KkYCCe@2JSs732L?%_l#zsF)ma;0ibHaE?2VC5A2X|hj{b4!4HlxS(q+GY|u z)CcKWisF;-p}at?6uIwf5ke3w#lv4qvy7-wph7L>=P?fV&DeX3WN~Q_^!ggG{l|DD zdF9~jNbBJU1Wka5KZaFh0=$Q zRc`^{jUUN@vl=}tQCrB~OX9e&pTFzEDT|GK1!x<7H$I&lc&x#nyUP_KJ} zhm3VG_YchyP~d6N8D%CNTKxcyOA4vXP?0{UdE!S5xZqxBq*%6Tig2@{RYQc}$ZGJ0 zVqKjLn)p;zF{O?VlA^3iBsAP!5!vbwI+iEcRgx$V`QH%^^hzN(QZZMx?W9o1=&*V5 zr0|6BMDl)7+aC!E3Ut{;UBgizr>Znh+W@>H5Wjhp^)L4Ba-(%>eCq3INm|5A!HHsW z46}Rb%j2b1z3H>xoA=|1*PearR*gOV64Q}3pW)4P2otBiYMV(~4Lxn)%4mWmx8riM zPoFAy4heDW)#OFg4h)$ zBL2k2e)4KfU^WuJ5NcvnYqDgm+o&~WvaU>8K2OH=DQa`w#c#xnIn>qpPu^kIK8d;< zqIEz2K^yAbVhHS-?ZpmoN#L`dr^;QcU1tn>eokZ0$0w803dwYmi{yAkSAu_K9chWi zccr(CXb^{1olR$?XIH(hx9Uf%IAlo4P0ZD1m`P*YD6#Y5$WOm74^LpaCQooR=s&Hj zRrDMOeQml?Af!$VfIE|PkvK)HtuPm?qC$)@gPQcmWi@+K)*L)^q({ ztgGmjm@t32djfA6ka;7(R?7v<0|nnber?&I)#|rGut0CfG6$I$C8y;;9S0y_s-oa? z94u_7|@GyJM2+4 zw~k7O3MRsw{Ox9UgA|~BVTK;=;;$g&tnabeWqHL}f3{;G4Cc9#m|v=(L-p6F^vJab zErQYOtH(ITc8-poQ##F1pyLfB=?f~bJgf*X1v=Ce`K-tsF&@E&el{Y~UAJea>6w}R z-B8aN%<)Pmgl0;zR($@Clgh7gqT#KHm>xBs)0EDrV8kzP&__tcP;H$m;@XF$!5WGh z${Al9TB((iAYU)MoR1K_Hd!KwVVX3>?Hl$O&k(_gXq7F&D&r(re9jAfq|%BLk$<829my!AnK$)V#1y!4I@Xpd+Az zDBFje)$!7cv_*8#XSIPEnBQ~QoVxsI68#x~vn{NC{bm89k&Eje- z6hcvNt!^Y1V_Dlcs$g=@V39bxc8a31!d?;5iws^Wn*|Own4ZLgEgUswC<~Oxr^ja^ zqZ*u$5#{-EQ6Iq^uRGDe12?as@g@xUK|RKN`C^5~@#XVIO?5C70`wb?sjADWJF?$U zkMDWQKTN~CW4sn<4U#OTO*S-1!Xh47Xo7Y^hc=AHY@o*`_<9{g$YW=`qJ2jfZodSiC|rErh`5N;Mb(%vd=jqNMMn{f(&3d z^!YGd)^ZvxdZs^lrc|c*_8ZR0tLj>E=0%~w9t5wEfA)6VqY=8%s&6YssYiA)vak5$H zCvq@110D2!{(7)zN)n+cZbJ!k4az;*bcju)Ji>DDq(9rhSXUqc%JXFAW9}fxK!ZrIRap7&?t&!v+cqYTO@kq5{Bu_~+rj1*wR)~g25hb0sDP%b zdvq9a4<(sumAHXtP*jNMF{hL%4L)MnmxH~<#U@cctKb%@LC{`;VT4R?>Qi)Hnx3=y zx3mBY_GPSCxIO8}I|)rH*FcTCNz4ff6l)7LS}3zjV$&yN!(bhzYkK;MK4TF3?4>*T zgvqg#kRo{5qnN%dDMp{M`6K@=tqrx42rcvh%qzV^E$a!Kc$>C1q^!u&xOPn?(JB`w z1e%zr!oAz(7>y!m_%o4SK9}D$TqeYA+a?i(B&|4VL}Kp3wDtgq)-^tTUI$)x#=!=-w20rIXAOQOOAjz ziqGVTcT@vO7Wp^a;%ZP5GsL(by$~Z1DUHr4;!Lw>v(_k>t}`8qJ9AS!))8l!#;l1HjTHDzK&@c7fUH< zy4}vjx1SeH1&UL05Hvl_1`I&rIt+%g>_j4A4ea)-kVSe%pHRnn%PFX)e@&R*BEh7# z2chE}sd_|0(SG1M;Mh_}8?heW%E+FN=p1zc*+IhOqMwz`e|MVJ=Tnqfd<=`yeoBUh zxls^i5TbSVFH)9TO0ccBjsJ;7KrMC1+{xJ*HwK^ScwB1?N?~mbiWng-jO-1~jiJtM zPZq(S-2O%ci^}n;h+2xIn_(7B6*s*(yO)8vw1;wH4n;~g${q#rB-12e+uukrelv7_ z;{Vx3ND=wEgiREC`CjuI_lE=+a72_&)%Jl}XO&&lZQ~9OzX=7#*SbgN51VYHRy&>a zR~Jq{B!XLE!X%g(Hk#3*=lYSw8E!2;hAd5&zwx}xy15;FhB8=ph z8TL6m;7PlbfXoVSU__5TFrI=BUZ;4K*i?PGjwAmi5c^I8%j~Eux^1Smb---6(tg3S z40Di&2H~szK^f-OynJ`61P}qWHQ1fz5`=fpwSPSoD4S2%)~hA{{O3 z;`5exYcv<`1xMoi{)dXX(?sG1h@bs%6#_EDeC((f2xMSkpx&FX9o-#pWnd$Yrmn&< z)fM}w6n=2RBn_2^e2(1&^-5CM;CpDAio!hq_EzmSsgZ!P6CcqIb=k45Yn^%0=%HbvzM;r1h@@LQIaax< zxsxRx9v&5X4ZNeIsTe26NjYZWKvoH#_2(U(Iu42Mg64EIUE1~YylpOgE+ zVeg+Dsjdp+9+>}mPBet*X*kk5IKViN}q{p0ravU9~|$I3#z_XD~zz#fFJoVu~3*D|Pri&5pBs$k*&I;%gXr z3w2`9;9)g-^x)e#-PPvN2QcitwX8FWlBq>1M0wo+L2T$XPULXl2NhG?yKHQ*KeKjQCa4etS9^e*rxP zZ0&TOy#~?dMU@?_*v!NX5U+FBy5Tv4%C???;Vx@K;fGk8z(QCvC1zR6p+t9wBfr#FQLXEhGfng&-0d z-@HKKMon9jF+i~LWpS34gAt)xG@}9+@bS00(~kpQrBo+DkO7LX0own^%K}uHuWjxi3vZ1hH->D6`Yfx zCApMg)c?v{0~Te7lN@R{{KZyoU6gtuG|X!PiMtX@!??+AqO*q_1?Zq4l(;suA(F14 zo&|;rt=bteIPUBKmDK+lPRQ&|;PsXu1#f43O*h6lo;UF00+;>&{M&0?~#ZB6#}V$E9wC@)h}$h+%e=>Z#lrX z1FXpY|2298*wF`ex&E#XIq6;E!mR2142WRoWMp#t9z-$Y#jRxGx zD6vfpP0xRQ>_1=BI|n!wy;}xbZrvOxPN{|;WG7wC@?u&pNB0&ME&k^fI|Z{lovicV z2uPvAul-5X2pv%4?^mDhMh-DmbL(`(;Q!5H?MDc>9RGVzLBaAhss+@y`b8zV@f)S> zJAJO#PYg45*j9e<8P9&3DJA|_73qQ%w!x*f1kLm((znZ?N0z@|_t4No+Rx{r3KVH2k= z{Mpl+n+BTpea6?n>XQV`?6b7!A@24|!gH032n@Kw_*&S($GIN46Nlqt({5e{%jwTE zfWrU3N4~BxnNj~3Z^|NU5>FO2CZbHCNykv6)GpA+&dEBy^Awzug;$f!QpHUc+(Qdv zYPm#%Y_jLcYC8<6i$e|}b}!q;lT}hekqTF*2$}r(KfVF*6+E+}<9V^AXa*w7^QiZm za5=fBEtn(?T4`(JmWBj~_L|6;CGk6)A3IgxX_V57ny~MU)-5fR9gg2-BHFZI4X65;ethC~SvSuqa2cn2P~EJ(7X!Z=TOn;QGs_W=$|QOt1?S1 zj^job=j2iL&+6%Ph@a&RtstAx68?Vf6QyHCZ`#Nq+AO_~_8_U|*) zn>Q#b+_f$sKxp>I00!DSkN1yCot%~NJDzuWEuWUANH}tKo?>jjC2_VqzZqU9t52Qv z>f&v@uB%DxYnkWtYu=e7In_9#$h*Tg`%ATZ^lw!C_^g$I4#Y7ns2EL{DMHT4XvD2j zGhsp)n&~4J2zcEu6Ga*DUM9_7g^Al_p0{;O@dMnqfBh(D{ZXfh;i}aoc>P;TcT4bJ zZ!s2ozI9R6&&<#hEut0HtR>utwR+|zfy?gf&GHe4k=-eZvivnW9?51%J7VXcF>!Ch z*|NZEDf@QJo<7d&mRNJhRBp4Ps^a~H%J*zKj7s+im z9(6FtTp)Ofum2p*^4y32nXvm8YXE3A0ZFnanx6_N_L^ilH)Z78kjHN{S%SLqi_wql6O{5df{^h{1i*$`Sk3D)0T)>SzYtnnUd_ zHT@Gb-whRt3dKPP=cQ`5Z3Rn@RE5d6%vR6FqqzUvq&_zP=pqCv^*CrsXP0PwXss-G zafHg2AT3wEUr47ryUEIQMJ6Rs@Hw&$FH>`&!Ueu}R{#5=o7hzI?HAC(?f1x2zfrg7 z#dEUXunLo!*k{2Kj-l);^NaY99(VS@*UbUZ%%VIJ(eWp2VcMvc zyk4uT;J4)$B)vSRa$%7O`;6nn@Bk5!yuUuvl7cvXGS3xKD@nD##%J8}dm`Lugh|UM z^S-5_jV07R&kPv55CCseY+GcyQ)zF1q=QV!=8B{( zr?+iItmZ^gOwf$-p;Bl0-Ll6-iV`N`Wa*pkXU;btVRmbif3~*xYTWK7^L{He`m=1T z9!mndccXv?#^RV;VKk*TLx}xpW%Dlfi~hW$_~H*U?cU|6-%12`mgRrGsf#UNk|V(r zeX40RD921Jw}`6l^d%1XS>I)CiqSStgHpF+8BSo}Ine(1^ZgACwrR9zL!E+1d`4}q zj@tb=Ji$PkSYS`8=1D({zF6NP(V_m9) zx(bb-g(f*4EyH>HAlM6M8l(p>Y<3E*@YpfWA*7 z{3PwKh7>Z%@GHe6D`@e=_(3TfvoBK%^P)^o zGO8$c^~2@rmB~|B9*y8Ts3I&KS8gsBf$B^eA_6-XDPKswm#9fEhR6xtj=&}Um&CE9usp+T=yNS=F}q-hfvh%is6U+8UY=ZobQq+_0OFL0mfm=frW zg0alfk_;q*ki_>3hK=TAK zauT>SK9kmsVNha~^ErFUIh)VAo;%9h%-Uc1C_LHzu^0n;kpffDtvE(GqDOgTDNm+P zg8H=+7j6P24X}&JQ}X-Iy!jjg@gxow;}d6T-9Ru3NADY>?%jXzzPr5@BtdHeyT|Li z^ubu3p>L(-Nyg51l1XM*wr(g16>Bh~W&SDVxm8U$;;YDL(CjzV@W~BHbK}!IheU{G zO|kOJw8LIxRxhZ@%LYknWx}Pj4ahSUCp)BN?;3{-hI@6EAgmWwLhWQ!j*dx@@afTK zIkNPrY^i6zaFcKy)SVve;^3kEaC=es?FJX3q@#d`|3xeY`pT>nGoQM#Mw>ENvIeTx zOY##0GZ+dvzmWf@hIBRtRSpd(ROdc059B3DAQUanl`4t>U+k%;w+@t>Ls5wlvxW2G z2IW&2v?|nLRPo!Ald)sW{2kYutZi%<(2@&1zEIK99+zf0eE9o%$H`%%uKGK(CIOXX zR3ayuSn7nsBL=Gh0*cwX?UCA0z(#LM+&+pSK1vV@P8MLa0553bfbGXlRl zvmAar0-c~5wW83PND6#>{KZlXg`(nx5A@0NN!6x9k-S@;fai_aO94-I#edFry^xIl z?a%L?_m}T9is`BVsU!0E*#(rSvnYXaCWdaV=vC@>d%hJw!6re`1zT?h%m2#tpF1te z-Y;4}{*@ha-QVWlSLU@PTV3r)R4QGzavJN*vD0t}Vw?aqHfozHZp2>yp)>z1!ZjLA zf&>>aPs>B~yP%1yh9HH9*U$dv8>}nzP#k3p*o21SKTuwEWk5}+?%mz}Z%CZxB)d=9 zb{Z0CgcURvKI+Rv3S(MQQV1*sW?)>?DzVk~exk1xtE$G7YMM^>$zNJGHoCs9_|NOB*u*r!a`b>vBW7ujzSWPz}3fn;EKI=Lz;UYD)KlsJ2uDNH4z1I+3_a zcMYz+IOEuns$l~T5)YUtA#16M58ke>uDd;bDuXUxfaZfZ5}`k$9w7Jx>d8u~QzvW< zqT;Z*?W9Rj>@eU1#NN+D7=nQCC=Ey@al4p3>i%=}2WSI_W_!!8)MP~AGH*1PBdvYG zi(kv+b!@U*D+AJ*z{WD*0yaGk$Dv3Zy%wv*8VNW_`ZG!qPtn!So3x7QubYi3e*t6u zyPy$OVlVyEnZsJyF=uQG$N2 zPe3qKgZIPPYcLWOZLNP~16!a|820hB%2uNKbt)V)GMUhFtSb%Dm zw^q8Yo|t<+LNJ_3CQh2%)M8NoE|8Ac@!AkY;<*DMiTaa;-|M@ls!;}qIl2I7?DC6+ zrKPQyY;egN;ddy)VLQ?99aRt{f}U)b>X8KKOpKc4z4|WmxDkMc3c$NG69kqY1$ilm z8RwI{aC_YzoY%CsI1fk@$RZ{J5@73`FoIFJ1mKyz1IXIt`mHQ);wb(4ELxXpodMr= zb_;{J%FG?FtJGq?KznvBiHx~oi}4#T^&%j9qxwtFJ^)?+tMx;`B74^6ynkP1tO<0D z08bgCbRD2r6eI%R%8Qv9YY;g&xpBk?nR^6cJt%B2DlPjJ>lyC-_<%3G?6be2(;OtagWtn z1!XzF)jMx>{$BeTCKLQCc%@3G_EQ!QGoZJR0_Zg8cqEH5R+#Z6I5GF+lqn)4h0Z-A-4vUw! z0@rDho1+caZNINq0251c`|!56y0CjekdcYWJYhsNvKQd36ZLR&>7bnRmTOn91Hgbz z+Y#l-w+nv^#N}Fj%hC9S-3O10^@ycRZByzq5;y44*vkz=@6#TUKX%W+G5|pm+X4il z0iFLVFH?`fNP1i=?QKdHL>kf*?l%KLV3mX`D}vq z{r9ydy28?dMyq|FNU-8Nx%c_$w=t=r9>eFUtDhb9sE0_0oNx$SCjU1< zO@jkIH`3rxLgTCcv#|xh2FC1VN?FUD)=3}SZ1THz`g5aukxw9uFLokKa1$C-ji4dt zlyla*-@PBEvUqLZ!MT{Rq|5gJPac9Z^UpEPDO)~W{xp#vK|k8CU0tY||0z|%hcSe* z(VR>ik*Z_`wTUM}2XQs`DQ+D!l1f{EHrLi(}QM>!BttF-(IyW zwl;>yhc72=R;qb`2LzxoD3x=S=TTU(sjCad5O8PuY*dGvMVhdff-Ayexg0jZ1IkrL zAn>T#4zRU>FefuCW%yzY@Tv|ow$`ej-o19Zv$$==-Fp4WbC=t1kVllyqj3FZ3qRhm zWL!@3eI8xk=JmZ9!ZVhRa_1`ZGQV2HjnKRLan6z>E>lcGEA1_FQ^<^gkQ|u^M^G|> z3^y|>1sa1g1VP5nK#7t_Sv?vxlhI;|?JYH+;0L?{2@HfE4$MGX^`GJH$gvaosP!s$ z11JP33&~RBNx#Z|`8bivI%z-JV`7jBLEAx)l&(Z& zsYKKF5h)sMa@WO^whL#+e}ZQ10Rbcw>^&6ttk{qFMIG9W1{5zV1R7vmKQwiR;8}&< zFxzLwbDBr@ToyX~1o)C_d)_lAQ9FXJbT7s|mmG*^YtbI_1X?b|U5a3R7G}!|7|J}C z&a~J}Eq-wLbhsQ!eD(xr`~^$jbxA4zQdB}?c1 z&-y3#k3WF=XFS;d-=h&2c91&CbtXBKIRGl``{eYNknQ97aSVypX&Yh+BMBZ-*y`86 zKx`I3yGQX90LxI-yH4|$8TD)dv|~YS{Z+(%heH3rtYG5B*Ln-l=P@WEDyDsz31K3a zGixP+r5^j+>iuCOG^23Ad>AMWD-+TB70i`jS@gkUz$6OwFq7Al@3Eb`>fP7w2k=JN zrmxe26$;3c!Bz}x8Ip4*jmZ*00Z-Vdk=v+t?1_|U>5=x^-CBj`6?CXy2n``GTr$*4 zc-M*d^pd|>qZBXqBm|flWC7`R?)imy|BwsoOeBt{{(zKFwF02^{M++HzI6+3RMC+r ztWD&v&34g1!Z^)ykHfxUj#C3>#acj%xUR-IPiZ6isc$(c=E@cUx2czRzpy?h@D_ao;l7sK9B`%P}0PX0R7k7t;4U8S~pB|16Z{ssE##YG7#IlW(w zvnb+lt4Wbqv~Y%vjk)rHKkF2^3`I_|9K|huu0OCaPh-^&ZPoKe4wew@_c118X+KDO zd9YE*d!Gj!OXcK4`wsF~mPmN@d4FrX--wgyq{^PPaKqG7I-B1(Qq}pU4q9S5OqbmF;ez1cx z>HA%q8IM`-6>v%Q?o_tnIRE9HI=>6DG113k(iOcAkHneS?QJw0!@P8paMdg?Npn(# z7R)4rq~_K@Y;gm4VgQFiPQevR03vo77l%?PORASl7CJE4A>>u>fDCOGGU5jlaDX`n z2usmTrQ2IT*ty$02ao|vo$j(;sF{$qH_fbv9x_tGY(puKa`FnAq%;)WoM&Q<>G#!$ zM^@itVLs56p_C__bA^N~A5GMgPIrHD;SG zVEeUa5!#<>l@$Js3z~+It2_ujWMvIdqDAoh0!XRs32W575%)lnjH7%c(o=>r{MiNl zYE`N#-_aLc=Tbs`7ce0{qfSk-FLc~RE}L(=D~50IK6i4k_1X_N#_PJj{XY8;*bq44 z#9gyVI^W2s5MSke$IW2fdWWTW)-u^GLH-2)`k}E&0Y7y0Q*=teB2b3jQDsL@Qu57X zh3|mn9m_d!ar(jkvBTsD@_nay#Q+ZK7_GlpUXed;BBVZF+h{URWMulQw(W8pUU%SzGF}ALgn|Obx^P6(;`C{JH19}f? zD0qVtn`W^$#Era97Vt;j04qJfIw?P|!547en+mQ&-lIRbkK{X``T)a|L}4SZDPp^L z*<|Rx2FCvQ)D9EK7aAdet_4GtP10?bKqq7N5rP$3h6o1Mein>A6>9aXuD6NO3zpqn z!`C?hI*8F5Aw`_x5JR#LHY7q8!Qx4d(b?fsM>)A59S#K(_mBkUOCm+Of2if8kMlDx zW9qlJApoF@6O+%5Q2g~WXT4Rh#_m)u$pLmTo|Sh>W1Rq@w?#oy(Y8us#NDf1m`dn_ zvV`Yvaz+lHd%drF5bZnXtOmXGPYDAr{baBe1!9*3$eqkY*Q-ue$@qI{qxA6gPRMDU zx{~UWhe@m>>e-JFan5tMpqW4wb4~o_;fES3mxx6?QVeq+FqY#7aq=@?h%*S}hOsqU zK5wby-S0|^Eye_bL5h1$ez&I$3o684W^#B%?stN=t8`%mO&@eRTFQHqC(*2;AAqx} zG82CO!lioZys^4?NF~y!+}<^pQ%pxDopE)8xqokJN(#*SXYGyH%Z``F(;lx0Y01Hy zjn*67x5{4pDBr(tDky|2Dsl?j2{BZ8cnBkY+YM9}&$AK9>AsO86gW_(zo)1>io#>9F=)Tdpp;IOv72ENM}n533db0u43{I6fy&nz z;EC3`zCK=V-QQn5WxIJ*^YK4_T9x1JyRde;|h+H zaQkQ~4haP=Vo*1}5F>t$NOA^r&V`D9_8L|EsrJHmiY0map@i@58xQW`UP)Tv2o-FO zXuFDJ4vIORs# zpj<1K3v%o+{MlqJaT_Gcfw_&%<}XhvXGY(CUrTZIC7zrTGx~nf0l+x^@+2db?mr2O zV3c4CPY@NC!~#L312#ckJ0JctVP(90J6Y@Kgd`BCNj3Fx3y8Y1T8%qcZP4OWKVg4a z`h7IBuZ!68!O~=~PUDn*I>QV#h$2Kwv%1`}9Xr$zVlQ@e6Inx-JfJjz^OU}yhp$$r z%-#D#Et8S&1CIYGL`j)dyH}~6KLmRR-Z&XxzqKYq*hfAD8bztu)itI;D`0V9(_R+qgvn9@f}p| z4zDBXTv@xHD8vT1;hh2uiftLWi!tVk=%h)f(XQfYMtgH`O}y&Wg3AV-q6CzkHKVEt zqUrTeF>gKwp-gSr+iqp={CPt1;`2kyb^BA3GmfT`J~3}TPNr2_R*X(TnuFXA#Z<$g zkM)=0X?jLDNtKjYzvcCLWgDd4SnS-=Mb`--!A8~DsFSBt%CuG<8Qa@$`a@dADowg; zD>9g$e3-0W5!=HSKoATulEHm->d~zI=;fuF06G;Q3rGcIviBWYv=o@Xw%Vg`6V^n3 zMdE;MKJ?So8U%6~i^7G}h0e~E0ZAAswp@Vmmw75e6^bXE`DVJ~S3*pn=EOC*0^U-= zfE<*<_3x4e4FtrvS9xB>WJaU~6(=NAo!*6r79wTdy|CEteJW=9#2&e-w}ZaqEyBK* zovF6720wRMntVx+F*qQ8_Z^@O1r6f?<8#{X55MQE|5nI%Jw zgK=>y%rE79zpaJKTdHt_a*h>29a6CTLiQP;&dus2VNFafYOYlplRY7jl;_QujmDEJ z>YUM*SZl1IKpdVBBU=1p~h$*^hW9ZagjdH!_ap~J0nWu{J60J+FW40qmjlYNBJ~J1&zr!rz{QVYxz&oPZ-pWrROw$} zs^A1?=V?$JLa$Le%j)M6NCb(@;_k7<57cQb$?bt;s#*Y2O>;oQ4G@oEtv2hNu^cqn zy309&gLFpL`fw=`wtbK7zeGO8^Tzf-?5H7Qx}oz@#h|2{MLNmqG?p@}lFo7248)1N zAwsn;eeWrgLf$J?%7QgEn;5%;io?v_EVvE`jxQ82&}5L6K$p4(11Irisff37ctiSu z&>U&X{$YJ)Qr~+Fb(9SD&Y~=qw69OsyFswOhwx`AmM2vwj%afhJx=H2_>oaM6X5DE z?+b$1&-R;cE;e_Bes5}YxVy0_k!FbhRNg@k;r--wsZ~dHHyayaA5E5>ZLrd1%R3z~ z%a6Z}K^cmbv_IAUD-i|M3$ilm{DQBXKAJJfSoq5MNs+eqNSTCWY_jf5GBjObX1>sg z%-WNXq5(6H)Dzw&Fca^0i;j`+e)Gz)Dh|1pIg7~#1Kx*E{4de$g=G8i7U{=U8&45O zk)hCP@@9oRrFgE1tHpXNyvCw=%l5GVyCZD5%1}nRbCOQEtk~|IKa30Fz~EFhX@ZBBqb$9 zRYjpCcOM^xzCOBi(Sak5d=Dqqwh!wpXD%)#FLM88tgYn`dkz>mLThLmXwqkXGi~Ax zr)b=gi)fLrv=uJ^5E49cv0(Q8>a>2OK#O$BshSUZQbDeBg^`Jg#%2^~Z^J1v4wQNs zTqT&Y)baAh<_V%UE!9jyDf1cfWGTIf3S{+Wm_vd$;Bu9L(ykbMP7A;tW3^m0YbV56 z)X)(6r_gbGi;G|Dq)$70%sSXAZu;&MBg z1u{~1HEn4&*++;dwGk;JeK&f()xN*Q3G9V`K4N}~#F=aPS^2233uDnKI-36HSmf8H zyz0Se`n^xJmRls)|RBMgS*7q_LN)- zGgmp5Gr6=+!tSerfT42D?U>lebC*Atx0~m4S!dHdfH)x$_JQZ$cKhw?*!}q9YSp&3 z3l5p6ZbrCh=!4Hef=oO?Rl}f*Yw(xOLtk$182x^7*RfF!GN=ON{K3=(O8BJK&up*0 ztoWL^-G0qZ!V7xL?{$&mnIT5s%nfev2^=}lMYlSoI6GUde-s^02LP!Jswwws6ftzyk}_>hO<}e$^)l}@j?kICftXZC{R=SAV+|!U71^`*NCdac zd?6w#GUSqI3eYK!l=wE|%eEidq^DrosITeje?`zT|1*VwS<9*kDKgV~jW=!}ugwsk z3HkQ{Gn@ynD-E^wkYV9=5gL2ByK0DX|HQFXoJiH!0gREnTRl=!IVB9^J{>-2~FGX zklZ+1?5mJa*yuIg-!LvOhJQS;0yJ}-j4*=_VhX>~)1c5mS*RKbc<81j)D@F67KbRo z3FB9loyXdd+8=+AgD0wLF?mRm)e31Uat0`@k~fF$R&-ABkX)dn0)*c6^yQYcQH<}! zI`tQrW{CJN^};U84Sli9Erz~-TP>i;CKJKjQFLz)On1=&<7KabYLF+ydRyF;F;_X! zcbX4J`PC%(6*=%{U8z)Kr`mxaRd4@6J^v!+0L{od^W!#Uqoppf0>>l8r7BiV^GD(> zLQmu7@pUmyC%9<%=eiDTYecxY<=&7}qz`N-|16ZE6IvNCvrU zuPmKXx4WoXRG)LMC0yQydRek~Gy4U*1>j?ArQBg*_?K&2EGIzV`kC3`c&TFmrDj6% z$;3V5F|-?{xP1!+Jkv5pfJM1PyZ7L5U+}S)!oaCp%Sa5RJ+nK0JW9XZfN#=a?r1X0 z9l$)IO1RJqe?SD53pp!(uPjhzp=XZ$!M`wz(^Y5b1ivmg4hw$a)(aevX zJX3`#U=+Kmw}GXHKOTMrdm(495?jM@?YnFHnj7NMCqa3!3Ia|Hy7+Xu+!od}(SK{S zM;E@->JLksy?Vbod@1O$5>%+9K3!ph$*WVNP5qm^TEZr|^DOt%6;SWe8?=ChDc1nBna_XPn2xei-QR10 z4udCfT>0P4(CBHO!R`NsnQ-KbuAl}pfz{ZzjCuMQ&woODXtksz<87u(9EH<2i$ODge8W8alTG!sum&3^vaK4rAY2*vAB2!%*B%_`x_4XKdhU>X+|XGcTjGT zvRe_10)I0?YnX9FN?pkO{ndFHzEK7)H%eF6##q}6X#Ytxj5lahe;LX1qGcSftsldE znNJA?!`)?fhy~!$D0yf61T2RJK{Qt4 z8P_sQLX@FrIx_;`%}0fB@sK}@TNqgc4o|}nm3iMEVwITmWqsFNWvA7wLGsS&>4$3WG?k;{_Zus95Pt8J#HjyGH z|LbPbu*8mSzTdZ3*Dk)Fw{N(Dg=`m*H!IzZvYHKeahX%h8F6Z0DU*g3c+@*L9R+G|}|kW&cwn z>?i)K5eVN>)&HvzddR@}&CKGUa^mWwJyX>BTO}6E&G-^B)u#=}n?znY`SkOUOiVaM z_`CIQh}B}#Mr59zkY{8Biy``{d*S0&m>w0FI~z(Z7XHN$h&Y})w*PUBs3nqZb=fXH zpc9O}dUiq|@?k=U1)p5{8I)J~d{ z-#Nu?5WL+Qi7)tdp9+EDSuaz2kjdn`MHzv4*ix1UJk-holODvrGUydo|cq_k$y*MytSES znV`>4Qe<4PsUUU|9yTd90zfq6z1=+?6{`FNT%u%I`% z4^D(lDKbLcC%h#tt{os4CJdahI_S#B`p#wp*-V4P20F@cirGy~*)?mqb%sCmEvw|u z1V))+TkcYqWTWcH5_RFK7u8Tg`fc7TA0f+_P2!4?!*vk_12~%8;&ksRh~tDpM8w5o zjFkXsvl@_rSt+=eBlL84)Y_xcdvMMKeFxXC=#opS*6VO zD;O|zAiy}(llF)_2$YUk6O;YD>lQ1s<#}(<+;zKR-Mgym*0_`^q5hqOx>1yg*^Ufq z*56A1t-l5{P@#wPzG7LURdEZK!$mQyhBlx^wjDQYkyq4I+RfF~+8} z{noheYBhiXt!EXBwi)B?pwQXlTrOEkfs5R{;TjWH6n$qye%}UyQ*l+;lS)$ZDFf~a z23kz((06#>ElxFS0=~4y5X83zGC4DaK}fLgU&TvW`wlFa_pmSty#~=wYugw5oyP$> z=SfrwHJx?&bT-G~Dt;O+Fq?1e^gW+s)=b<&R?HPuV1C&RTx0?Ynb!3D zUn<(@rr)U}qOdPd<038Xpb1AML2f9!QllNFN5o&_21vC{1Y_e` z2)k9n61slWXakU!6$ng=3r?*I+I+rxm+^r;g%!F5FdfzwZB9R;CntYd!@KlvCGltr zadjfC_bR&ygXb1Wuo*T2~~!Hj(x19pmJ`I(ProE=5s{WoXB@JM*TLYUV4d=z~vJ{q_lN z0blzs;#k(-oup;Vh!{!5s7hm!GRP{1ao=Vv^X1dYUJcxR7!(BhH zV0I^)YcS0J_SxmA7BZ=&_DEpOiS>%8tRP{YHlVRP1j=`XMR_*@?*{UC7rZFG>vEB| zu?y0;U`i5km+?iQ^GeA*hHrmo&b*5K_-x?p#<_2G3#*L=-Y~egM-IP1{}bf~GjwiI zpjs4OgoQ@LmJJQ|>lz$Jte|ZmpLY>`X0#csoS}}HGl47~C!_QAp*QbaMmxTe<~@JB zNO?R3m~VB>EJ&y`vlUVTmpDpdvLq9gnS54(e;o^yKOmZhnJd`G@1|f=wM5A*sj`Nv`rqWO=7H@crb82}Ny13Y-+6d46M&3~N8ENCyO z5(p(`JVGoSzE9`!aYSnpSK?Fg_=ZtVxzvuUg;j$TsWU3|L55xRa%Ij!kPH?1T@-ZMD?OR(F+ z;r$+O-huEj%9{M-#6?8V#4@cID$8d_+sEa4O~pRU@9FR|RqPgOO2Z?ND$o=l`XL;J zhvQ&~LHPNsv6-4$CI2AWf$7Aof?DZ$5X&1SH`8lZ>BJ7*wDljx9QNfQTaFYs+4ST02vgk~n%^D~7yz$T4A$3RMt zZ?xE~5wH3d6sWK!VHtyB4PpOvv%a|a=JuBaD^{Xw81AnG!3br=O?Z+>q-y5sD*6=% zTTN#4lMmN1N9Vnwe@+Vm}_Jl)rd z_iJ@qb{LI#6w#-F@OaVJ$f=0WiWKEX9Kr*w+=T1cwKDf6d#5x;e`zn3v@Ea6w^3{- zaTlX6Ttu_9@7!En;SRZO7OM zeG}cd+8%&KK^l%~Mvzyi&U9QQC-E3-u-0Ydk0dI-9FFxBkHqvb(TG>tuVcjA3%i+g z3Dt*k`O3x23O&0e$Jnj-8HWc?cnueQoB!_uh5!}PslVIAoq>1aYbErNT0o>k z!G;X=gZJ)BWkHUGmYk@OaP>BV8JRjDiRR`+D24CHro{PevsXsZvw&S$V)bEK&`~KT z;0sfAGM=X(j*Ij9xd2!_y3PLL`GxR(mkv`hV}GTzJk8cDKD@hCWFA~iZKJ6vs(``+ zRcOevia&yG;#IteU-!YRrM>deFgJNzf2$ZucObF%@>=OP#BC2mFqyIqwDGu}1ED30 zKfLRwxc|iRpymM9jDDJe$wH_JbF!n6?Jrj~TKeq{&8Bec!iN*}j#e?{iQXr_gEXaV z1OXV5P!mQJ((zdA7{8M;jKR*==vk}8@8>JchteTD2wp)wl4n7qom=R&YSvMgM~D1i zU^f*H7~*0^kFUpcd6ng*7GuUJ6pOZQBY7?mWy@HC-}3ld-D$;BiBH2`_hxk5KzySDNdTDmsKu(iFH7WjcwJ$2OJzIx0GdU|eQ?`7LV zpjk3x-E8gOy~RL-!K;5BJE!cpRM)B;dnfX8)|^|sN+jfmvu&!YC;yM`@`!HbLpjJ< zBPJDVG*?jyuW5@Y#9o&y0MiyNaNcq|nnZD_7;ghv^23l~V%TU?`0Zb?9f1C;mPx3y zLYwrqxwsk#kGYZ8DA_-mwo!YQc>=MGDx`DO5CVDQ7 z3Mc&Zw`oWO5*}ehaqH-E7KeBKXbLq>tUJ5_lFy(`5|jsc3*c5N`V}aA za5RAT`{VUcBoEnToUWXg@Av0gPc6|-{0%9psViOEJbNkLPUNJ<9uQt>h9<nSjoqaTaLH1^e#1wWS4w{ z75Obf^e^2H!h`-|dZF}ojpN5j+9PVg88TRLXsj)m05_>KM)~57gKS-^sB~7KvZz(7 z4=mHd(Lz~zb7Or`*Z(g(28|oV9l`I-sNWdWu`IM+MlMvS(w168BDiUJ_hVd`bvw*^ zhkvdtgbZS^``)vjo~$8qbhLSBclv4=y~inAv8#zV9VUpse_mv<{6uKJHe| zC|a8NLJ=&|UZ08jITjOIFXLO#S!oUe;u_Zsga+xR){&^Gg3Y$jjD73^t&|7 z!^K4?j<0HC{v&-USn*Nj3E>Ogq+?mSnPX8wDP*%_jvrlrKvT?y{L}dyF{vmbuUEDO z(=K*+erN-t2q&Ht21=RFJWcu$+EU$P4z3fXk*9#?m0=JX!xCsj#zY6lom37*%Yqn4 zyd}bsW}oJ@k;?SPY2CeTiL)Dio_&v7?ho>m?du ze>1>c^=oQ+70Bsv?s%e3v_ofX-w1d)x2`tTd)j$jJG;RbE;YeEDLik}3DlnYUlzbR zdtDo}VjCkBv#R+cptub8!_yGnj#8++|N3}E#gFX-dYg+?OIdSeLynQ9O3AB3B^}_7 zjp@O+_G4#|pFiKCQvkK}lI@(8@ck%m4zcgV;}Rg_`##%RBjNr=J%hy%>3WL~yl9$> zuQh1L<+6K070&$KZcGx+a7Z~`JKT2Zd%}){ap4ZyyCqpa}bn4ii8K zKAbhPLU+g*xi}*z+{AJye}3GSx%j?|LbbsaTfJZPVEMbGL`y8kKKtLB2YBW*$(nT7 zjg0q;%3J@d1}dS_X~3iL^AhT$RV*22mMe~HVix#41-C;nR@=!dUcv<5E*o8zc ztD%3Kw>1~yPHTO(I%_tg@sk|T5VG@O->Qu2f)aZ$RF+qa=eOhk{52UNnqyGQFip@h z#Phr>JCV}(3!6^YBe!F=`&;+J`^)?$kU|+F#Ot~fIzI09PB?)X7M#c_Pjm>3TFZ3L zF;m!Ves(T~cKgjP1d2{?T1nMi;PyIe-m$AlTk0ALu0JsJ-S<4xl4nwpl9LnmEU+-a zUKcx)gxMf)?lOI%(y$+nWpVH+xl0js^!#TnQPb3PxgN@x%6i#f^Nlw|`SU9?$;N!6 z!4c(cs=jsf%yd|i2EQM)8eFa%{S+K*(#OsuoO?G0#CH7{!lob&+?g3~LW@Iti3%rb z)0|mFr!%pvcuGlOrjSmjz^@StBgt9s^qiX@pXm_^fZ#EYKsnF%J@5@CN5<4=;TL4o zIGY&nuOZEf{yWnLOEPK6>AGW~opSPf)k+%EW-xf5QtnSJ*;1pq%oJac%1@1Q!X{)LCTre(g02^Q1ecvl|zg$w>IS$ht z9o^tPuLj<>jD?Baz!~SkI3Nwd=oQYefsV%B;R}ZR(nQbg8{}DeLS1CQKCXacuN=>XP#~n99qEPfXM{;a1C^18l$^E>w1^l#7eT2=1V z8W|BtV7~vcL0J(@4$G>!wTcz~zj6{)^1oJ*WL{cw_P@q_wA|NxCA!i>HFDda7M^%8 zxeBC<7$DDX{D2C9ha&o=pSsRGK_uQd*ls$P_j=I$9J5J9TB?&`;NbqxZSfCCbP>X2 zBaEk~z8(t|<(x&}XY<3tUz`0z_j?g-HGQ$jFlTmloWS|@6p#yV|7^~N=#cOheze%m z`FUIp+f`MfkYRhT+KxQk9!lvD_~TS&hvz2K)5ACbBS?5dc{rmKYg}n4A`o#R>8jay zU>@45CmFXt(bkfw(2o1^_8p+Y#HA?&XHXC5Le*~L`JIZ5I7GxpWyZo=wvZWI7;4NS zL+RAAe|VpZH$Xveux;sOwK+(A=F$woeq%?FvfryvgGdZPRT&ImTq1c@PP8-}cOy;ktHWjlWKp{s| zqW$FiS4$S|r`q6xH5Y@eX`)S@+`(wyMz=sl+R}#0daKtnIBB83mX`oGG<~33KC%DxS>d--+Dxdq2CaZvxRJ<>CUUO`XcODo5+7{Li~_fz7WV!>d?) zt}62ptr}DhNiMEz@F**fS$4o?4IWKB9%P%=DnXIq`lAnqz~gk$bhYKz8AMeTN)dkY zxyeK!d^3pB!9L=Z3a&r8hY7f5E7e(oEXZP)U%&O2K$B6WBq)18iPc zOBKYJC#p=I_S1x2?XxLa%)UNC4Xc*$Qj%-`wa$1q@+O*JXKrz7rL#l z_XK`Saj%DdlRshHw$A@djQk9(2sS-EHd;gFwH`s^2_Fh?&EE^x@$t^)K%dD)Nk0|} zPqIQ|i+fv$FzEbrs$(1w^@u{Gy}+BxT7g3B)^67r%X?Ie2y2$C-D$h7;RKnou=ov0oPPSF)>= zFe}i6TVq1SB{B5!GV=5{3B@Ais9byd8^4aM-P$pWJ=(Ku=HBB zr753`al2Wy-*pCd_3RL08qQwW*F*qYV2E2CIe!P}dsgJ(FYQ@AEK(g5(hlryd(;k- zu*6@^0RIm%Z;2kUHR-&{|1MCNe+zW{w*p-pLoF1P(Fe+T)^$t$Woq~zRsyB~AGf#+ z-PzJYIc-gNImLb~`TJ(hevK9UTM?ZDk+_ddplHTzZD~NOX3p)#o*#VXH)t~{IfT#X zBQ~Q6l`_M_`{=sOhc@G8K>Dun`2$~tJwzjIGf7gpG)N?yO?2PL-hDwlt$#{ z=8K;X8x#qGEtaQ?IL3Z@YC*Wfp6@62c0l)z+p&pj(6(JY#XiPKKB%q|KA_qEVe=Pu z^Jfx5jf^w{l70v?HQZtS5qFI#SN*jvJ)?MyHbi|)E9W0iS3D!#g0{1zU4(Vv<47~g z>`iKvge2;)&MjoHn0_^59x+q;GRlZpx&@}UYX=n44LYqypPKIT_%$_`ECqBre@qr`PpCG`1^UJu50~;o|Fg$y31}1o-<+f4HIiv<~23s0}rMgEE@u@YlYi zAnfVKh!?pJ-BsB$Y8jB%j5*t@tyBocpiaYQPJid>PD4$i&nVc*Tw3qL22W3ukhj!o zO%Qsj>7n{-0yj;ap2KWDY<-CN{palkRG@;%&WA%4SYlGv%W>?lcfYyKpD)4(*uw9V zw?%n-j-JsT=AQAg1C4dU_Wgr$@AwlE)C@iq4%`@0A?+YMloFr7n>#W`gTpBBx{ghvBx6xLUx!v1aMfNp~`~w8l(*FXq zQiR=pLfq%d;oc`7-~G7!`BIvqOwTyku}|`$tEm?_W$d&9)bqLP?SmKOwSpdhD9TF) z;C_w2U!|!0>bZ*+dEE|$0H?R-==3SDqdD?en8tl>R zqTj%&Bg~Q@PHUSsMH^w+>u>Jou&IGh5&>;kb@e~5@8|KXo!HzsuyWG&`0_3R`v8yH z?C;w#_)CQ-f2uCMnaw|}HQ&P9>BhL9f^l)x=Ng{}oHf2G|F^L|e*Ak=ei-_e*Zye7JfIdJUG_Qgun|BX zUdh^s#jG4_orv520-AgKZw6f##1m0 z$5{zT=#L}VRZD$3`!>Z*AfKj{Bmf=O*P5IeR@nPpe8{q2V=x^9HaYBeCuX6WDz0>gz6t!gS_sad#i8C8@-dXi^i5P+(^RJV zeh<3ms5E)J?gur9EUyzI1&U-^Z{pJ?d$kSS*Y)iI-7ZP_T*bq21nq}MhMt{V$-5(g zP+CWG7VEaTAtu=P9~jh%4aP}_*k7!ilF*rvN;c+e8|TceI~Ks@i(x0b2EJt&1pv+( zY@Gefa?ucrUQ(>g>kvvj7~KY}6!$&8qx%hamK?!zX~;q}#g=hSvJz$_(nz5t3#UJAPv2dgZ^^4-5U=85t7)A@40k*cQ}6}9UxDp*W2WsDMG)U0{OLUA(S?|JsP!*6su+FO|mmPiHrt>xHkD%@eQ$uP#25_yLx&EY3SA{N~dT zRN?Q#_;2NkdCD&qLym$THXjQw5mbhK9`LXv0x)qw((9!VvzWFinx?C_1kT+()B5&` z1@FhF&Oe8od~GIofftE}OH6jnRuUv$+I-b&_F02Tt&w1N&&DecewDv!O&Llaf5h#N zy_%!yZ7lc+isLfSL-s7$0QZV-hT1RThiF4Z!GP?-qk+j?X~tZm@24V#?U^qWG7i|U zy3-T%^&Kx8pQ{K}hjAxH&G=#dFbe#Va79TF*&eL#(XYS?;#3hhr-Y%Z=HxH2`oet* zOdd;6zG7z~s5IHVaHA)9K~pr&Pm#^V!_`-#CehTq*{^qI=|*m6HcW;?=JBCk_I&i! z$#^m_Gat3+v)X55jE`5BDHQ}91DtAD9797^L;5NX!m%z&Xq0b99r8}^?!rNre!tA- z7y=A~Xb9!#1o>!5~n;OV)V9JKRsfZnwabHj@yXY^4(DBOtdOf`XD|Tl86MR zRd3=1DU8<4DtMuD%?Bn#s?;FAdL3nKg~d}{o1mxu*Eko`-_+d6eK#V3Jz7Si8YXDb zmUQy)Emspqu2jm^)wMO%6;+IkUZqB9IMEt2Yfu8%0SjaaW!a$5s^GkZ|IDR$0$w#T zK?kK$7LdCDb=`N5d)WaVhG|$Dt8U&ls`^YO5IXyDC4Iz)uv*VmYcv@q9X2<;{NHia z!x%L0@M4VZv-;^@9sBVBDtwJfd>?Lj(JSRhC@5zJyke*&z7vWp9ghlg1BFj1%+Hct(BwXE~=?A`V?-k!B`X3K+Zy^;*Fr|9LN z5{7%LhHE?fjs{)HI;Ry`+9;?(nHtP6>1;Q6P%T3gZmPW$A7vFl@G%MQ{%g?V+N$YEtYUU3+Qj}{RuY!U|PI6O;IgFCuSh8RHR)9_vCVhDc5PlF^)Df_=2 zQpW!}q~FTb`E}IcznoI(_V=Pr#ZosCq=Qj^u+%mNko-~aJ)Y`G6%F~twDS7*nnvS1 zuH!TxR`F2d3;_Yb(LW}->K5G=gUA*EW|N~2wVxxlp)mPjLKBUZhRot7^2c!k?pKSJU!_|)DbkgAL% z;o1x`8Ncj&*{IUzw%)>@z;s>ZfWXdRF2l~q2-m&Zu~UuoMRdOnNlzdSd&fa_3D}u? zsq6eyFvMaVEW(hPn@ib8QyEQ7Z(kJ_HG-kXRZ1-|Xy(l9dnNHPVkp`J(33X z@*r0Fko*k{j9NsJwt=Ch?j&Wi5S;)|PfOPVhF0{*vMT zRPS}gw1B2^xX*+V_dNDU5M11j-nY`NIb?ezd?~HhL*pzANP29i+C{)~Z5a`+VrKd^ z#lpFuhK;=$-JM+B@hY%A<>mSy2HKn)=1BAr&En}|UaV;!(I&shwqp!G`y5}Pj%q3YZwEu3yk4z}_=5rD1RZQ1^ zhfa?sykuDX^Qi4Gq9jpihHYeCDCJp{Yx7QQXCUI2m#uvKieENwr((GeM@efK)Xk^Iv0HY@wyQhMSfQ_iVXxkT&1Z zk7^2LrHvG8N5LaAhhS+r(Vs>eQ8|RJZm*nLR6YN={TNM03nm0@L}?;F3jXfAcq^W~2}(NUR@DC};6 zV7fde0xyF%Eh~E>Nh^!7hxP>m6&l{XUpFOlY^L&OGs$ zKT((hnN6x+lF+$iTg`@4lPP8mBO#7io_~L*-do|*R6pIPtta!5^K7sy)}PERnHQJM zY9CN6TJ$9dg@#uLEj9{k%r!*yB`%lvwz!902Q;(SIR)danwJL5018@{y1*O<;RBq z6$w0`E2}cPe>)kd7z{y${^~bZgsn#Oq*N;EAkRe~1-eq+;36~nA};Cmq-@Fofv~wm?-o6VIZqOi4AnJ!?l4ng2{6lNr{?GV>~1IBqyPlX(gEhY}alMw`~5KMc}G?D;imer1k;U*21 z*P-Xof7NoPguf>K_J4mqh9s!;_b+vlq2+*4?U73EYqA(YVsSc}C!)?fs-G0^URFj; z8+CIXcZ72hwIUx2M

9qK>|Man};1+FfwKY{e-jJ==t2Fo*4=Il;`!KNBjTm~Hl(xFeP#=Mqb82d~gqBeK6t!OV`aAMc5XQt57 zO%?ZA`Vm#!SykN7+cCS4?*CMcRVOhj(TG#UpwzNtU={JzA=yh>-;e^VDKP@)E(M0X zc(n>`zf@B}zfgiv@*wfZeZPoR6y}!}`LxL}ZP6WlC^$D2ZYn%TuL({GL$URd2G@eo zJFYhyl0=FKvE=A?Nn)>It9aNq?cmtXn%I!o^PCj$ltgrXaV7-8rnG?&`t0gkaK_+N zShPqv_9P7xO6<^-eckU3QcQ$p`=!Bql)y8pzr?JoiXdlhz{6@kJ3ZBYDRYk{sj{}t z6)dBzrI_QaeqwBQAl5|eAgTUHP*Vs*9YS2O;}gU9-47q!j6|yCXolkI$eb`@U0-ew zUPUOnRs0mbxslRnAfWA8pV2@7wpLsV^gQ5*8S^Jo4Rm{5^%?yLf5TWNBkUG6lV|Mo z)v(7K>`FiEfnnki5n1YD%VBjL8HpN2I&O!J9ZqrfBDoBb1xyy6K4C9ykcU4Wd;fWj zB$Jd-4bL^FD+(RU+Me6ljxbJPk;D%Q22cG6QHZV+>BIVJE)4VKo7n0YVlq;5&1%(2 zZ?^g4iFog@tO~`Hi?p;j3Dsq`KD*lL?{I{%7YI^Np_7Bcfq~x|r3NKEga#X(jgLQs zzk>P~4e~s6Q-^+ctxvnPUpx(&F1_y_@bAN_!6a54A2X&fI8mc7n2jBE zs?nYlIB}U20(JR2`qU7kHE3?VGiq%fOd%W-h`8pHlnKc^?QN^41TrjTUB|CGrVcO1 z4Jd^heHY>6n^psbe@Fjxa~|9=|991Yh7VP-`cI#Hi~1+gRc#y zM(%Ob*=K8>#MXjETY%$TNGrbIB|uGpgL0yhrM&~zwJKBX91QLF4VriiuIyykgnRfP z6WdoT2rvgvjd@D)fCR7+ZBhWZJ>L@)l+bG8u7G+a%RY1wEvQnmaSQp%obbM%W{$AJ z7Rd*}8BI53tH6*{DoYTI9*)jffi(n8nk|7YA}dE+YCjngN`m8*Hb7XwoKRZut*f!e z%wVsqq@)@_CZsoAp=~_?QibY zo?u^F35*ZJ@6+E|)M>k5eI8pcI=bjj=)u7PCqF|O+{xL=`lgn5&FkuTa)v;CbxZh7 z0ZxjXu$NJ`bJ#P7kiET7(dA{SdgI&tGSfG-bm&vXW#@b%Mkrx@JP*UAI3i_drJ{M)oYv5 z7^gA7_#V27Uoj&KCciUbIV?}SU-66`n5_Uz+H7Tz1r=OzTu+#gej^8_Ze$>SrvAJW z_K~%FbRvqlJ^hX{*DL{Mb*Ke_7roel~#R`^BvO)S;(rWd@ zFpiyroyJyQQ1F9MGK#m@OUf|uOB(vYZH?-1yIv7XyBnR4svSX#F22R<9B$g>F z!j1SVf682)l(;0NMsv1wi1-KC=)9&@sG=E8hqOQR`_}K5Co9Ji>L6CUQ96=LHwBzN zob2`4845fT7yPvMWeO+D-tRC68Osh8X%VoM%N`cowOK=mkeZD%l64=Ih{s9ge3v`@ zUoP;UhBg@~_hd~|n@zvI%c@)ac2962V!VoG4?ghmU}C_~XU%XfE#~wvE=Q?G(f>Tv z|GIWFE5%9xo$sdWn%1}qrw+f!ciWG`L50Ew=QObuZ?n|Kl{LyBref)98*pX2DE_Bf zhG(}(&y{Rv;ijcnd~(diuRR1kmJ`a|-St9^L@hrfPovGIk-qB1;F}VI3v>sJn-@5$ z^$vzY&1j*n`5L&HQ#W)F&d=cA4xZ$>HNjn7yqIZHX1_^MO-qfb(T$EY@Nfmy zziGu-1!b(Aos7Fty;}hGr;TzQRH%Qx6HT%2GgvZeU2($;>=ELwra?TAZ4hm~D z>SuB{9L)V| zA)UJ3lCmBbB7=gH={L4q!b8vrI^b@QdI;hrovprwElm|{@BL-l=+Yyu?LNTAX7btX zCOQDq=XSn0zduEH`Je0CI1{Srm*DLr2{qljCZHa>_W~Nu?zf=bdR?E6l$GkvDm%ZT zuf6+#*6P)?Wfm5AkUm_n@eQQQN4dq7WMjn%iAQqaQ(H-Yxmf!$gk${udRW40DqqO` zV6p-#(pPChKe~Nyn$l%(tAycc1Ci$Y2=V7HZ-2#IXER-^&HxKT;;($6KQw%~rCqt0 zf5Db2>O~cB=th720U8_eA{V2<{mGRY<>b7imDLk0w0GYk(&bOI#mnuTl)V7MjwNYP zpyVbI7Pq#8gPs&CTs;1Hx`ER%EzJn?2q=M_y+=zG-~NpttKzy)Ph4Fv5}x>c2PGj% zX-`U?d<71Sgzhf#iNF@@>%Ic>&jy7IW{t8hlVF(lGxb?vH=2*ksR+0NsnfOkt>C}fzf~V?cJaERRZW*cByjfZRmnU# zG!9{x=lO|05O)KKcS0?6NGk3~vG~?-xq*GY0`aTcw|WIr*<3l1a4FqDdVN%wQ3Xo2 zx00vsihVCsS&E^`=9gQpDx`k%c)qh7XL%Z>XI2)T^3JBts?H|bp2SJlk$H1TiQ?qW zB+JL!TYSNa@u7Z68rCbD6j&JQaaF@CuEkF=ZE-(_T`OvVA$X!MSA9tDEIqHulS*2> zWz0wbvqt!GjpO-&n;LA1+W!;-e9Y@E|r{ntgRT7 zy6Ry=`h-=CX6o6>1^id

c9Y-03PRv4zCt95Ao&taBRypQ2A1HlyyAnv`W^J_)=u zye!glRHDvzO*`DL+dcbno!_=n3QG3HZkFu(b)&6N7bh_b4`BlW)1}{8E=VJkSnf_1 z81f&>LlZxwT1nn;-InnK!0q~FFMbz=Fw-(2{*Xr298je83rSNjDb#^(cDg1|2=K@O zN1LW)cqE%K=3nPhCx;}BWRqJqCfft=*-W7d;BE}Uua5XuV+5OTw5V%1)nQ%G{NnUO zpv_|S4)1&9&u+B#Z^dpAY67np-Vt{f>&^hVH{L~5K~GP&(6p9ARu|v3EDLyD_=6%v z#I~!~6YU?B5I&y#Zy-ABdM-MphCHepTIheykIjK$1p4ATTjI|FNtyILD^@uj&qOwi z9~oI!hKm0wG$Lvc*R{8%@td}nRqab$B0VmHk=w<2z_{=8!w8{&FF5QKacV|{&AJ$s zY?~|>XWke84*Exh$5_ng(LXLjkgRq;ro7hzZvWF&1)R%kLWeNC~>v=yqvecoBeRC?|u)jjIylg+UBW; zukEYH2tXiUDyIIGUVwao&d>jiex+!{9~0hdq8jH5PTIbOfx2d{ZV_I|!v;pq=+@m< z%NFzwYGnm2j&a>F>bEal=WCVz8Pn%HfSJfVK`7qp@~92r-r!0+tYt6bukqaL?$eHV z(8?Vig=7EYgH0ms3c#3xpGsPB)V4jeEw+V*RwUa_0Xz5IjpJzoUJE0!coN5+ep*Ma z1e)|A)c9*oS%2@rZ%zO=$zFAR=X*s-K>Jgq(&5zG4gm7IZfxvD=dL1hfIWMt25@tK zDj~z3lw}dw=KLKU5($2evBCz{{+K?2C2sgw&@oo>zMQX&*=?|%dIt_Y*e6A-Ju4)l zrt9xIM*Fzj>;Qf4eJI17A&OD)5T`#jnKeE6H|DltD3Vj>S{$tN_knu@HD1)U4;>7e zE@x(mPx9CxJIDTU*F7CwZtTe$lVB^TTT9($4li8zvGr}y|=?MwmZ8#8p)uHSOWPS zPv%vufT7jfuW$F=XH64!Rn?(ndz!BRqO>YmD($K%NmpY#rn^Q{Q?)_A+{?g8_~w|V zfR(h{$;REPvl-{hZ#>~IHYa3URhN9r6Xpk2XH9cnbL9a$lEN06T2S393%ZUA#e4+s zg^>3jKtJqqzc>!|foM|)xA*MNmHaTymB3yo2}oWdWtJ-B``D3^iO)^|>5x8F+V+`n zkW_>Dg>=bG5Z&4l>ipYvLaYl#hjC8;a9*xaWf<)uA?4L+z@3axfa7hJmGx9#dk=$P z>XEWuT+yo25)*iL;F$8=Zfvvb>M9spu$rr)d34EcQ#<T!R z)(hj#b849Z24e*%J}M|s3b@~ze~EmoQBQFJ)2F8WK40qE-#Z&>_*_J9lXn0sR*H0v zcJ1HGGd_2@n(>!{|N2$|a{rpw#_GFTdaT*8yarEY^kJW}EorF3J3kxGP#46_CUo3v85B$iNKVk+m>!|;%`ZXEe z7EVhIJzyB!FoL>YCITJW&a|rX`8($bgI77$<5*C*OuHx;S)oWvE+trvDmKnfAQ}8; z-?M$z)IU0QNdX3&THz;~&$8KV=i2OIwV1EPQpN@b7AYVeS-924;1hF=NfGLVQt-FW z0nJwo$$J;(KiEJ3g5q!g4hUkevnZP*PBqdJJ|{u&#zss{cOIWAx4`&!E0A7o$p2Zs zgXT67{`Q27RG^3q5+m0q$AMol4cBhg#g9738g=~ID zn282}4B@!i!gtm%fb`XUTG0M#3mMVPm*SK-aBt?q@CV%e?`rEyAQbf%e~f)y_Xcle z1xocX+E%ozyrr^}@^SHyfn)0sSp=a&sAAU5F(6z`?}vHMy{{SqCJq#ln@GS?cRWT@ zz({B7^r`a4F?G&)(**NqFFGpOq{n7(@ETM5vcul!RPY8q(!BE&E$s0=bph8~Ma0YB z^JzVQfDJ`GAguEp6K~n*i|bk_JO-ycI{=CG3@gwbjwkxld>ACF@7TJ~!ez3B|2cl+ zsd1#BV?W)%1)TT=hQLJjXTj*FlCQ0x5sOr7r+Cji(-4dTK3pt0>R#Rb@r~MP6ApzN z!cqKa7JOOrKc&C$tUrN9&grY$9`vuf`b2qM@DclFAAh!=zYM;Gf{;z|w1BTuX_(=? z?ummQmj4FNo1+~@Vocb-$yjy&12e*-f88x$D_i>=-M0cR(WLK0P`LZ2f9JaI5+r`K zQi@>wRV3Y*bBxC2`p>&r1>(wYJ)d+^H(75|Hbr^mP!sa_J=u#~ehEGJR8m+aaMr>~ z&@g}2eN#Xo2zbNa-nz>%(9_b(Ea+Kp`&0ObvfnfC=Z0$EOWlvNmitwEzsi5p(*fO| zZSDc*M6W~pg&~o16978~%ChSn1(qkD8=5${ImQ3l^JxDKnU_+ivupdoKdL{sygW*2 zrTvt85Hi^`o^euOpm+Xpeh-N%XmV)i)p>gHSv26Z1O7|k%go>XaIzDIHtMIn9Ol16 zZ+7opV=4WWzh9-k#Z2U+Vg7u$5ZLA@Fl&!S6r4^m-6jxv#>P3 zyA*?_c@|3EyRGcdN_*;fDlhPhzNrwHb!{Xi!9ssDjbBaBzgv%C=6?X7cUf%aFtxH6 zz5TW(A~I&!tKl;M2fA)TyEc;(52&e&Mlke$Yl5Z>1ZX7%&9J{{MYjPk)f_797b-7| z9Q@4IoI1M>dL5}ViIbH>4iS!9A}+p0mduqFS5~FDhr_=)!j9R_C;K)hu)6BRCLP)* z2yQGLd!T;7g9-|PHs@Qw?dtBL*3MYmtmF86cif32m-%gl#BG%9<8ef!M$$5Q9|s%H zfiOYfyy2~|b!nF69|6ltKE*u?9y|cyo`yta!1genhg zu%8#BtDgH#@b0eJGyd0Sd#C5qv)Rs4>IUF(TWg@=x*gd|J9wOR5dJ}Sdv@J_(`uY;L~< zV4j!XkX~PvP<4F{OTiAULg8_Rus`0mzCP!bAn>ZibTR?y4Y5Y-aGV^>IlzZV5VrW z0kq^6fX$&NoP-rgR$wcYOhpBQ%>09{%oHZarb=DUqez!B$q{S25C$HLk%+daAc)-a zTf^+9h$Xb(C(Dmz>xWtygg|EK+yn8}RuUAxFl!=OnikObja-)>1mCt~$T` zCEdX0{|p*|AC#_DHZ2=%_xMJUUJv6rsWjW_PIK}0sk(o6v@H@+?$7u}jd(DFSRU#*-B{l(g44KKl40TP@ zWMCd|(ySNy_69s;rUi8x-+80#ZC7P?+FS&b6Mt(4R-rN4; z&-#@Kg-aD~CdfQdCXC28zXpH)R%$n0Wx@Hp9oQ)dNemLH9&hMn=unHgz#_+Wfc6I$ z1Buk5p46koAh=HYLS4r+c@YjXWT6{Gs{sj$jcDH4JtN?#?lLzJq3ya4Zb1zbYq#4x z&L^iKM@2{n5I@KrE;^U0kXobn=^A10C>lWO328DN8%{Y79o{$IU?@|{q?}C}-5t2r zWN0&8774Cr0%K1h#`)Rs2POI>V@)(NCt5rE5wz0?V7r5Y4T(M98+8=9gb|WK4c^_6 zJ7kAErnB)4BR>d2Dc_l4)zQ9`WY}Ao$T;&JW@p6-ik^Xy;?ywb=x2n?qF=)9ZZRN{e%*r>KC?QNhP6;rG6ER^@Gk~xv*>T26Xya-&&Y& zPX`OexlS6C^?Xd%_vB+$gPEbo3#!IKJ(lpBx6JQt6Dj2L%KrQb4m;w)KKO%KH}6Wo zW_dh>dlM%j+M7P4s&2z)aq-!@@&Jqn0i4E-sxdjtE77c7jYv=sjsyg(0Ji&equsUZ zG(uX>_ocD>{eU6-PbQ!J&oAE(Pd)D)hToDiRnKU6JKWH2}%_(c`~wUa$$fE zR)*LdO!B^fyC!(^Q_}&U(OLks2h1=>m6Q4C_72#|rc8#Hqbp@(0}v ztodwEnF+BuZLJ@rH9DM=0{UP1R$S5i{Q8-?zU?Yin1o?QxkEXLK9{#%tmb8^# z{jyjUL=1Jcq5NCwIY!sjCaaAq-7`diSBuq#(gN`-hZ+C36^_Os94joC9M4rbMRKKV8El{4r z5#!hD%`d{Qmb;gfzL-;rVgBZE`hv$5H-RR+**cbSYMk{B!_(Z&rm6}$j;#RIt$fj& z47)CKnx%9rgl)P8^Er3&1-WvUm9L(_2r1Y~yN-)T9-Gd8v5SwZT0`5rn@Ii(;Rj8B z9WIYKRP7ZN`|*slLT#CQYZn%^ch3r9`I`j9+nW+iO^;OP?a4!m!uS8^Cexl(R(~g; z-)x@nZ1+rss_uB68zz)Bx{}BG+6g(U&hXlg_j~=9Lrb^jer=$jYHGSkDIADW;ntCN z*R6HGBc5X)pjpcKHO?@SBON^y%kYwb?|MA{OEq6?Xt!>AhTS%LC)LQ0$|Q{ucE#~w zAsOge2<{edt~$zeLeO^Z4G0Ea#q|!4J0tX9V65PIDMa;9=v459tl5j_B2fw#mS~s8 zdvu5jW=abJhpYX8s|*fX5i~4_Lyhux1w@^P!mw)cJGk*MF4^}|njAmx2U_!w<9^8< z4hk-Ucw%^2l(5B}s2%gZGt5Hdrt9F;<|-uW(J9yvQ&}-irM|2>gQ1CQ<&=rAR-B_eBcIgf05z%g=w5wVyEWsQ$3H655rZn%lFpm7%z|F ztR`wYZ54%7b#;B?K<(w*U)kk`$zG{rFtiMloO_dq2)uWg z-YIxHJjt~Pi+Z6Mly4BII9yslsdLRNNNxN1jxT!R)|PO!-5uvuLe zrRXcFX}W9$B3=NW0b%x)=kQu%3fb)4;c4*Hm%beHBO?Ry{|Rfq^ZvIs=ZMEp{rPf) z0q5I{$qm?!Dl03CZvPDnTSp<6ZTmS#k(q6twEzT$?1;%CW4Ye zlA`pPv{+DRw%wqF0a{+BYYh8Eq;ma8EA+eddbm(fVf*))_MxHw z7}nV23$^z3lTp&kqNp_F=QeXmaF+P7=GcSRV7X~FJn_Ej{3iDYI|5bFG(rDuUnr#~ zw=59I7!X_tvuIbZ)ej*ZNUowX#|s`iivC&n*J){iKZi?Mw+~Z=9Gaa$J9QwJ?gI~o zfcysu6e5AOAq7)@8c2NNOlF>b!#8M9HOPEr3($?Al){w$>qz;)Qy69z!Hri?P z-M3?2BIO15PNM+V_aCR|Kv*PJzg`L4j5c0xBOtBc(W2xkmGlsuOsX`Ozc{ zC`BkDVZ;`uo+np6L}}ba^xVEFA}|5a2T94)U2`y>`nSSA3sy_a$s+YJsB(4puBE49 zgZ2G1-WH6+e+DJeYrh@qZI1+Cpy5-~xh%ShGMotD5IAe33CGj&U_Alsw zR=k!+0mAnQ&Ic9I8&y(OTHDy9enJn)nGk(x3xl|%BeHJqTKXWZSlvUS@Sh&L9IpI9 zQQFJ)BnA1WIJ-Z!ttuP;%De=j^3R>PT+Vw~`GBJn^1r0%FiJzWs`0PIQKZ#+tvrIN~uaJJ??srk^-(;QmY0cEF`YX+~! z>JLoa0r`4BN?2XETU@jIy0G(WKOLi?yT&44NEbx7h430dyO~whT5RfdV)=b>krme}8S&&se|r z0wVhFT(QT&@_Y|?phBsX!L%<1a2|yz(f&7k6jhCjAbY1V?U#RJ144(BGl6Eck`#Rc zw*~ZAt*4R!mRAbeyg#@ z^^gM_d;tc*hN_kxFkJ|q{qC<@SmzC-GLGAr}u`0m^Oz^{0ss{ZlPirMFRC?Sa@NRxmB!uuFT-asR7 z#H;CFHqgTCI8~1+KaXvVd?ZN;8M}hhQX!a3Mz}8XD5C_B9Be zOY!J@(2j7}tr*>Bw`>4>$nk#d+&Aj+zD0icmwU#w ziuSJUfJl+XAEwo~um1n{EFJ?s=XRU&50mN#O)a>$xDTk$RBL601%QVfpQp-ktavGT z+kc~+3tQB2n!MC)OTX>dtrNh%d)rGD7RPg-j84p_l1=4AM$zA0((|&Z-w_6$`p@%a z^S)tz@6SM^W1fpQIx5Negc{x$3_Lq*WlS5N6x! zaXTX%TlW+KzZPcMCqBTafRNm#SZnP5dG9M~NQ#oUSZI<(@|RMmHwNWT9&?3e{$grE zbp@R5OGQ zp+%D(Q!qYLw-gCRF%$V=_8qGeQGoqN71?zV)cJ8i>|#Vz1W=In^9WE1I<7NBlY|nA z+shyfwtN6L)fY%0u?`FKGDV*{Gx^9>yvurPbBMkBF`;XV}AK^GsM5@6MP3Q}{ z&b=OJT2Z0(-7L(hNgYm&4`&)pfGuJNUoh3tI7o&%i^Kq9AYcegUZc?8vDvQU@s-D} zQ&&|t=E?utTRr<=sJ*V=Oxr$-+hvNzp^yn(iCIpzR?FFZDd{hPmwSx{#jwVNs5k?^ zv3iaqaY8R0lj8?@Bl?jnC?Rk;bX{{%QO zUQ6pZkjvrf3^Oa{Ig>ePdgTW8p4q@S-JSKd0LG9TA)z(PXSNzZrsu-+v;k~P%~RZG z6S~)pzv<7a>M{D0DaqwBkD+-c#7JQ~HivQ2M>~Li(!v4u=k0#UioXd4*$by?03{-j zmK%@b5N zFAnSF89;1H)7(XVKOgyuOYF<&Au{5r=Ob}!6xaJHLE-@IK4yT0af-1Q0 z4gNd)O!$6V*z6l9W2I0wu$;CSaQWKg>)>hL@C{|EP~?;7le%95`gx4Af)Tind%oGE zBn!s2!fVs8A#Z6$@&I=o@_kKm9GuA!#^3V1HzL~dSzWk8N7L7LkpD|Bd0zPs7$uNF zsVo8<{h>FbQoUa&IWBlyw$V>!jT-?F_}45GB2A&E0wV4Af-3%xfkgI7MIvituCrM4 zuzw3>s`Y@NbAPdBJgm5;@3is2zqatuNSlw`A9~q&q=!1xEuVbP27jtm#~BBUt1_ph z*T`6U<(l=d$Ur-F#JxKl8Bu5Fl+5Chn8l9fqY&PPNwVZ{Qc-)jY8LowM4=4WF(|kS?tGjaxidH%|6F#64t`n}j|L z=`AQmw3J-<_B$A?m(%A)QUfl47mVC13G!^)D^ZNGK8)4X(Ki=JRh8M>@-aUw{&&^3 z=Q@UgpTr0NHuzkq^)CnW`*d7i&;{KZvTCU-AjyI-Cet$j=LSpFrn^mMqj_)U)a2Dn z?Vd2AK!;Sj>o=&X%_8aMTs-o#tpI*ZKFGAR#A5G!1#N(HJr0TLZ+tpmS|Qs zH_HAC_{?Jm5#2eh>?gPNq)RxVgokp$VPC8^<;lR=mgb)X=5`-qGOo>R%h*$Z9Yb!6 z3A?}7c7Hj31^^uC@q9ZeX_~-58k+MJI4w4FWbL2At8DY}lSw`R<0jKrMeh)*oWXJ@ z9&04pW?<`UTet!&l7LtdvoVCDbA^5CowtBERpXV3(;L=loZ50vOo0ITdUJA5p7*4r zAVz8YvaT#$Yn--QPvz7Gey$vGlg>cPFz4(tAtA;*+k?Q2YSAQ2f*BdS$nWdF3OYc^ z69{x0I77%n39=hm<9q4U4CAaa&@*F}AeyC=d!S+&6^uCyGn-7~a1V^sYHTQ?n|Q|B z00NdMvC(Df%9XRD*HOUEjK3;UaBPgM!?q zPQ0)7%@{NoV^qa;XB%@TgYUW=a$#v|*RLS&%Zsf71e~E9VC?!Y0TNfgP4i{~u}VK~#UwWc zcj_{%PrwrZss$_&F*d8L9Aw4QsVCwKZ@U~RGwj&>@4yVXq3{}51|NaBr{ePq10-8Xm_c2j4l>|V@ zpF;xPjpwenb5o{eNs25>ehqMkx8VTGIQKP_4O$r$We9I_*&RZ!^Q+(=%Vrsq7YuDL zhuY+FuQS7J9L+sX4+XJ*>ka@uj@#R=w<*lBdGaZdu%Z*&5+ORn6n8UVhM0?z7a0GW zKsFYJ=pk#P(f`LnVk|&OL)AEhCvsQFt48N|0M+kn=xh($>v4-klt?^JEg-_UjyIg7 z$BrTp#4I(IJL?;nBkfRwq2xYfFe?ZRnRxW7m`fh5nfIf|{Dn^ASw8~`X{v-P(ZQCK zNf^5-#6D~FIVX5q78+IseB_NB?+v);eubv~y5l&VkoYzxsi5Bqd_=<2S0s*s0jW(V(a|k*D zWwYP=Ug^EAT13S2fEHS0uVnUjtcVAo7*8gOJF66gPU5rZ^fZvlkNj2&0Ph0L5gTBpv1JP=>W%GRE>p%fcyZGI&3)!d0+gwNQwO-Tp zfJyHaP@J)NXnS@OgrsHi7RJ7;uK2g_Y0EzR&FkB*nu6kljuXHOLx?0`pp}yK1_CIl z4?HU=BkUm*%RX!MYy8!BNJxkbI-w;(X9^|JsbKPiU&&Vd65~gsq8AW8r|OXUj;|#xDTJURi`Md+lci>Ny{4MF>&V6 z&Mkfd#oM~~%LTFC59PxNkpMBmZEi`Pf^OzR3rPF7yOA~P`+Yp*m$smY#o)1K$k3pd1A(kA^C8+3ypQTb!b% zxjh0ky^3o6UIgSSd^c0SA1Q+z9E)5Lc8MQ1Al@) zCQT`NnU~8bSyIug1LPUjB8f1gO^%@(WtJ3cU+??Fzn~>++%`R?8K!u0HgEZ^RwgB6 zI-3J4U2J41RV*pN3kVLXl-6-<+HSbsPJe8m3YBuOL^26~-mL>WtllTbw zb~SBq6#&Q3aT$_f#xd0!k!Dd&Ep1wCmTW0AifeN}nB|%-G5xdWY-n))4230_@oBfq zVX?vk0gI?!v$#<`e|@o!H}1e-R{}Om>{`+tjNIw0s@Zn$9b?EY=k5HcdEK)wh^{i@ zYi0tU!VJQkaC0u;U+?6$4GokVBR$Fec0QLIO$rmNJ3^EBnq4>iP#ApjD1TZB@ktnI zjJxA4T1T$=ON%jQO&J#Qxln%V8^PIFYEsc=Vj^?LChHEnw&?(Wt7*!^e3U3?x z6_x(V9i^peYW=nYE=2Vky}OmJP@IvJ{LjA|y^Z@G_cPH28>+w$=1gMudHg z?qllOUPy}5%I{~P^FVdGFEGIu3>qj`rRJ>0`!|*bqs+jw$WWK1L56|m;?qJ^QErq)iu&y!L#<(l|q&3!k)nL!ZD(0Si? z6mCpUmiF zb$3n2zV*IpRrTlV8AiK==wv*O!;Gqbp|$|e)?cimt?U#q0+0@{utKYgoPOsoyyCIQ zfnOwS9-ASSy~}9CzF9uHY3tS_Mc7@LB*7wQDVDd&7MPZs(YDJH*~Moui?Y8jj?}c4 zwW*NRsGSSpue?pkWNQ5J`|*!jS0w-Kj_`4#uk+%{G%w#mitS+qw!r6TEbw+Ft+wGv z3GwMjU(`=~dACk~tjIqIM<3JNM*=yS0}O!`htP2KuY)nLTES4CeTAH{Eq#XOPuG=R@V2I~Fz1`3MAFO+_Cb?))W9ks9ct7B;ci^w;ydp*rr*9XEBEH0Iz%xf9j~ z+$dZ)SoPNqXxgwjuko{r`Zmq|ntpzkOSAEF86(0C6K22#te?XGJ}FgZ z6ueETp$z&YQyX}35Jm)x6PGj2ddk?+k$PXVC}?J}A@Oho4SjP!0jV~9ew6p#Mdd{` zV%;y;g;rqYKY?$yX5=3H!SS^K;rHtTuTn2h_Jk9$`tv51f?PITMO7Ka{9)G0pb*^X zLouKeBf8mFa-S5;MKb;@pCex@36q=TOVxi}$erd+IU&CcIq0Ok!)mXzPC7u3HRtma zlA)koMSK@~1Fbo9WYL=zkEG>V%We#dYxK}>zzXWPeGx_Z zr|t?QdjIMJ;!b_fYxRLnEzL-6x9h~~0^^Z@q0IUUfZv{%!;ECt|h)yotu>x@DyVOpa)V zzknVZua|?gis$38D9jH*l%Y0U+qO}H_N(_3c|xlFCT+VAx>2>yQW{IPpQF-6&W<~A zT#w7fM{Mk{;^8Wi*2;*p;A4Nl7R&$k#WAbaRMLqUsTRDfcuj8@$#2vAn~x`t%PNEg zQam;|BxQ>bT0N;_F1|}@+O|Rhw(F5pIBAnzq?L!}0qU*9gA0qx)xl;DAJ>M2glv|n z=;(5>a-Tz`W2Y!Jk+Z}*N_zGR5J@d@#YCEt<0dgfw80kq-*hwqV;CwJYJ9SBZHOT0 zx`|N8FY8QYG#o48+oT12Ku#H;;O`p5$Vd?I-zyN8P!Y5%N`RT+9gp)rn<4(eCxQTD zg4oxYd_C*O+c-LOrj6cqc-md|SC#tFm#VTZVwV^Hpka6DvKWIf{nuJr?hK}nBXNl!xqnJ~#x#u5>Y$?lMa8Dur zq@IO?Xd#uxrszLHG`~VJ$aP&N7u?f_Jnl5PwCanw-;Tu*`5qenkuep}^aXxb3~t_0 z)en;zjc{glIjvXMb76BC6U*oTXv|C03yT+x(_K@=+($=WcX^0D7F#}B0E9M!r$WuU zXk45csyA4_tuLn#iWm#?Mf>IPy^TG@9r?u>*teY6!*ZJ(t#tW5Bo98{2sw@Bp$SH8 z5caF98`qm&g6Pf}-xsQVWkutVoSsq49g-Jzcymki8D|Hb&exTL%x88Q&c8^fVH7L$ z(eZkNzgKu*aN@$(587lTZUu=?H9++)gknbL4+ic%)n%*}`NhGMeuGai*ppyOY7SGR5<@?V z$pu6KcOScsf0cU+%EVk5padbG;4 z^^O6$Nld{z(8o3TNY}m{X7I?piUt*TxX9cJmpKB*nYN~;USGL!$JgHX=nq9u`v4t- zCDq9^`uz_`(x2rFHT)4{F z-H8(;=&--AfT#9?y8rYMpqKO5<&be`jw0P`jxk%RCmTy3Tpc zqUzy)go=4VNstQUt-Vf)PDE}35%}W<;DP}BoBxkOl6%n7d>(X66ZTDeyl?Zx**kaxt`9`>Pzyh=d^A1DUEpP@`q-U zJ|pl0T>}O|;uQ8g6~r|Kf8({EP4UFFKx@6y6=&(eq*OvnVWxR5%GC^ia*0+$!Ub*k z11IWXzaxA<-0qv#HM{l=Kua<%g~m2Xz|u?aS>8MOdp$!boD#Dm$MWkR6@C&=x!E7M zT{sFtgkL3#T&A0Ihx^cb8%I?k@+dr_KE42xRTNxgmiOOZay`nmC6(mOrYY{aOg7^X z^?V40!NE`a44X~E(H@3fLeCMG%{C=+>mPj`P4>a3Ecvd#=RUe_lNrvAESA0RZgP<% z6jXc)Q6|Wm^KT~YeE-S&+KQHxl@ZjQQXl7+#{6U)whRmvOz zmfXNQw;f#$q@&PF`+EMCg`iZ=&+WXhLvHq(!)lWuGI`lx4|uwm z_?5`btm-R%%EWRS^tCaLrSrAVhPYd;o06-MF9&qfA~Zy&c^xZ!epvjWrcBQqFs)yA zS=xAyyz|wp$%`i*jEw%7^D+@{z3`qyVWe=N={Vs`V_3q%=WLK+ty^E+PoriChk+MN zk*f_<)(@UvD`ZAEgY`_IRn?h{k5%`$oKhfVujI>ib+QWmgjXBgz`Epw8a ze^|N@VfM*D6(}TW?C@{@_SrEWhYAT_bW~X3a(UvvpCJ{;_rQ_@iP4la*)CMrE&l5u z9%%n`58|qxfSg+H+7!%$zlrqG_d-_^F-$$y{~D6FN+NR)sg9&}LDuWGx*nUIl<{nE zuHMNC+u#rvw|X&~>9MysRQnvW=7o0fm}taU8P2 zlbID!4@g=_qbB~2^FGWcv2;CrZTBRHwgn=k*-8MlSvI|Nm>ng`z zUeGQmMH4?Hqoob=x5|(qv8>0CGr|{P4q$> zW)pO``;q7frRT{dyg`^4y>7xHz7s}CjQ05aaOgnbX~ z`qQ)Wg>jmh(XAB4Pikp&>(SqDgfM$fnmTA3 zQ7yO^QQWe_XqjAOMDiUR0VHF29*-V8Ah8)wTlcj$);EeKIK5}iAoRsGVT;m+Rurzc zUA#09vNm*pH_P)h4V-Qm2`V_N1EC3?J{V`1YJwe&SVl%Ii`>zZ{ixTFff0MriLPd8 zQH8+y`pvHGU=fPYS0pzRIFjL#9OLbk(jX$kFJpo+ZI=Sy=MJ);> zcYi&i>&;}mw%#7SzIxyI?zaW3hx+|@UINZercM2zKiQo{gZv-a-@K`*p*CEH`7DgD zhKmSAgUTEZ91q>PnwR*!u766DTHtf%9#bxPE@Rzo!6!37F zWHK8qU&k8*)j21@M_754&6nJn1)HvC_?~7TaY%hdbMUJ6hv%FW5wyiz%eD^Sh-vZV zm5;X#*tN?FI(tLWJhvmH!_m54o9h@=XkkxU`y-?;Y-w)8x^AM?ww5II_@2j5Dvx>M z1bl$U7&(^?I#lk=D5m{EP5Xk;fyaV#%oadGr|7x9=y_cf^&zBs9vqzDD4?%moc=sU zEcy}ixuySEx7Y4Q71Tds+aA7FyND~`D;eBZY|SUIh(=RcPDoXVdr<3Q1*icN#(($YkWG z=&-Nzdu?Y@#HS>K$PehO{UyoJY5>7?3 z9G8@8L6py=WS84KDyFTCBHPmv=y=58woWDMTj4|5Cu^A6HAivqnc;;K_ZFI#*X*@< z52`#~KkrS%vmN<7)2|i)a+JmVZ|i=aN60EM16r%wI8Ec#lHo21ZJ_wywJn8v67~{bHX@6;2r^+8Y=77fwkm!3^ z_b4VxHDLWoD29X(7H^G@Br~-z9+~F_<^Hl&8!PiJ&T}(!q+&6xQ0YFd(X`B5N9{R? z|FO=<&^oiUx`_Pwo?3er&j#yTlE#A4fouly19~WFektYHe69+{p>Qxb({b#V-)DC> zb2yr8D>Nz0{6bQgQv`aLaJ&;WQ|F*Cp)co>c}6C12_zYJQur#&*d7|uDqCBeJER2L z9hfg=D7<*qfZwLU91li*xzRMwah~(D>3sN;dP|t?;#wx{C61?*A`yT~si1Ma+56gV z(!)Ie4UUVVxK{+6$i7W>Cvlmacv-ZgGSKrvU`OuSO8;#&^GheSNSO+s8I9`5Z`XVE!w+Y996luw1FBWUOObKxEYo&{ z(rfZzRdr<+pI0`LYE9@xVh(R6w8J=EA|*k%J+&hsg!6B|!1a5-(KnR#`26}j96GC34zmAn9ma2}RX*E%yHdxvz}~>*2KeoV`q_TjvwNKG z@Od7mIH$4PrzP-<`j}tKi>oi~0-rBsU+oD71@wMhw+wmum1TwlQmU1-?rX(=W3(Do z?^rn!trz;RL@tln)Q(^j@Y?@Wwd^8tZ0v*FFougz+w3?^cTVJuz)%oeJ%jpg`nmLa zFm&?jGVnd7G8mSgSS|wBmU_Q;)Ej>~)OUKmRF-sf@r*ol`ymw>!e<5R`hm5?U06>e za8WmEXJsKBl74^mOkWATz~6Qd_e#RK$q~zsOUV7W?$CwysFO5Xkfkc(A+z6vgCgWI zUMWcZ=JKVS-GtS_li#)Rf}$YdPd2HA_-n9GKT#I(6F^iSFx{iaUbDH!fXs{Z>uE@Z@{0uLIzpJ4qnKPCJh zZ}i8ldBFWYH0#xRzuzTDB$-7fQZ0_SDNz+QA@fU(tizT*R(Ia{2#vWZqy|_D4f#y}#zkU@{vKS7lg+RbrY80Z6_m5gigY*7rn7ZHTd6^rp zqI7dzzBd*Bvtd!B^xRSm@}0OQn!HqVKUe=V*dNc9lnK@}<0mXTM1AkKwF<82Mg0?| zigT^0&&#K7x7k6=wXtB?95(YRBHLkmclUJLG*K5M7+T(-3VULJn2|#yTpwgLOh6a0 zclJ?57ynnw`i^rqO#Zxmn&1v6qswLJWS<`EHU>nS2q+h=s$X2aJ9#pjQhWw-a1Z{0 zTbRfeq)cJx+jVp2jC^mGw3p&eV48iF69u}IzQd2HNC^EpF}Wk@C1rK%tGo#*L#iRm zi6ohXZcz;=+UbWm&bu)6=97uDe=}@H7^xhZBUOryIjcW5#nJ-*sc}jPq3lKi$d-Rj zQ?1*5(p}Ey>YR@tjm?QU*`9lo&Fel_K0v4nk3Xj(AUTKmAuUDELo|g%(~=fIB$Zgr z?6H=68w&YCvQ;kAw_iTL6bO8zP5a(%BX)f0@?1RMCmp3{XvK*K`akcRiU_4iWDqzL zzvnmo3rKS8{`w$X(lm#UIX?^i-Z&^dF#uGixvGU8MJlzZBpkQR+CjlD%0i!Ry)LE= zD3U~H2GgVj7ybxZiH@GwmuNL%M{u9|$kG2iU(flsKSIY8v&*A?eLL<)F$(x~hN`nV zC7li@2gCH8Z|wB4+3DKc%u~eSVIF?2NJX-nT&v5EW7wL)rhGJbEC1#HDi+Wcei)94 z$Fe5E(x#R;AAsLm#fCNRb!e!xAr>*rW%|cW=etyNcf7VahNn=<^P>5CM$k~AjfV9i z(7J~Ep+Px@^Y$8i(3?JBa+5rSnjbM|1D@ zX;~mWY=|AW7sQ%VajzyrNXeRL`FwGW+BdhYpl-t1TF!K@P8{c&-HTq+)o%OOWNgNN|k#4sOX z4m~a|5e^7&cnOkInAqnD!@~n0)_)<`Fd*0Tae!~IXE~ms{!2m5dsN-)cHq+wmT#@g z2FnN}t&Lp261Qz!#wNC_1HJN|^GCS!|9f|S3lUkZL8>^J7^$g&PXxFl;I0IiGA!#S zG7T+7NkGG;=j||NM!mT8PP#OZ2n=TN}RE=Usyc>ip>~YwF{8 zO(dU2irYBn8L2{yr_pWPcZh4v=z4z~4}>BX6XgYH?uxp#w9)|+qsyY^7rqt;?`!T9 zgU?H9$m%r?hxc=sCq0Q!$_N3vfVlP00MuTXctdcAR!@=Wysmc*(I|c?mPme#d7V|c zE;mBdVTAvg_dAWsHIq%&-cS_ZO(80fPZ(4!K({K@(i(GFs3oV%0je&Zo~sFHT4jG@ zsU^{U1h32`73w|%9pGt=hT9lIEL;>=|K?{PZe~**F$8ldiYVM~G=xqY2tO;2MFC;! z+vhpqm-l);&#$0dp)z%!{NUs_2H%@{4avF)*9t2v672**MFqx59IdGVElsYE@Q)+k zw{t#ci;Yw!-nf|}7_{=+ zngI+v1eZmBnG!@Zs+a<;DjKFk&#?)^X(m)*L?#ZOrS1p}mc`mj7@@a+NgYmU7apWb z5RxbeWRktcC}D__hn}fKU~_?3Eo%A5Zhn-_Eya^Fi>RWa>S2z-d%SLN4+7b#L%kp*Kg zEzGmT0mrl*x+XkCVSj@ZE~Dl4OBvJ_gPF~@%e(u3@>fl3wwudeu3tWgt69O;TNnj; z)V7YPMs@7+Dy`#-x)8$7hMlXMmj(At&7G6k^naoHLq$=SFL_L$p|VM*`QP5e2|rBB zR0w?1Xs&=$?v6nm4m6NpNc(Uc)ZCw?cLZv7Xp#U%%9-Dl*H--qiG2b5Fzb{JdR2N| zuy&6s+i|%*-zAg)=Xg&8>&!Bz--0SGzw2`7oSqKnvWi(Z_GD`3z@mloR6MD=jin`< zOm6X@2Rvw(BCWiy{=IzXL07i`lG*jFz_+hw9JB%@@1l0Hn_t|3wT22tQxYqRf4mKk zJHF5fr!^mWagibk4>b)h+Nb+-DEq& z(S}XNR1>aMa(S$W+$=vLEvF)kD>!$CsI);{xjm3``q z^WJ!t9WiqA!i|6Rl>Z$&I5Q2XYK7U<3EcserVB?=vf5j)pHK=U@0JqwK+(+KYA=4yw(a&1} z0*a8(!a8`mTcMXL>AlMe$0^W<*u1?$&F^_u*6@YJ7WAyvUQq;OXmJ(s4yhFx0q(bX zND&@~A5lK#NpDWi$wYRp^Ee4S!HDvQa6#< z;(7ikd%!3}@0{rpUg)K1>;t#}vQHJrFnVJ<{YwNdFt)J0qO#i7)`n^I4MmC2Dbsrq ze^j4h>y(m}N$j=nTnP&}?}L{xL8E-*OVlz@F3pRLT-ttF;Gx~7?u&;{BmL1gnC1r_ zf#%@FR)xUJa6uIHE_3VH%Ajt&1w9mUHluD>C6?QoA)h&#SNY54GYZ#Y#vW%GQjj^O z8ujw*Z7&LO-=@cRPu>m(>O%A@<20e@*0pHvb(usWUKh;gsn&YSWnzmC5?N+7t(z7x zGD>%1-(LavefYf(mpfRZiAtQm^*P8-TkaAloR~ff+_xmyHdi>_!yC`+yxt2B)69KG zVg+*}1xdMdA;dCruU=f4m4Fr>R7bs?`I1Ct82F{s@Dv1)J`Tiy)TAp3Rr%IDo=;;^ zP^&dO)#^0hz(r;!x{4uuOoVMR@{204uUdpDaFHl{U!{T9IiQY&;d^i)n0m`uUY$!W zWN}!*`mO89Vr>*b2^Jhme(wqx?wTNSGqK|{eE?_UnbZHo90t{AP7m5d!~4YS{Z3OB zdi*1J?~CFX$CvlJ_FQ!ge@-uxUvXrAJni`wlrw%0+Ab~o)Dy|nHg2Rfq8jP-_r{p3gkH zy1~`T7~|vcpboaIHs$kl_U78og0=JrCRWSU7I3cTXk_S}R=*X`I6=NbWhz7vMp{mZ zs&ZPg(6$uB?FDB24Eo)z0pC`oh<_qrtjlKH&opSOfV*AhW7~Yh_v?DE_(-t+8^6ow zD(U~GV?>5rdftG1sEhcncCJ6XZw7Em(ppjYZ^&`s)t|x1I02VG7ht-2zebj&^tD^7 zYj0EN5+Z6UxXX_}TPl)&Bj{cw z%IQXZ7+}zprn;2FmgIRuc%^lnu0dWz8}BEDJMZ2KHLF@PwJzPfI3A9ZQ1A}DG}6RU z&rw$v40WW`%;0u5eIQn@ zObXP1>@$Zh0>+u(ribQYja?|eUWK2{2QwO7H~d!C!7Kvnnm?U4N$41Y@YkqS>J3CsA)A91F$Gsqn>a?P#b%|4qHw3N z<{$B*@e)v*Sh}S4MVOZ(Jv0=Kf)n$2%F^XX8{h>tzr9uk9=&e3LlrPly=rCY7E)Um-LPhJx6KN2BJnhXd*p=?dV7NXzJk5Uq&C%5Ab^7MVI6XD~o%bB|eTI#bB+@4f}=@*`Yo)#MpKt5YoS zh*>*|fboZ^oPD*UZd##sXTO*Lq&(d(l&o05o^ngcL4#(ZrF{0VVz>>~{bMScVF8S> zEW$xvnUL$LSafs%OR~g>jT_8tNt)sg8MkHkFsL20qq0?q?2b#VR4wB1pd$~(>MbLZ zb@ssMOnVzxL(O7XL20s1;nfPPjOn@Inu9It0>#!*M=+{y$H#ZE`sjSo7QEuX?L0cG zY~MN0e|#j@#qv~4^(C=X(GJ`+2rCM&evjGT*+ezz*RjuL4(;-CO!am`eSQ($r_U!p zA1;2zMrbL%&~tr2S}?16YryJX)IZoM*dgoEFhnv!9UUxNY%s!hvmd=xr}MVOSEQw? zyNyWKQH-dDl~UYWkEY;E*A8IUU)}ym59h1~Z#%#c7QIf;ipf@DHE_6o2yg-A1JFZB z=W*IoG*w^*mYk*S<>L?)w&}?PG3IFy@Rpv!?;y(A7=#)5A2yHK%hlEK99+zI>&AmW z=*rTEU(9g_(-?mD+|L+g#bUhP3A^K5C`4U18>XvW-{LRubm#W`V?WFJJi;SS`mgU6 z2(jD^(~M52;pU~EM0Puqh_q+EQ<{lhW0AK#I_UjkSc3#XJLGl4NnLr7Fnc+8V6||O zT9ghPHs-FIh>iD4Id+Tf%~?!`^o4m~_?rH&&GIMVmqXjHot-DzxPuAWBdBqFbmhep zwvF9oNf-ldaZL7mrc&Q|ds;ZOQ{LTnjjKDiq}u)N7X6<2&;2h(D;y0}bdMW(voUxh zf4z*p?;ai7KW0G41wc0_OT3_8y*XO_b;z# zT^Qi%fz-!qoR_BrdcEbJg5s|7k-%Q~555gn&Y!9itGbH^vH5yZjMDsPxRp$f-TM%R zpx(grivqG=TZbP^2rAjHHx`@b--xA&YQeHbCgdf`InuCC7iP-f5yz|@HAp!L9kZUG z*XqSM^cwKf(lC@}TrA2I_Cp~ZnfZ(wY%CU`d~$k z8mIq$$dG@(Xcsn8)G%w6mf$F6;8roz(wv`2<-9N1f7u2ttT{a$8Ux=R@wgS+3W~C9 z-2C92#Js|G2K;>|-wm9mDJLCqg?xt7GIV_ z@tNN)Pmb-%lLc!F5?F-(?sEHyeUC%UVP@?RS17bgGFq_;>`1VTP5Z1rU2Z^x!xEI1 z1+7#xmtxY@7Q=Q)5TIg_9)j%IM$wsGLGwUdE5)ly= zb{ISE>YWTe(`Nb*NECWA&D| zNfqqj%w_pQ^@p{|0_71T?ZFQTJf%gVkv9#wQWBCjS_P`><@82R&%(y8J5_`i_KowF z6BAkBHInK)@f4CO030wqr|JB<*q|H*VG^Q#SlVL9b3=4dd*$BUImr$T(uHP&Wrr8n z;iyno@Y3XG6~V1yGFeZrectqH9EsBMpX z%<%!~H{*+(I_FDIly#x+2KB zgi!b+rX;~pis_@3C2}OH3HSe=H6nxFUDn2+k@w~Gl8XJ)K(<}O=m1oKfWXd{l@Qg? zzOjcN^*97&*8*eW=3ow{MLvdtLU>Bu7y8YfY6H$zDh+sB=`(yc2N zBp!MErN?;zQ7@Xe)B=gI`iC8UmR4ki7b|vP`vU|axLS@WhBw3+zVL*Vi#84 zVEwu&zr9&XkTDhD-m;0l&yfvIY3<<{D@#Gi4|`l{^HPx4u#tUvW1q*%|2*!?T8@P6F|uPf zFwYUMdJ#`r@er8HI5Bhxy~Py6Z_65XCNt1Zj!;m*1ofIYnzT-3tFHK*zp4+Ksm!^O z4JlUEF)n+;iur8bE|7}{keA8UBRx_XW>G_MHWo|xI!`YWALuKYw~zM#5nKYI+2*9= z8e7qTl?c=@M4v089bmNz%RRNfBCQ^S5n7K(BO4oq4jm7AkyJ_MS^Ff>FD7L>G?4c# zClyf+riGeG#i1-$q60`Kt_33?i-^sFC`XxZaycFu_ZALF7?wM{(mw7FFOSdZ+{>}= zN`RnB4_?E%&;2cinv=bI0%hYP6AzZ6*?uSsn=vWqwW$$4_9REappsAo z{s54J)gvS$;Zr0WJ`cOdDi`sDAhH?(tF*sD16nlw%2bMYwxh>i6_i99XvyX^LRLcx zN*2f-YSAEf*+dH?3Lg+^gJqAt&~hsU!jxOu(he8OzZhMgJCd-WLvG6Xq14D37(L#n zWCvj95D9T`v{A`KXQ0aGAWy;nCi8Ct7K;;GYYyL-!>n__Bp?e#m|?0oeUf#Sv}6}~ zXlydfFL$}X5xVy_C4hb<6+imKB(4zQ#yvWt;$r-V{w8#w$rJ$a{t`Fn-5v`mt%g-g zVSGk|yd9-njOeL_T<&(i%34|gFMAI!y9Gv}b-dA7D1KsW1R`6iomhNW0tyea3kRRR zCwz{%u0&pu%$TLqU(vTKKho!4Ip%RcXjm&PZmnuf=ly8)WIy&H>DbOTOI1T%lON=r zeZfLPr{23H8yL+<(E8_>(svn@y71Cv_`z#1kv_LM9w{JnIW#f$1*c)Pi9d!>5@+f*(1m$fvpzZEVjLrFBSD8&cz6LZX9{= zV_AJAf5~9!_iDb;6FZ?#QO=O;Y&pGih0J`bqLDu~hlgz8p5B+Vc7ydNn*>ZzU$HO| zM?qj1LT4Po?j|W$22ujh_<`%yjJ7*I$9x zpBttqyD1@2uW8;!Z~>&Q6pm7q^U>9TLuGXC7k|8TjvS!01#1mrgL^fp< z&|TBQ)lOXzpgEjAz(wtWqX*Z$%lHS$qe4vHX?;2V2xNJG(T~jQ7$KUVqjtIXIEda zrDrSeJ_#91bEBChQ`sRKH#gQ<*b9nK+? zO%fHX)^ZXEoI-^q56meJ80A>D$fRhLq zq0b^Do2HRFPy{rl+8GMI(q2vhzcY2&8R!oKx6G(67CNEtDd$XSH=c?QS6D!_niF>E z`Y!mu_E{XWM|)aV9S{5uF3597RR9ZeRc6k_Xx)7{MtBQESY9ARKFERd|cTT~LmV!-@@N*fvNQ*p6 z($a06Ut5Ny5xPsEbAgt`M3r0){#q2fG#vVU@BsQx^UQqwIT(kxlWW6oZ8*BCzK*ITFlmay{UQP?j? zU`1aMw$J4E%`*=NWP<=bl*JG>GPXJ-afOUZy;1{8go`jB+<~ z9Wg!@_4K&0c~p)SV={6b;RlyfQ$t{5@>Ozxh2%j2yz*JcdYXb0kQFVs1AB`kX0!{gMREl5O`R;bn{%WbV0}6Ab!g4gBkh8_2l=_tIT$}wvk-8vobyiC@!@xkEE=0q48h^}lpjS&V^$N7?Z~GR zU1eTF2$}SZix~WPMt2=CNj|AT z%+BP-VU%38NX&2^gYO7IJ4nxus5SBGf8YL`qbTpXmo-_FAItoHe7Zn0!<4haX0zgx zuo*=p?Dx&D@^qa4p(hA`|NDK-WL+7nm&CF6rD4pD?sy`r@}IvU^&ud;ldmOiF%W$< za{sF=kuzNkjJ2(cj)(X~{6Ons$Ph0fwLd=60ADC&wtCQhk{t32tMBQlEVXHfr@Q0Y zrN~*Ioh@M-5huDjoq;y!wy%K~b!5d<9meF_v;A+mE}Jnca28;P|6T$iQ;@m=SVYaE z8Z(Ym6_~pHQlV!)V%#xjL~#`Co6mbod|HGxqm5a9VU?j8hL{QW%f+qHOiT*iH!*3s zw7qHz1lxJ)fW$j&tZ>jvAqX6cQ${L&tKpd_Br<*w+e3i;LV6cG5C(_yIHVuVXdG}T z+L9_Jc0|*$hH2mV%?R{1fn=+?SW-hx7^qIIDav+xZS)*OhWCd4C5$1M9G}frR4w&Z zQe##!ZeX}qEQ}zemCR2=hLMVUYXB367amRNok4=`KBN^b&n(Ki?Ch-=D~d#;cS(nQ zy=N6yl$T;FNZuoW-VpJcq#v4Vd95C%R}E*!?b73rK3LUQnGlz`C^ekx;LwpqG-H3y z(nzGBr05))?>jOPRq@;J1utn$J7)oL_r_Z&>QG&0c!4eGEz=5+qhuUP4q1n~Ll>iD z770VE`>|=3DX%ju!aIj8$w%*vp2has%q!!OYXmAqXuFS!XQCxDVg88sx%I6dHG7r_ z4EvFG5knL`^hD`n2I)kmwGIKH^=k9mJE{9?LP9&V1+Fu6nR*4F}MD znHUs;%eOMynjFLFZF)$4ypH;c(JWVd)X!%>?mt#_fEBC8L`r_a2hRc}$La<|2}hVc z$2h;`3)k+kvy#$>+GHdsML`U^qiM50^1r)* z)c`2aMKSYRTBy=31HX~g8+gS$mUPp@G1xU z#`fCIkmPJ&dPlva2?9y+4uZL#4}hOOk>7BmnF4KzPbpXPU?taXAy+JTLu(nEAWi#) zNq_x(s$i;BvB*nriwMLV(wwaJQ|}{gR8K zij-Fzm&z99NZz&g*HV|U>u{)W3$hNRp8kZzOj}7xE0hXh9Jc3lVah8T$E1OwlMYsx zqd;1>TfXx<-V3{wAI=_Sd|ehEshAvK1W{f>iy(Flaf{dq4-t}T0zwi3+Ivh&IxE_$29L^|pl;^KU4k>ExQ&Q)|LN*>o9pB>AfKfMH z)=C9lmw!N?R6~L@&Ny0{s94HO(A!bdvZr9P4a?MFfv3WtiSCVVEs5+`D${RN2ld^z zCn(`}P=jx`&5(MB3R+T|pU5tbybf!RunSV>Y{NND(b+nb`=}uKzO?_zO}3=85|5CZ|Tb{v!gO;UZZox7$?eYp+j5IOXfWbycYH*JtIJoWD?- z8_Y1X$vacf10dzFcZK#UI7e6|l50 zhz)GezebKj)8PVBqnqp>cIWna9+~m^Ypnxoa82 zO~URruSD#Tc7}Pbw>Y)SgLps)6T<%-Ee(~VX-gydt&44*aW)-npgD|>WGzF?3^3rjRoKZH1j~c8lHZ(cDk+ON*a@uIndq7$LcK7{lduihZNa`Fe`dVZao_2dx*L?%B_K6FlC}Mc+Owqd~YRErc z*?4&_cH8xu-FUmu`f0UmJ)p3g5h5~md3D4tTSAh{(_SR6ofO=}El$+9+TR3Yn$ptx z>qEj~Q!WoAm2A!>{lDOgD~Zi{<&mrL+leu-VjuQjEAoL-U!TRnk>vRHTIKll@DThg z`f5>PCArYt{dnKp`9bdmY$Vw2&{dsmg711TJ~1iTQZc@s^FamWpCxNVx|;+Y$QT5Ij8NQv^a$5`Q8^aEGb{&FLerh(+{Ns8Ddm2gyrYU0OKROmalTPK4kf8S-^B*Zq=`|p_e>$U%J z>Sk3Kgm;9!R5qD-e2IZSqQVve+LSrh{Q_($ICF*&LRcs|L4j7 z-NnBLJwl4)TvLA!Gm%#r5h9ViY diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" deleted file mode 100644 index bce7de80..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/test1.md" +++ /dev/null @@ -1,73 +0,0 @@ -*斜体文字* - -_斜体文字_ - -**粗体文字** - -__粗体文字__ - -***粗斜体文字*** - -___粗斜体文字___ - -*** -* * * -****** -- - - ------- - -~~删除线~~ - -带下划线文本 - -# 一级标题 - -## 二级标题 - -### 三级标题 - -#### 四级标题 - -##### 五级标题 - -###### 六级标题 -[链接](http://a.com) -![图片](http://url/a.png) -> 引用 -* 第一项 -* 第二项 -* 第三项 - -+ 第一项 -+ 第二项 -+ 第三项 - -- 第一项 -- 第二项 -- 第三项 -1. 第一项 -2. 第二项 -3. 第三项 - -1. 第一项: - - 第一项嵌套的第一个元素 - - 第一项嵌套的第二个元素 -2. 第二项: - - 第二项嵌套的第一个元素 - - 第二项嵌套的第二个元素 -水平线: - ---- -带反引号的“内联代码” -``` -# 代码块 -print '3 个反引号或' -print '缩进 4 个空格' -``` - -> 区块引用 -> Markdown教程 -> 学的不仅是技术更是梦想 - - -SDFGSDFGSDFGSDFG \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" deleted file mode 100644 index 12f85c9b..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/tone\351\203\250\347\275\262.md" +++ /dev/null @@ -1,615 +0,0 @@ -# 部署说明 - -> 此文档以开源版本 T-One 最小单元部署举例说明,不保障系统的高可用及性能等 -> -> 若期望大规模集群化部署可以联系SIG项目组进行具体讨论。 -> 若遇到问题请参照文未的 FAQ 文档,或进 SIG 群联系我们。 - -**组件说明**: T-One 包含多个自研组件和几个开源组件,此文档以开源版本 T-One 最小单元部署举例说明。 - -* 自研组件:tone-web、tone-agent-proxy、tone-agent、tone-runner等。 -* 开源组件:mysql、kafka、redis、zookeeper - -**机器要求**: - -* 硬件要求:推荐使用 8c16g 以上规格机器。 -* OS 要求:推荐使用 Anolis OS 系统进行部署( 暂不支持debian、ubuntu等)。 - -**部署说明**: -- 主要分为安装环境、项目构建、项目启动、数据初始化等几个步骤。 -- 该文档以x86_64机器为例, 如果您的部署机器为其他arch类型的机器,则需要将docker-compose.yaml中指定的第三方开源组件镜像更换成对应的镜像源。 -- 可以自己指定安装目录,该文档以 ~/tone目录为例(推荐)。 - -# 部署步骤 -> 后续步骤以 Anolis OS 8.6 环境为示例进行行详细说明。 - -## 1. 环境准备 - -### a. 安装docker -``` - yum -y install yum-utils - yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo - yum install -y docker-ce # 若出错:yum install -y docker-ce --nobest --allowerasing - - # 启动docker - systemctl enable docker - systemctl start docker - systemctl status docker -``` -### b. 配置docker源 -``` - vim /etc/docker/daemon.json - { - "registry-mirrors": [ - "https://6kx4zyno.mirror.aliyuncs.com", - "https://docker.mirrors.ustc.edu.cn", - "http://hub-mirror.c.163.com", - "https://registry.docker-cn.com"] - } - systemctl restart docker - # 建议使用国内镜像源。 阿里云: https://6kx4zyno.mirror.aliyuncs.com,网易: http://hub-mirror.c.163.com -``` -### c. 安装docker-compose -``` - pip3 install --upgrade pip - pip3 install docker-compose - docker-compose --version -``` - -## 2. 项目构建 - -### a. 下载项目源码 -```shell -yum install -y git - -git clone --single-branch --branch master https://gitee.com/anolis/tone-web.git ~/tone/code/tone-web -git clone --single-branch --branch master https://gitee.com/anolis/tone-runner.git ~/tone/code/tone-runner -git clone --single-branch --branch master https://gitee.com/anolis/tone-agent-proxy.git ~/tone/code/tone-agent-proxy -git clone --single-branch --branch master https://gitee.com/anolis/tone-storage.git ~/tone/code/tone-storage -``` -下载后的目录结构: -``` -~/tone/code/ - ├── tone-web - ├── tone-runner - ├── tone-agent-proxy - └── tone-storage -``` - -### b. 集成前端代码 -```shell -# 下载前端代码包: -wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/tone-front-latest.zip -wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/toneagent-front-latest.zip -# 安装unzip命令 -yum install -y unzip -# 解压到指定目录 -unzip -j -o tone-front-latest.zip -d ~/tone/code/tone-web/static/front/ -unzip -j -o toneagent-front-latest.zip -d ~/tone/code/tone-agent-proxy/static/front/ -``` - -## 3. 项目配置 -### a. 下载 docker-compose.yaml -```shell -cd ~/tone -wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/docker-compose.yaml -``` - -### b. 设置并替换变量 -执行以下脚本(需手动替换`必填的`变量): -```shell -# 部署机外网IP地址(必填) -server_ip= - -# 账号密码(必填) -db_password= -redis_password= -tone_storage_password= - -# 镜像版本标签(非必改、默认latest) -version_tag=latest - -# token(非必改、可自动生成) -toneagent_access_key=$(uuidgen) -toneagent_secret_key=$(uuidgen) -admin_urls_token=$(uuidgen) -pub_api_token=$(uuidgen) - -sed -i "s/var_db_password/${db_password}/g" docker-compose.yaml -sed -i "s/var_redis_password/${redis_password}/g" docker-compose.yaml -sed -i "s/var_tone_storage/${tone_storage_password}/g" docker-compose.yaml -sed -i "s/var_toneagent_access_key/${toneagent_access_key}/g" docker-compose.yaml -sed -i "s/var_toneagent_secret_key/${toneagent_secret_key}/g" docker-compose.yaml -sed -i "s/var_admin_urls_token/${admin_urls_token}/g" docker-compose.yaml -sed -i "s/var_pub_api_token/${pub_api_token}/g" docker-compose.yaml -sed -i "s/var_version_tag/${version_tag}/g" docker-compose.yaml -sed -i "s/var_server_ip/${server_ip}/g" docker-compose.yaml -``` - -### c. 启动docker-compose -```shell -docker-compose -f ~/tone/docker-compose.yaml up --build -d -# 注:如代码有更新或首次部署,需要加 --build 参数才会自动重新打包镜像 -``` - -## 4. 数据初始化 -### a.初始化db -* 进入`mysql` docker 镜像中,`docker exec -it {数据库容器ID} bash` -* 连接数据库:`mysql -h 127.0.0.1 -P 3306 -u root -p` -* 创建 `T-One` 数据库 `tone-db`,`ToneAgent` 数据库 `toneagent-db` - ``` - CREATE DATABASE `tone-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; - CREATE DATABASE `toneagent-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; - ``` - 也可以直接通过 mysql 可视化界面初始化数据库 - -### b.初始化 `T-One` 数据 -浏览器或者curl命令请求接口($admin_urls_token可在docker-compose配置里查看或更改) -```shell -curl -s "http://${server_ip}:8080/admin/migrate/?token=${admin_urls_token}" -curl -s "http://${server_ip}:8080/admin/init_data/?token=${admin_urls_token}" -curl -s "http://${server_ip}:8080/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." -curl -s "http://${server_ip}:8081/admin/migrate/?token=${admin_urls_token}" -curl -s "http://${server_ip}:8081/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." -curl -s "http://${server_ip}:8081/admin/import_access_token/?token=${admin_urls_token}" -``` - -### c. `T-One` 关联依赖配置 -**系统执行任务还需对以下配置进行设置** - -- 配置 `T-One` 测试用例 -- 配置`T-One` 测试机器 -- 配置 `ToneAgent` `token` - - 在 ToneAgent 系统-账号管理中增加一组 token - - 更改 docker-compose 配置中的toneagent_access_key和toneagent_secret_key - -## 5. 验证 -使用浏览器打开链接查看: `T-One` 页面:`http://{host}:8080` `ToneAgent` 管理页面:`http://{host}:8081` - -## 6. T-One 多生态使用 -`T-One` + `TestLib` -### a. 创建 `TestLib` 数据库 -- 进入 mysql docker 镜像,docker exec -it {数据库容器ID} bash -- 连接数据库:mysql -h 127.0.0.1 -P 3306 -u root -p -- 创建 TestLib 数据库 testlib - - CREATE DATABASE \`test-lib\` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; -- 创建 TestLib 数据库表 -### testlib数据库初始化 -

- 点击展开/折叠脚本 - -```shell - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET NAMES utf8 */; -/*!50503 SET NAMES utf8mb4 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; - --- 表 test-lib.case 结构 -CREATE TABLE IF NOT EXISTS `case` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '测试用例名称', - `creator` varchar(64) NOT NULL COMMENT '负责人', - `type` enum('FUNCTIONAL','PERFORMANCE','STRESS','LOAD','SECURITY','COMPATIBILITY','OTHERS') NOT NULL COMMENT '测试用例类型', - `priority` enum('PRIORITY_0','PRIORITY_1','PRIORITY_2','PRIORITY_3') NOT NULL COMMENT '测试用例的优先级', - `suite_name` varchar(128) DEFAULT NULL COMMENT '测试套名称', - `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试用例执行方式,手动、自动', - `run_model` enum('SINGLE','CLUSTER') NOT NULL COMMENT '测试用例运行模式,单机、集群', - `is_available` tinyint(1) NOT NULL COMMENT '测试用例是否可用', - `tone_case` varchar(128) DEFAULT NULL COMMENT 'T-One测试用例,当run_method为自动的时候生效', - `device_type` varchar(128) DEFAULT 'unlimit' COMMENT '设备类型,可多选,默认支持所有设备', - `device_arch` varchar(256) NOT NULL COMMENT '设备架构类型,可多选,默认支撑所有类型', - `labels` varchar(256) DEFAULT NULL COMMENT '设备标签,多个用,隔开', - `desc` varchar(512) DEFAULT NULL COMMENT '用例描述', - `pre_condition` varchar(512) DEFAULT NULL COMMENT '前置条件', - `steps` json DEFAULT NULL COMMENT '操作步骤', - `custom_fields` json DEFAULT NULL COMMENT '测试用例扩展属性', - `parent` int(11) NOT NULL COMMENT '测试用例分类节点', - PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`), - KEY `ix_case_suite_name` (`suite_name`) -) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8; - --- 表 test-lib.case_label 结构 -CREATE TABLE IF NOT EXISTS `case_label` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '用例标签', - `creator` varchar(64) NOT NULL COMMENT '标签创建人', - PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`) -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; - --- 表 test-lib.case_label_map 结构 -CREATE TABLE IF NOT EXISTS `case_label_map` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `label_name` varchar(64) NOT NULL COMMENT '用例名称', - `case_id` int(11) NOT NULL COMMENT '用例ID', - PRIMARY KEY (`id`), - KEY `ix_case_label_map_label_name` (`label_name`) -) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8; - --- 表 test-lib.case_tree 结构 -CREATE TABLE IF NOT EXISTS `case_tree` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(16) NOT NULL COMMENT '用例结构树节点名称', - `parent` int(11) NOT NULL COMMENT '父节点id', - `level` int(11) NOT NULL COMMENT '树结构的深度', - `path` varchar(128) NOT NULL COMMENT '模块完整路径', - `children_nums` int(11) NOT NULL COMMENT '子节点数量', - PRIMARY KEY (`id`), - KEY `ix_case_tree_path` (`path`) -) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; - --- 表 test-lib.device 结构 -CREATE TABLE IF NOT EXISTS `device` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '设备名称', - `arch` enum('X86','ARCH64','RISCV','LOONGARCH','NOARCH','OTHERS') NOT NULL COMMENT '设备架构', - `ip` varchar(16) NOT NULL COMMENT '设备ip', - `type` enum('UNLIMIT','VM','DOCKER','PHYSICS') NOT NULL COMMENT '设备类型', - `sn` varchar(16) DEFAULT NULL COMMENT '设备序号', - `status` tinyint(1) NOT NULL COMMENT '设备是否可用', - `label` json DEFAULT NULL COMMENT '设备标签列表数组', - `owner` varchar(256) NOT NULL COMMENT '设备负责人', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; - --- 表 test-lib.device_label 结构 -CREATE TABLE IF NOT EXISTS `device_label` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '设备标签名称', - `color` varchar(32) NOT NULL COMMENT '设备标签颜色', - PRIMARY KEY (`id`), - UNIQUE KEY `ix_device_label_name` (`name`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; - --- 表 test-lib.device_label_relationship 结构 -CREATE TABLE IF NOT EXISTS `device_label_relationship` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `label_id` int(11) NOT NULL COMMENT '机器Label id', - `device_id` int(11) NOT NULL COMMENT '机器Label id', - `is_delete` tinyint(1) DEFAULT NULL COMMENT '对应关系是否删除', - PRIMARY KEY (`id`), - KEY `ix_device_label_relationship_device_id` (`device_id`), - KEY `ix_device_label_relationship_label_id` (`label_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - --- 表 test-lib.func_result 结构 -CREATE TABLE IF NOT EXISTS `func_result` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `sub_case_name` varchar(128) NOT NULL COMMENT 'tone job名称', - `sub_case_result` enum('SUCCESS','FAIL','SKIP') NOT NULL COMMENT '功能结果', - `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', - `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', - `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', - `task_id` int(11) NOT NULL COMMENT '测试方案id', - `current` json DEFAULT NULL, - `expect` json DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `ix_func_result_tone_suite_id` (`tone_suite_id`), - KEY `ix_func_result_task_id` (`task_id`), - KEY `ix_func_result_tone_case_id` (`tone_case_id`), - KEY `ix_func_result_tone_job_id` (`tone_job_id`) -) ENGINE=InnoDB AUTO_INCREMENT=479 DEFAULT CHARSET=utf8; - --- 表 test-lib.outline 结构 -CREATE TABLE IF NOT EXISTS `outline` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '测试大纲文件名', - `title` varchar(128) NOT NULL COMMENT '测试大纲的标题', - `owner` varchar(16) NOT NULL COMMENT '测试大纲负责人', - `tid` varchar(256) NOT NULL COMMENT 'oss文件地址', - `remark` varchar(64) DEFAULT NULL COMMENT '测试大纲备注描述信息', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; - --- 表 test-lib.perf_result 结构 -CREATE TABLE IF NOT EXISTS `perf_result` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `metric` varchar(128) NOT NULL COMMENT '指标名称', - `test_value` varchar(64) DEFAULT NULL COMMENT '测试值', - `cv_value` varchar(64) DEFAULT NULL COMMENT 'cv值', - `max_value` varchar(64) DEFAULT NULL COMMENT '最大值', - `min_value` varchar(64) DEFAULT NULL COMMENT '最小值', - `unit` varchar(64) DEFAULT NULL COMMENT '测试单位', - `track_result` enum('NA','INVALID','NORMAL','DECLINE','INCREASE') NOT NULL COMMENT '跟踪结果', - `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', - `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', - `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', - `task_id` int(11) NOT NULL COMMENT '测试方案id', - PRIMARY KEY (`id`), - KEY `ix_perf_result_task_id` (`task_id`), - KEY `ix_perf_result_tone_case_id` (`tone_case_id`), - KEY `ix_perf_result_tone_suite_id` (`tone_suite_id`), - KEY `ix_perf_result_tone_job_id` (`tone_job_id`) -) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; - --- 表 test-lib.plan 结构 -CREATE TABLE IF NOT EXISTS `plan` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `title` varchar(64) NOT NULL COMMENT '测试方案名称', - `req_id` int(11) DEFAULT NULL COMMENT '测试需求id', - `req_title` varchar(128) DEFAULT NULL COMMENT '测试需求标题', - `content` json DEFAULT NULL COMMENT '测试方案内容', - `status` varchar(16) NOT NULL COMMENT '测试方案阶段状态', - `cases` varchar(256) DEFAULT NULL COMMENT '测试用例,多个使用","隔开', - `tasks` varchar(256) DEFAULT NULL COMMENT '测试任务,多个使用","隔开', - `reviewers` varchar(256) NOT NULL COMMENT '方案评审人列表', - `owner` varchar(256) NOT NULL COMMENT '测试需求的负责人,多个以,隔开', - `report` tinyint(1) NOT NULL COMMENT '测试报告是否已生成', - PRIMARY KEY (`id`), - UNIQUE KEY `title` (`title`) -) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8; - --- 表 test-lib.plan_review 结构 -CREATE TABLE IF NOT EXISTS `plan_review` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `plan_id` int(11) NOT NULL COMMENT '测试方案id', - `reviewer` varchar(32) NOT NULL COMMENT '测试需方案的评审人', - `status` varchar(16) NOT NULL COMMENT '评审状态', - `desc` varchar(512) DEFAULT NULL COMMENT '评审内容', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - --- 表 test-lib.product_category 结构 -CREATE TABLE IF NOT EXISTS `product_category` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '大类名称', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; - --- 表 test-lib.product_plan 结构 -CREATE TABLE IF NOT EXISTS `product_plan` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `test_product_id` int(11) NOT NULL COMMENT '测试产品id', - `plan_id` int(11) NOT NULL COMMENT '测试产品实际复制执行的plan id', - `executor` varchar(256) NOT NULL COMMENT '测试产品执行人', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; - --- 表 test-lib.requirement 结构 -CREATE TABLE IF NOT EXISTS `requirement` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `title` varchar(128) NOT NULL COMMENT '测试需求标题', - `outline_id` int(11) DEFAULT NULL COMMENT '测试大纲id', - `outline_title` varchar(64) DEFAULT NULL COMMENT '测试大纲标题', - `content` json NOT NULL COMMENT '测试需求的描述内容', - `status` varchar(16) NOT NULL COMMENT '测试需求阶段', - `owner` varchar(16) NOT NULL COMMENT '测试需求的创建人', - `assignee` varchar(256) NOT NULL COMMENT '测试需求的指派人,多个以,隔开', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; - --- 表 test-lib.task 结构 -CREATE TABLE IF NOT EXISTS `task` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '任务名称', - `status` varchar(16) NOT NULL COMMENT '任务执行状态', - `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试任务执行方式', - `owner` varchar(256) NOT NULL COMMENT '任务执行人', - `plan_id` int(11) NOT NULL COMMENT '测试方案id', - `plan_title` varchar(256) NOT NULL COMMENT '测试方案标题', - `cases` varchar(256) NOT NULL COMMENT '测试用例,多个使用,隔开', - `desc` varchar(256) DEFAULT NULL COMMENT '备注', - `run_result` json DEFAULT NULL COMMENT '手动用例执行结果', - `config` json DEFAULT NULL COMMENT '测试任务配置', - `device_id` int(11) DEFAULT NULL COMMENT '测试设备ID', - `device_ip` varchar(256) DEFAULT NULL COMMENT '测试机器IP', - `workspace` varchar(128) NOT NULL COMMENT 'tone workspace', - `project` varchar(128) NOT NULL COMMENT 'tone project', - `job_type` varchar(128) NOT NULL COMMENT 'tone job type', - `test_type` varchar(32) DEFAULT 'others' COMMENT '测试任务类型', - `cluster` varchar(256) DEFAULT NULL COMMENT '测试机器集群名称', - `tags` varchar(256) DEFAULT NULL COMMENT '测试机器标签', - `tsn` varchar(256) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `ix_task_plan_id` (`plan_id`) -) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8; - --- 表 test-lib.test_product 结构 -CREATE TABLE IF NOT EXISTS `test_product` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '测试产品名称', - `category_id` int(11) NOT NULL COMMENT '大类id', - `origin_plan_id` int(11) NOT NULL COMMENT '测试产品对应的plan id', - `desc` varchar(256) DEFAULT NULL COMMENT '产品描述', - `test_method` varchar(256) DEFAULT NULL COMMENT '测试方法', - `test_requirement` varchar(256) DEFAULT NULL COMMENT '测试要求', - `need_config` tinyint(1) DEFAULT NULL COMMENT '是否扩展配置', - `owner` varchar(256) NOT NULL DEFAULT '' COMMENT '测试产品创建人', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; - --- 表 test-lib.test_suite 结构 -CREATE TABLE IF NOT EXISTS `test_suite` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(128) NOT NULL COMMENT '测试套名称', - `creator` varchar(64) NOT NULL COMMENT '测试套的创建人员', - PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`) -) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; - --- 表 test-lib.tone_case 结构 -CREATE TABLE IF NOT EXISTS `tone_case` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `tone_case_id` int(11) NOT NULL COMMENT 'tone用例ID', - `tone_case_name` varchar(256) NOT NULL COMMENT 'tone用例名称', - `suite_id` int(11) NOT NULL COMMENT 'suite ID', - `suite_name` varchar(256) NOT NULL COMMENT 'suite用例名称', - `test_type` varchar(64) DEFAULT NULL COMMENT '测试类型', - PRIMARY KEY (`id`), - KEY `ix_tone_case_tone_case_name` (`tone_case_name`), - KEY `ix_tone_case_suite_id` (`suite_id`), - KEY `ix_tone_case_suite_name` (`suite_name`) -) ENGINE=InnoDB AUTO_INCREMENT=603 DEFAULT CHARSET=utf8; - --- 表 test-lib.tone_job 结构 -CREATE TABLE IF NOT EXISTS `tone_job` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(100) NOT NULL COMMENT 'tone job名称', - `state` enum('PENDING','RUNNING','SUCCESS','FAIL','STOP','SKIP') NOT NULL COMMENT 'tone job状态', - `test_type` enum('FUNCTIONAL','PERFORMANCE') NOT NULL COMMENT '测试类型', - `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', - `tone_job_link` varchar(100) DEFAULT '' COMMENT 'tone job链接', - `task_id` int(11) NOT NULL COMMENT '测试方案id', - `server_info` json DEFAULT NULL COMMENT '存储tone job的机器信息', - PRIMARY KEY (`id`), - KEY `ix_tone_job_tone_job_id` (`tone_job_id`), - KEY `ix_tone_job_task_id` (`task_id`) -) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8; - --- 表 test-lib.tone_sync_pull 结构 -CREATE TABLE IF NOT EXISTS `tone_sync_pull` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=76149 DEFAULT CHARSET=utf8; - --- 表 test-lib.tone_sync_push 结构 -CREATE TABLE IF NOT EXISTS `tone_sync_push` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - --- 表 test-lib.user 结构 -CREATE TABLE IF NOT EXISTS `user` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', - `nick_name` varchar(64) DEFAULT NULL COMMENT '用户昵称,具有唯一性', - `email` varchar(64) NOT NULL COMMENT '用户邮箱', - `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', - `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', - PRIMARY KEY (`id`), - UNIQUE KEY `nick_name` (`nick_name`), - KEY `ix_user_user_name` (`user_name`) -) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; - --- 表 test-lib.user_open_source 结构 -CREATE TABLE IF NOT EXISTS `user_open_source` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', - `nick_name` varchar(64) NOT NULL COMMENT '用户昵称,具有唯一性', - `email` varchar(64) NOT NULL COMMENT '用户邮箱', - `password` varchar(64) NOT NULL COMMENT '用户密码,前端对密码md5加密后的值', - `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', - `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', - `token` varchar(256) NOT NULL COMMENT 'api访问凭证', - PRIMARY KEY (`id`), - UNIQUE KEY `nick_name` (`nick_name`), - UNIQUE KEY `email` (`email`), - KEY `ix_user_open_source_token` (`token`(255)) -) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; - --- 表 test-lib.user_role_op_record 结构 -CREATE TABLE IF NOT EXISTS `user_role_op_record` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `applicant` varchar(64) NOT NULL COMMENT '申请人name', - `applicant_id` int(11) NOT NULL COMMENT '申请人ID', - `apply_reason` varchar(512) DEFAULT NULL COMMENT '申请理由', - `signer` varchar(64) DEFAULT NULL COMMENT '评审人name', - `has_review` tinyint(1) NOT NULL COMMENT '是否已经审核', - `review_result` enum('INIT','PASS','FAIL') NOT NULL COMMENT '审核结果', - `review_reason` varchar(512) DEFAULT NULL COMMENT '评审意见', - `method` enum('APPROVE','UPGRADE','DOWNGRADE','DELETE') NOT NULL COMMENT '操作方式', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; - -/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; -/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; - - -``` -
- -### b.TestLib 服务依赖 -### c. clone test-lib代码到~/tone/code目录下 -```shell -git clone --single-branch --branch master https://gitee.com/anolis/testlib.git ~/tone/code/testlib -``` -### d.增加docker-compose配置 -```yaml -# docker-compose.yaml service下增加test-lib - test-lib: - build: - context: code/testlib/ - dockerfile: Dockerfile - args: - APP_NAME: test-lib - ENV: daily - image: test-lib:latest - ports: - - "8005:8005" - depends_on: - - mysql - - redis - environment: - <<: *common-variables - # db - db_url: mysql+aiomysql://${db_user}:{db_password}@mysql:3306/test-lib - # redis - redis_url: redis://:${redis_password}@redis:6379/10 - # app - tone_host: http://${server_ip}:8080/ - tone_token: tone_token - tone_user_name: tone_user_name - main_domain: http://${server_ip}:8005 - oss_url: http://${server_ip}:8005 -``` -#### e.重启服务 -```shell -docker-compose -f ~/tone/docker-compose.yaml up --build -d -``` -## 7. 独立部署 FAQ -https://tone.openanolis.cn/help_doc/12 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" deleted file mode 100644 index b09df7d0..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" +++ /dev/null @@ -1,70 +0,0 @@ -# 一级标题 -## 二级标题 -### 三级标题 -**粗体文本** - -__cuti__ - -*斜体文本* - -_xieti_ - -下划线 - -~~删除线~~ - -上标:Xy - -下标:An - -> 引用文本 -- 无序列表项1 - - 第二层 -- 无序列表项2 -* * * -1. 有序列表项1 -2. 有序列表项2 ---- -[链接文本](https://gitee.com/suli01/community/edit/master/sig/T-One/content/%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97/%E7%94%A8%E6%88%B7%E8%81%86%E5%90%AC/test.md) - -链接名称 - -'''python -def hello_world(): - print("Hello, world!") - -![示例图片](https://pic.rmb.bdstatic.com/bjh/gallery/03e17cba710868d9153176b50a5fca0d1090.jpeg#pic_center=100x100) - -| 列1 | 列2 | 列3 | -| --- | --- | --- | -| 单元格1 | 单元格2 | 单元格3 | -| 单元格4 | 单元格5 | 单元格6 | - - -| 左对齐 | 居中对齐 | 右对齐 | -|:-----|:------:|------:| -| 文本 | 文本 | 文本 | - -
图片名称
- - - - - - - - - - - - - -
值班人员星期一星期二星期三
张三李四王五
- -- [ ] :待完成事项 - -- [x] :已完成事项 - -
- 图片名称 -
diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" deleted file mode 100644 index d0a3a7f0..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" +++ /dev/null @@ -1,2 +0,0 @@ -# hello -![测试外链图片](https://up.enterdesk.com/2021/edpic/0a/13/7a/0a137aaa28f48af0349cee1e568c0a57_1.jpg) \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" deleted file mode 100644 index e5d110a5..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" +++ /dev/null @@ -1,2 +0,0 @@ -# hello, 欢迎来到聆听 .md -## 阿斯顿发射点 \ No newline at end of file -- Gitee From c4989f12ce3b73d15299a6cb1e258b9cb1409722 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Mon, 20 Jan 2025 16:59:13 +0800 Subject: [PATCH 112/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9548-?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../000000000130_anolis.jpg" | Bin 0 -> 47154 bytes .../T-One\346\246\202\350\277\260.md" | 30 + .../assets/Dingtalk_20240614165831.jpg" | Bin 0 -> 6459 bytes .../assets/jiagou.jpeg" | Bin 0 -> 366652 bytes .../atone\351\203\250\347\275\262.md" | 615 ++++++++++++++++++ .../test.md" | 70 ++ ...26\351\223\276\345\233\276\347\211\207.md" | 2 + .../\350\201\206\345\220\254.md" | 2 + .../test1.md" | 73 +++ .../tone\351\203\250\347\275\262.md" | 615 ++++++++++++++++++ .../test.md" | 70 ++ ...26\351\223\276\345\233\276\347\211\207.md" | 2 + .../\350\201\206\345\220\254.md" | 2 + 13 files changed, 1481 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/000000000130_anolis.jpg" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/T-One\346\246\202\350\277\260.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/assets/Dingtalk_20240614165831.jpg" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/assets/jiagou.jpeg" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/atone\351\203\250\347\275\262.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/test.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\350\201\206\345\220\254.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/test1.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/tone\351\203\250\347\275\262.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/000000000130_anolis.jpg" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/000000000130_anolis.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..25e606c9c5d28fccaf9f6caa351e3720570e4162 GIT binary patch literal 47154 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 literal 0 HcmV?d00001 diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/T-One\346\246\202\350\277\260.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/T-One\346\246\202\350\277\260.md" new file mode 100644 index 00000000..74f3dbc4 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/T-One\346\246\202\350\277\260.md" @@ -0,0 +1,30 @@ +### T- One是什么 + T-One是一站式的自动化质量协作平台;打通了测试计划、测试准备、测试执行、测试分析、测试报告、覆盖率检测、智能Bisect,环境服务等流程的闭环,为社区研发提供一站式质量服务。 +​ + +### 平台架构 +![](assets/jiagou.jpeg) + +### 核心特点 +- 一站式质量平台:平台打通了测试准备、测试执行、测试分析、测试计划、测试报告、覆盖率检测、智能Bisect、智能巡检等流程全闭环,为社区研发提供一站式测试支撑。 + - 支持多CPU混合架构(x86、arm、loogarch、risc-v) + - 支持多操作系统类型(龙蜥OS、centos、debian等) + - 支持复杂环境测试(企业内网、独立隔离、弹性云虚拟机/容器、应用集群及多种混合环境) + +- 质量协作能力:通过分布式的业务架构和独立租户空间能力,支持多企业、多团队的质量协作模式。 +- 数据分析能力:平台提供了时序分析、对比分析,以及聚合生成测试报告的能力,在大量测试之后对数据进行分析以发现软件问题。 +- 开源软件包CI服务:社区开发者可以将自己的软件包(可来自代码托管平台如github/gitee/codeup等)注册到Testfarm, 平台会监控软件包的代码变更,一旦有变更则会立即触发测试,并将测试结果通知开发者,方便开源软件包引入。 +- 开发者资源服务:社区开发者可以reserve测试环境并登陆,方便在测试环境中进行测试及debug。 +- 缺陷定位诊断服务:对于发现的软件缺陷,平台可以提供了缺陷的自动化定位诊断能力,可以发现引入缺陷的commit地址。 + + +### 应用场景 +- 场景1:OS发布测试,每次AnolisOS的发布,社区测试团队会根据发布测试策略进行大规模测试,保障产品发布质量,外部用户可以在Testfarm查看发布测试数据。 +- 场景2:开源软件包CI,社区开发者可以将软件包注册到平台,平台会自动监控软件包的变更,一旦发生变更会立即进行测试并推送测试结果。 +- 场景3:自定义测试,社区开发者根据自己的需求可以在T-One平台进行在线测试,或者使用命令行测试。 +- 场景4:离线测试,对于网络不可达的测试环境,用户可以使用离线测试模式测试并上传数据。 +- 场景5:独立部署,外部用户也可以在自己环境下独立部署平台,测试并上传数据到Testfarm。 +- 场景6:登陆测试环境,社区开发者可以根据需要reserve测试环境登陆进行测试及debug。 +- 场景7:缺陷定位诊断,一旦测试出缺陷,平台会自动诊断缺陷引入的commit。 + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/assets/Dingtalk_20240614165831.jpg" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/assets/Dingtalk_20240614165831.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..925bf2945891170613821e8e7dbc9e4206d17c8d GIT binary patch literal 6459 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

}E@Hj0_{W?|f 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

FG!grkAXdJNt$uIvKqhcJq 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 z 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[WR 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ⅅQKHz};_SkLL8?V2PS1YROEdQ3~XQxay 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ċXdTaw*%m;m5ZDbWgJ_XqbT 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�R;g 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

ddeE*SWKS`wD5C=M^ov`A=E-e{k-D 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 literal 0 HcmV?d00001 diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/atone\351\203\250\347\275\262.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/atone\351\203\250\347\275\262.md" new file mode 100644 index 00000000..12f85c9b --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/atone\351\203\250\347\275\262.md" @@ -0,0 +1,615 @@ +# 部署说明 + +> 此文档以开源版本 T-One 最小单元部署举例说明,不保障系统的高可用及性能等 +> +> 若期望大规模集群化部署可以联系SIG项目组进行具体讨论。 +> 若遇到问题请参照文未的 FAQ 文档,或进 SIG 群联系我们。 + +**组件说明**: T-One 包含多个自研组件和几个开源组件,此文档以开源版本 T-One 最小单元部署举例说明。 + +* 自研组件:tone-web、tone-agent-proxy、tone-agent、tone-runner等。 +* 开源组件:mysql、kafka、redis、zookeeper + +**机器要求**: + +* 硬件要求:推荐使用 8c16g 以上规格机器。 +* OS 要求:推荐使用 Anolis OS 系统进行部署( 暂不支持debian、ubuntu等)。 + +**部署说明**: +- 主要分为安装环境、项目构建、项目启动、数据初始化等几个步骤。 +- 该文档以x86_64机器为例, 如果您的部署机器为其他arch类型的机器,则需要将docker-compose.yaml中指定的第三方开源组件镜像更换成对应的镜像源。 +- 可以自己指定安装目录,该文档以 ~/tone目录为例(推荐)。 + +# 部署步骤 +> 后续步骤以 Anolis OS 8.6 环境为示例进行行详细说明。 + +## 1. 环境准备 + +### a. 安装docker +``` + yum -y install yum-utils + yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo + yum install -y docker-ce # 若出错:yum install -y docker-ce --nobest --allowerasing + + # 启动docker + systemctl enable docker + systemctl start docker + systemctl status docker +``` +### b. 配置docker源 +``` + vim /etc/docker/daemon.json + { + "registry-mirrors": [ + "https://6kx4zyno.mirror.aliyuncs.com", + "https://docker.mirrors.ustc.edu.cn", + "http://hub-mirror.c.163.com", + "https://registry.docker-cn.com"] + } + systemctl restart docker + # 建议使用国内镜像源。 阿里云: https://6kx4zyno.mirror.aliyuncs.com,网易: http://hub-mirror.c.163.com +``` +### c. 安装docker-compose +``` + pip3 install --upgrade pip + pip3 install docker-compose + docker-compose --version +``` + +## 2. 项目构建 + +### a. 下载项目源码 +```shell +yum install -y git + +git clone --single-branch --branch master https://gitee.com/anolis/tone-web.git ~/tone/code/tone-web +git clone --single-branch --branch master https://gitee.com/anolis/tone-runner.git ~/tone/code/tone-runner +git clone --single-branch --branch master https://gitee.com/anolis/tone-agent-proxy.git ~/tone/code/tone-agent-proxy +git clone --single-branch --branch master https://gitee.com/anolis/tone-storage.git ~/tone/code/tone-storage +``` +下载后的目录结构: +``` +~/tone/code/ + ├── tone-web + ├── tone-runner + ├── tone-agent-proxy + └── tone-storage +``` + +### b. 集成前端代码 +```shell +# 下载前端代码包: +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/tone-front-latest.zip +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/toneagent-front-latest.zip +# 安装unzip命令 +yum install -y unzip +# 解压到指定目录 +unzip -j -o tone-front-latest.zip -d ~/tone/code/tone-web/static/front/ +unzip -j -o toneagent-front-latest.zip -d ~/tone/code/tone-agent-proxy/static/front/ +``` + +## 3. 项目配置 +### a. 下载 docker-compose.yaml +```shell +cd ~/tone +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/docker-compose.yaml +``` + +### b. 设置并替换变量 +执行以下脚本(需手动替换`必填的`变量): +```shell +# 部署机外网IP地址(必填) +server_ip= + +# 账号密码(必填) +db_password= +redis_password= +tone_storage_password= + +# 镜像版本标签(非必改、默认latest) +version_tag=latest + +# token(非必改、可自动生成) +toneagent_access_key=$(uuidgen) +toneagent_secret_key=$(uuidgen) +admin_urls_token=$(uuidgen) +pub_api_token=$(uuidgen) + +sed -i "s/var_db_password/${db_password}/g" docker-compose.yaml +sed -i "s/var_redis_password/${redis_password}/g" docker-compose.yaml +sed -i "s/var_tone_storage/${tone_storage_password}/g" docker-compose.yaml +sed -i "s/var_toneagent_access_key/${toneagent_access_key}/g" docker-compose.yaml +sed -i "s/var_toneagent_secret_key/${toneagent_secret_key}/g" docker-compose.yaml +sed -i "s/var_admin_urls_token/${admin_urls_token}/g" docker-compose.yaml +sed -i "s/var_pub_api_token/${pub_api_token}/g" docker-compose.yaml +sed -i "s/var_version_tag/${version_tag}/g" docker-compose.yaml +sed -i "s/var_server_ip/${server_ip}/g" docker-compose.yaml +``` + +### c. 启动docker-compose +```shell +docker-compose -f ~/tone/docker-compose.yaml up --build -d +# 注:如代码有更新或首次部署,需要加 --build 参数才会自动重新打包镜像 +``` + +## 4. 数据初始化 +### a.初始化db +* 进入`mysql` docker 镜像中,`docker exec -it {数据库容器ID} bash` +* 连接数据库:`mysql -h 127.0.0.1 -P 3306 -u root -p` +* 创建 `T-One` 数据库 `tone-db`,`ToneAgent` 数据库 `toneagent-db` + ``` + CREATE DATABASE `tone-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; + CREATE DATABASE `toneagent-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; + ``` + 也可以直接通过 mysql 可视化界面初始化数据库 + +### b.初始化 `T-One` 数据 +浏览器或者curl命令请求接口($admin_urls_token可在docker-compose配置里查看或更改) +```shell +curl -s "http://${server_ip}:8080/admin/migrate/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8080/admin/init_data/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8080/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." +curl -s "http://${server_ip}:8081/admin/migrate/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8081/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." +curl -s "http://${server_ip}:8081/admin/import_access_token/?token=${admin_urls_token}" +``` + +### c. `T-One` 关联依赖配置 +**系统执行任务还需对以下配置进行设置** + +- 配置 `T-One` 测试用例 +- 配置`T-One` 测试机器 +- 配置 `ToneAgent` `token` + - 在 ToneAgent 系统-账号管理中增加一组 token + - 更改 docker-compose 配置中的toneagent_access_key和toneagent_secret_key + +## 5. 验证 +使用浏览器打开链接查看: `T-One` 页面:`http://{host}:8080` `ToneAgent` 管理页面:`http://{host}:8081` + +## 6. T-One 多生态使用 +`T-One` + `TestLib` +### a. 创建 `TestLib` 数据库 +- 进入 mysql docker 镜像,docker exec -it {数据库容器ID} bash +- 连接数据库:mysql -h 127.0.0.1 -P 3306 -u root -p +- 创建 TestLib 数据库 testlib + + CREATE DATABASE \`test-lib\` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; +- 创建 TestLib 数据库表 +### testlib数据库初始化 +

+ 点击展开/折叠脚本 + +```shell + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; + +-- 表 test-lib.case 结构 +CREATE TABLE IF NOT EXISTS `case` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试用例名称', + `creator` varchar(64) NOT NULL COMMENT '负责人', + `type` enum('FUNCTIONAL','PERFORMANCE','STRESS','LOAD','SECURITY','COMPATIBILITY','OTHERS') NOT NULL COMMENT '测试用例类型', + `priority` enum('PRIORITY_0','PRIORITY_1','PRIORITY_2','PRIORITY_3') NOT NULL COMMENT '测试用例的优先级', + `suite_name` varchar(128) DEFAULT NULL COMMENT '测试套名称', + `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试用例执行方式,手动、自动', + `run_model` enum('SINGLE','CLUSTER') NOT NULL COMMENT '测试用例运行模式,单机、集群', + `is_available` tinyint(1) NOT NULL COMMENT '测试用例是否可用', + `tone_case` varchar(128) DEFAULT NULL COMMENT 'T-One测试用例,当run_method为自动的时候生效', + `device_type` varchar(128) DEFAULT 'unlimit' COMMENT '设备类型,可多选,默认支持所有设备', + `device_arch` varchar(256) NOT NULL COMMENT '设备架构类型,可多选,默认支撑所有类型', + `labels` varchar(256) DEFAULT NULL COMMENT '设备标签,多个用,隔开', + `desc` varchar(512) DEFAULT NULL COMMENT '用例描述', + `pre_condition` varchar(512) DEFAULT NULL COMMENT '前置条件', + `steps` json DEFAULT NULL COMMENT '操作步骤', + `custom_fields` json DEFAULT NULL COMMENT '测试用例扩展属性', + `parent` int(11) NOT NULL COMMENT '测试用例分类节点', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`), + KEY `ix_case_suite_name` (`suite_name`) +) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_label 结构 +CREATE TABLE IF NOT EXISTS `case_label` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '用例标签', + `creator` varchar(64) NOT NULL COMMENT '标签创建人', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_label_map 结构 +CREATE TABLE IF NOT EXISTS `case_label_map` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `label_name` varchar(64) NOT NULL COMMENT '用例名称', + `case_id` int(11) NOT NULL COMMENT '用例ID', + PRIMARY KEY (`id`), + KEY `ix_case_label_map_label_name` (`label_name`) +) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_tree 结构 +CREATE TABLE IF NOT EXISTS `case_tree` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(16) NOT NULL COMMENT '用例结构树节点名称', + `parent` int(11) NOT NULL COMMENT '父节点id', + `level` int(11) NOT NULL COMMENT '树结构的深度', + `path` varchar(128) NOT NULL COMMENT '模块完整路径', + `children_nums` int(11) NOT NULL COMMENT '子节点数量', + PRIMARY KEY (`id`), + KEY `ix_case_tree_path` (`path`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device 结构 +CREATE TABLE IF NOT EXISTS `device` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '设备名称', + `arch` enum('X86','ARCH64','RISCV','LOONGARCH','NOARCH','OTHERS') NOT NULL COMMENT '设备架构', + `ip` varchar(16) NOT NULL COMMENT '设备ip', + `type` enum('UNLIMIT','VM','DOCKER','PHYSICS') NOT NULL COMMENT '设备类型', + `sn` varchar(16) DEFAULT NULL COMMENT '设备序号', + `status` tinyint(1) NOT NULL COMMENT '设备是否可用', + `label` json DEFAULT NULL COMMENT '设备标签列表数组', + `owner` varchar(256) NOT NULL COMMENT '设备负责人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device_label 结构 +CREATE TABLE IF NOT EXISTS `device_label` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '设备标签名称', + `color` varchar(32) NOT NULL COMMENT '设备标签颜色', + PRIMARY KEY (`id`), + UNIQUE KEY `ix_device_label_name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device_label_relationship 结构 +CREATE TABLE IF NOT EXISTS `device_label_relationship` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `label_id` int(11) NOT NULL COMMENT '机器Label id', + `device_id` int(11) NOT NULL COMMENT '机器Label id', + `is_delete` tinyint(1) DEFAULT NULL COMMENT '对应关系是否删除', + PRIMARY KEY (`id`), + KEY `ix_device_label_relationship_device_id` (`device_id`), + KEY `ix_device_label_relationship_label_id` (`label_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.func_result 结构 +CREATE TABLE IF NOT EXISTS `func_result` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `sub_case_name` varchar(128) NOT NULL COMMENT 'tone job名称', + `sub_case_result` enum('SUCCESS','FAIL','SKIP') NOT NULL COMMENT '功能结果', + `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', + `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + `current` json DEFAULT NULL, + `expect` json DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ix_func_result_tone_suite_id` (`tone_suite_id`), + KEY `ix_func_result_task_id` (`task_id`), + KEY `ix_func_result_tone_case_id` (`tone_case_id`), + KEY `ix_func_result_tone_job_id` (`tone_job_id`) +) ENGINE=InnoDB AUTO_INCREMENT=479 DEFAULT CHARSET=utf8; + +-- 表 test-lib.outline 结构 +CREATE TABLE IF NOT EXISTS `outline` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试大纲文件名', + `title` varchar(128) NOT NULL COMMENT '测试大纲的标题', + `owner` varchar(16) NOT NULL COMMENT '测试大纲负责人', + `tid` varchar(256) NOT NULL COMMENT 'oss文件地址', + `remark` varchar(64) DEFAULT NULL COMMENT '测试大纲备注描述信息', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + +-- 表 test-lib.perf_result 结构 +CREATE TABLE IF NOT EXISTS `perf_result` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `metric` varchar(128) NOT NULL COMMENT '指标名称', + `test_value` varchar(64) DEFAULT NULL COMMENT '测试值', + `cv_value` varchar(64) DEFAULT NULL COMMENT 'cv值', + `max_value` varchar(64) DEFAULT NULL COMMENT '最大值', + `min_value` varchar(64) DEFAULT NULL COMMENT '最小值', + `unit` varchar(64) DEFAULT NULL COMMENT '测试单位', + `track_result` enum('NA','INVALID','NORMAL','DECLINE','INCREASE') NOT NULL COMMENT '跟踪结果', + `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', + `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + PRIMARY KEY (`id`), + KEY `ix_perf_result_task_id` (`task_id`), + KEY `ix_perf_result_tone_case_id` (`tone_case_id`), + KEY `ix_perf_result_tone_suite_id` (`tone_suite_id`), + KEY `ix_perf_result_tone_job_id` (`tone_job_id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +-- 表 test-lib.plan 结构 +CREATE TABLE IF NOT EXISTS `plan` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `title` varchar(64) NOT NULL COMMENT '测试方案名称', + `req_id` int(11) DEFAULT NULL COMMENT '测试需求id', + `req_title` varchar(128) DEFAULT NULL COMMENT '测试需求标题', + `content` json DEFAULT NULL COMMENT '测试方案内容', + `status` varchar(16) NOT NULL COMMENT '测试方案阶段状态', + `cases` varchar(256) DEFAULT NULL COMMENT '测试用例,多个使用","隔开', + `tasks` varchar(256) DEFAULT NULL COMMENT '测试任务,多个使用","隔开', + `reviewers` varchar(256) NOT NULL COMMENT '方案评审人列表', + `owner` varchar(256) NOT NULL COMMENT '测试需求的负责人,多个以,隔开', + `report` tinyint(1) NOT NULL COMMENT '测试报告是否已生成', + PRIMARY KEY (`id`), + UNIQUE KEY `title` (`title`) +) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8; + +-- 表 test-lib.plan_review 结构 +CREATE TABLE IF NOT EXISTS `plan_review` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `plan_id` int(11) NOT NULL COMMENT '测试方案id', + `reviewer` varchar(32) NOT NULL COMMENT '测试需方案的评审人', + `status` varchar(16) NOT NULL COMMENT '评审状态', + `desc` varchar(512) DEFAULT NULL COMMENT '评审内容', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.product_category 结构 +CREATE TABLE IF NOT EXISTS `product_category` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '大类名称', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- 表 test-lib.product_plan 结构 +CREATE TABLE IF NOT EXISTS `product_plan` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `test_product_id` int(11) NOT NULL COMMENT '测试产品id', + `plan_id` int(11) NOT NULL COMMENT '测试产品实际复制执行的plan id', + `executor` varchar(256) NOT NULL COMMENT '测试产品执行人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + +-- 表 test-lib.requirement 结构 +CREATE TABLE IF NOT EXISTS `requirement` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `title` varchar(128) NOT NULL COMMENT '测试需求标题', + `outline_id` int(11) DEFAULT NULL COMMENT '测试大纲id', + `outline_title` varchar(64) DEFAULT NULL COMMENT '测试大纲标题', + `content` json NOT NULL COMMENT '测试需求的描述内容', + `status` varchar(16) NOT NULL COMMENT '测试需求阶段', + `owner` varchar(16) NOT NULL COMMENT '测试需求的创建人', + `assignee` varchar(256) NOT NULL COMMENT '测试需求的指派人,多个以,隔开', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; + +-- 表 test-lib.task 结构 +CREATE TABLE IF NOT EXISTS `task` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '任务名称', + `status` varchar(16) NOT NULL COMMENT '任务执行状态', + `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试任务执行方式', + `owner` varchar(256) NOT NULL COMMENT '任务执行人', + `plan_id` int(11) NOT NULL COMMENT '测试方案id', + `plan_title` varchar(256) NOT NULL COMMENT '测试方案标题', + `cases` varchar(256) NOT NULL COMMENT '测试用例,多个使用,隔开', + `desc` varchar(256) DEFAULT NULL COMMENT '备注', + `run_result` json DEFAULT NULL COMMENT '手动用例执行结果', + `config` json DEFAULT NULL COMMENT '测试任务配置', + `device_id` int(11) DEFAULT NULL COMMENT '测试设备ID', + `device_ip` varchar(256) DEFAULT NULL COMMENT '测试机器IP', + `workspace` varchar(128) NOT NULL COMMENT 'tone workspace', + `project` varchar(128) NOT NULL COMMENT 'tone project', + `job_type` varchar(128) NOT NULL COMMENT 'tone job type', + `test_type` varchar(32) DEFAULT 'others' COMMENT '测试任务类型', + `cluster` varchar(256) DEFAULT NULL COMMENT '测试机器集群名称', + `tags` varchar(256) DEFAULT NULL COMMENT '测试机器标签', + `tsn` varchar(256) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ix_task_plan_id` (`plan_id`) +) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8; + +-- 表 test-lib.test_product 结构 +CREATE TABLE IF NOT EXISTS `test_product` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试产品名称', + `category_id` int(11) NOT NULL COMMENT '大类id', + `origin_plan_id` int(11) NOT NULL COMMENT '测试产品对应的plan id', + `desc` varchar(256) DEFAULT NULL COMMENT '产品描述', + `test_method` varchar(256) DEFAULT NULL COMMENT '测试方法', + `test_requirement` varchar(256) DEFAULT NULL COMMENT '测试要求', + `need_config` tinyint(1) DEFAULT NULL COMMENT '是否扩展配置', + `owner` varchar(256) NOT NULL DEFAULT '' COMMENT '测试产品创建人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +-- 表 test-lib.test_suite 结构 +CREATE TABLE IF NOT EXISTS `test_suite` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(128) NOT NULL COMMENT '测试套名称', + `creator` varchar(64) NOT NULL COMMENT '测试套的创建人员', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_case 结构 +CREATE TABLE IF NOT EXISTS `tone_case` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `tone_case_id` int(11) NOT NULL COMMENT 'tone用例ID', + `tone_case_name` varchar(256) NOT NULL COMMENT 'tone用例名称', + `suite_id` int(11) NOT NULL COMMENT 'suite ID', + `suite_name` varchar(256) NOT NULL COMMENT 'suite用例名称', + `test_type` varchar(64) DEFAULT NULL COMMENT '测试类型', + PRIMARY KEY (`id`), + KEY `ix_tone_case_tone_case_name` (`tone_case_name`), + KEY `ix_tone_case_suite_id` (`suite_id`), + KEY `ix_tone_case_suite_name` (`suite_name`) +) ENGINE=InnoDB AUTO_INCREMENT=603 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_job 结构 +CREATE TABLE IF NOT EXISTS `tone_job` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(100) NOT NULL COMMENT 'tone job名称', + `state` enum('PENDING','RUNNING','SUCCESS','FAIL','STOP','SKIP') NOT NULL COMMENT 'tone job状态', + `test_type` enum('FUNCTIONAL','PERFORMANCE') NOT NULL COMMENT '测试类型', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `tone_job_link` varchar(100) DEFAULT '' COMMENT 'tone job链接', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + `server_info` json DEFAULT NULL COMMENT '存储tone job的机器信息', + PRIMARY KEY (`id`), + KEY `ix_tone_job_tone_job_id` (`tone_job_id`), + KEY `ix_tone_job_task_id` (`task_id`) +) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_sync_pull 结构 +CREATE TABLE IF NOT EXISTS `tone_sync_pull` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=76149 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_sync_push 结构 +CREATE TABLE IF NOT EXISTS `tone_sync_push` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.user 结构 +CREATE TABLE IF NOT EXISTS `user` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', + `nick_name` varchar(64) DEFAULT NULL COMMENT '用户昵称,具有唯一性', + `email` varchar(64) NOT NULL COMMENT '用户邮箱', + `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', + `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', + PRIMARY KEY (`id`), + UNIQUE KEY `nick_name` (`nick_name`), + KEY `ix_user_user_name` (`user_name`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; + +-- 表 test-lib.user_open_source 结构 +CREATE TABLE IF NOT EXISTS `user_open_source` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', + `nick_name` varchar(64) NOT NULL COMMENT '用户昵称,具有唯一性', + `email` varchar(64) NOT NULL COMMENT '用户邮箱', + `password` varchar(64) NOT NULL COMMENT '用户密码,前端对密码md5加密后的值', + `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', + `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', + `token` varchar(256) NOT NULL COMMENT 'api访问凭证', + PRIMARY KEY (`id`), + UNIQUE KEY `nick_name` (`nick_name`), + UNIQUE KEY `email` (`email`), + KEY `ix_user_open_source_token` (`token`(255)) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; + +-- 表 test-lib.user_role_op_record 结构 +CREATE TABLE IF NOT EXISTS `user_role_op_record` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `applicant` varchar(64) NOT NULL COMMENT '申请人name', + `applicant_id` int(11) NOT NULL COMMENT '申请人ID', + `apply_reason` varchar(512) DEFAULT NULL COMMENT '申请理由', + `signer` varchar(64) DEFAULT NULL COMMENT '评审人name', + `has_review` tinyint(1) NOT NULL COMMENT '是否已经审核', + `review_result` enum('INIT','PASS','FAIL') NOT NULL COMMENT '审核结果', + `review_reason` varchar(512) DEFAULT NULL COMMENT '评审意见', + `method` enum('APPROVE','UPGRADE','DOWNGRADE','DELETE') NOT NULL COMMENT '操作方式', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; + + +``` +
+ +### b.TestLib 服务依赖 +### c. clone test-lib代码到~/tone/code目录下 +```shell +git clone --single-branch --branch master https://gitee.com/anolis/testlib.git ~/tone/code/testlib +``` +### d.增加docker-compose配置 +```yaml +# docker-compose.yaml service下增加test-lib + test-lib: + build: + context: code/testlib/ + dockerfile: Dockerfile + args: + APP_NAME: test-lib + ENV: daily + image: test-lib:latest + ports: + - "8005:8005" + depends_on: + - mysql + - redis + environment: + <<: *common-variables + # db + db_url: mysql+aiomysql://${db_user}:{db_password}@mysql:3306/test-lib + # redis + redis_url: redis://:${redis_password}@redis:6379/10 + # app + tone_host: http://${server_ip}:8080/ + tone_token: tone_token + tone_user_name: tone_user_name + main_domain: http://${server_ip}:8005 + oss_url: http://${server_ip}:8005 +``` +#### e.重启服务 +```shell +docker-compose -f ~/tone/docker-compose.yaml up --build -d +``` +## 7. 独立部署 FAQ +https://tone.openanolis.cn/help_doc/12 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/test.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/test.md" new file mode 100644 index 00000000..b09df7d0 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/test.md" @@ -0,0 +1,70 @@ +# 一级标题 +## 二级标题 +### 三级标题 +**粗体文本** + +__cuti__ + +*斜体文本* + +_xieti_ + +下划线 + +~~删除线~~ + +上标:Xy + +下标:An + +> 引用文本 +- 无序列表项1 + - 第二层 +- 无序列表项2 +* * * +1. 有序列表项1 +2. 有序列表项2 +--- +[链接文本](https://gitee.com/suli01/community/edit/master/sig/T-One/content/%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97/%E7%94%A8%E6%88%B7%E8%81%86%E5%90%AC/test.md) + +链接名称 + +'''python +def hello_world(): + print("Hello, world!") + +![示例图片](https://pic.rmb.bdstatic.com/bjh/gallery/03e17cba710868d9153176b50a5fca0d1090.jpeg#pic_center=100x100) + +| 列1 | 列2 | 列3 | +| --- | --- | --- | +| 单元格1 | 单元格2 | 单元格3 | +| 单元格4 | 单元格5 | 单元格6 | + + +| 左对齐 | 居中对齐 | 右对齐 | +|:-----|:------:|------:| +| 文本 | 文本 | 文本 | + +
图片名称
+ + + + + + + + + + + + + +
值班人员星期一星期二星期三
张三李四王五
+ +- [ ] :待完成事项 + +- [x] :已完成事项 + +
+ 图片名称 +
diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" new file mode 100644 index 00000000..d0a3a7f0 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" @@ -0,0 +1,2 @@ +# hello +![测试外链图片](https://up.enterdesk.com/2021/edpic/0a/13/7a/0a137aaa28f48af0349cee1e568c0a57_1.jpg) \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\350\201\206\345\220\254.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\350\201\206\345\220\254.md" new file mode 100644 index 00000000..e5d110a5 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\350\201\206\345\220\254.md" @@ -0,0 +1,2 @@ +# hello, 欢迎来到聆听 .md +## 阿斯顿发射点 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/test1.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/test1.md" new file mode 100644 index 00000000..bce7de80 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/test1.md" @@ -0,0 +1,73 @@ +*斜体文字* + +_斜体文字_ + +**粗体文字** + +__粗体文字__ + +***粗斜体文字*** + +___粗斜体文字___ + +*** +* * * +****** +- - - +------ + +~~删除线~~ + +带下划线文本 + +# 一级标题 + +## 二级标题 + +### 三级标题 + +#### 四级标题 + +##### 五级标题 + +###### 六级标题 +[链接](http://a.com) +![图片](http://url/a.png) +> 引用 +* 第一项 +* 第二项 +* 第三项 + ++ 第一项 ++ 第二项 ++ 第三项 + +- 第一项 +- 第二项 +- 第三项 +1. 第一项 +2. 第二项 +3. 第三项 + +1. 第一项: + - 第一项嵌套的第一个元素 + - 第一项嵌套的第二个元素 +2. 第二项: + - 第二项嵌套的第一个元素 + - 第二项嵌套的第二个元素 +水平线: + +--- +带反引号的“内联代码” +``` +# 代码块 +print '3 个反引号或' +print '缩进 4 个空格' +``` + +> 区块引用 +> Markdown教程 +> 学的不仅是技术更是梦想 + + +SDFGSDFGSDFGSDFG \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/tone\351\203\250\347\275\262.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/tone\351\203\250\347\275\262.md" new file mode 100644 index 00000000..12f85c9b --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/tone\351\203\250\347\275\262.md" @@ -0,0 +1,615 @@ +# 部署说明 + +> 此文档以开源版本 T-One 最小单元部署举例说明,不保障系统的高可用及性能等 +> +> 若期望大规模集群化部署可以联系SIG项目组进行具体讨论。 +> 若遇到问题请参照文未的 FAQ 文档,或进 SIG 群联系我们。 + +**组件说明**: T-One 包含多个自研组件和几个开源组件,此文档以开源版本 T-One 最小单元部署举例说明。 + +* 自研组件:tone-web、tone-agent-proxy、tone-agent、tone-runner等。 +* 开源组件:mysql、kafka、redis、zookeeper + +**机器要求**: + +* 硬件要求:推荐使用 8c16g 以上规格机器。 +* OS 要求:推荐使用 Anolis OS 系统进行部署( 暂不支持debian、ubuntu等)。 + +**部署说明**: +- 主要分为安装环境、项目构建、项目启动、数据初始化等几个步骤。 +- 该文档以x86_64机器为例, 如果您的部署机器为其他arch类型的机器,则需要将docker-compose.yaml中指定的第三方开源组件镜像更换成对应的镜像源。 +- 可以自己指定安装目录,该文档以 ~/tone目录为例(推荐)。 + +# 部署步骤 +> 后续步骤以 Anolis OS 8.6 环境为示例进行行详细说明。 + +## 1. 环境准备 + +### a. 安装docker +``` + yum -y install yum-utils + yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo + yum install -y docker-ce # 若出错:yum install -y docker-ce --nobest --allowerasing + + # 启动docker + systemctl enable docker + systemctl start docker + systemctl status docker +``` +### b. 配置docker源 +``` + vim /etc/docker/daemon.json + { + "registry-mirrors": [ + "https://6kx4zyno.mirror.aliyuncs.com", + "https://docker.mirrors.ustc.edu.cn", + "http://hub-mirror.c.163.com", + "https://registry.docker-cn.com"] + } + systemctl restart docker + # 建议使用国内镜像源。 阿里云: https://6kx4zyno.mirror.aliyuncs.com,网易: http://hub-mirror.c.163.com +``` +### c. 安装docker-compose +``` + pip3 install --upgrade pip + pip3 install docker-compose + docker-compose --version +``` + +## 2. 项目构建 + +### a. 下载项目源码 +```shell +yum install -y git + +git clone --single-branch --branch master https://gitee.com/anolis/tone-web.git ~/tone/code/tone-web +git clone --single-branch --branch master https://gitee.com/anolis/tone-runner.git ~/tone/code/tone-runner +git clone --single-branch --branch master https://gitee.com/anolis/tone-agent-proxy.git ~/tone/code/tone-agent-proxy +git clone --single-branch --branch master https://gitee.com/anolis/tone-storage.git ~/tone/code/tone-storage +``` +下载后的目录结构: +``` +~/tone/code/ + ├── tone-web + ├── tone-runner + ├── tone-agent-proxy + └── tone-storage +``` + +### b. 集成前端代码 +```shell +# 下载前端代码包: +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/tone-front-latest.zip +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/toneagent-front-latest.zip +# 安装unzip命令 +yum install -y unzip +# 解压到指定目录 +unzip -j -o tone-front-latest.zip -d ~/tone/code/tone-web/static/front/ +unzip -j -o toneagent-front-latest.zip -d ~/tone/code/tone-agent-proxy/static/front/ +``` + +## 3. 项目配置 +### a. 下载 docker-compose.yaml +```shell +cd ~/tone +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/docker-compose.yaml +``` + +### b. 设置并替换变量 +执行以下脚本(需手动替换`必填的`变量): +```shell +# 部署机外网IP地址(必填) +server_ip= + +# 账号密码(必填) +db_password= +redis_password= +tone_storage_password= + +# 镜像版本标签(非必改、默认latest) +version_tag=latest + +# token(非必改、可自动生成) +toneagent_access_key=$(uuidgen) +toneagent_secret_key=$(uuidgen) +admin_urls_token=$(uuidgen) +pub_api_token=$(uuidgen) + +sed -i "s/var_db_password/${db_password}/g" docker-compose.yaml +sed -i "s/var_redis_password/${redis_password}/g" docker-compose.yaml +sed -i "s/var_tone_storage/${tone_storage_password}/g" docker-compose.yaml +sed -i "s/var_toneagent_access_key/${toneagent_access_key}/g" docker-compose.yaml +sed -i "s/var_toneagent_secret_key/${toneagent_secret_key}/g" docker-compose.yaml +sed -i "s/var_admin_urls_token/${admin_urls_token}/g" docker-compose.yaml +sed -i "s/var_pub_api_token/${pub_api_token}/g" docker-compose.yaml +sed -i "s/var_version_tag/${version_tag}/g" docker-compose.yaml +sed -i "s/var_server_ip/${server_ip}/g" docker-compose.yaml +``` + +### c. 启动docker-compose +```shell +docker-compose -f ~/tone/docker-compose.yaml up --build -d +# 注:如代码有更新或首次部署,需要加 --build 参数才会自动重新打包镜像 +``` + +## 4. 数据初始化 +### a.初始化db +* 进入`mysql` docker 镜像中,`docker exec -it {数据库容器ID} bash` +* 连接数据库:`mysql -h 127.0.0.1 -P 3306 -u root -p` +* 创建 `T-One` 数据库 `tone-db`,`ToneAgent` 数据库 `toneagent-db` + ``` + CREATE DATABASE `tone-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; + CREATE DATABASE `toneagent-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; + ``` + 也可以直接通过 mysql 可视化界面初始化数据库 + +### b.初始化 `T-One` 数据 +浏览器或者curl命令请求接口($admin_urls_token可在docker-compose配置里查看或更改) +```shell +curl -s "http://${server_ip}:8080/admin/migrate/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8080/admin/init_data/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8080/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." +curl -s "http://${server_ip}:8081/admin/migrate/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8081/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." +curl -s "http://${server_ip}:8081/admin/import_access_token/?token=${admin_urls_token}" +``` + +### c. `T-One` 关联依赖配置 +**系统执行任务还需对以下配置进行设置** + +- 配置 `T-One` 测试用例 +- 配置`T-One` 测试机器 +- 配置 `ToneAgent` `token` + - 在 ToneAgent 系统-账号管理中增加一组 token + - 更改 docker-compose 配置中的toneagent_access_key和toneagent_secret_key + +## 5. 验证 +使用浏览器打开链接查看: `T-One` 页面:`http://{host}:8080` `ToneAgent` 管理页面:`http://{host}:8081` + +## 6. T-One 多生态使用 +`T-One` + `TestLib` +### a. 创建 `TestLib` 数据库 +- 进入 mysql docker 镜像,docker exec -it {数据库容器ID} bash +- 连接数据库:mysql -h 127.0.0.1 -P 3306 -u root -p +- 创建 TestLib 数据库 testlib + + CREATE DATABASE \`test-lib\` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; +- 创建 TestLib 数据库表 +### testlib数据库初始化 +
+ 点击展开/折叠脚本 + +```shell + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; + +-- 表 test-lib.case 结构 +CREATE TABLE IF NOT EXISTS `case` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试用例名称', + `creator` varchar(64) NOT NULL COMMENT '负责人', + `type` enum('FUNCTIONAL','PERFORMANCE','STRESS','LOAD','SECURITY','COMPATIBILITY','OTHERS') NOT NULL COMMENT '测试用例类型', + `priority` enum('PRIORITY_0','PRIORITY_1','PRIORITY_2','PRIORITY_3') NOT NULL COMMENT '测试用例的优先级', + `suite_name` varchar(128) DEFAULT NULL COMMENT '测试套名称', + `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试用例执行方式,手动、自动', + `run_model` enum('SINGLE','CLUSTER') NOT NULL COMMENT '测试用例运行模式,单机、集群', + `is_available` tinyint(1) NOT NULL COMMENT '测试用例是否可用', + `tone_case` varchar(128) DEFAULT NULL COMMENT 'T-One测试用例,当run_method为自动的时候生效', + `device_type` varchar(128) DEFAULT 'unlimit' COMMENT '设备类型,可多选,默认支持所有设备', + `device_arch` varchar(256) NOT NULL COMMENT '设备架构类型,可多选,默认支撑所有类型', + `labels` varchar(256) DEFAULT NULL COMMENT '设备标签,多个用,隔开', + `desc` varchar(512) DEFAULT NULL COMMENT '用例描述', + `pre_condition` varchar(512) DEFAULT NULL COMMENT '前置条件', + `steps` json DEFAULT NULL COMMENT '操作步骤', + `custom_fields` json DEFAULT NULL COMMENT '测试用例扩展属性', + `parent` int(11) NOT NULL COMMENT '测试用例分类节点', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`), + KEY `ix_case_suite_name` (`suite_name`) +) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_label 结构 +CREATE TABLE IF NOT EXISTS `case_label` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '用例标签', + `creator` varchar(64) NOT NULL COMMENT '标签创建人', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_label_map 结构 +CREATE TABLE IF NOT EXISTS `case_label_map` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `label_name` varchar(64) NOT NULL COMMENT '用例名称', + `case_id` int(11) NOT NULL COMMENT '用例ID', + PRIMARY KEY (`id`), + KEY `ix_case_label_map_label_name` (`label_name`) +) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_tree 结构 +CREATE TABLE IF NOT EXISTS `case_tree` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(16) NOT NULL COMMENT '用例结构树节点名称', + `parent` int(11) NOT NULL COMMENT '父节点id', + `level` int(11) NOT NULL COMMENT '树结构的深度', + `path` varchar(128) NOT NULL COMMENT '模块完整路径', + `children_nums` int(11) NOT NULL COMMENT '子节点数量', + PRIMARY KEY (`id`), + KEY `ix_case_tree_path` (`path`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device 结构 +CREATE TABLE IF NOT EXISTS `device` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '设备名称', + `arch` enum('X86','ARCH64','RISCV','LOONGARCH','NOARCH','OTHERS') NOT NULL COMMENT '设备架构', + `ip` varchar(16) NOT NULL COMMENT '设备ip', + `type` enum('UNLIMIT','VM','DOCKER','PHYSICS') NOT NULL COMMENT '设备类型', + `sn` varchar(16) DEFAULT NULL COMMENT '设备序号', + `status` tinyint(1) NOT NULL COMMENT '设备是否可用', + `label` json DEFAULT NULL COMMENT '设备标签列表数组', + `owner` varchar(256) NOT NULL COMMENT '设备负责人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device_label 结构 +CREATE TABLE IF NOT EXISTS `device_label` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '设备标签名称', + `color` varchar(32) NOT NULL COMMENT '设备标签颜色', + PRIMARY KEY (`id`), + UNIQUE KEY `ix_device_label_name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device_label_relationship 结构 +CREATE TABLE IF NOT EXISTS `device_label_relationship` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `label_id` int(11) NOT NULL COMMENT '机器Label id', + `device_id` int(11) NOT NULL COMMENT '机器Label id', + `is_delete` tinyint(1) DEFAULT NULL COMMENT '对应关系是否删除', + PRIMARY KEY (`id`), + KEY `ix_device_label_relationship_device_id` (`device_id`), + KEY `ix_device_label_relationship_label_id` (`label_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.func_result 结构 +CREATE TABLE IF NOT EXISTS `func_result` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `sub_case_name` varchar(128) NOT NULL COMMENT 'tone job名称', + `sub_case_result` enum('SUCCESS','FAIL','SKIP') NOT NULL COMMENT '功能结果', + `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', + `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + `current` json DEFAULT NULL, + `expect` json DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ix_func_result_tone_suite_id` (`tone_suite_id`), + KEY `ix_func_result_task_id` (`task_id`), + KEY `ix_func_result_tone_case_id` (`tone_case_id`), + KEY `ix_func_result_tone_job_id` (`tone_job_id`) +) ENGINE=InnoDB AUTO_INCREMENT=479 DEFAULT CHARSET=utf8; + +-- 表 test-lib.outline 结构 +CREATE TABLE IF NOT EXISTS `outline` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试大纲文件名', + `title` varchar(128) NOT NULL COMMENT '测试大纲的标题', + `owner` varchar(16) NOT NULL COMMENT '测试大纲负责人', + `tid` varchar(256) NOT NULL COMMENT 'oss文件地址', + `remark` varchar(64) DEFAULT NULL COMMENT '测试大纲备注描述信息', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + +-- 表 test-lib.perf_result 结构 +CREATE TABLE IF NOT EXISTS `perf_result` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `metric` varchar(128) NOT NULL COMMENT '指标名称', + `test_value` varchar(64) DEFAULT NULL COMMENT '测试值', + `cv_value` varchar(64) DEFAULT NULL COMMENT 'cv值', + `max_value` varchar(64) DEFAULT NULL COMMENT '最大值', + `min_value` varchar(64) DEFAULT NULL COMMENT '最小值', + `unit` varchar(64) DEFAULT NULL COMMENT '测试单位', + `track_result` enum('NA','INVALID','NORMAL','DECLINE','INCREASE') NOT NULL COMMENT '跟踪结果', + `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', + `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + PRIMARY KEY (`id`), + KEY `ix_perf_result_task_id` (`task_id`), + KEY `ix_perf_result_tone_case_id` (`tone_case_id`), + KEY `ix_perf_result_tone_suite_id` (`tone_suite_id`), + KEY `ix_perf_result_tone_job_id` (`tone_job_id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +-- 表 test-lib.plan 结构 +CREATE TABLE IF NOT EXISTS `plan` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `title` varchar(64) NOT NULL COMMENT '测试方案名称', + `req_id` int(11) DEFAULT NULL COMMENT '测试需求id', + `req_title` varchar(128) DEFAULT NULL COMMENT '测试需求标题', + `content` json DEFAULT NULL COMMENT '测试方案内容', + `status` varchar(16) NOT NULL COMMENT '测试方案阶段状态', + `cases` varchar(256) DEFAULT NULL COMMENT '测试用例,多个使用","隔开', + `tasks` varchar(256) DEFAULT NULL COMMENT '测试任务,多个使用","隔开', + `reviewers` varchar(256) NOT NULL COMMENT '方案评审人列表', + `owner` varchar(256) NOT NULL COMMENT '测试需求的负责人,多个以,隔开', + `report` tinyint(1) NOT NULL COMMENT '测试报告是否已生成', + PRIMARY KEY (`id`), + UNIQUE KEY `title` (`title`) +) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8; + +-- 表 test-lib.plan_review 结构 +CREATE TABLE IF NOT EXISTS `plan_review` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `plan_id` int(11) NOT NULL COMMENT '测试方案id', + `reviewer` varchar(32) NOT NULL COMMENT '测试需方案的评审人', + `status` varchar(16) NOT NULL COMMENT '评审状态', + `desc` varchar(512) DEFAULT NULL COMMENT '评审内容', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.product_category 结构 +CREATE TABLE IF NOT EXISTS `product_category` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '大类名称', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- 表 test-lib.product_plan 结构 +CREATE TABLE IF NOT EXISTS `product_plan` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `test_product_id` int(11) NOT NULL COMMENT '测试产品id', + `plan_id` int(11) NOT NULL COMMENT '测试产品实际复制执行的plan id', + `executor` varchar(256) NOT NULL COMMENT '测试产品执行人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + +-- 表 test-lib.requirement 结构 +CREATE TABLE IF NOT EXISTS `requirement` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `title` varchar(128) NOT NULL COMMENT '测试需求标题', + `outline_id` int(11) DEFAULT NULL COMMENT '测试大纲id', + `outline_title` varchar(64) DEFAULT NULL COMMENT '测试大纲标题', + `content` json NOT NULL COMMENT '测试需求的描述内容', + `status` varchar(16) NOT NULL COMMENT '测试需求阶段', + `owner` varchar(16) NOT NULL COMMENT '测试需求的创建人', + `assignee` varchar(256) NOT NULL COMMENT '测试需求的指派人,多个以,隔开', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; + +-- 表 test-lib.task 结构 +CREATE TABLE IF NOT EXISTS `task` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '任务名称', + `status` varchar(16) NOT NULL COMMENT '任务执行状态', + `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试任务执行方式', + `owner` varchar(256) NOT NULL COMMENT '任务执行人', + `plan_id` int(11) NOT NULL COMMENT '测试方案id', + `plan_title` varchar(256) NOT NULL COMMENT '测试方案标题', + `cases` varchar(256) NOT NULL COMMENT '测试用例,多个使用,隔开', + `desc` varchar(256) DEFAULT NULL COMMENT '备注', + `run_result` json DEFAULT NULL COMMENT '手动用例执行结果', + `config` json DEFAULT NULL COMMENT '测试任务配置', + `device_id` int(11) DEFAULT NULL COMMENT '测试设备ID', + `device_ip` varchar(256) DEFAULT NULL COMMENT '测试机器IP', + `workspace` varchar(128) NOT NULL COMMENT 'tone workspace', + `project` varchar(128) NOT NULL COMMENT 'tone project', + `job_type` varchar(128) NOT NULL COMMENT 'tone job type', + `test_type` varchar(32) DEFAULT 'others' COMMENT '测试任务类型', + `cluster` varchar(256) DEFAULT NULL COMMENT '测试机器集群名称', + `tags` varchar(256) DEFAULT NULL COMMENT '测试机器标签', + `tsn` varchar(256) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ix_task_plan_id` (`plan_id`) +) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8; + +-- 表 test-lib.test_product 结构 +CREATE TABLE IF NOT EXISTS `test_product` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试产品名称', + `category_id` int(11) NOT NULL COMMENT '大类id', + `origin_plan_id` int(11) NOT NULL COMMENT '测试产品对应的plan id', + `desc` varchar(256) DEFAULT NULL COMMENT '产品描述', + `test_method` varchar(256) DEFAULT NULL COMMENT '测试方法', + `test_requirement` varchar(256) DEFAULT NULL COMMENT '测试要求', + `need_config` tinyint(1) DEFAULT NULL COMMENT '是否扩展配置', + `owner` varchar(256) NOT NULL DEFAULT '' COMMENT '测试产品创建人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +-- 表 test-lib.test_suite 结构 +CREATE TABLE IF NOT EXISTS `test_suite` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(128) NOT NULL COMMENT '测试套名称', + `creator` varchar(64) NOT NULL COMMENT '测试套的创建人员', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_case 结构 +CREATE TABLE IF NOT EXISTS `tone_case` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `tone_case_id` int(11) NOT NULL COMMENT 'tone用例ID', + `tone_case_name` varchar(256) NOT NULL COMMENT 'tone用例名称', + `suite_id` int(11) NOT NULL COMMENT 'suite ID', + `suite_name` varchar(256) NOT NULL COMMENT 'suite用例名称', + `test_type` varchar(64) DEFAULT NULL COMMENT '测试类型', + PRIMARY KEY (`id`), + KEY `ix_tone_case_tone_case_name` (`tone_case_name`), + KEY `ix_tone_case_suite_id` (`suite_id`), + KEY `ix_tone_case_suite_name` (`suite_name`) +) ENGINE=InnoDB AUTO_INCREMENT=603 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_job 结构 +CREATE TABLE IF NOT EXISTS `tone_job` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(100) NOT NULL COMMENT 'tone job名称', + `state` enum('PENDING','RUNNING','SUCCESS','FAIL','STOP','SKIP') NOT NULL COMMENT 'tone job状态', + `test_type` enum('FUNCTIONAL','PERFORMANCE') NOT NULL COMMENT '测试类型', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `tone_job_link` varchar(100) DEFAULT '' COMMENT 'tone job链接', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + `server_info` json DEFAULT NULL COMMENT '存储tone job的机器信息', + PRIMARY KEY (`id`), + KEY `ix_tone_job_tone_job_id` (`tone_job_id`), + KEY `ix_tone_job_task_id` (`task_id`) +) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_sync_pull 结构 +CREATE TABLE IF NOT EXISTS `tone_sync_pull` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=76149 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_sync_push 结构 +CREATE TABLE IF NOT EXISTS `tone_sync_push` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.user 结构 +CREATE TABLE IF NOT EXISTS `user` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', + `nick_name` varchar(64) DEFAULT NULL COMMENT '用户昵称,具有唯一性', + `email` varchar(64) NOT NULL COMMENT '用户邮箱', + `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', + `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', + PRIMARY KEY (`id`), + UNIQUE KEY `nick_name` (`nick_name`), + KEY `ix_user_user_name` (`user_name`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; + +-- 表 test-lib.user_open_source 结构 +CREATE TABLE IF NOT EXISTS `user_open_source` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', + `nick_name` varchar(64) NOT NULL COMMENT '用户昵称,具有唯一性', + `email` varchar(64) NOT NULL COMMENT '用户邮箱', + `password` varchar(64) NOT NULL COMMENT '用户密码,前端对密码md5加密后的值', + `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', + `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', + `token` varchar(256) NOT NULL COMMENT 'api访问凭证', + PRIMARY KEY (`id`), + UNIQUE KEY `nick_name` (`nick_name`), + UNIQUE KEY `email` (`email`), + KEY `ix_user_open_source_token` (`token`(255)) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; + +-- 表 test-lib.user_role_op_record 结构 +CREATE TABLE IF NOT EXISTS `user_role_op_record` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `applicant` varchar(64) NOT NULL COMMENT '申请人name', + `applicant_id` int(11) NOT NULL COMMENT '申请人ID', + `apply_reason` varchar(512) DEFAULT NULL COMMENT '申请理由', + `signer` varchar(64) DEFAULT NULL COMMENT '评审人name', + `has_review` tinyint(1) NOT NULL COMMENT '是否已经审核', + `review_result` enum('INIT','PASS','FAIL') NOT NULL COMMENT '审核结果', + `review_reason` varchar(512) DEFAULT NULL COMMENT '评审意见', + `method` enum('APPROVE','UPGRADE','DOWNGRADE','DELETE') NOT NULL COMMENT '操作方式', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; + + +``` +
+ +### b.TestLib 服务依赖 +### c. clone test-lib代码到~/tone/code目录下 +```shell +git clone --single-branch --branch master https://gitee.com/anolis/testlib.git ~/tone/code/testlib +``` +### d.增加docker-compose配置 +```yaml +# docker-compose.yaml service下增加test-lib + test-lib: + build: + context: code/testlib/ + dockerfile: Dockerfile + args: + APP_NAME: test-lib + ENV: daily + image: test-lib:latest + ports: + - "8005:8005" + depends_on: + - mysql + - redis + environment: + <<: *common-variables + # db + db_url: mysql+aiomysql://${db_user}:{db_password}@mysql:3306/test-lib + # redis + redis_url: redis://:${redis_password}@redis:6379/10 + # app + tone_host: http://${server_ip}:8080/ + tone_token: tone_token + tone_user_name: tone_user_name + main_domain: http://${server_ip}:8005 + oss_url: http://${server_ip}:8005 +``` +#### e.重启服务 +```shell +docker-compose -f ~/tone/docker-compose.yaml up --build -d +``` +## 7. 独立部署 FAQ +https://tone.openanolis.cn/help_doc/12 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" new file mode 100644 index 00000000..b09df7d0 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" @@ -0,0 +1,70 @@ +# 一级标题 +## 二级标题 +### 三级标题 +**粗体文本** + +__cuti__ + +*斜体文本* + +_xieti_ + +下划线 + +~~删除线~~ + +上标:Xy + +下标:An + +> 引用文本 +- 无序列表项1 + - 第二层 +- 无序列表项2 +* * * +1. 有序列表项1 +2. 有序列表项2 +--- +[链接文本](https://gitee.com/suli01/community/edit/master/sig/T-One/content/%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97/%E7%94%A8%E6%88%B7%E8%81%86%E5%90%AC/test.md) + +链接名称 + +'''python +def hello_world(): + print("Hello, world!") + +![示例图片](https://pic.rmb.bdstatic.com/bjh/gallery/03e17cba710868d9153176b50a5fca0d1090.jpeg#pic_center=100x100) + +| 列1 | 列2 | 列3 | +| --- | --- | --- | +| 单元格1 | 单元格2 | 单元格3 | +| 单元格4 | 单元格5 | 单元格6 | + + +| 左对齐 | 居中对齐 | 右对齐 | +|:-----|:------:|------:| +| 文本 | 文本 | 文本 | + +
图片名称
+ + + + + + + + + + + + + +
值班人员星期一星期二星期三
张三李四王五
+ +- [ ] :待完成事项 + +- [x] :已完成事项 + +
+ 图片名称 +
diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" new file mode 100644 index 00000000..d0a3a7f0 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" @@ -0,0 +1,2 @@ +# hello +![测试外链图片](https://up.enterdesk.com/2021/edpic/0a/13/7a/0a137aaa28f48af0349cee1e568c0a57_1.jpg) \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" new file mode 100644 index 00000000..e5d110a5 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" @@ -0,0 +1,2 @@ +# hello, 欢迎来到聆听 .md +## 阿斯顿发射点 \ No newline at end of file -- Gitee From 38bc05883fea257ec891d16a64371d442ebfe143 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Mon, 20 Jan 2025 17:01:48 +0800 Subject: [PATCH 113/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9549-?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../atone\351\203\250\347\275\262.md" | 615 ------------------ .../test.md" | 70 -- ...26\351\223\276\345\233\276\347\211\207.md" | 2 - .../\350\201\206\345\220\254.md" | 2 - 4 files changed, 689 deletions(-) delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/atone\351\203\250\347\275\262.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/test.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\350\201\206\345\220\254.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/atone\351\203\250\347\275\262.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/atone\351\203\250\347\275\262.md" deleted file mode 100644 index 12f85c9b..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/atone\351\203\250\347\275\262.md" +++ /dev/null @@ -1,615 +0,0 @@ -# 部署说明 - -> 此文档以开源版本 T-One 最小单元部署举例说明,不保障系统的高可用及性能等 -> -> 若期望大规模集群化部署可以联系SIG项目组进行具体讨论。 -> 若遇到问题请参照文未的 FAQ 文档,或进 SIG 群联系我们。 - -**组件说明**: T-One 包含多个自研组件和几个开源组件,此文档以开源版本 T-One 最小单元部署举例说明。 - -* 自研组件:tone-web、tone-agent-proxy、tone-agent、tone-runner等。 -* 开源组件:mysql、kafka、redis、zookeeper - -**机器要求**: - -* 硬件要求:推荐使用 8c16g 以上规格机器。 -* OS 要求:推荐使用 Anolis OS 系统进行部署( 暂不支持debian、ubuntu等)。 - -**部署说明**: -- 主要分为安装环境、项目构建、项目启动、数据初始化等几个步骤。 -- 该文档以x86_64机器为例, 如果您的部署机器为其他arch类型的机器,则需要将docker-compose.yaml中指定的第三方开源组件镜像更换成对应的镜像源。 -- 可以自己指定安装目录,该文档以 ~/tone目录为例(推荐)。 - -# 部署步骤 -> 后续步骤以 Anolis OS 8.6 环境为示例进行行详细说明。 - -## 1. 环境准备 - -### a. 安装docker -``` - yum -y install yum-utils - yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo - yum install -y docker-ce # 若出错:yum install -y docker-ce --nobest --allowerasing - - # 启动docker - systemctl enable docker - systemctl start docker - systemctl status docker -``` -### b. 配置docker源 -``` - vim /etc/docker/daemon.json - { - "registry-mirrors": [ - "https://6kx4zyno.mirror.aliyuncs.com", - "https://docker.mirrors.ustc.edu.cn", - "http://hub-mirror.c.163.com", - "https://registry.docker-cn.com"] - } - systemctl restart docker - # 建议使用国内镜像源。 阿里云: https://6kx4zyno.mirror.aliyuncs.com,网易: http://hub-mirror.c.163.com -``` -### c. 安装docker-compose -``` - pip3 install --upgrade pip - pip3 install docker-compose - docker-compose --version -``` - -## 2. 项目构建 - -### a. 下载项目源码 -```shell -yum install -y git - -git clone --single-branch --branch master https://gitee.com/anolis/tone-web.git ~/tone/code/tone-web -git clone --single-branch --branch master https://gitee.com/anolis/tone-runner.git ~/tone/code/tone-runner -git clone --single-branch --branch master https://gitee.com/anolis/tone-agent-proxy.git ~/tone/code/tone-agent-proxy -git clone --single-branch --branch master https://gitee.com/anolis/tone-storage.git ~/tone/code/tone-storage -``` -下载后的目录结构: -``` -~/tone/code/ - ├── tone-web - ├── tone-runner - ├── tone-agent-proxy - └── tone-storage -``` - -### b. 集成前端代码 -```shell -# 下载前端代码包: -wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/tone-front-latest.zip -wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/toneagent-front-latest.zip -# 安装unzip命令 -yum install -y unzip -# 解压到指定目录 -unzip -j -o tone-front-latest.zip -d ~/tone/code/tone-web/static/front/ -unzip -j -o toneagent-front-latest.zip -d ~/tone/code/tone-agent-proxy/static/front/ -``` - -## 3. 项目配置 -### a. 下载 docker-compose.yaml -```shell -cd ~/tone -wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/docker-compose.yaml -``` - -### b. 设置并替换变量 -执行以下脚本(需手动替换`必填的`变量): -```shell -# 部署机外网IP地址(必填) -server_ip= - -# 账号密码(必填) -db_password= -redis_password= -tone_storage_password= - -# 镜像版本标签(非必改、默认latest) -version_tag=latest - -# token(非必改、可自动生成) -toneagent_access_key=$(uuidgen) -toneagent_secret_key=$(uuidgen) -admin_urls_token=$(uuidgen) -pub_api_token=$(uuidgen) - -sed -i "s/var_db_password/${db_password}/g" docker-compose.yaml -sed -i "s/var_redis_password/${redis_password}/g" docker-compose.yaml -sed -i "s/var_tone_storage/${tone_storage_password}/g" docker-compose.yaml -sed -i "s/var_toneagent_access_key/${toneagent_access_key}/g" docker-compose.yaml -sed -i "s/var_toneagent_secret_key/${toneagent_secret_key}/g" docker-compose.yaml -sed -i "s/var_admin_urls_token/${admin_urls_token}/g" docker-compose.yaml -sed -i "s/var_pub_api_token/${pub_api_token}/g" docker-compose.yaml -sed -i "s/var_version_tag/${version_tag}/g" docker-compose.yaml -sed -i "s/var_server_ip/${server_ip}/g" docker-compose.yaml -``` - -### c. 启动docker-compose -```shell -docker-compose -f ~/tone/docker-compose.yaml up --build -d -# 注:如代码有更新或首次部署,需要加 --build 参数才会自动重新打包镜像 -``` - -## 4. 数据初始化 -### a.初始化db -* 进入`mysql` docker 镜像中,`docker exec -it {数据库容器ID} bash` -* 连接数据库:`mysql -h 127.0.0.1 -P 3306 -u root -p` -* 创建 `T-One` 数据库 `tone-db`,`ToneAgent` 数据库 `toneagent-db` - ``` - CREATE DATABASE `tone-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; - CREATE DATABASE `toneagent-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; - ``` - 也可以直接通过 mysql 可视化界面初始化数据库 - -### b.初始化 `T-One` 数据 -浏览器或者curl命令请求接口($admin_urls_token可在docker-compose配置里查看或更改) -```shell -curl -s "http://${server_ip}:8080/admin/migrate/?token=${admin_urls_token}" -curl -s "http://${server_ip}:8080/admin/init_data/?token=${admin_urls_token}" -curl -s "http://${server_ip}:8080/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." -curl -s "http://${server_ip}:8081/admin/migrate/?token=${admin_urls_token}" -curl -s "http://${server_ip}:8081/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." -curl -s "http://${server_ip}:8081/admin/import_access_token/?token=${admin_urls_token}" -``` - -### c. `T-One` 关联依赖配置 -**系统执行任务还需对以下配置进行设置** - -- 配置 `T-One` 测试用例 -- 配置`T-One` 测试机器 -- 配置 `ToneAgent` `token` - - 在 ToneAgent 系统-账号管理中增加一组 token - - 更改 docker-compose 配置中的toneagent_access_key和toneagent_secret_key - -## 5. 验证 -使用浏览器打开链接查看: `T-One` 页面:`http://{host}:8080` `ToneAgent` 管理页面:`http://{host}:8081` - -## 6. T-One 多生态使用 -`T-One` + `TestLib` -### a. 创建 `TestLib` 数据库 -- 进入 mysql docker 镜像,docker exec -it {数据库容器ID} bash -- 连接数据库:mysql -h 127.0.0.1 -P 3306 -u root -p -- 创建 TestLib 数据库 testlib - - CREATE DATABASE \`test-lib\` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; -- 创建 TestLib 数据库表 -### testlib数据库初始化 -
- 点击展开/折叠脚本 - -```shell - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET NAMES utf8 */; -/*!50503 SET NAMES utf8mb4 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; - --- 表 test-lib.case 结构 -CREATE TABLE IF NOT EXISTS `case` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '测试用例名称', - `creator` varchar(64) NOT NULL COMMENT '负责人', - `type` enum('FUNCTIONAL','PERFORMANCE','STRESS','LOAD','SECURITY','COMPATIBILITY','OTHERS') NOT NULL COMMENT '测试用例类型', - `priority` enum('PRIORITY_0','PRIORITY_1','PRIORITY_2','PRIORITY_3') NOT NULL COMMENT '测试用例的优先级', - `suite_name` varchar(128) DEFAULT NULL COMMENT '测试套名称', - `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试用例执行方式,手动、自动', - `run_model` enum('SINGLE','CLUSTER') NOT NULL COMMENT '测试用例运行模式,单机、集群', - `is_available` tinyint(1) NOT NULL COMMENT '测试用例是否可用', - `tone_case` varchar(128) DEFAULT NULL COMMENT 'T-One测试用例,当run_method为自动的时候生效', - `device_type` varchar(128) DEFAULT 'unlimit' COMMENT '设备类型,可多选,默认支持所有设备', - `device_arch` varchar(256) NOT NULL COMMENT '设备架构类型,可多选,默认支撑所有类型', - `labels` varchar(256) DEFAULT NULL COMMENT '设备标签,多个用,隔开', - `desc` varchar(512) DEFAULT NULL COMMENT '用例描述', - `pre_condition` varchar(512) DEFAULT NULL COMMENT '前置条件', - `steps` json DEFAULT NULL COMMENT '操作步骤', - `custom_fields` json DEFAULT NULL COMMENT '测试用例扩展属性', - `parent` int(11) NOT NULL COMMENT '测试用例分类节点', - PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`), - KEY `ix_case_suite_name` (`suite_name`) -) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8; - --- 表 test-lib.case_label 结构 -CREATE TABLE IF NOT EXISTS `case_label` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '用例标签', - `creator` varchar(64) NOT NULL COMMENT '标签创建人', - PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`) -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; - --- 表 test-lib.case_label_map 结构 -CREATE TABLE IF NOT EXISTS `case_label_map` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `label_name` varchar(64) NOT NULL COMMENT '用例名称', - `case_id` int(11) NOT NULL COMMENT '用例ID', - PRIMARY KEY (`id`), - KEY `ix_case_label_map_label_name` (`label_name`) -) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8; - --- 表 test-lib.case_tree 结构 -CREATE TABLE IF NOT EXISTS `case_tree` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(16) NOT NULL COMMENT '用例结构树节点名称', - `parent` int(11) NOT NULL COMMENT '父节点id', - `level` int(11) NOT NULL COMMENT '树结构的深度', - `path` varchar(128) NOT NULL COMMENT '模块完整路径', - `children_nums` int(11) NOT NULL COMMENT '子节点数量', - PRIMARY KEY (`id`), - KEY `ix_case_tree_path` (`path`) -) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; - --- 表 test-lib.device 结构 -CREATE TABLE IF NOT EXISTS `device` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '设备名称', - `arch` enum('X86','ARCH64','RISCV','LOONGARCH','NOARCH','OTHERS') NOT NULL COMMENT '设备架构', - `ip` varchar(16) NOT NULL COMMENT '设备ip', - `type` enum('UNLIMIT','VM','DOCKER','PHYSICS') NOT NULL COMMENT '设备类型', - `sn` varchar(16) DEFAULT NULL COMMENT '设备序号', - `status` tinyint(1) NOT NULL COMMENT '设备是否可用', - `label` json DEFAULT NULL COMMENT '设备标签列表数组', - `owner` varchar(256) NOT NULL COMMENT '设备负责人', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; - --- 表 test-lib.device_label 结构 -CREATE TABLE IF NOT EXISTS `device_label` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '设备标签名称', - `color` varchar(32) NOT NULL COMMENT '设备标签颜色', - PRIMARY KEY (`id`), - UNIQUE KEY `ix_device_label_name` (`name`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; - --- 表 test-lib.device_label_relationship 结构 -CREATE TABLE IF NOT EXISTS `device_label_relationship` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `label_id` int(11) NOT NULL COMMENT '机器Label id', - `device_id` int(11) NOT NULL COMMENT '机器Label id', - `is_delete` tinyint(1) DEFAULT NULL COMMENT '对应关系是否删除', - PRIMARY KEY (`id`), - KEY `ix_device_label_relationship_device_id` (`device_id`), - KEY `ix_device_label_relationship_label_id` (`label_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - --- 表 test-lib.func_result 结构 -CREATE TABLE IF NOT EXISTS `func_result` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `sub_case_name` varchar(128) NOT NULL COMMENT 'tone job名称', - `sub_case_result` enum('SUCCESS','FAIL','SKIP') NOT NULL COMMENT '功能结果', - `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', - `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', - `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', - `task_id` int(11) NOT NULL COMMENT '测试方案id', - `current` json DEFAULT NULL, - `expect` json DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `ix_func_result_tone_suite_id` (`tone_suite_id`), - KEY `ix_func_result_task_id` (`task_id`), - KEY `ix_func_result_tone_case_id` (`tone_case_id`), - KEY `ix_func_result_tone_job_id` (`tone_job_id`) -) ENGINE=InnoDB AUTO_INCREMENT=479 DEFAULT CHARSET=utf8; - --- 表 test-lib.outline 结构 -CREATE TABLE IF NOT EXISTS `outline` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '测试大纲文件名', - `title` varchar(128) NOT NULL COMMENT '测试大纲的标题', - `owner` varchar(16) NOT NULL COMMENT '测试大纲负责人', - `tid` varchar(256) NOT NULL COMMENT 'oss文件地址', - `remark` varchar(64) DEFAULT NULL COMMENT '测试大纲备注描述信息', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; - --- 表 test-lib.perf_result 结构 -CREATE TABLE IF NOT EXISTS `perf_result` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `metric` varchar(128) NOT NULL COMMENT '指标名称', - `test_value` varchar(64) DEFAULT NULL COMMENT '测试值', - `cv_value` varchar(64) DEFAULT NULL COMMENT 'cv值', - `max_value` varchar(64) DEFAULT NULL COMMENT '最大值', - `min_value` varchar(64) DEFAULT NULL COMMENT '最小值', - `unit` varchar(64) DEFAULT NULL COMMENT '测试单位', - `track_result` enum('NA','INVALID','NORMAL','DECLINE','INCREASE') NOT NULL COMMENT '跟踪结果', - `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', - `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', - `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', - `task_id` int(11) NOT NULL COMMENT '测试方案id', - PRIMARY KEY (`id`), - KEY `ix_perf_result_task_id` (`task_id`), - KEY `ix_perf_result_tone_case_id` (`tone_case_id`), - KEY `ix_perf_result_tone_suite_id` (`tone_suite_id`), - KEY `ix_perf_result_tone_job_id` (`tone_job_id`) -) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; - --- 表 test-lib.plan 结构 -CREATE TABLE IF NOT EXISTS `plan` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `title` varchar(64) NOT NULL COMMENT '测试方案名称', - `req_id` int(11) DEFAULT NULL COMMENT '测试需求id', - `req_title` varchar(128) DEFAULT NULL COMMENT '测试需求标题', - `content` json DEFAULT NULL COMMENT '测试方案内容', - `status` varchar(16) NOT NULL COMMENT '测试方案阶段状态', - `cases` varchar(256) DEFAULT NULL COMMENT '测试用例,多个使用","隔开', - `tasks` varchar(256) DEFAULT NULL COMMENT '测试任务,多个使用","隔开', - `reviewers` varchar(256) NOT NULL COMMENT '方案评审人列表', - `owner` varchar(256) NOT NULL COMMENT '测试需求的负责人,多个以,隔开', - `report` tinyint(1) NOT NULL COMMENT '测试报告是否已生成', - PRIMARY KEY (`id`), - UNIQUE KEY `title` (`title`) -) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8; - --- 表 test-lib.plan_review 结构 -CREATE TABLE IF NOT EXISTS `plan_review` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `plan_id` int(11) NOT NULL COMMENT '测试方案id', - `reviewer` varchar(32) NOT NULL COMMENT '测试需方案的评审人', - `status` varchar(16) NOT NULL COMMENT '评审状态', - `desc` varchar(512) DEFAULT NULL COMMENT '评审内容', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - --- 表 test-lib.product_category 结构 -CREATE TABLE IF NOT EXISTS `product_category` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '大类名称', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; - --- 表 test-lib.product_plan 结构 -CREATE TABLE IF NOT EXISTS `product_plan` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `test_product_id` int(11) NOT NULL COMMENT '测试产品id', - `plan_id` int(11) NOT NULL COMMENT '测试产品实际复制执行的plan id', - `executor` varchar(256) NOT NULL COMMENT '测试产品执行人', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; - --- 表 test-lib.requirement 结构 -CREATE TABLE IF NOT EXISTS `requirement` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `title` varchar(128) NOT NULL COMMENT '测试需求标题', - `outline_id` int(11) DEFAULT NULL COMMENT '测试大纲id', - `outline_title` varchar(64) DEFAULT NULL COMMENT '测试大纲标题', - `content` json NOT NULL COMMENT '测试需求的描述内容', - `status` varchar(16) NOT NULL COMMENT '测试需求阶段', - `owner` varchar(16) NOT NULL COMMENT '测试需求的创建人', - `assignee` varchar(256) NOT NULL COMMENT '测试需求的指派人,多个以,隔开', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; - --- 表 test-lib.task 结构 -CREATE TABLE IF NOT EXISTS `task` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '任务名称', - `status` varchar(16) NOT NULL COMMENT '任务执行状态', - `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试任务执行方式', - `owner` varchar(256) NOT NULL COMMENT '任务执行人', - `plan_id` int(11) NOT NULL COMMENT '测试方案id', - `plan_title` varchar(256) NOT NULL COMMENT '测试方案标题', - `cases` varchar(256) NOT NULL COMMENT '测试用例,多个使用,隔开', - `desc` varchar(256) DEFAULT NULL COMMENT '备注', - `run_result` json DEFAULT NULL COMMENT '手动用例执行结果', - `config` json DEFAULT NULL COMMENT '测试任务配置', - `device_id` int(11) DEFAULT NULL COMMENT '测试设备ID', - `device_ip` varchar(256) DEFAULT NULL COMMENT '测试机器IP', - `workspace` varchar(128) NOT NULL COMMENT 'tone workspace', - `project` varchar(128) NOT NULL COMMENT 'tone project', - `job_type` varchar(128) NOT NULL COMMENT 'tone job type', - `test_type` varchar(32) DEFAULT 'others' COMMENT '测试任务类型', - `cluster` varchar(256) DEFAULT NULL COMMENT '测试机器集群名称', - `tags` varchar(256) DEFAULT NULL COMMENT '测试机器标签', - `tsn` varchar(256) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `ix_task_plan_id` (`plan_id`) -) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8; - --- 表 test-lib.test_product 结构 -CREATE TABLE IF NOT EXISTS `test_product` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '测试产品名称', - `category_id` int(11) NOT NULL COMMENT '大类id', - `origin_plan_id` int(11) NOT NULL COMMENT '测试产品对应的plan id', - `desc` varchar(256) DEFAULT NULL COMMENT '产品描述', - `test_method` varchar(256) DEFAULT NULL COMMENT '测试方法', - `test_requirement` varchar(256) DEFAULT NULL COMMENT '测试要求', - `need_config` tinyint(1) DEFAULT NULL COMMENT '是否扩展配置', - `owner` varchar(256) NOT NULL DEFAULT '' COMMENT '测试产品创建人', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; - --- 表 test-lib.test_suite 结构 -CREATE TABLE IF NOT EXISTS `test_suite` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(128) NOT NULL COMMENT '测试套名称', - `creator` varchar(64) NOT NULL COMMENT '测试套的创建人员', - PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`) -) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; - --- 表 test-lib.tone_case 结构 -CREATE TABLE IF NOT EXISTS `tone_case` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `tone_case_id` int(11) NOT NULL COMMENT 'tone用例ID', - `tone_case_name` varchar(256) NOT NULL COMMENT 'tone用例名称', - `suite_id` int(11) NOT NULL COMMENT 'suite ID', - `suite_name` varchar(256) NOT NULL COMMENT 'suite用例名称', - `test_type` varchar(64) DEFAULT NULL COMMENT '测试类型', - PRIMARY KEY (`id`), - KEY `ix_tone_case_tone_case_name` (`tone_case_name`), - KEY `ix_tone_case_suite_id` (`suite_id`), - KEY `ix_tone_case_suite_name` (`suite_name`) -) ENGINE=InnoDB AUTO_INCREMENT=603 DEFAULT CHARSET=utf8; - --- 表 test-lib.tone_job 结构 -CREATE TABLE IF NOT EXISTS `tone_job` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(100) NOT NULL COMMENT 'tone job名称', - `state` enum('PENDING','RUNNING','SUCCESS','FAIL','STOP','SKIP') NOT NULL COMMENT 'tone job状态', - `test_type` enum('FUNCTIONAL','PERFORMANCE') NOT NULL COMMENT '测试类型', - `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', - `tone_job_link` varchar(100) DEFAULT '' COMMENT 'tone job链接', - `task_id` int(11) NOT NULL COMMENT '测试方案id', - `server_info` json DEFAULT NULL COMMENT '存储tone job的机器信息', - PRIMARY KEY (`id`), - KEY `ix_tone_job_tone_job_id` (`tone_job_id`), - KEY `ix_tone_job_task_id` (`task_id`) -) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8; - --- 表 test-lib.tone_sync_pull 结构 -CREATE TABLE IF NOT EXISTS `tone_sync_pull` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=76149 DEFAULT CHARSET=utf8; - --- 表 test-lib.tone_sync_push 结构 -CREATE TABLE IF NOT EXISTS `tone_sync_push` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - --- 表 test-lib.user 结构 -CREATE TABLE IF NOT EXISTS `user` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', - `nick_name` varchar(64) DEFAULT NULL COMMENT '用户昵称,具有唯一性', - `email` varchar(64) NOT NULL COMMENT '用户邮箱', - `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', - `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', - PRIMARY KEY (`id`), - UNIQUE KEY `nick_name` (`nick_name`), - KEY `ix_user_user_name` (`user_name`) -) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; - --- 表 test-lib.user_open_source 结构 -CREATE TABLE IF NOT EXISTS `user_open_source` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', - `nick_name` varchar(64) NOT NULL COMMENT '用户昵称,具有唯一性', - `email` varchar(64) NOT NULL COMMENT '用户邮箱', - `password` varchar(64) NOT NULL COMMENT '用户密码,前端对密码md5加密后的值', - `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', - `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', - `token` varchar(256) NOT NULL COMMENT 'api访问凭证', - PRIMARY KEY (`id`), - UNIQUE KEY `nick_name` (`nick_name`), - UNIQUE KEY `email` (`email`), - KEY `ix_user_open_source_token` (`token`(255)) -) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; - --- 表 test-lib.user_role_op_record 结构 -CREATE TABLE IF NOT EXISTS `user_role_op_record` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `applicant` varchar(64) NOT NULL COMMENT '申请人name', - `applicant_id` int(11) NOT NULL COMMENT '申请人ID', - `apply_reason` varchar(512) DEFAULT NULL COMMENT '申请理由', - `signer` varchar(64) DEFAULT NULL COMMENT '评审人name', - `has_review` tinyint(1) NOT NULL COMMENT '是否已经审核', - `review_result` enum('INIT','PASS','FAIL') NOT NULL COMMENT '审核结果', - `review_reason` varchar(512) DEFAULT NULL COMMENT '评审意见', - `method` enum('APPROVE','UPGRADE','DOWNGRADE','DELETE') NOT NULL COMMENT '操作方式', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; - -/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; -/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; - - -``` -
- -### b.TestLib 服务依赖 -### c. clone test-lib代码到~/tone/code目录下 -```shell -git clone --single-branch --branch master https://gitee.com/anolis/testlib.git ~/tone/code/testlib -``` -### d.增加docker-compose配置 -```yaml -# docker-compose.yaml service下增加test-lib - test-lib: - build: - context: code/testlib/ - dockerfile: Dockerfile - args: - APP_NAME: test-lib - ENV: daily - image: test-lib:latest - ports: - - "8005:8005" - depends_on: - - mysql - - redis - environment: - <<: *common-variables - # db - db_url: mysql+aiomysql://${db_user}:{db_password}@mysql:3306/test-lib - # redis - redis_url: redis://:${redis_password}@redis:6379/10 - # app - tone_host: http://${server_ip}:8080/ - tone_token: tone_token - tone_user_name: tone_user_name - main_domain: http://${server_ip}:8005 - oss_url: http://${server_ip}:8005 -``` -#### e.重启服务 -```shell -docker-compose -f ~/tone/docker-compose.yaml up --build -d -``` -## 7. 独立部署 FAQ -https://tone.openanolis.cn/help_doc/12 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/test.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/test.md" deleted file mode 100644 index b09df7d0..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/test.md" +++ /dev/null @@ -1,70 +0,0 @@ -# 一级标题 -## 二级标题 -### 三级标题 -**粗体文本** - -__cuti__ - -*斜体文本* - -_xieti_ - -下划线 - -~~删除线~~ - -上标:Xy - -下标:An - -> 引用文本 -- 无序列表项1 - - 第二层 -- 无序列表项2 -* * * -1. 有序列表项1 -2. 有序列表项2 ---- -[链接文本](https://gitee.com/suli01/community/edit/master/sig/T-One/content/%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97/%E7%94%A8%E6%88%B7%E8%81%86%E5%90%AC/test.md) - -链接名称 - -'''python -def hello_world(): - print("Hello, world!") - -![示例图片](https://pic.rmb.bdstatic.com/bjh/gallery/03e17cba710868d9153176b50a5fca0d1090.jpeg#pic_center=100x100) - -| 列1 | 列2 | 列3 | -| --- | --- | --- | -| 单元格1 | 单元格2 | 单元格3 | -| 单元格4 | 单元格5 | 单元格6 | - - -| 左对齐 | 居中对齐 | 右对齐 | -|:-----|:------:|------:| -| 文本 | 文本 | 文本 | - -
图片名称
- - - - - - - - - - - - - -
值班人员星期一星期二星期三
张三李四王五
- -- [ ] :待完成事项 - -- [x] :已完成事项 - -
- 图片名称 -
diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" deleted file mode 100644 index d0a3a7f0..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" +++ /dev/null @@ -1,2 +0,0 @@ -# hello -![测试外链图片](https://up.enterdesk.com/2021/edpic/0a/13/7a/0a137aaa28f48af0349cee1e568c0a57_1.jpg) \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\350\201\206\345\220\254.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\350\201\206\345\220\254.md" deleted file mode 100644 index e5d110a5..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\350\201\206\345\220\254.md" +++ /dev/null @@ -1,2 +0,0 @@ -# hello, 欢迎来到聆听 .md -## 阿斯顿发射点 \ No newline at end of file -- Gitee From c1701648c9f2b20f043fdc975cec572c0e744e96 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Mon, 20 Jan 2025 17:03:40 +0800 Subject: [PATCH 114/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9550-?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../000000000130_anolis.jpg" | Bin 47154 -> 0 bytes .../T-One\346\246\202\350\277\260.md" | 30 - .../assets/Dingtalk_20240614165831.jpg" | Bin 6459 -> 0 bytes .../assets/jiagou.jpeg" | Bin 366652 -> 0 bytes .../test1.md" | 73 --- .../tone\351\203\250\347\275\262.md" | 615 ------------------ .../test.md" | 70 -- ...26\351\223\276\345\233\276\347\211\207.md" | 2 - .../\350\201\206\345\220\254.md" | 2 - 9 files changed, 792 deletions(-) delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/000000000130_anolis.jpg" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/T-One\346\246\202\350\277\260.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/assets/Dingtalk_20240614165831.jpg" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/assets/jiagou.jpeg" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/test1.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/tone\351\203\250\347\275\262.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" delete mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/000000000130_anolis.jpg" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/000000000130_anolis.jpg" deleted file mode 100644 index 25e606c9c5d28fccaf9f6caa351e3720570e4162..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47154 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 diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/T-One\346\246\202\350\277\260.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/T-One\346\246\202\350\277\260.md" deleted file mode 100644 index 74f3dbc4..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/T-One\346\246\202\350\277\260.md" +++ /dev/null @@ -1,30 +0,0 @@ -### T- One是什么 - T-One是一站式的自动化质量协作平台;打通了测试计划、测试准备、测试执行、测试分析、测试报告、覆盖率检测、智能Bisect,环境服务等流程的闭环,为社区研发提供一站式质量服务。 -​ - -### 平台架构 -![](assets/jiagou.jpeg) - -### 核心特点 -- 一站式质量平台:平台打通了测试准备、测试执行、测试分析、测试计划、测试报告、覆盖率检测、智能Bisect、智能巡检等流程全闭环,为社区研发提供一站式测试支撑。 - - 支持多CPU混合架构(x86、arm、loogarch、risc-v) - - 支持多操作系统类型(龙蜥OS、centos、debian等) - - 支持复杂环境测试(企业内网、独立隔离、弹性云虚拟机/容器、应用集群及多种混合环境) - -- 质量协作能力:通过分布式的业务架构和独立租户空间能力,支持多企业、多团队的质量协作模式。 -- 数据分析能力:平台提供了时序分析、对比分析,以及聚合生成测试报告的能力,在大量测试之后对数据进行分析以发现软件问题。 -- 开源软件包CI服务:社区开发者可以将自己的软件包(可来自代码托管平台如github/gitee/codeup等)注册到Testfarm, 平台会监控软件包的代码变更,一旦有变更则会立即触发测试,并将测试结果通知开发者,方便开源软件包引入。 -- 开发者资源服务:社区开发者可以reserve测试环境并登陆,方便在测试环境中进行测试及debug。 -- 缺陷定位诊断服务:对于发现的软件缺陷,平台可以提供了缺陷的自动化定位诊断能力,可以发现引入缺陷的commit地址。 - - -### 应用场景 -- 场景1:OS发布测试,每次AnolisOS的发布,社区测试团队会根据发布测试策略进行大规模测试,保障产品发布质量,外部用户可以在Testfarm查看发布测试数据。 -- 场景2:开源软件包CI,社区开发者可以将软件包注册到平台,平台会自动监控软件包的变更,一旦发生变更会立即进行测试并推送测试结果。 -- 场景3:自定义测试,社区开发者根据自己的需求可以在T-One平台进行在线测试,或者使用命令行测试。 -- 场景4:离线测试,对于网络不可达的测试环境,用户可以使用离线测试模式测试并上传数据。 -- 场景5:独立部署,外部用户也可以在自己环境下独立部署平台,测试并上传数据到Testfarm。 -- 场景6:登陆测试环境,社区开发者可以根据需要reserve测试环境登陆进行测试及debug。 -- 场景7:缺陷定位诊断,一旦测试出缺陷,平台会自动诊断缺陷引入的commit。 - - diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/assets/Dingtalk_20240614165831.jpg" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/assets/Dingtalk_20240614165831.jpg" deleted file mode 100644 index 925bf2945891170613821e8e7dbc9e4206d17c8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6459 zcmcIo2{@Er+keJjtc}q$_I(>6*|%sYhE$eBSF)}kAK7wLm zVmgFiVPiqDB2i2zk`M@KBn1TxB_$0CP6tQ**U#Py06_&9lJh_zyZ{*j0!2Xf+5s*A zfKY(ik`z98AY@Q-3Q8CiH4QD;p^^b0gY0WhK|xLq_6`8s0dfQdBaehC9VnvwT-Qvy@R8>hvyA1Zy(>#u<(e;sOXraC*51+C^|Jfb;M<{h!z1rU$MA%i*}0GNpB6q7SJ&3RZG7L{`a!Y_0ziM6^~bV* zu?qp(MMh2zC5Mshf{=NE35p=6;E|wYRMmrBbv?{08A63rOMFz?Ld_?ozjDOVZGZ;F zFO3%_0Q?=KsmEKZgBd*BC$tg@B6(MF1y(pBphE@Xjg~{vqDVTWw=w4io~C zIwzBo%9r%@l}nz|NLdBaR81_|2ysI#Kid}<=hi%IcU23Ye82L9QtM>6;oENkva4*u z-1TQa9}mbLR&Zx8>k8JU8mE6@)6Z^gccgRCV*JPLOeefJL$A%o9)K`Ynlu?LO%*Xy zIo{+*O~WVea@ZZs-Fy4S?A*5HN?(!+pSNH8ScpnCp`;{knLX|97 z+2x7xXG1T=yy1uB9bZM&0v@T!9`+W{_~I-Cm4|UNoR^fE2_nbIEO9Ox5Miq(I z3&qEtT@Aob8V~c|(-a*z=jkp}&TuMNj4X$eoQ!NHf4E}DOJ`GmB*c?y`J49U^0&3z z9JY>-N&lfRLDRa^D2ej8n}4>(`lT#@{`x-Qx# ze8tG^I5|6~hAM}n@+tkY(z^1hx|FBYYd)x#h`aS)?D&GOlNGT)IHWidVQ%dG&i^w0 zr{6=I>6@jcYtoadzd(sC)*iUas9YC`FmP0Dfpdt3zF#wvB_GOZUgCA$ihy3&~6qLW^ zkjkVO!1&K3B$*`PUy_5*@)fffdb{b)Bh&c~{Php?GU1h}@+GYAqjFQFc==|pltt*j zV7Dfd`m8wYpKjNYU0B{ZMN7vtFVyn=^x@=}Tw|tmRwKa!Uvv1y3l0~j=Jy~gpZ&Q9_!kylGYz8V-sZ@%rwkXZQ;@y$%wUq4AEqM0K$ zgKyZbx>WX!@{{wdm-PoV`IO#s-v}yEDqc}3ohj-MuQPv?Umdo6v7nbPvR(&K zHr7jJOS9-sk$9OOe~KbPrtgatbJn5VnAJUiV{;FR`h{lenyO$25-~85X|2j@Xvd^BcM2- zjs*1f6Xy_M8Ke9ui!9_%)$b-!2{wEF!A^{F0nmZ;8^BPI{SAXZ?_l$yI#L(%EBWa{ zV$k0~3{w25`rSk-!RFyVfIx3#L6LgPAQ)->2IHT1u(|l3O}&JnMCVL_0R5-x?>!GT z>wG_lyaMXU3|cLGlE#<>RuG$Kgzce+2@)ax@B+5Gvq|D;oaQW5*GCTK(D;|blkP!G zsrV+=MOr6**YnO%FI)kGm+eZUdNGN~%Y|RX3 zBlU7HWOTsP6ogCJ2cfua6eY|8X2$8-zun&GZWiVwK6*zW!KWVZLEMOYKO3yo^(J}q z4S9-Dj5jY~xlM6C?#o*O$L=$N(&c4wF@Gt4(Gxw7W;?rGXWPi#p9?|JEjnjyvv6!q zaA$X}ut0%lF+9m%ENAqcoD|Z|)TXX7#{#OX;t~y!J;@%oDi|l;z-sl(1!gQz-d$~h ztnWPT5YM`ifDqR7Z-8LC4+N#6k`>wVeIVE#0HJ3e2#HS8Ja{5IpgU`Pi?ErjxkIV*gjWn31 zm)tL!+RP?=9XEXU?VPkjMBk*?(oE>{`z`k>z~3}Ty(QIaW9(huRfi38{^ldI zAhXzO*Ltog;{8zSra1Z&z(FKPw<#r7asywd@`zdXBX9+%ND4 zx!6TxL{xNoNV?H@+{hc{kSL&K%%***WvtD9byZT!>IG-{^p2F_pvS0~Ck`>`)IX1k z__{jAY)6IJ;_5yf7p3(4BGXL>d29l`qfTq;0d*wB7z4jtu`am(_6g$`KkPG;1c*2N zKx74o1pzStnWF#Z7wKe&9PH(kiUWv(I3xijc_j}76N$TWvr~f)Kt}TyQyrisRu6A%Ls^eoJwy-^k`HTT!bY9lMq-4MN^MES%)z2Zp zO$e_I4%63v1JP0!13*6jjzl8?yPafpb`Ws;h^$Bf^fnJ>u=f7><>X4_haiW5oG(q6 z)&l$ErPv}TC%f{EM@rlY#2Sl;x;Enu_G;Q|XZ3n`;yB8Vv)nAzJuj*Dz?bvRgCCh4 z35De?Ds-Yo^RP}ijBxjKP*d6+g@T4}J;Nn#`c9RKnY%0x}rJtJJ zY$3a>3l$cOn|*M|`_HT&f@S=AZMDor?$gU^Q$0kY#w9L`)7d`-lu!=LE>I!zH!vG* zb3I}?K`y#M;)z{b6}3Aq?@~uViK^^FWTtK0L>Rr21%}}{7TOczM%4!g(wpNNeEf)7 z6>$3TF|3_)fywym@=cf3CF`*4Zs`v=t(@xU6qNy5vMtlK8ZnacbAfQ;hjx0ePNNGQ zc-E1A zuB^Iuo$%sOtfc0-7g8w3n>1S{n!73$kVOL{ij~ywov076^&JbdjFZU8o_v#DXUaRa zVlMm_Sm(^Xy4>SW782;`gr6{&5+n-UvdL__!FntWmuOQHNgby5xgA0o0(Q=WZ%i_{K_4k%bp61tt1)+_6%CKh|%A&&*_REOo+B>9Ob!8L}{)X9!6F=`!tb^vtn z)3!)|HZe1bi{QSA?s{Cbll3}1GvOngujj*tev@tBFoaHHsmY>0ej2sSM3}TP84+D~ zuq@T?p_<H;f4FfUfm#?^u!2l~-~fswz~~R^ zLa_M1nV1A&q`od0iLp~EKmh*XyuVSlk7W`l)sZPc1t>{C>~GQ)69ABbe+H6->^m0$ zKn$#;*8Y1wZ7mE1SNPw9|2t)=)s;Y_e#I7`2l^!%k~s6y*={9#T`n!iy4wClQV_cP zxeNOed-}-JlhLS=>OhL2rS(N&ahLRoyUy7jM)yKsmT5M+=a0)B=gc)cwK?AYqyXCr zXO*4nCR@X9`S8KycD(ypJ}b@YlA=&I?+@)yFkG;0`w3{GPmXKXdE8HrZIRNr$)!{s zbWWLFPeN>A*Q9`(a!vmXhNTFfNgt1ti^fK-mlkWm6MkgA&-r-)+x60>bG6}+)a|1j z@Rkhtz|;APfoUj-r#5sd@Po?;^lQ{;XE9}QBsQUhdcfVn7dt+wU9Pk7g{u>>S@PbI#Cu3)qG0j zMpi&R&xXy@$#PIM49{)Lvro6lxNqe`6*1g5c{PIPK|(S(?2Q7R#BPB*7;B3H}H%Alw+@7qqrCDWx$30e_Yn-SXxM5^^RWR=AD-o``fvu;QIb=cwqW+{8%%dYh^brcc<=x%*cCDFvwvH3fO?u)_!(#k|HpLc!;w)8lTAEeOs|~zDq0p z^0|mdmT3}a`&lrW{=r5HeQ>;~b9`qcC+wYPoJrf81+Ou)xyGWd0Cz7t+nfGAZap%S zxsq7sdG{?*O8LprBH}GWPFVTyNjzg^ebdl#e(3qgGYySH#V%JPmrbLKpPK84f|m!P zqWL1JEb_oNkpRV3>PP8pwDz;rp)Y|;zp7r&A2S9(j>A&B>cyHf3gYNfV75mrk|5VY; z&_ECUJs=}R7f{$&&kH>AoH0)Urv*Nef;-ZUMPCrBg)cgb4l>;j=VCBl6rB3fTX=e4 z%H*NO^ymboZf;{?5O?WCpsDvghhs+a%6zM0Ktrjzjo)=aZ}!HGB2O<~Dr?5mQEQs7 z6N`dRJF5Kz{}AJm69{~zdC>ffB z!o0Aac5~Ci9P!A6c$?@D`J7Ty((TVO=(Fr;;ZbAw=UI|4P+PNViEfPWi0AvV2iUDWUZ@@dr+XdqoRLf)wBZmn|;Zt}#*)}TYIGp)r}XSALP+>xQIe{N#I_+dgP z?`8;{tE1?^M9oPBg`>ykTtm9m0WV+WFjm_%%FJuuCDpHmAWBMdYf?gX7Hn+2RK93^ zFH-(Qx=YFfH!ntkbdZIBnN((H+7x(q1uJGDfQ4`Dpj~D$$hd@faDf3g(p43VmlT!X zUMEreAh`Nj>;vEy4hA!p{u%9Mkdi}(V~JqVsNo>h4<5oHuGmK8!Ty0JlA;tWD2zOB z0qmoD2wWi=44Bc)6Z5`<;#C(lyurdeNBZ78c-#kSz@s=CV2?p(2SZ+FgReQDFf#ph zun!t04emp3Fr#$e9Q+At!2K=f1h{v^_0rF-eFJ-#f`@)2a7Z1ghXH2yqXm+2!oFZ1 zBs3i~BY_p21y$H~2mt>J2H$}Ua2BS5UO}H9ps-`$^}>OoLgP z-xtcqkJ544^-O$-v!$5-x!%9gOlIThk2Fsri<9(ot!Udp# zgPkg)0`o+GM8HrIcSR7&0V|#ALS@J0Tpqs9WN)TQBz)_bAh+qCw0CB)ze;B@pU&a} z{FvO>TUuHwKt+c9@56%zQrd&YFuZ!u|G$r3f0Jf1E=k<~Hcl3CCC#*J>~chP_5}ai zU|vsvBZdEOt?P@hblr`D#}kNN8MnMM7Bs@ z&L6t2-aU&+rm{>FC@0`yNUJP}_up5Qm+H_PXMV!56p0BOU9=~zV7zBpnvIUaqi|L* z+01DSRp|JRORQ;^eQXmT3o!J{ic@a}MwhI!_@b;_>BZa%9nm12S|92tRqj!b}=HhVr4XZ!W*Lk?!6N zaBF>ieMt$#mj;q5dMp-(^&;}!e^xv;3v`&LZ&XiLH#&`z@NKp0wo9a8%7KQm_k?CL zon@r=W3k3Zb(Me%78y7k^zZ0O2aO_lOKe6BSCi9|kO@zU6orkZqnKU`KYg$*@zy4z z2lk%W5C)3H0!gA29XFmEM)SXuz=@>k2FLOapI16hj&Ku)m2uk;M5)c@Idy(9jh zKS~g-$1jlbo5Y$oUDrnle6y}flwKEp*^?*cK3K6v|I+OBet+`*d|WQ%YSCCNKGA3| z4VcA+hHBPAM-;z=9R&pyj6k#=VK)vGyUr@^(*M}Q==t+`t?zX!cJulEy!~TAjzS@) z6Y%C!Iea|T%;Q5O7)%UH9%KjqW0QaE;twi5*;+TmD!4&-V!07jXsb?jF>4cuO26Mo zwDdiGJQByaT}wPb;hz)rqT%Q_9hH%hFC094+-SLg?|H!_kS-X73q;Fd6W&cFp5Zph zX}v@nhhy8Q^!(f7SThplFiEk6fS~5i&Uv$;ng6{(4J;4*ZskW~(;UHA z2_t?Ka^vOv3`OD&{K2{sH6`67Rf1z$MEgINNI(OxIP#-}VnBR|N+I6&>poYOFkIWV zX)&5(>m}Cr!?-^P+JlWCnAHPQdr@Gml*km1(WTe7k?A3+L{lnq|RFXyj9bljrpk=1Qr+9(fp zsLPHg|AQ4bx4S@ia<;>7%9%_XF3Y+})ayqGzApnSb;c60_?tEQJ-?>N>}vZUHmtYb zx1NhYjen0dwQ`jZl4~|jC6V>ZxZVz75V-tS@_k?5PP5ty5Go4W6@+1QBpS}H?!M`V zJ!BUAxG)!Z|6R(@X3z_yEm$}PDZBN&<;l?RDXvC)b`hmY9A>mg4KXH= zO{809EP4=pGp{DZVk3ScdteKlKmLvZd) zJc~IoQNNKN-F=VK)eGNa^b}8%^euw)3VMiAjT@qg3lJ4B_K>}eqCzTRlmSy?;EX?3 zh565_@J;)3ZeWJMIpo}o5LJ4DyI3^4An5+@28!eC*P?g9ZXz~&>MF1IbJNB5^ITud0T~F6*lEZ%!e>0Q#nwO#S0zB5iIM|? z6DxFY3nX$`TFRdq8CszcAMKz@JKRt(BnpU_9jLxgs9Lf!w^G{RRt?R)OBs9+$arFG z6k{YV@<9T|7|C%XK%Wk*G2j0dIxw5m0PHjZaYv~Dm615hKW+f17sc;lz6;I&`)Q7o z7&dVqQlL80q=Gv**Z|2~#s6Ug9$b*zol^Cw3)!PG{~*#y6RrU=BPJ%!MZ}8YkW6n(o)T@lhySMGgq%p zs*^M}8fN%$Vq5&;~Yp);xB zqOks&{lZ}>$`AZ?%0-MecO@7ka`dOP#hB(=Zm?rw7`i|Dz%fLxQ(BPy>jZsn0tqT> z`(bpnH}vNX2iWu&Tw(8{$ViY(SkF2mjz z!{Tx%pU?b2;a_fJeQ{~dUjhE(H3&t%*WaR}9|4*Ag8O;Hd4}hj_XRwzxBGqbI>PI* zLSGDd(y5LSt9q~A?QzQ92L%qlKQQgPJlElFD8UhQR1g(NnmW~gSl@%$U#`c|B40oU zu$MvE0g$I3Q!k+*H6#9Sf2QGYL-Pi`we*-om9R4w_dtk-yrX3Ja;UvFq(^ZN0|)|H zSP&tZVIy#6!w97)$7u|Z4v|&OYgRA;S&oz-Zht8X6&!nXCw4_XW9MFo!b`bZC@s zTN5o}WaINz_p1v<7{}wV+aS-h=^r>+)c?A}aNPkIcY?_5=dTv0+i=IizHlPRI}`8x zkA>VXR#=p8B;rwNT+ZYpcm^dqkIVWqVyAC%l>@;3u=2@V5XD)J!&vojIP8;&cr=@- zeLas=_GR@gAmUUU!T;eqTa*6HL~SI<`?CG(-xc^&H@Y)o2)}#$3xoe!jjIncEE7$W z&Ha6f1|8}<@IfCW!Q|FW%EHCZp7(52`@&}_UM=q%2lU$?WBmsAhK+|Q+A(|st#1H_ z7+^><_;$9A#7XQll;;RRjGP@ zZl_9`>3)`~kT#b04$3()9$j+mkn!6GeaD4SVv$@9W>+m3%Cg~He0?NjD) zKg9t6(Zwl_ZCoukudkSjSqLThP7BKRTmWyGF`2@5T``Q}&Yf;BN46EVfnAg$`p>}| z;WChARY5EG{Ce(TIBZ;yj}+0^tq>boNG6RuQt-(9$Lr6U!ZYGyg32PLgiOu>ll7kt z!W*i)(bUGIeQR_L!njRTLW)i~G57qq9r1lz$YnOT@a+7!o6ux1NF!!kSA{Cok$2zp zIIo&RR1QMWyB7ssciWG~;*titE=BfzC?s$Upz3#T)}V0&3TTmzA{A?#EQKN|KtF=JQK--YO`S7Cj4#K=W+a-gIQK*^{-UU%h8q+&dN?Mk zQvI3eWk)>89=g=Y{rRu}%a?wW<^8k@bb%L*cD%%MT9lZC`MuNVs}G^Ayi7i)998Nc z=>CTYHQ`DQsMgqKh-v^fPVf9UaEQO3$FMl7Jk%0$a{ z*#DV8QzAORyygi6cGwS!W1igtClI1YDnhkIJn%h&;)VA!UYIIg600vV^5dzc=MciA zr>$hjJMD>Y4S6gT)7v5*InH62IB9fi;vU8?0@vdtUlBO+<`$~~ti6Gd$p~?50rxcg zCVug@>fy=j^v{1_KyL~VaX+3NNez+#B4@8Gu3kIGUA0sg!%-Kav~?pc#5T z>RWV_>GvRUr_ido)a^Kt$@`@a`;o=*Le~K{_nZ}iwC#FavZ2s4G3gzoxDN>)CN`Rc zio#;g4BNvrBc3C?u+q*`6w1xGn@hH&*GjuH*ci|K{4w?lroV}n9ToHwi>U!>nZ|61F(y`I(Yf#9iND88u za#U246lTgBg(p;e*g?97oH9{!;B7baG7OFnOamIGH#c9G0Gd$k`=cK->w$LvsZw*~@?ITATzrW}_{QLm!_FfP~r$XTQj(E>v4I z0_Al;T&GD}jwi<^uFl%H!g7IIqoFgI31yIbaP9lYQya0Sbq@wZsr{CKeJPv4^tyFF zhF^WkDUi2)PPD)g(;a(?D~FrF9dw88Iz{=e+2~l4fq?{(I@k%ie`iZFs0}Na4;?n5 zIo+J~UUAPWLnk;GBnAI8NR$^lD7%zYi2Oe${hLo&SKjmr|7YH&>7ZWHS-Lj(Ara?@ z%i8u`7RPSo>?EO7Lw>g=_hFLeTYt&WGoPObJl7!PlA4w!8G)Un

}E@Hj0_{W?|f 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

FG!grkAXdJNt$uIvKqhcJq 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 z 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[WR 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ⅅQKHz};_SkLL8?V2PS1YROEdQ3~XQxay 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ċXdTaw*%m;m5ZDbWgJ_XqbT zDvAh;-~A5{-eY6$?_p6wFPKWC2wO#bCkhup5n5$xivQYC8gC{q6W18Df;8o)yZA^L z&19`0^;+FlAyp9lc`R#?1}XdxA=qZp@qYg0K_H~ccT+X*5)8#~rET{E?)6ete%?+` z>Pg;Oc!igL?}wr%P%Jl@>kT2>A_9lw&WZ1JDr##o*-z!EZ(sXULd{qi52l@J2FAZh)l%b1RxVsPVT45>GYK6W zs%mt)YBEJObA&^*vaO~&Ylbo`Q*J?uQnpw@EGyN#=FD{MpiJ?21iE=JK@!i{WQwiN z)*KO=f$)&wM8z%)PSI(CGAWa3)9c;ND@?)lyrRtaD7$GqMXV^g$953;;!hXxxUiRa z{)GPb`7iQmMGUkxRpBs!#wr?u=&Mts2N^sjCv}q8AWjT2j+a*tX4s1U)^X`h<$6f6 z<#{PRw?(ir$IPNe(R5FYC9daux!_Ty_s*Sduj|)adE_3Nm6{4cb89eLQ_KCsL(^t8 zmONhdjy;uav|LBMmFJmw)HSpDHl46wr2>kjJDF$H`h>YmCMPl;nd353r|-GB2~crJlEYSZdvg__fXQwTu_6lDVdjdWA1o{3pj<* zWO7`~@K{3uUOy}vzP|fwRJ|qtV1!mFv;onWLycv;NES?DdSWTx7<4q$E(7u-h5`*y zunjTjaPhRXv>5{Y=$2uqyQi2ZfQq)L2rSx1#qp2#kA?Cat1N}Vess|sMKCc!m>fu# zskZ_Dk$MRV&f0w`meIYU7U&TXTLZk#7Jyte?LOzQY4aWx7Jw$Q~AW05`zp#STqFF;8>m(vmt6lfA_v~Z zPR||?_~jnZv`K@EVgRKEX5W(W*9-znsc1ALK-W7`aQY%CLFZcpXF@&6^`$)77hpYo z+MF(7h6)8Jg-v8eiTVL$q!< z6Dva)^)DRY@#s3N<7D%mVKJO5Ef3}A=sBe0`p_8|XbHCSjuVlg^#tR(kG0h7_lfWM zl1KPfPXTED71gAg({M9iGpA9D(7lpLmYY^kHI2xI^)RNz_q_|9^Vt1u@Lt}?$Rx3q zHB5%ploO($xfB!a{`_da$~3pMA*$%)S5+tR16^{WCtPCoxk9|No(`ulTm=fi#KHxn8b$4Gmy;6T91*vrdDsFfq&&+a>I}QT$-}alE@Cye%#p7#M?m1`^VJfG8cOpRxv-IIy|LD(Bu zup^9K&aifKUsoB@Nn7bY)Aa1qEhPJzHOH=PpUXl~YKAlYhmBJ6h+Mf(of4$kGP zTX$P|+AfOJI{A+^{3aYTYfWZ-JyTk6^vZL><~Vh&vlYu3rfjlYLOQ3~Vuvc(WU3or zr1Tw_hLp&V{<6V6?{K~U=lAWc`Sn2g#B)Y1$I|vgI{Vms_kn4(^n+9`GM{>0jzVyc zw}D4rdDqgU7lE0S_m?prJ)yM*{lKmMrVAUiXJ%@od0D)1YmPYm1Oz%%dCc&P?81Gi zPrCw9tq1gXqQ{a;6W*LaTZ}hEfZQ8KgPkk$SnEiQR0cX@1pK7h#t)q&g}+E9;vJ`^ z)W#ra{#A7IZRFuvDtpnu`uUfL3)UPQ%^$9Gte&zFN_HT6wbgM%x*;df&FYfEG1M7C zi^8c2vThidKUDO4O3I6kMs#~2@X%(71?`{{b^!S4o*dmNZdgCkaA=OK8Oj^B=V<(E zwsIA@Dm!xAHWE_a&F{IWFkTgR4(!*CvG%g%MP)n?n_8LP-+zdm&-~kpr)ZgNFt64= z4y*IK#RIXN#67XEE}w2jH5KB|X!O9sgS0jZaz346t+tVpa;&*}P+mM;GizAtAr7oD zzJ8NePQ%;;ZuX_g*>X0l`h$sNY5e8_m@+(I; z9jJe?g@n)80~8;b0WsrkzymB6?GP=0@X-||R`xgwF~lER*GMXe0L{oJ8sw1>3;HW~ zavo)i>3u9hC@kMB(jhAQ8Hub)#;Im9oEt&u5LAAKA{9-T;Uo~ZvcZ1VM>HCI=tL08 z9Flu?l(}k&j~%E26#63lz55_*BPZ%M<>gJ&A*9Q{*81JdEHQB*O`<$`g(&RZBI5P) z3w;&((H>lRL1fAdngPe z|DM?l6daIXAD}C+F_N5}(4h!@0FsFhk z)}9(slQ13XTG~*X6#4QOT%rgitrTSyu@8O`9k`XdB8ZoQkhrIo8d4l1RUit!Yq#5nAZ7~&4Kb?jMk=5p zuYHaR;rgv^VHD49*kh>!z|9}MR5}9*m)B4g41#VUE=Qd|pgS2aVRN!DLyk8M2;8xU zx=|ud_tx=GP!?Arft%7gp$a6R5yvBExr3$A96Rqb3~A?zrw@N^$kb+lcVWq%aoY#g zWXAs4z&2E%MNRBYmsBxVs5cxWVO)jT|KoSKl21~`FfHXz+3PkL9R}?WHXW53AhnGb z!Mq_*Y(BCCa`ZKHSKw}p6k+;F^5wEpf^rpSaV&^{p{Wm57KC`!Mct0Jv~IQ84#2Za z>A?Li^|XuAgNufcu~$4l9l0MaMp-Xuv(YSd7CBwZ>>tHUI;A9$ zK#-m;DU$|e%TQK#{;0#|P0bfjRFzc{hEC26sIU}CwN+B#Ys2VaYkG<{uXO+H92g1x zFcbeye!yZmqHN*D8>nC~cx9t+At&AU;gHEAZr|6N{Q*wQ5b!{@_L99cM-CM>K~}?B zOA|;a^w3;LLYzFTNZh8jjuZUXLhd6?({M+9N+NJ=Qh7xG9?TBIL|^k79K1G8J$`zz-f z{LcoV(wMBU$-4#I1f!K9bZTyo5|~K0fND5mtn>zsr?P4I3HFCf&hvtjpoSy-bOwyR z7DxneuS-w~V(&}@1Qs>=3Wl0#-4R{FcJu1?JuFF(KutI@YBSL_Vu^TSVVcgrQu6lg z`YL)Ip8xX#@N}OSg>jFcT{w$&tTILH3^*z(&E{ojAo+Y z?}1f^ZFE!ZbKI||WR~c)hr|sW5*>-0=4vllV?4{AJ(}cb!0x)(d-$86*j=|}jQit;;=T9t#`2- z#ho=jO14r6+ifC^9n}o8@0M*VJbR^7(8uuqyQ03@vV94ocz_nB#FA7nFamBH10C~=;yg9masmmH zn2d70nZH%inRjtzGaUMs+&oxg1#A-4$XSByBQ)uCc^Ux|T6Ivk$P!;$l89Rc?^HZa z6xChNiRu{Ix=59@P)lsstJ=3q;ok_}(h6j}^-^s3-4C5n0$g0cS2P4Z#ORH%@NY0} zjNwypw3$A~wW@u6Y&10DWWyyBcSKA4t8&gP*5?Q7IgBO>KGX>FIODC@#CpfW(J7^2 zx|jrH%I&=Gt`ln_gzo=}L#_1t#8yul$wdEvVt^ZbcP$&%?5gj&kMX!1`dxNsE>%*2 z=l0ppYmZ(`XO-o6P#f2x`vbynvDMtW2gG(+z0Qs^@bXGC^5@q*`8# zJiTFiU|(aUyPn$A?7FA3IT~R0#sNc*>Dwv?!WJ61Sx>AC?j7pim<>8;(?Q8RQm^A0 z(xb5Fs}xiB6J+grKWeNr`IIyG$g3Eb7LAf&-1@_R4bL4W02C31vQW*^pA zZ#+Y6EF-PtXl6b~#rI^unQ*d!K<4-XeGy8xIKhWmn&tRk9B=1F3GH7j2>gw3*6UZ7 zZW*107M(EK$g26SgQ(6+ninA`ajbWZC63?slr$7#X}~w6_%&Q)*QtABV58!%GX2F+2q>XIczR{vfFXJ2Cay zf}uGwNA|O3H;Na9E5Oxm+Pr#*KtC^3!3uJ_WUc8tj!I6wDUB%4lmR1>e%UQ^wN>^- z22DIvc>)_0Y1HHaNB293pfK7_0EGzz4)$xs#)b>g`7*p+m3tPvk27D?TqZ(CY}1Ot zp#tkAAuymZrfX+e42w=nS~#K$#B|CYD`^lA?~-gg?1_QGE={V|k~Em5)J@lp8+g;Dz?dnI^n)@La~@$3lt_uC%ZL~I z^vaTvwO^kJDWYRcfPOsuR`-R*RSkAjzhLu&8rTn5ASvAKCUGM{xiKs{l|eazU2PVO z#7VA2?nW8cjE@o`FA6tLkqr>jD@4MwRaq~;A1rsC*O>^=dxPWqp(HsLbKQ7aKW7>? z#|rYIF!9$lQVE3=5@cZpPf-SqkW@cfb!Ko;dhzik843}dp2JqWDv~3{cINKG= zG4xObQGx|yfxpMQ?9q1r5^-E6|ntGW_mfP6Xxk~`3ZXYV$EVG;ggChqrl=%_L!gGzLdZ#&#c;iKcwNBjVDp^msR zN?}4wU-O}4Rsy)kzSL*yuPdj7govOIVM4DwDX^YW z{l+{+3e@%#B zM$lL$^lEJ**z(J%J-8{~UMzibIVWL^oEA&()K!q?-M@WsEKJ~9uyi@TwNfaP+s3i8@Q}Z5r*@NdR z2&sU<&KAlcl~f~f5Eqx!Gwk1T_|3p4Fdr)%3o0Y6!8z_1D2AB)%sr*x>Cv4uGVamk zNY4EwUBIeP)R%~Y9hE&uQ7lyYH-KB0tW%M)Tax8Ji!tmwZS&?x1%l&5AR zQx%IxDVgCt9I?e*98W+bEhJN*DU{6A3B!!q4nIQk60jer#>Cf_8AF@R2yD{dq8y>% z@5aY<+6rkGrY22CixG%9(?GqjpO`{X`%AvBOA7P`g`Y~yg}=nH zdNrBJre9~$+&9v`nJt>*2RZ$^CeYx%|2aJbN}L;G*Af&q{ql^OK!+bf<{}Le6@nHL zfVLa$Nr*&{jk$-}w}~}O7C}M;8Z_YU9W5F|l~LVq-iYI_=vbkyn}~rxw-YcI`4t5-@YD-9;$+u3LBUYgf_@kqx|k zm|kGcaM8N7G`q(H^Zx~QwdKBqOY;2!27Hre9y$Zj4CgSkm)#!S3qWTxUbH4I7PDX6 zOULp4RQb-kESXp`_}p_#@eZ>7=BG;dMUmZSf~sKjoCz7K^WdvBzQE@sJ2d8P)@_|iW3`1XqWlKRX)gX+8uO?{}# z3x3&Cxv|;ELAtA4@*)2sF*z$!_;@3e_Szi_zn@nmuJ7r zkTPGMP&Xwq3kF44rLs2?iO#FQ9+08)Hg%TZL>=eIYP?+Fm>OoeHi$K%!-(6u!4Mh< zV;&dJaJFh9CLr(Qn5>Shx61<`k(YI(ka^k?t81Rz-b=s9M5@m;$ybg#y?;#TNoZ>u z(<`(|Ix%hMCttK_f7+T>Q~5<+4vP+rF$qfWz1HL$92Ya<2Li5gNfI5;gW&`G>bD__ zOMg0>gwc2ja9m>JH!)(Nnc%AE53W4;IK9m*X=5n)L3+&|gYYXx-VjYiX}P1txfwc3 z-K-ieV+E+0g+_ zXUJ__P;C+>i%wdbVWm?7g$Ng&Tv2Ci_=iI!kXf5A>+SbjU{XO4>hkpVjr3+qc?XSd z=||H>gjh9KLh*`0z?;Y7hgmO*=AuF35zS>U+8bZfeAh!6xnkut#C?5A+5RY!rFCA4 z&W2XDWDGjyp^u7T!l-?#<7weR(|PII?e4oS(P^_-uzGerd97>lUY)48by!(`y24hp zZe%pHDHYT-O>aZ_X>$_2Pl%Eq0jF&`ur0w2K(HUGPRR0W>aEeZ`Z{(+!8_^3YJgfC zTAOB^5jbtoJYTo(8xA)AZj9rI!>VlynOvf3(7sZ&V$N4>H9j?+j1usqUKP(|UiYiu zx~)xqwI_rNvAk3Hi!k&wr>-^E7So>F@OK-Bc9;y#9V`IFYgD%K z+sC7BngS!7*_)PNU56M(ntgBj-Bjdm47&c7*B9f*YOZ=1#MQ&CrR_bu;z_CC_sx@S zsKtbYf)*RiG)RVPjHsVZUG&+IhqVmuvX5!N4tNr_;nT4>W<_opCR!r zC&sLtbpZ*T@!!LN!_G!N);=1qx9BF`xIWL92E12Y|G7%d=>fLq4Ld;q+G9n~i)Jm{ zzV}X{L+}AuH-FK+PI7QhUvp<_Ed&nQ3QrvHu?QR)AX;)$H0rqO)$sDgbq{EbRIk{q zyk!+F6#rGe{4?mh6spwM-_3P`%H!g;=$J-Y7pDNi)f(zG-w?+=0_C$|ad8QFj!%oy zb2)cDY)Z>^r&o~I zW9GQpVuP!+08X1@K5MPrZcPJ*VJGXf2l`+|Q5l9uRBbwbZkL&91&;-ZEfFImfZ14| zv(6Agw$yuF z<#4(PKI^j?QWyy=VY#iU!&i!^HO9Vjp}uxOn%6iLrfvIusg41;l(KGFfhiKTwsG)b z9j+rJfu{E*H>jQy9>^;EHmTZ=UBsc%I`-G{3bo>@!b_5OkBL~VVO@}PwdwdT@s{rpDZ$P z8>YzJMFpvEHIPO&r^heeMGt^@Qk7_*BT97OFQKy3AltCr2Oh{RCqoAwhTpbxb6aed z9YY&vnBbt{c5KQRhmx{3=z3`e08WUf@lZ+~0|9n72Hlmj41Zphwe&uCy2BU?>ZirX zLwc0hz~cAJS%2+pFH6cFmR{LqC!zn|V1edf)oZU@^gy(mzG^h4WjKuBWlgJQ_&qAM zKpn+alf7z7H}rZ6g}NN36qOry+g5vG z_Y02>GSdeCwy8Neph;h@fwp5)Iz@W>?Tive7#Lwd~TOl>eI`h zaAU|yZR$rF<1R?>CS$48?1ES7m$RC(#^V82+Pj+Ew#x;8DMG1b%3;qQ-sHznf7g$R z*@2!_=ZU$kbGZtbRX=W_RM&y)YxcFD74Vh)svY%-j}s_KAVGGOsS{%oI8k3~j2el# zmDS#0(9YrKSJ%WQu5^28zd&@aJ7!Bx+Rr0%1 z=a@pGVoh*#p;lSdO^`ui!_KAud~0H|pIzM) zA0Bm&F0Rk92&Oj53Qr}@qNrOZRGo|v5#xn$a9~n(&29Wl*mZYbjk$Ov3?wios#>jld z6!-^Fr*pmH&yqYTj@4vHq?{CQ&5iK8KsP;UnVbG(vmfdjtr??kqdM+8Af-k$k*sl` zra7%Imot?b@pKwj>Rpi8m^>8DyEpp|D?jpC>=H95rf19i4F=dIi z_IU(zzyF2j-;tQ@9K#9#v3V_g1Z&XTMTb7eOSf5<_z;=RYD+na2d*z}e=B=+W56c` z?4opk`)Uq5P0ZACnayu246N1#$)x3UW^EsHwg6N5?B<$~bs*5|){=dyb;Cji8o16x zWoMC#OP5kivQo-+*$hQ3L1_4*-in0X=Xn>zZT={w!hWv4Cdh6M#~G~!g9ck zmmSWdYiQRKFW#C8wf}o>_MRH$S*he?)PR?69TRoQ%2wq-f+^F(zKP1_Gk@RnuHrJg z?k?w&UU zPrp^mCm5CKuzY{?H#v1RTQ4LMJnEoNZ-HYqJliVE!Y6=)E*quJ<^`f0?ce@tPt1u9 z5Cl~81wl(5;Z7VdAUi$-)fP@9_xJ4!$1sO83RkrN8@Mhle4FPEcS(x>0P zu`yK1ar!MiFSl-Oq3KsS3N7L$IkZYBDjh_RfGDY7f%^q@j1=pKKFJO|NU#$5y2RP5 z>bxy(gm!9~(%I`YQ(M8lDy( z^xq3~LNkQPmQuAJx}q?cac{NG=E%9&(l;_Q|03;{-iIBHGBf4Trh`_(IZ2|Z%>jH7 zjyRwwtopGMVqJ;fYg$?*(|O<(gPc0U+;)>6+4jLPfVxk3enI~!^uwo#z?5{ro;*#X zxtm5WL@A6}LQCQ9KHBEf#AM{PT>yA$tCBJ*)bKg#kGT)+Q zQ(Bc?f{Lhynsp7PT5LU}a~oLRPiVR;C@t)98xjr^Rr~usLBi~;0k(^i_2zoe_{J-E z7gDpXSKAQ@{@w_y4Uk$Abm-&Bzz)YhbykaG-0Df+r9<+~w>}NCKQwt`3^lkp`fWAu zMv!dm-70@A`280RCW5zg5{O(ZKR!v+@DBgIEj;~**l*Z)u}?TsUju+6R?jupWS~}D zo@YUeOsRlx%#zy6DzZAF1CNAEh*)it>p>P1T6Qnl)iL+4tReM64Dg?Nb1@=&n0J)B zPXKwqv?qB(0Nc-d7vq}0w1{-k;J5tC@!y#S^1uIx><=K>F}tR&9+M7bg-T$qvbDdd zI~n!krBg4ZW|SF&k}h7wSTSOLpwfV4&q_dGj7IU5jJh;(Sb)d#JM|B%VbdUzL1)@) ztI+g3AsB#(1^F);1Vd=hhDi zG`cc~ZnMRTDNhS#jRwhl;UXxDV+;l^C$u{&SG$>5Bq}&CmJSch(#(eR$n3atJFb}A z0A#(zwTA;E!O@{<5Y_O?xs;sp_l5qy3)i4{T7gS|*BST)7p4VW_n(#_m65U|fye40 z>p|Cvdj{}@GP#(8Ei|+H+)Tb6gL>&25-ggf$?fM_C7O6z*occOz0tx6INb_x}acWX6x^8;S z%j{B3iRR!^7sr?h1fm9(}goCi}T?Cmop|94FHlI2rBXrPn<+J|6n-xm7v?lN9$Up~L%ick2J|O**_)=aKllq$N~gHKu`4p`kB zV0l8cb$F@+bF*Y{W0|7yTBG{JDg3*g!R{2t|8^ z48#cLY=eV?4FZ;|))k_P1BC-D)PaE^Pu~SLkTY9Zkm)R2Ru0Xk=eru6Vp)r>kXIaN za3EDHw?%r2MS6RC8~VQiw&+Mhq&KJM$0oZvdj{zFmL;1mE}Gyf*P-G!G06G$xQ~M$9#Ht8U)gda`qOC^=jMojv># zZLO`7tt|tC!{klkT=KS5b#8C(92ps7ADbl>J>SDUQS^MZe`2Y4T;aKE4z#t#mWoxY zR^@^-yLNbZcm>=R*0$T)Vz}w<=|#ZAR18D5d+?szHPIDB#eq3EFq`%ai5efP>-n}e zT9>j-J>OEv+Z>#{J0&msw9P1P@V3Z6jnbh*LnG|hy7#MXiZMMkZN-myEv0%^99SF& zT1UsnxLQZXMoFEG1O`#^Hnp|f0j=#FZEYQ$ty2?|BX&r3bdHXXceJ&un|mX;EoM9s zTFHOKfkkqlyDKJXLxZDzeSK-a4i2o>9mJP)+?t{1hw6I1lIO+gu`1UhIbiXDG%_~m z|J*GvWm$zEa;^#`GIi`y&O*mWZBFiNnesuJMfT;&3aU83LiP=j~+ zjSmiu_V@NpPK~YVU$bFweP??YdwRJ=y~4lMIk4>0Hj5rs*?6IBmE`y8>h2vaDz!dy z+v*&s2)J8uzzTy&QjF5=9ekam!=sav<7M(@?6l~{6sU#zji&YA%k;OkeQBK9`A*3hh0C0~4e1-NN49{-L2^vo%{A+B>?)TU$AGv+0_1 z_J!ydTNVOCM@RUDttzLUH)l)J*;%71R2*0_4onqo&${5e5R~h=giFmcM~&Pcp@_ku zAr89suFf2KT01(&C#L(PSBwu;L3bMtY~t9h+YENEQMf(5{j7`j&W?d0PiN-25AHVg zt|~Go2bO)>MuGA|F(5`q#-}D*{p9-MnJSwHh*4CK);Wg})4_(G9~~w6eil7X&fBYYsW`A=9N-`${5C9F zYU3uh{6!jdfz-yE5#U9?O3Vb_-VP>Co~9cc&1 z!+g``0oAE(B$#R)uP+A|Rlmssag|bW;4V1eOi$fv99!ML%E)b*;X@z#P%D{Z(v~d* zW=zq4YIodi`D#NTYYsV(*M{?{mKVSHrIRfaz1@B52kz`>>$LgY6@OAHIj=adF!-Wu)+4o=yWk% ztn_?igWp|@-A!8oE6AA~sBMp|AFP<_>FOCA9yDR|-^V`kvEh;7_SW{U>L}%sbn|T+ z$#Hn2&+CeLsghx4F%RvcI`2gsY}0j zw&rdbxK=)lk59(!5V2Kq2ub!cjEzl5sU*DOz;bYaYPD0*l!?`7y(?E9RzU1G)$?%) zyH1ySzS86s2Ud&&1drGgJR9Tr5%S1odeD}&7vxqYty3&VAFpuUBRLR8 za_L9$m2cf@+Hp>(RP>>r!5d$-+Lh&w7tte~MJ*G_(3|30vItSrR5t5CrN2#>t+nZKBN6Q!Z}<5u z>)H!e(6cvWm0EFN9vqlz=@=fF=;>*9nWH7I(7@#^eG&V4jPlWWwQC1ex$l8xJYGpud4 z2Wp&Y!k;Hmn_(tuH*FT?)a>+`wnvt@xpFr{(h9s<#%WuFdYa8n1qyVWdW%aKYDPl? zpo&x+SXvH*nAL-LjNC09jy=S&vJ!}39D-{CtAj7{Z=y;qnJ7#Vi_uU!R+ouOSmGiH zt+L(SIY7ot#zMkdio?PccP4DJO`n>@b<4S;Tt48?^R8kDJzp~#wj6VXq2jQPXf8UJ-#b2YZao(*i%G9zpS}Mq24j_HAsh&6 zwP`X|eoopg)6v@F4oCm3j0!_Tv0ulBhr@)OR_HV$7gE2wA8ftH%&%t4uOH?|$2JdD zWUPhc+w0KX)x`xnQx2E55=G{Vo*x|(FOHL?x0{!i<_g>0j05DZ9Oi6s%#ybv6>m)# zm!YaKvu*e(bTsjqdcJn_Z5fKLP%e}McS~ioQO~z_ba$?Vo?j5#H(4vYiv~!WIqZQ= za?PW>&07WeHrL#I)^Q&A5+p5?ZPAinv1wbJvT$fJ6zE+v-n_Y50ahHCg9FXuw7ByI zF^0Eyb(9NB8kw5G8i|XGG@}w1Oxwu(&`?~g*TC5vZzNWciUUi<0i!tge_ScX^E%Z+ z^3B)mQD;(S5oMU)D3D84E<6pHA07_(oVB(kL|&n)I4~a$5WJkW@lz1{oJUE_$b2wt z9wr349>j&Zo*xo#*f!1aI(YTB;=qz|V56RobMi&cw|958Z~Q*z^6B{{t3!oou^d?T zXy^QlRLyed>2SP>48e5(#7at?JeWS6hZqUOVdy~pVJ<>O_Ad5bte=AE(3uf50V zsESxi<)YsGS^4k>9*ENmA~xegr4tio9qrnzpQ$GX=^g`vP)A*?un11V!BQ6%4Nsv(xk$DGje zm7ZTd{#Kah#{t^DA@G@FIp%DQ4%LwPO3%-)eJZG>Wkvs0yEWbU7Mb5{@#W8LpGN&)1T4&c4mB`YkkX&e;in+KWOA4sjwmMXna4l}b@9yMfV+NSGTHX_=aE9R_b) zT#ZqxFs;xeBkJW~^W>E4>c>Y$ee4UW#FI5j{v=N_i#;LD{P7B8rU2;da5KRKug2uW zScm)Xry|AAMv4!Y6~ZRGP3H%;%cvko1SDm3vM!M4Crtr}XZG>25qV+oPl|t8#LTBG zkY~M;PDNxyx*|NYcH&utXC?xZsL^EslOeNVSsnQW# zL)%u)BsRlm+ch{Tf(&>v-S?&&aS>!lPht{Dl9#0<{YgVgAeaC-$Bh2QV={+TGRR86B+?+N)eiSRszfi=W@UxCI?VtWE`nd zs9&f4nl+yEBmiVGO(awN+&pa{;e;QUt2|xPdAoAb}|{gS;X+9016S2`S#t z;j-kbX~e)LNR&kcHnxzbpdnz+x6^Vpegc3Nujif#FXX2>Y1c})^ znX+NS28lgAJ&V8(GyDQniV%Tnp?KzkPf{C-MiJs!BTt&h;ZYKnXHFWGf-NiSl`OzK zSFKtF%qtYSUl`d9Qpu_8&T zbQnO&2w1u}NXSu}Pw+`381+q@4N9g(3>&Hgj{qJLkwoZcqRQetlPV0!f&lmR^&w0V zQl!h`C!DII=xJqDKbMIE2FT>L2GSxa655fdXrpY4Y*w#QY_yaV;wl9U!lcYfUP>%5 zc*Hd>NFj4c5j4HLN{1Yz6!HLn${vxBm?@c<#DIrHNcjOEBRo<72r|M9OvKMbtFp7w znTe2OM6O0eTsj&AWf6FStqRfwV2~?F)x?vA%v(Jx4pbbdII!g$pn0e@x+QfET}qGT z;G25STct>+i$tg?5x|}~|4AJ?D0Z4VY;W1Sle5k_=hE$cse+7G)iihH2TW zpY!AZPGTTdYcl-A5(U{&1;2s_jEoWiY)4_6o3?3Ge8gFORU2R^qfql?BF=gx&iIpv z?+fKMoN{S(m?81B9A%QeP&{+N_jJXA)6j;2?vBp(me#KJkU3Io)=x4&9!93He!NEaz0^Mu@0L2Yq z66vP^Q0+Vsrganzr&@bTkuC-P(gWkJTiF$nb@x`eSshP5tFQtb&=y)sqX^kL8cVlQ zbm~NH0YKwQ*HWJ1S{bmm)2yC^YA#Zz#wYZh(XrvlshVZ5X3d(+n*t*v4B2-QxfH}m zOq?k{iUuP^t_*;c3le!rSc-9Gr){J|0vL=$*;5D;?X;&V!`4707x*MBGkPn#CrAZ( zg#fQIi>Hu+Jq>g9v*JL-fr9+^+Ng3W)u;Pmx**KT?e^DDu_m+oKq8e zMTb*UB6F3VuM%NuJoqKbC5wok2=G*#CzvD&<}5TR5tl_UtV{70RSkH#kOYsQ7Epn2 zJhLKF1dxy@LebKplE_XdFK2lG6R<@_15NB~VunmceWgfGp7@!i&w`>#ng<8$!^&+Y z_MR|zV~MPct++ioJ~}=+JT@{EMsH`kg)dLZeLY>?F@4MTnk;dQh=B3bG|Wp9LQX`q zGVvfSS~41MbXay4IC~y^SOeqZgX=etQf~(a1~etFa!*fm2dL7h*7Pmq5`=lwW?KQ- z=B91>65e3=>eZ`rqLK@1*~zo_;<$(u9d)6M)L`;5^r?yLnaa}J7m8;tcxb(%FA{Ca zmV(qP)mAD6l9V$Iz*2~E&Rc-_DK8}@7izsqQe{c2m&i(#QA(E5%!hm>J%dv6Ewu1R zls(aAxl%+VdMX{k(58ySVQ&?bqRqSN}hI zcLDEbaV!r1xW(Pwkl>yK2uTPMoFc`&c%elL#T`ni7pKLw6ev~*uEmQJ0TL330kPxf zyx-Xk=e88?ZTjBZ@^8=Pe4gxYpWWHnnc3OdS$QxQr~Je=1Tt_^p>~-CIlXO($kS4VMETV#h-5+X1X;E$LNe1f5=C+s05ITwy*G}u zLri8k07AEDsV4}YAS-o1PKSzaCnbK7=ROP4N|v#hM7Q>RWF zZ@h7a2CF<$69ctK{C_C?uT59}x7uvQ$+X$b+brDV+oaj-+0v+#dl zl?*RUF~*D;)uTr@yd*tYH8@fBmzPYY<{-{;(+4yXw(4plD=N#JQ7el@w^&B2EHBNj z1wMnyvhup>8a|$;`k2dQJp~!klaU!SX3W}auPrWxm_o+etZK9FGs&S@vbxEd#m}s6 z6cH538V%{PuL7;OBDUOo;;8l4<=v;J2o?QlOOrtrS>Z3ea+tOtx_791##CW_3rG zvRSi6rQhWADr+GMFdNoXB7OUH^(y5p$h4)h;>H3`DlS_W>^Bi3G8NsfO=Z@N^dvRt zRmb*iDM|5c_T;kQKnXxdW^+92Nhu&hOlE_K0V4n90mYaik_{41akd2efdRvo_;2u! zIch_r#g?iz?4fY6$*f&!&sgOYwMVtB;UA&^#$h7M;9G*!2V9ARaKOG#o{9g$_k2vz@)=zc~THoYY~@jU2XLeqJ?$L`+fG> z?ZWfV-EsRJthezh!@5mnC6NGU{P;}{JLJHh|MX`Ytha7`ZA=2O7;c#Uw~h17x4-=m z+}~#Vm!vHBwB-L9OLWvv1T*jT)>{v^GUGjuJMOqkFTHfL%{KFvC|Kgmy?VJ&0;glg zjtA_&_j%`?H+uAFlA!mtIQ5qc)K_LE0rcGo#~=NxU;S#Yz4o$ZxY0%%nSc=vbhdeavvyMjoE3q#cnh>7+wqVHj;El# zSuUlkeV1K!IrNbI&ph+Yo;`aiC{a%EWrK#Cz$ztO3bZAv%M;C^mz^9i`ObH~v+~L- zOKEAEvOp=G5m4kSLx&C>1`ZskplrEb)hP?6pP4vP;Fg;Jh_L~-haY|@mWjYbeh@OM za*`QM^Am)xth6=pf1LuD(!wAS>>w~%0B{5^{9Je4b+_1J3thlZ0b4zZ6JF!KB2vB% zF>(b0&MNNNxpQaFEEpn!f--o@>8DD?^Am8GWPHR$)SEN=nNvI=kc($ovWY_R+?Ko{ zlceRg$o6$1i@g@@xZ{rcqv9az^4+_47lBxo)o$Io@dE13xld&cra9zRk*@>Zn%+u* zRtmII;2)p>#g#`xT8MU{{b)HV$Z7)>BoRz0UWrga^m*PzCQ-A?J z$_&EmEF^48=`3Q55Rr{fQ+^p_Hny@_zxAze5e$-pvv?Rj@xg&(~etTdg)d4$>E0{z+kxX#+&ZF_ui7S*gG_0*wDT9*ma-1cD?()M}GU; z-xAckPunYW%b0v6{MN))3baz7l>*C40s1YhqqNP8LZc7q!mYR7x>KjN-~RTuk2&TT zDYTG8%7+S~jwn5f(UUL9Th_A-U#FTtR!YtxLxxP5GDS|+NwMQ$`|Y=<_aF>fj~+dw zv)sh#I;A+Uh7KM2#1l`bQ7N@#RC96ou>ClNA9&yaVAU=UQ1W;Mg24eOaK1#4TwGaB zdBcP}Qsl31`ic!5xh#9e2;l6ry>mY}@%z)JfArIz{&e;ya{*T{QwAKQV3x@Ir5am* z{+$#E{wA)ivF2*%sg!42XPzS1#B`LxmWYcV3kzO&;f0k}T1iTlL%aZCx7~K@*RS`` z!F|h1ORl~4TBYioez#=jqR6yo2iM9=%j{EAfi@?p?sp6|iLbo!%9zpXh@f3I_i=Q2ziNrQeBqcxY|cIJ;ul|h5h#7KsPKP>6cmlA zAfJJm(&d+5&Vu~KFMe_K(MN2$=|)8A2PdDz;$*XGCgin+?u39AK`a}xYpt~wW0QD4 z^w8u-9(jbwW+g(lvPz}MR$OsKlrdN7)w83vuvWkKz3)i}1Sr7sQ>4BrRxd>qw@?YP zEc55jr@JL)m2L7P|3({a0Owx4`~UKnzx?#mPpK*m$<&rpfF44@fo41>g^f2}cgW!W zC!KVXMDQuiL4*1YA3j_yU$=x1+bEj~__q!?fN2|xb*fg2;&}?nsGT!sj)vrkfvzP^ z@85OTT|4cxowkG)NRGGsgxKMSA3l2YdT+fo{@ioVt^4c#2Y74vzn}n)r+|-S zpaoU_8XnN`xVXUq9B# z--2yTX{A6b1zIWa4^w~!qj@MXDwmRMu>t5(t|$hT6k5?>YP{wPV`<1qRpuh}l8rgW z;spy9d?gOlX4aesAH44iFZ}ua_up3|XhQ}KSZD23$Bi3jYYbDz9)$JQTj&1!AEXsy zQdd-D#jj(>Dl@lhuDQlfl?ssYRz-PqFcm!g^b;pfewxcZn-**j`d_yD?)d}NolD6N zhm4*SdA8kl+d+f+o_p>^ufP5}d;(@j&K|b_06+jqL_t)V9{g<+RGmhg*i7`ZpZ)Bj zi!K^4pwHQ7pS|A!2g&S}ws?YI;9!zH`|PuS3#2vWf22TW5GI+fn~itw)Fv0HuVZ`$ z@2n|QRajXKo?<3z;E+QOF>AJJVDF0+Q=AgvYn7RWyZPo53ESh3Kc4w(Zmyt33Cvn! z%{7>&2KdR7AD=mMrm6|jfC0TvJn{Q?+;PuMH{SBa(7bFXnt`4~sS>XX@+XG=$M$?P zGW_q%RhFkMc}Gx@126c2vS_ET>K^DWQdqx;9X4V7Sm!|&F0T3RcaK_HQ&&(}+*DBf z@~dyCXwwOsS;E2q_r$WqHY~FTZf(^*8Lb*KTbpi#8gy!ELwQR#{q-#H^VU zqO7zMJS+31CB;s9p}@wYHz;l{nD^P@n{U36FUUQYJ-T(KM*H>YJz&6qo;|x;6RU83 z#^>Fj%0MhE=+wUK;DZmMdf)(g3K@OeNC`dn@py8L*&Q)-=l~eL{>Gb2tCy5l#2Q5? zyRwSnf}#yJSX-Ac+w4DhNS7WxKV7uAh7ZFDw6gMATfiHeDlEH6DJ&?hC|_E=c=3{j zcinyGE<0~$>C7=aW;D!e>uQkT%+pU}i8dAl{eN@KZ}f|oUww;0RJA-mzvQBB-MU=# z^NXE5DlRK#BNzG(NBWXp-#$IoU1#K)YhEzxquK1*+WNGSGVQ-}_g}}3opG&gRq4-u zd@-~gd(^JPxPmS{I_tSBtvu|QKm%t zRr(4-4ewNAnkJ!4<|Y|#43|WSLtx2=MXuT?7$ikrPkyh6BsWTZW2E>gb3;?~)7YfYPLt4UPJUjjzSG-g^D`v7_6!uWDCip9GAO6QQ8#(8CVfV1spTxZ#$2?u`*$ zmnXNjCT_juq~Rk54<9^Ok0jXGT36ff=JcsEXUtx(@bdzv!y0S5w69uY^;K$X>RidX zWJz^pMH~IysYl~0+ErC>`iy_&m6vMk3tX*ZL0ca&3SV&EIh{Jh5i;FWM~}Xmx{qg2 zys2P|aiczb=e7GDeI|se$)5Z05yIi@(@&viY8t4i@+MLneJWP)HlH|Q(4axi=b`)x zE3I76==@&st~>2uj{tx$-+tR|1`i&nI@}q#(uxvac>dWJo_@STWy~bockTGCop+fq zVdGnGzne}-g#xAj^xzO+S=o{$i`rDCuS%qOKAMM=rhq>6NScE5X6hpa9PvLX@|3Y9 z;-|8HN{l?ojBEDY%FvtbARvH)lX`Bz z$uJXD5?PcIJ?3fQf{1CGc3h{08>D;N^D#K4X_1qtS z@WBV@5xnrltt3wJII#w1I>cVE+R7_*?bt5MXZJ203mcpJcJI8}iYrY1% zWZoRW$yHTl?Dtt~tu;*BR1{L4 zA3k`sm5*eol$A#}&T2Lktmd%k>l(|;SOotJtVtko>7b+dQr+&QyY|W3JJcEqNMpz<7E^p7LUr{Ujvi&!;E3fdx7^|qFluVph!wEs z?YF1gbI)CAYp^>P3YhUg3C3kZc}>33EM4jj8K6K_y95Y)Ggkrr`O`N23+W1qO9~re zx)QsPL$g#?+Wv2s_S);c5@f>z{QmI6x&8b1|K!uogcz`LLY0XLbIACqlyn6{*Q69>jYP6>5;zWK@g0V=gBAZVV>Yzy zYR4V7ArQ7*wN&RykfKr(HVP|zV*~p28!%`f{d@cEw>uiN?Y7%@?b?-AN_QxPacO|| z_ws9ROq)90nwYf?8!s0u_{_})V1mGVlqAoWf6ZwN>)qH9$Hppm+G!`~39xlU&{Gp2 zBXh@g9adRom9}lmKlotQspnjX&MgaonW}y+Nw@art!oYSVRJn6&_kPVzIn&?70^(1 zCJt?ii6GOe3AjPJ;Mc$YHU6TlYzm_Bg885F1(rB<8YWAg@iwC^lb3tX5_WJs8E5OR zvGU--L+`r#Zg)3eV=w}g=H{&@O?u~@cgzpf>q=11+QjSJ#(%%3hT{b>b3W>z@9f7| zb8#2SacM}O{n5cxfqH;G@On`9%|xJN7rRU@$Y{3yKAns#;dQqcJU=Y z4mKr=6s1k=2x_`irj)c32C}#EDkBN-^!MIF%HKpD^>o8E?Gt#tA2!07AR=ZSjZz5Cn5JrR+-Q3h_C1XtZnJp+oyB3h~?D-g(AH zpYV(VsA5`I)Qb#^Q z0M%t}4GWAqJ$rW55k`%&u(y8p4rNnA&Ts9wHFx;E_dghA{^J8VH-4XV(upGBP)oPM z;1NMWauHToQAsIZKADly*c?~dO2;)pDM5PHLefz*vZX=9tA?gD159+zr9^3`IyYT? zRRBCg1|-zl7n2I0zAF3Ire%GrxEw%v0xRNc6i_8LD$1|&PftIkduHTw+{X6YC{M)$ zh#V>86q!Xb&N-4X&ub{rkliUkzx!yHr?s>8~$q*RJa4 zKl^!-@aVZzzglD-IB?)P>#V-&su$bl5Q>`M!l$fM^U=Xb2Y#D26%-3NrDfsfh`ZCu z%e!~)Ow!j_W8_gs9d-VN7X{jBWkwZry9@4@pE>_QC1U7I$_)!JPSAM!W6wI{bQU;^ zMY?PMa~{G;TI?P36P=YM4~)!V!v_8S_kXzQrki9Y(j59S&{VkNivkk4n!0r9}7TMQSSrwBFs3+BsE+A@(`4VQs)8^~cp95l>Hf;wC7`QOD&z9bB z(@j74!LjVX9e3K!!7L)k&FUVb`hxnBf?}GH{4q&4-FzZBnKS=0ZST;jqm>Qye*XEV zOyNa~7A{`2=r>ngt)5$NxsCfF30ZS#c^UVRrGP{P*K)*>A&Vyps@M97Flo|uUAlCh zG2>%hWt(lc;)}W_ZBZb*^4J5`rj0XfO_yDE*{2KURaTTYxXd$6v9v{mYI9jG#t*zDxxV;TvY1*P}B()ry(2*NFXh_-+udG z&fD)!Gof04-StMUIuc)Adu_mrFTVng{A4C;)#M?&`r?Z&r1f+SGn|)Se%ZA#Q>MPh z2p~2G9k`z=NQAR(_RJVuL5Qor7<|deilG2vG?bi9eEEeJn+xh2YwM`ittL(C)2B~1 z8cK@8Q>&2X=&%~7$5p3gy6{c#K@?Ept{sgFY=ANmDk=$UJ~T{0v0BtV=i}L=3qZA3 z*M26ORv5n_z&J$M?B4N{K%rjVoC%c9r5k898CJa3M}A6*AAkIDg1W+x0S?_wojM(a zY15|t_{TqXG3t#sUN>vjC%^g4Z*&tlklxi-ANkQov+Tx!{HRf*w%KNDG&%94AHqbX zW_=>9AydG)*%2d#8f0h9oNWLexzb8ThPiV;<38v&V1OHdd9~~~$osNbW%xy?&>4e7 zFwWEHo+DT+WXRH!54Fe=wYR1%DLw8MPxHGkaUh0@q?AGvi4z!46=iY#Qtto$r&7>> z03dMlQ~vnbSZ|+&Nn^HDw8dLn(T#?>kBa<^WhdjHO@aMGdOSn90VxoLD{Y8I$$GF{51DVD|>C*nA2LB39C9X z+j5bDua71y{_A0(E#szat^(CWi`}AZ(!&K-aWiM7l%G2^z7 z2tr0!Tm#h@>r>q;3loN-g;}s`yW6|y5Yu2Dzy+u z)TpRxo8&W;Ls|mJg<79qK>@=w+6s7qXju%<)0V5Pw%Tmr!nmKTwtCrzqcD`@9D3-X z@@H7&p-mg#Z7y(Z$~wWEdGpDJ#1Mm;CD=`|2-w5~lFi@44?nD|Y|dHa5!{AJt9&MM zojP_V>x_B9A|6BK=%bG=E-hoaJp9OGih$G724Vx@zes3#^RJKm^QLY1kpmqO3y{fc zh)js3Ki~vbxv+K5J@*Wwv!>A$LWCVzmbZdfkt-{Abi~Qg;lqdQzyJQ1UwSF#8FRu8 z3}#g5x}YKVn{U2((#dD&qMy!RKrGY}-K?qE*5~bZoK#oeaN22S&_|UORjaSQ`k(&v z;o z)tZ2+-h#j?4Z@ps? zraoYHgeU~9PVikjL!uHJ$rU@{CCbL3mAFajW|v~ zn;L3NV({+31NXti%P+s?fj>T|)GasN%xy7px z3IgUpLXB@|78g^snHOd(VtSK8-Za2 zNbs{m#||n5C(WR0wZOh*DpraHDy>qls%yjF97Ib!mo2JOl3tMIOnbpX?Qq@M0vbJ( zU@HP*zpU{;HjXrdo=6@n zvMBzAi_e??3KS8Tg5pvEY=QG%nf{KLf^wg(&BBHJ&lb^ zmMpcEgCXaZGK&BD8#(tieHnS?|kQQ)&lL9rNZ(oU&9qwTw$fI#O_$3DNUHu z`Sbd^rInTCJ^`@fw{{>EbmtFJXliUSArIj!C^+YwGx>Ab9a*)wf8o+ge;zDNmbn}z z9Usm9goVjVNV;->aL7qXIJUlN;jgTd{|n?;;_>&_pebf*UMJDF(TJ10zBcY~@7=Rk zx}di3+N-ZK=|Wi+(&D9YF$M~|fYE<<+;;1+#~w9q+=kPpyl3-aVX1FV7rVZWDDdS2 zh;t1MjqklXRacjY_dd6${;r)nj~hQ$~rHCfX%9*{(i#nVRg9i^@Fn=L8 zzXQQiP@X)=@6a%4_uO+|o)4>$m+|r|uOcvmh74AhIa07vy-l%}8;9!}8{J_;sPON= z{rCT5?p%GRZJTzaMb9#adFGkt7~C@Rc%65_g;!m5)#Fb-fy=RksYKt4!Br_wO(2uvdPj7< zw0YQfS|)Bb(Y}{QAAchHNNFhzqYJ2oNP}san(IF{EhkdzehET&L!x&_hYLT3{E+u# zJP=feKvV}6C-2uU&UDIH@ zv?eZYCGM>O1=xc_h7J4d^Xl7fyTi@UQs^}QXIGB*x88dDCgUfd{DTioCY&;05Ei#| z1aYE4mU21)@H3c~^mBYRiYwQ_TE=Lzm8IxE27WAVp}zq=#e*f*D_Y8eEaYr@K}-I> zCxX$6nApIJ11?LcB{dNTgj|p2t+>w;#b*h5pv~6Ixaz}`MaaF%1|r)yP>2btjnHWY zo{4NANwchs3Gf+bTDr+0>)7=WOCKmHohz-TW-0oxymLGMqEQGF6I5^V0-&;nIo%VQ zv~wtsL;+EtV!f>>1|R{3`i@oz(9pAxG+LA@k-^ZVT}}1X8VHC+;VH=CT0{LKgc)Kq zA(UL6?|HR+bj}oLec}S*JCW{E5Lc`RgBluL&wyiNMr|;0!g%Mz)?IszpIKUs>%=b8_6#W0Rc4WL=Pwz3p<%l zuJZPK8ysvwCpX4Ky{4+FTz=?fKeB`M z*Gr@1V^2Q8r0m(F7dNyU(Ui){#N7e18C&gsVkOGl8orJKSpy(`B3+m(7#ICK&ie%4 z!(=Utjf->?Akr0~J*b_I?c>U^R4`^xG?=l{PiqIEd9Jy;FRpg)e`STEAYuKz z^Y)t{lYtGbzZDex`qHca{OW7oP!z)i*HwGtv4h!vq_215f5nwPRh5UzL^|dg#GS!Pj4Z`wxHkL+T{y5~Q-&T!Dho z<(eAZ{rJR_&sY{X=%D@j_3LxPEw{P*t+LF{C3`=jLz=6Q27FaYN4HOj+Ok=Bx81(o zp+lR6i>u8~LIET#W96!}w0*XpBoY^J$PfrimoDLVscDE+azYRYmy~|=(MND2e1J<- z3uTcU`BAk*UjxQ?^E&YTG%o@wlx9Jk3Lu4UP;jedF*gdxW8pOl_rkMGdpiU~smOl-vWZISl1vk2%^w!Amar1r3-- zZWo8pbSIv8;&$6^1uaJWtFOMvu!bbCYEe*N?Ep*jYK25`r_MGVzlno7K9UHZ(Hm^g zr%(4`E3U+**9X+7INhkfopHt)m?c=J?%1(|)gicz7`_7ixW#4@b1mMo1E4AbI4dN2 zcwvDHW6nPNYzHV%#w^bHWzF1Xn=SphWP%NlzMyDVO}I}^KmAmz6a-6eAGgWq*|R^n z>z=#8|Mv?)oa8vS&THpulGtb^sY86Wptuc+AAUHyU;kda@4ox9&%Z#Djk94UHpFM{ zY#E<5>tkzKy?b@HD8x_UHVqS}Bv&Cqu1sv--VwxD!&IGt8kb4M?Af!eq>bHp19LX& zOrrVNiYtw<(f6IV-X*({ zs11matD?zpb-F~sEC9AiNn{g*`RkBRUAqqL^+(NtttyT@@<@49nzw+u-(|b)wyUYD z)np24yY04q>ZxaKNu4@%x-LLb9CFBaMvPd|KI=t`s*x1qAi#qQrum8*TLV%I9@OXN zo9+lHN}FerfW;Uu;-DrTJ^l341JlvvOfDSs7T^6OuHso0qixQRHD~5^lRbn#sP$QeT^1}YtvJt_l$%9^u*nF*DPt2#GdL9hH&W2Pa*bWcAs z*j$CoQUuVrPW)6w07-MXsI;+BzZP+iYepto(U=Z_CprV3JH98Za;2&O2ejBTlLjNN zKn1xqEH4ERALT16+W@gaPQGz#@=7pBD$C<@Sm?^C;jwz|xfhX|gKz58X_Od7*u6}aGBDa^ zBED(qpi+P(6|rSqfB^AU1#<}4E}c4$8#m4lAm#+fQoNFF+O%noK=aP=LHFz3NAklD zKMYiC^iTa=b##cag9yQ&UQpJDzC0E8$`u2ojzJ>>pPEF(G0F&8RzcH9GYfSM88YO! zV~^()?$f8wuYY|R=Y=LXu?K(s55j~Ugx2tN6d)V8AjlAMlsq!YSwn0JeTtbXU{A`B zd4WrI_fS@mIql7HQi)DdgecN@^4B?_oTh)l_l6pbv($#WT>bV;S}C!JF<|Im*6Djw zXFUG+<7s2OJxBG1VDbw%;UU0~3B%Lpoe%1EE*E`)*UzQGq3Y{8iX#*dsb>!E6;_Jim)LsdB)vX6YhgG4Im_db6LY zlgFngU6~k0M3MVUiWe<0XRD}9-pqKgGLHVT!9pReW>~( zN^ISwuws^zbP!V&+Jb3IHl4*&{y6L>&p`(rpy6kqeePRt#U-3tA-zM#_EV-zF`w+; zuQxgs7ZtLhDNwa25|cu-Gha&cWU_9`39OcCg%1ym8@DkGKm2f3w{Bg*?AyP8k6wK~ ze4px%AVp?Ybsh$c5UeSeAMRjx>WU+nU0GF0qu54-ytsbiR-!dfXrjgiY zr=ms*hzMY)t$^jF6|Tu4b+!taocHd%1NVegAP$Zs1|g_%^tMm;2k(Cfi+lGPXR$(A zQ;{-5Xn59Rohg5+^36Bj{$%bPH*n}pg(AWhpy`aCf4+o^RG!mLJIzJRk3RNftipW}$e4XEmt1o3xJ@>6HtDRh&cP|& zim1o}L-#PNG0g9D$~4<+#~t^*I>%p&3Wg5pcksanhlmyy9CvJ-TxGY0(U5eQA)8oI z!fLOois_siXaP58%c7_XVhN6euZ#>zCkE-_Quj(_v1#9~!xDFCmMt?Qz)zhljOkD* zaiG7vraBf7oHg=vA$7ZU?SJ{J%l6xEzsFFqiYYHP0HA$%<7EkgEPjFUpiF-EHV=(haWlqY%5QzTduJU7k*iB+_53EZ0Ul@ zKqG}vCSZ9hh+8j;XWBQRV9N9NKCH75C-$d;1kyM{s0fTEc!Hv(f(Vh2C%R`IT*|}8 zr{Qq$s-dy2q}i3MVUiMWts_4Pc`MJce8C0+C(ewS5SmtnnG)3*Mk~zOmc~Krz{5Zj zlnDb!PP*SS6CpKs8TG_v08lM40;T}xTyK<3Twq~|%M)!#2C-UTsP`GQP%OxlCUrdP zj-;wKIMwVz;MnFGIa4XQ6pTxR5_u)I_KP6h-xtEu`9;VQYo^2pN+fW{h0iOkG#t;_ zHkSHjAb5DXq!F0Hm}0qrL>%%PkJ+%Qs*D@m&!HoRJB>DJ%dHFn`K=#SGC5S? zfgzb1l66a_M(gt{DS*q^fn45Z6^&?ql0$@@K7D$`(>->WHF)p5c@`HVOj35R@c$8EwU-gx!$1F3;e>gDqh#Uic|RW1y9thX(I~rFYyE#^7kvCO&Fu z)k5RwsTk*CBG%NcOV{z6Y~rlA0nt%%ix^Jg1#rV~-bv`z^>i>@rB zb94$aY)YxRnwq?gu$gJ-GE6%Ovp6ckDq^zxGDg=f9bGqQZ;pO);f3elefJ-TxV}NC zks=x!BYGIDbZdCUQn>1>t7xv8rAy%dlOJE~l+=0WU7+t}BS|gFo__idlbMBDVO0w* zuH;1(nK*I0ry4Xos2cviup1KnGOg zqQ#i*CP_^BcXiGpf0j4oVta8-p%sFYA`*xQp5`m=MA~JS*!9}CchBdZ3mHSes*3WJ zS6m4>-+udT1e`c=+`xf-Ep2_iXc1_FyLP&D?Q8;$Wkz&)TIzCjq73||21`r_8Ig^< zzy9@=habNGs8MU1Y@c<;Y0%SUFphKAB{7z(1 zxZws4`P?*Xxu>0W?x6ky=FFWn|C2czZa8Yk9kzqdS!bR*d)}P7+QyG>?DawTAQ~CA(xqAyg9#FC zv(=W+cIH7&5~jU`)iV%IZs6EI=_YtaXu7+F9qhxk{rmU7@WPAUe*LvW4?XCUPv&26 z!3EmJCUAzt=Iyi3J%=zNluwPr!C0bpQ@GqU^g+cxocWO=Iv}uL7!0}2|J)~4gCm$o zTl$na9tkKJglcZ)dQbW-&aFv7H=Gj3EWC5zO(3O=!gt?&S40L+LDw++Bm4U6uER^E zBjEVZ;Un;6=8RdEslSfmST@LEh<^R3Al|NN)21z{UbZgrbw$21UG3_EBsp|DjzjQV zS}=#9(>oB;E^jr&!E8f`3__L@{$moW`35X&=CrhJ3)-k%`py@mXbwF4^rab4hECQ- z4HOraSg(E-KYdemZLt1mEcT%wf^qy0P8c+3;Bm(ubLe4*v$9O> z+z)ZtWmoW`D3$xKy*Zmr+{i6$3l@CZrBg@M5?AAt%@Od?BI2MU>lYBnjtnUxuF=|d zhix8s;31$$rKZX68N*_dBG(mwLsVzXnEl(|{uWIZ%$o=2J@(pbz4g}m!@UpC(jb%4 z_~=Vf(ZxTxglTl>q2J97_vC)iQ*7q-4`lHqq%lx>+Zw)(0*IMkAyoFSAu_e_zyp&h zG4eyGxNnFemSwT=Ih@4{KhNxwPUDd@`h-T}UkF>YEY^($Wo`c2a?8!8PWyl@vH2Dg zu^ZD_lC<3GufM|}0fCK+U+vo1>210Z1yjVFB9>d!OZ+^=MIfwd8H5((qs%uc{7a^7 zK>(yNfMvqDNMVaDCVuwmLW-Wzufyk%JA{5A#a~2{48(BZF1YGi{*~3%bo)iY;6eTT zb?x5$s;jO^FGCH5K&0Ix2Of0D;6Vd(`id*8WZ1(bJ)bn_$?_OeVM3l@)vjH95RjYR zbPfa_NErlg?ckzWw%dLiaVcJc;As&SG(%BEMMS^zCBIF{^mE=Z#`+NF5NmqK%&_gQ`=e!nInikY+&szlOh}x;VOcB zamP-bY*U;$YnB;Q(!T@|ne1_MbK~U&X%`$r6Al!dg~YL&Y-lf{y$U9ob|$U!=PgiO08d{e!$UlxzSmxB9Tf$& zqt&6EtroG)5y$Ri`FUcJ3jOy~qlh1LCKYL)fcD}wYDo7qMj;FGGI~%5Ur4W+jFe0? z=c!C@-3&=R1_28SScK2N@B*2P1-0fTYu5^zs@UZMI2CEN%6Z&OaJ2|n=4a;VlTST9 ze!?azju`AZCg~e)7>>^;pL}xawCQ+lo`Y+{hYwk}aLIzXY{Gfu!E@0P7osjY;GhFL zc8Gm`u5cKmM)3UMUby|-<`thr6?4)Mi~B) zbihd~0J-X_t2NF5?5!r$r`^SYdO`H@M6uYYnMEk{PetUk0ggxsx3o{M-d@d`HB+TZnbYpM z&)y&}UhGoVinZ2S%~8W!Zo6Gy`*==VJCsCM4gcu@t#E{T!I2oyb$7(E28D$_zu;!X z7+J%H1Ba* z@ZbHh>(bf13oEQJM16T@`x$4R&$|acqi5*gp_<>fZ;!=`Ywc68pQ2s6Z6Lz{ zy8E8Ec-?@o)ub)<*nJnZgYeQzFMR*|NB8K_)j%M4JpJ^av}>7(UtDy|_m1w_GnR#4 zd+n_qx985@7BZR$LpxB+d#$%4l!BBEj^LU_mE(^+rhk9?)`F_KzvD=E-1&Qlf{aBr z*XV#JoN%n~V#y%Pne!+Z4mGOS zJ#rwQch1>;`}TBG2rDA%1i*nk_0%6IsP~f&@&WV9F8gJq#20-h$lwpo5C$-cB;<{c z>hj9y#w{X0%_2{7E5xBV!B8SULG(0d)639DU{}CDQPD}h5L6)xC#O*Q)%y7FD1aR# z2gMqbP>mfscEW@S9Q|B8Loqo&S@I!4fO<2HKfrB_k8ddU*QRkq0x@q5P{WAJ$M&3EjI zkw5x&b0d51s3Q&s!7POZw&@m|@36y;-v0EbKY#hvKZB`D5)@a}>&xH+NJqGYu-ql$ zg+)MdL*|Zcus`akBlKjRa)QFn1J<>(d+oLRYp=a&U$vif3g!_MbDpJ(7E>a`0$3fM z8OqM{U2bA==bd-67b5)-o zdEmbLci3+G7_FL`2=^LmtYewBv?7kl8mo!7B4&nE)o#1(Mxm6YOaF%q8|vHh9Xbs= z<&=|8KmBxhV4KP7Sy>vZe0H}xxug{1V8+bZ)?{p1G}3cXSdQCz%dL#ecHFGB)~ai) zvFhQ6AN=mr_kHtv`Umg(TAJG|HBEEAGN{Xd?oa{(Mh`4>MPBU9uJ~GOuD!#? ziyS+SX{7tWW&aNfLH`)@VnLrOG>Bq>;GmbMw>pAX0|xY4_~~cfE?wHZV8O!no!YOk z!tj?~c_qX<%`2=bC`grAzzji+W0Ubs3yjjIKp;z4N%93f!bKoP<EDk( zo)HRaafna@;%bzRgkEp=~=n1qwF@4j#g+bP|lW)!l$9a#4+Re3Sut?JY;w zFD)-F;bXH{Lfap4#G#wK^X{*HdD*~HP>8Y z=n5k)z4UV09b}a8v}Da(FwQTS8{HNJEndT6*P`S33Lp^Pm5m$H!*Q^hJ$E>Vo0olZorEzwV-?)l|ywZu^}n zt_3<^ci(+yf1iF{Z3X*}4?hx>wT8c-K-@<0KUwYgVoH3_LHkh%*WYlP4PXFBF{~VY z^kG+Cc`fr4TX}Z(-~Rx2d$y@E(jVjs+dJ?4!_!YcYiVewU3Tu*x4Yw@-cruYg7V5Z zY_`un`%Id&>1UrUG5vevt+%ZpF%ec=aj3;)-x73$T}5j5)FVhjM!Y2@i;Z;BBEvDq zo^;MRXUpXNaqMP0x;@A?A-C+>N&EfpfB*8!FP%UCQ>)WDAp6yJVgkv@)wy#Ao)Jsa z%!})qo(iw)<3KvUlE@YJq$% z#aeJUC5jgp>pouT9a<6X3eRt>HyYvw4jedo^k`tC;Z3pToHrt6Rj&vM2SlmXu)GvN zZF-E2O*YURznBMrm?X0X^>m!#am5S7@7Hg8Oy_Hp=4WOigWus<+JjEUcRY>D{8D~b zfDRhi_ks(5?Djj8Had-CkNmv<;RjbDRt}k0YqI7h~7^>4|GsRR*bnr~bl}Z$$LE2Tdu}j3r znzMoLtk;AI8@a%r>LD4lfHQc|&;+A?yY`hMS6$_U88hW%?vX=lXzpb!E00|(CMw!! zMb3~sW5#R_1I1O^=&Vf=YaU`(Th5$0t2UkTipg9Y^$vG3!4gPVU2Q#qe(}Xc)(z+# zW1h7LGuALZU5--D?u}~_#*G_mr?}&CS6y}OqmMnpgr$Xs4;$>_1S>FxRfD=d!1!+8 z&e}r3@F4^F#@4G}-^y5ZZNWbK>>D`!MObE};G+`@ahGdt+QjNSL(mghII4~DCbxKM z#_QV#g9i_B0u?Eol-6*8iJys#*&v~tVVa4rA*$kA_m&Z32impQ-@r;hpLpfgmxhL4 z{rqPzXLZe(G1CTA9KpfhX7hiR1I+9dtd@LXE&ZKyZIk~CkSa8-WrsHxB= zQ}j)Ocj1MX(84`>^%^v!{{#2^G4+eM_5dTc+G?xU&UtO(rkm}#`)>9s*n&&9S~2L+ zqx<7eK7H)5$NNcad|gdl@b?5$zbLOLg_}ihM!PY0&L{I$T5z#M05j|XA zG#;0hR|d8Xbv$_k`}aHNtTSiMS%4tkhZaZyZvH1(p%_viy0F#3fN}we#ltq0F|IGF z|NMz3o)|OAQpqUP`()1SlTSKnI0OqHZzx)ZlUP+;o^N(iC zobv9Jl~<097!q;AV&BEW? z?@VWZaJ^Nw38`cI5=En)F1C2dA~m`$_30;`JYe7bI(BU9B&Pw?229e<*RXKmlJ;%e za8vkjF!yEB#!d6)%su_|lZOoH&&BDpG^Dz^w&vA8zqbAcYiru8e|`%Q0&IQ#n{U76 zGohC5_uhA(S6+M7+qUIxk!!bIcQI#s_SqLreS<6o1-d*#dCxs}-ENz$A9>^vTcC~J zl!@h@sqei<&v)zAamO9Ex0=WOD!*lCVBdQ4o!PTKab*`pqzAft01dru4PQ@zJQRPK zN_1-5wpIM#l&Z~XgaliR)P(iY%dWQaw)*NTkDD;T@OD44}4@PA1 zCaxsvxZ_SVWXzg5gS}zo^~z3k*AuL{_Ug6uO=q2Xww(wJErROWuy*a*-gNy9Y>YUz zSX^vn%kY%^V@(BR(P0f7f>B0K@l-`N_98c1Eq$xaD^1|+6B#pRj6LlPBEf*d!nyJ0 zTVOJO{=!b39H)=*D=v^USLA_9>Y5Qkk*gXsG~w9RXqbE2$g|q2tLMv6P21$R+9o}B zReh6$w_X|bB^miUeQ1`;>#ukWQL^Mc~e$i$@1KCtIe@H1U}te z$4d`D@S;=qGfB#IJ{z|hXDwkL~ zHxw;de^gHVu|8gSI;jU*G|4mK0lTl>eyak{c!17QoJvv@- z$-sdFxkU|WX5Q8WY}`^XvZWP&Fm+(?mBlANy$v)X!!m~rI1)XDEJNPXWI4a$snQUy z7SVLJ7R#kfpFVxn)mCzX;+}i%H8w9zi&0q-Xq~dqkZt!p_YgVjoO3`(yH3IemGa6f zulcfyX`5|qFpT_Z@o>Vp(J(d9GNO|(pPpmlkS%5}MNN!fCB@ZnDYP&Yip5ec!#Y<-94Da2;A~f&8Bk$wL(GS6C>hPMaH- z*7y>)yAw0lWEi>9%4EhYOWc@eK;3xUMz%Adsvd+XRTY)<=gvhygB*4sV@PaW4Am>H zFr4y~GxdvD&7*d+tqGJvL747x4y1nk@y8Xkr6hBi0ZI?bX?=M7_>K8HoF4#?U|4|i zR%U#pnAHdkIir^Nj6@x|g)lkcp>xOSAx9qW_DiP5DW{y>seRliHFL&CI#KtYy)Hce z%*BhBeD{bW_>{F*)e5?1$7K_KI+*7_ez=`>*`-6rN|U|Oqt_cXYCYKI?bb0NYq|cU ziDi7={)f06GJGcip{EHjMr#Q&=-G_9KoAoU*We<)xR8I_k(-vuE}1 z-xrKO|M?9|oE9IpO-J>zcuK$Y(koo0!7`d0cEzb#K+IsRrwto6 zSi2s5{4p?PR?t2%&QP~az&6CbBz8KnY}Q?8jf!raY$Tyc_^i1h91w!1SK6+w+_eqv zoD_zawbx$T%uS2JN>2NhGl^XMd(lM~!AfeUd!08fE9NYQ1s+G>(L3riL)QlwwMzP{NzaPSb50YEfDPVlQLV_O7ilt_AYD^Z#j zK{ZFK#3LZ!l&8;4VYgR_S3YaJEt+Gxf~2TVpB^gYx>{wGk?fPBk2>^cKQD18&XzWd zF%1o&m#7JKP{ttO^&NNoZtncgtme&`%dVLVh(uRtIFY{1R-3-_&Xk}2{1;iFku-}3 z;9J2XnHeP*s#-jEjpb?XKPm73`LvB6H2(g&Ir@OEi%h7N4LIXRneWNC$;~(18XK&% z3>`i!b5Z}14V9zwG%45)nSH>)RN7T+1j0Aa^gu3@MkZKHTH-8L?>;?$aMB5F+LT>; z?G45ZGC_$nH@ES9YgZV!23`NQux_qsNg?m#R*DzbPw+W(-Ax!5j-@S^#0UhEgqQ8w zw#j?{GE*@fn_&nOO2H_F<$Q{7zx$49n{D5DajYt>hK0Y84l**?)t2P<&9~pRXJ+pF zc}(ZHrkwSe+ze4yb8Jq~BASzhkgpqIA2NK^r4C=m0wa)3`V8tzmc+tHd0FLo=bqoE zch{-YW}2?@?{#T&5{b4ZW@5^{Fg}E_64wkz9gKmR{4DH*$pLJCG6;d}2iopc# zf%z9fW2I2^Fk#LfcGw|c)>qfsZ?>em!5kG;gUUA|rcHF@%6wd*O$KKtwocinY2W7W@Iy}H_&qo-uqc3&mglSdQa+@_)uCMG$0 zs}JaO=+F*sj_4eD#G%Gr)fiL~)oYcNhyCIgml=s+sN)N{3-{{P>}HmMfXO51u1R8J z7l1_S$h3{x@zduJ+O)9^xxz7e)bpuHpiE5_C!(vYva+h`>KZ=(d@3UZ^aj4qU+`(xKelwCyn?12giwa^vN-eXM%E#N23mWYK5Z&V=+vRTk5Y!b)z@1W z#VRXBY6)mbjJy&u!a3qeS_F|$k8zBr{N39dRU>RyG)#4jlpBw{Kt5LZkwO ztolSv+p2c(DJ_nbaPBz;;idsH=aE3W`so0#^RA6un z7T{Mh!pt`RvvyBp%KZO-qBb((7YYv=FktxbK?@g!fDInhA8@sU6{;HfoUv&8Qn zarn@ogGC;BqBq?>@7qlS>nj`@yGM0PoGXQP5wzmx1K#J%1h`+OWBx=;1cCzN8-MM&Tvt6 zSb4+|NA9!FKI^WtrdPlC)#cPB6`7B{sTVXJEYfFB6a>JL2m(GDR{extus0o3@$@#_ zUdy&3$2VKqpb91lDKh1;5p%+X2|Drp_y2J{PK0*t6k)UW?>FeZ>C?oktCtcOJEark zaACMCUavGT>k$B!`|=y7NKsgUS|l^M)$r5LJiAY?9q;27Tl~=3zxAEd1>A4`+M;|0RoJdPc>VxjDmQ z(eeAo9HW-%y6`UPs74)RcM~Rq6#~9G0KIUIw1(xUz@R~cFqkS!q7@P-kOZtTDq|~M zL_CsUgy~6L6F>jsKE*F*3?e1LN<7k&q?0-y3*y(=dNOhTl)D%t5`+cHhsQ;`CPPAP3$897i?O%gN&aCIpP zJreWq!w&97_i(e#HlI6p z-iIH~&_id>|16(AW%3bJW}$uiWB?k()=#a-lEd`Z?_kcm2Vurc-o9b6clhwZR(f*} zwe}7@+2RU{6rzt56+u-xtqbjZPE}`FxVXk}X@#Dp;jLFhUemgEPuIc~6dZE!0q;$n z?y6PWL}X|U%S!Q}!otjbASl1z+K*6H8= z{d?ONW`h8>l9TevxJWEcMVM}thCi;V(vkQYL#SyMuyoBb7e9$fnwdJaVbZINzar|* zwdacHNke%W0*GPQ;eao1WB+OS|7Efmw}KV=CR=S|ZOq&(g1Oe->Q_;7_!M=;RaaTD zrmpGU`|nE&P|Zc@Za1Gt_r+UN0@qF!+kqU64^IrzBN;-Ye%EfDPd)92pUj$V6tQa` zd-6WRigNa74Dd3$kx{AOeOet-BS`{*lz6&`OhgLATxK8+&yc_5ahIr|YCw8_>K+GzA02(V%}K- zpaU}+;*%5%S|5Y0YS-50vA{4!+;9LuNuyH3eH=b+Oz}05kmLf!2V=DAt+(DGg^IVW zD0k!Sb=Uniizy6OTYc5hqt^%IjAb7xXex7ier+x5VZHS(C#zRob(L-wAKH$u55$U% z^}F0;rM?JcI*b+nja+FZr}SxIj#c+kV2WnyAn2pIGp8CM7c;&<)R*#{Y&(J~{j$Hp{|gh0={wW6xBz9F_-{O1Ie zB@F0EOtqTx9%)5Q+L4i9FvYrd?fCoO|KXOKZp0Dmu4vn-Yqz!6THRz@!G?5S=z<0F zIlJ{QOK=W=ktAiSYZf=xG(7*zv!-q4`Ac6E{q-$f+ z?igb%YXjx!tw7#F(wdv;{gY4m;pd+(Jm-S*nSZvtl$3HqG&|tQ43$lfQ(I|CSTh=~ z_lanZJ;TKQgZDqMN|%WVqZSc`KqR_>B#0b4fm!~baa`!6R&egP^Uf}vIwi}v)_xC> zMw+al0o`>#O=DHVu%tZh9vnY*lg&4u;ATzdg=T&HiB=P7>A5%M7PUVAehMHj;-Mk# z2xJMVJ&`mi@MX%G*a%*M9J1#cn^HYt*~v7C)zvn7g=;q0VY^4#MDX5}sZTxijQk+S ztMZD+9t)i&KmHPo49!zWOpHiNdd`{pV>8>Aw7frUYRA=A<1Vo#_S93)S!C@S&*@8Ri+b|kjp1wLGk&irR+8Vxw0@<`=`KI^(WoTk6t`S_v-Q6_iiqWSY ze`14m*Q02P%&2|XFpb5Qk@Jv|r)}6rj0r!31T3~S7(nH89tC=jAn9Lprfa3_s*QEH zn8h`jgW0jnAvkj76*e5R(IuDsRJP-f|K5}-(*XyNEiP*|V0!lK>LOFJ^x?;!J@n8+ zSqK3qIYfnKRtp6$g>dq`s3@94OMmbIHv##9k~{_-MZl3W`S)W=sR%2gv?TW9IoC(W zGNsDHhKbcSw*!3i(d>f`I!Jo2K7GzT_Z(fuH;Moxfi_DG8Z_t!KRm@pbQdqFwc!); zY%N%Q4F_72|2qoc4t5|lUNCVf0lda6q9vlF^n4{4;)f)q6d4d)2KmECPU|QbB+;v^ z%F>3L!dm+v3SxPUUChH}yAU6+JYm^4V||$1wq}O%i7R+{ufka3A)<{XLJu?;`aZD; ziIvh~f`O~&#RA_8)bwYfEExRE@Wv7q{=WH}H5wo9o;t4!J%IHyP{;i`j znb={nBP-@sRM-tdIDF|V=q}O0rw8x5Kjfe=w$;gn`gU>f2xePNrw3Nxd=;`ZV5hQ5 zVXyq&rt}!zV1mbtIhZ6g;{mb&0LhaxS6$V%(l!`9pKriI?STjEGjKqkv17+R_~3(i zuDOQ4*7UN*N%v;o z9!nndZ(=Xgp#Q6Yk|sx%f{ao$4|6a}sM)M4y_JH}v8tB(0#PL-20zob!Gi}9VB2lc z+1@9nTZc~VFv4XXJQO-;m`$-L;g^r|2DCc65lYMWP)|MeF zT}0>oYY8kXYwJV@2oy(tReGL%EE<`&ouBM*70Cl1 zGB{(#EQ#v%lunX!SsDB^bfT^C*Bsd^hei^FQa4p5+zJc=6%|B8)GJu7^`c%2e$=aYvC9=H7c9I;69pU6yYyZI1dh1u_?tXimvy8xLokW%@UmJ=*s@bG`)Gycx z&)eR1h$d9uS$i8=SECMbSsLOV&OiSg0;!YlN^(LNQ@2(Hx%?z%VUm291rSybn`os= zkW$IZZWm=0p=aw^9J-f~nBt3I8sAH5EhaY*6OXDhwO&9*R|F7(gC zJzkWBK8ochp@nO(Axtp5d39{k8oF+#PY>H-=zHFMw2stOf4A=-pWt#&X(n z*ie)fzp{W01y&|UW2ld0O@-diilw!GyYe4Q0ZprEhuR;$wa^-wNEJ4giTcQX`dUY$ zs^)~4Tkm*)*cdbLMhqPmhg!{rMNAisV1*qrP%vqQ6e@~m{YaHv)KrJUu$rp39{QGX z+wgQxb4E_XEh-wf+N?0Kw=34 z^E7vuv{3J8@9%#1yB|9CnD@Q+-IW!Ffm_W!zwX8x8iGGC7`NDqb8UxL&!-g)TYK}>fz7B|%u zmsdCXY~m*z*R7RfW9E}j{qP589Cp}Y)22Fk%Oa zpj&J+RZ-R0RF5R-qJO9qJ&ZA9#&A>{6)v`uk%8v+E0tQ-@jD6*IIT`l6m2>^4C0iv zmi*|4KiYlTlm+u&TKeiM%a$x<)QRI2g>dRu{`2LR7k}ehr>P+Boxovh90e~4$3mX* z;~&A9tArZEcdYAB?@>bro$1o?j(-QtEeubE@tpYWhtayE+YL9cL}1v+(G$*cEL&L{ z>O#kB#~rs#>vKXvlgX>YsDTI;dXc?Zvu1f#gI=LY7XaHnlPEJr;;Uf1c_j`}iTM^i zH+#00U5Nb*C z$DVqc@a#5qvX@WJ44>q`?enHl+mAGP@}(E&1wVLc7<vi|t35 z_(sAPr%8$eZxWpk+!&&K!)z#35WIY$AIA7wSr?pjp?1ue;6IF?D&l$tK9;Du+u#jZ z=4&kkQcKY>n7R!=^(o9>9XocPz4y5Nj(e}U?)sqmd^oW60mOwB1X8O_ARl|`*%x1a zrK#1B6_G4mxngw4j8aY9VVdyjtSt+(Df`?+UHh4BIs^7CJwWnkKvyZt;IBY)m+ zev{^ROqn!k+LX!9&wBRZ2k+C_z>9T6j?jpe9xBw1+0I!#)g1E);g&DZ*d5nGb* zstWybFC7J>!$wiphP}#*TPl%itlwkzsie=|r@BTy5TAx!4fwQu)V$m*$&Y^YcoQWE z>X*NK>Kon=rV5{P_PN@%CZmn9?l>s-~Dk%;(De)1E8 zH;Wc8Hh8a*YahkYn{-4~eK`23rKM)jAZu87+i|AG7d%z`}iB`m*JmREqwXKVXMrv z92QGSWU(qHaDv1KAq&s0RB&%aQx;2c@#8_)u%bK+cLiA5Cy#}$XIx{ZHQg~T9kv|r zsi$T={q)oLi{Qk$pv}#?KGfg*`HO{XPy>3gj^v1-EM$j>yO-vDnG$I-TV;9iWtaWY zMETEsE*wMTC?quT0G4N-dBzBqC{DwSjp5S)Bb(|L?!rU*z?K) zVdaGtGsX}&7(e>akG|mz!_|U4JOG&NcHTCF=vtaogM>kCI>8AARl&FR?6c3p2XT{C zjy&=Ra^?WsbIv(OG?8V4IQaCIJqsLKIur^UmQsX|5piq;L9J+8 zO(f2Y8PmnFg(>!QU&rsfQ)7Ld{*YlB9VUT98d=}Fv1(;8A1O$0b8JXjTRFYA8acvD zp>KTS8zxMKZhyXF%L=*#hAM-e`Vs&-b?O;N0q{6NF9Hp7zybU0y6Yt4K0L;1N}$Wc zDhG~ zb=O@o3JF6eCtN@Dyl@tCt>!}#bTl5oOY

!tZ;CYHP`zs%5L9s@Bf|BnDpS3uFEr_Ny=71yO`A3x2<`+6 z?(XjH?(XjH?(Xgog1bX-C%C)2liYACeWxCJqImCIIj{`I< zL~!EKGHV~ni>c2n`sO#CCtuHwAqrji5~O3Tl&3nlH!$PWPmVn4Kq8R!ZXEr`BzNi;B)P(TZQUub|LN^ZZC z$(U6)rHmX+{<4N!xZT%nmtBex1)@d}MDNS_ZNWL^_fI~zxjb(<#?vXaH3r!q(P>(g zknz8e%r~xepcRGNPtQA5IxA8|%Q84z#6?)(E!Po)Q`|r!T=h}IWU{jT08sjq1^H!r zbXp#hqk+Eg9X)0RAw`LpwFs*pfIa*JP~MMan2T~oEreh9 zhbvu{wqW}-NK8i&xdaNbAPz+xEGw;i*$9+yOv?yblFA2Zw?jw(r~3DC&toxd7=qW) z>2b9ciXZ`45`vHdz49xDUd~VM^lq5jV9~;Fn}?}<87X7pa~9@jQF}l0eV&uX>9ZM) z#Y|s&g(jBLujX5YcR!qF?UK^mxYqm+?o0OgMr^>u4exE=1q)G84i(f}s5F%jME?${k+p!sB1n3T9~KI+!39-KFy16W84T08FG=#FB5K-}eK4$-*ZA)aPmDi1&7bey zswWn{2;lM7_8Y-q zL}(p(USF=Gp^Vx0MsN{lki?yIBGdR#?oe2>_-qYGMZPc!R=`p>#7^aBvce9OFpgm~ z3oy5g_({nzDG~=NwMnpcSl`91FR-5ku+ivtO8lxjB)kSU5CDTKMTpACU}=dB;-F(W zKgTkg_Uj9-c0}aZA$X}WDtv>%MQ~{Sz!C88L$LirU_4pfZ5I{o0TYsE8K_Xr4BeN2 z@>|fD_!f9&fBW5L|8e5E19}B_5zK0ym=&}EXrTn^pBrl{*&zl;V#i~W$@wd6i*5vXqJH=Fl`>k(Ugt3wbEa=`B z-PkRTrj@~H%}ev?{O<=SiyAN)!mY(hLY*w z#7(d92pl44Ux64+&*hFqjX4&I1Hz4t$z&HH!uhGYqMnAm4%qfl{Qy%Se2pvUoh8_B zk1jc<#6rR6Xu{k>MM_#o+B~uOrhy1o+JLZLazw}T6VI;|MATmRejkH-sgfXAapPtP@#xDBRmSRT}h|KtWgs4UNqawbh1;<;AvxzzbW+qoE! z$TdEAI>Q6|-jj7iD6PT;8v+kuxQF1WS%!s=?78x?{jlYEJll9ox1dxSAEyAlJgv%F zfEHW%T)en3$cnm~tr$-fj$H4yOp(y-i@4u#je3y=>T==T(*lgQt-1err9PjS+))^-wMEkI! z7IAF8QJsRF4brscSWH@5DUc5V1(C>uAP_E+|8*C!H0Q>V@)T@7_2VJFlJ#2%TM9+q zsHM9N^nCZv2uK2>WhlYb!%Ai_6~`b7*79%4Jz0KCU;@_r)ml339?(O@aU-8H3!b`& zsFHg5W06-3!sLYvDw+fQI%PHzLpK!VE}M^wEW6}&NTE?F1|bC?jXtS!BuJs_RkyVi zG~V3BUQL>{%))Ak=VxXGbi|vF8*2Mp7~`)WZ7wHW}2Ggyr zU0Hg9Ur#}lD<^-8Gez#KtFHDki}<=fYg(n-wlN%Yfr3^^T@Lev|Nhd`^U+4{)Azi2 zZr_>94C!d8+STNR2$hBHJQHZY)Zdm74PYUdvOn@Vew*r^)L`P*;Yk=;u;{i>u<-VO3X8o$#{TY6V8AKwFF2ydCP; zNPQr69BgtBQqkIi#4Aw%IxqArTJjkML!r82N58@~n)>VMU!S5*DqtaHrZ|?SYlG9w z<_qA(=^ucrZW!r$wbp-$N;5vKl)f?(3Pp(Aqo^9mQ1R(d;1B>@S1CzBLoZ1B7PS%i zFKF#O$G-`(c+UnS@=PR;y4Sz_QkE5OrhJ_u-xzjF^N1M{T9_tvYKZ?PnFWd$qf(kMeOdTmdrnoQ5 z#I5P+9~-p?4`$>B@C(Ike;N;m9y)*SrZR{rUji)XGFD}2$}Yt(Pq4c_0)HOl@o9+g zMB~us2Jd7&(9AGlSAynw+f7}zZp)noJ%SU$MSYd_3qx!fv1&rr(Z+-FoJ=re1KAgw z2YFkponqd~k2iLm($eOy`G0gZW37QF8MrO&^erOL zw_WwaDmq`U`5sd1*N^AaS1HSJ4oMj|Rzddy#KONabcO1ws(aK(`I+S1QuUjO(H54M-m6%s(79bWLyU8iJ*Mf8+KzS zk6xHqZVU0>98TvB)#4Wxu4+)}d6Q*+$K)e(rA`kw4L7oabs^Eo3IISfckeIovix5|ipnE>zDVE$ zUjk2r9*c3d8j6Mb(}o)bfP^cIzqoPadc^d!ZSJ3C+RBq|>jQyA`tW*2nb zs`7=|>iqBNlGUskazh;um*+C}3Qvnid zjo#;1<3O0&w!=Iw8G0C*XTs*ez;pfjhwE|Ktnt>tfr2;rAZZN1hg|r2|B;LiIQgEtvH5@_kO`v*f$3RCl|*${yT zzQ>6nSwgvpVHKf-{YlVy4^^{VMQ7Elg7^<1ae@MI6w?<;XaL7P4v73bAJ)<>%E_;o zZjh$yF&>Au5pi@%=dgHz;A>?=PKPaPBVg|}iny8DGQUVkHbYiKLPvEuPs69iRgJIY zC3ncQ&i5j=ti3O``|Ek;ChlP9WfUsabi6|lvj80PD#Eq`VTjB7Vas|9x=E8z+b}=DIT)8}I;d2R?aWoIK>#3WEAbEq+)FbBv zTMh&8TvZjqTDw%UHh%WS?Ps;iWeV5G_0(atl0Oc2S>d1}tey7^GI~$6`PQW!)-gd zp1KO;tKi)vchcNM$ex{f3Ek)<=*l~x6Fz9cEd&$^iTf*6!s zTY&kjuNP)~X{gD%f-G!kBf1RAG$`|h2d3|f`s3Idnw&keLX4{I=-_Ba*p#?u8}fH` zeO$oYkD$tgrtY*EA52tL-1Q7c(QTsvybp)k<2)C`l7N*H$mibbXQUSEugriNx< zvZ`s|9-c6%d1Zn+}Ea{YU{&ZZnKyXC@DT*zVr0IKD7?sA#ml zrea5u3_=B_&(GZ51Z&M?_&~#ZX`IUJo}FTQ-xro&7V}6E`A`7f5UDV6h}2Kvs#3pJ zQ@;qja=39AP@rGt{iAfghHkDwtJRcoJze+5admQT*#+RXXXjF+w>cj}lXTIIeD$>X zfE!Rb-r=>g^0a#ZXmEU)U(6^4FZ#mqGntQ{ynnT0$Mh|2dSSnJb^Lx!4-%G{wP|sC z{>UjP1RQR^68o}mvZQat4LgY7>9pW7i5CXSPpgT=f4ui^&q8p=VZ{cT=V$*_`s!>j zk+ij4xewg9!6{Y5-n5?2yzBK@<`Yh%#Vu}AgqaxE5*E08DKANYsg~)4TQzWXr5OOQ zL_l|Of`OKQ7=vl*YPTTz1fE5}W=$k$OM5K@JteQ({t45zyHDL9l~XdJ`Jx|AAK_G3 zw(ULf;*Mj^_#Wr-9WN+!ehsxqM9r5jKPHj&_IUegs_?EQ1g^#{MezdiXCmvHiIWkB z{1O$eXJba`0T`jd;*8!!ybh)OF$MxG1@0qofk zYG{^qT4ugx#Q?Yni?NhZV1ltr*X3)rn611$n)H5N)r|0F*!!3pH+&op<-<9Mh{L&E z!~{jq4{f_7U%)UV^cYlP9+N(5KhAprSj)SK#NrNA7fthDldM>1BfqyR-z%+xsSI=}YVu}qnG##zLMiQtqX-I*(M$L`X5`LpV1>*N7JT7-Ai#@A z;G|ln=}agZKuc4(U$kz_v>nvNKJqS{TwKKiRKA`D8-dOC;ezknkxCn6*|Uge$PXPk zj$IC}{^vDV`c4I>FGyfSS*q3pl?`AOx{gXFskGdXN(JTM_sU=&*%5oNf54pz*=h8! z_(l%)qe?gxg+*jUva+ybGFGj|4FS7{90w5*1m@`=NoC6-NZH+MbB)AeMP)F4#X7fN zYu2R-C>`>-RpTRi&ztu2B*Rz|O&8zxcI!=GUU z%oy6ND*}%e`ygdY4K?Atj=%PLj+B*2xcg7#JlTBSAH)$cTaU-jt(Vc6K$b*eNAA;FqWg1<9-)U4`924dVJ3e(3sL=R${P=b&Q>8Nz*b=Bs` z$Nfw>6F;d$ltcm_R({yBGb5e`=cl~zgB#e!UqkZ0;uDdOK_JCvF& z8jCwdgkDFRHFr+veK;l7O2-LaeLs}se^fHL+@soX%Qh%NgP`-h22T#|HZX;$kfx+R(PO zvGjg@W9B8ZgkFGa83WDNtA{OuNvTd|yHZwro}BM)K4kbw4v{>)*=BoxKYDDxB>wfD zAyY4PHCGkny0DJ0_Q&Th4WD0$Mgzc^WL%yL5?_-QzF0T}>R46~BH9|ER2}}PWcWOd z^x1$ERaxjJO|LxH;9b;NnsiJE2ZJbtCqmZ-_JG>+nTP~g8T|sY#(052Awg-k-g7me zT}X|JC6+Y%1ApvGx?bV5YADF-k7NxcL18RD6v*(KR0TPbpVUfcg5PFCX4WINd*@8Y zUEGrrjFT!q+^4~<@I;Z%gLU%OZ(6Sw^@~ByO{izUPd`~(=m}n z_rLNJZFd#1c)syqUo{&@n4pmZ_lil{O7%QV3%qi89Ost1A50w=I2y_ntJ^XCDl9au zy~5(Z2IAK$)I~=~b4UuPv7{H$yQoj}*Kzj(=v}uB$MtBscDN5Bg&&GmK^L>xMbgd# z+3L#1Q=JGIjDsZ$Oj(k#>(_W(e}+Y^+8Tvi4vye?Tp$#Np;EtO|rzgLOpilvG~ zL}@k#j!UQ&cx^1sDMKMizbi;yCUxX%4t|onn>}fxOdYV4L(+T$B!~|q!iZ&v+H01o z!JKH_=F*y4))4juzU>cL=dG(=+_CT{fp)(!TnqJR5w+Rt-SYHQ)rEwu74K#&PvMbI_tQ*qM*!3T8|nolk#&@6rW|~Wd&upM&=%eZQ(g;M$k|- z!i+=))71Uk*4?`9cjpV83>PdlW36JSlC?EQY$Qu}q~LDJ0v0zkqyE)&EU<5?vU6KFiy{XJG-u1b%V0xZrWN;S0PhG%|(- z&Lne+5PnnDSp&ZwVf7V*Y!mB*9me)D1vfKX29UWL%Ao7|@5?T62Tpl3Lg8)bUUdQ{ zC#c)~qPJsrU3A?ZWXZwNpC=uDFCO&VAS$}sH2Ln`mor+SP%$TwYFAFBz{Twku1EuIHI<{LtxHK90cTzY zA6>a;Z;awLU`<$drU)Dx3Pbzo+MYm#Z6~Fmat~kyG&qz5`7s8UmiM6x_H~Hz%q@Vs zRwzj{NoBHHFKL?RLq5GBa3s{}x?H1i^-W+4Nqm9o3UwGJPw&)n2hu30yTG@%GwWae zSGxcfK!Q&H^QE)-v>JCoLzSoZy(;D?-C|ZJLrDf8?3KNJz{PMNNyR`}ZAEHHM4pD4 z?_e~c3uQ$jg_HTk)&6iV^=4@?l(*^xkgmDs*Y_~wqX(((woGF-J=?xZ6ir1fl=wnW z9bGQFN~6IeavoMlNIz4{8p^KsojPZ8#8cN+V-FnNVO5jmWH)Li)umXJi~&(q=)M`u zT~>nyv)S6~idRGZv!MctC}U*TVd{hX165A*4xv|eEKQ;(y)TW8Sy36*7{8mit?(j+ z**8pamIFC5OCBLp4fX}^6A7DM(f7lm^B{yH)z&p~V<$L#reZAg1FML=W1OV}ja79W z=0TWz21^_=K0Q;$krD1)RI0UX18-}ojGHf7aKX|t`ypOCYfL84)dvj*Cdi8QzDnpR zOh(3Y3RhpMbyh-(7A*_VW+#N*|0#vj3Ihqs+aj5AGrnPr#Rtyq(VE?r zzvPnhGV9!q@fDW~A_uMfSPE+2BBlJuzx#}SO<7A9QS35-v5`}R476l6t7~E5D};ZS z*G^zK=7UOWmPk0VYah5_2_s?soX2T{7oSxj?c7`!sBGSs?Ow3!+hmonQwXfO8P5n? z_a;a*$EPtaZ(RSK&p)?(&UO7?=kuXsrWHX@Nv?MivO;TV_@U$;MW8H|TxlI5Nw zy1?wa-dY%Vbn#sHp6$JVCenBQ*jYQb--+e}fVr6_h2r+&CKz;DW=Mkc`GIGJWbF&l zZwM1Uy{~{FW^WmDkd1=J#EGq|1OV#yl!cf|gx}WUfeQTOUO)xmg31-1@c5vLe_|l` zyIjP))w`ulAFh^Ve}{YfDQ{PiUz9+a#44JwAkt<|NNGutNtNPiNDv(vOw=JBcb2K~ za5SuGkHiu~Uv_jvo-r1O_t_!ikXq+vA($31y98p|mcOEuVXPa^txMGa8TcH>GOb2l zOMZh@`^7ZkkuSZrOt;(TFh~@3`gyUI)6r;R<`V%Ps^G=mdKI(J7sLE`mJ3{jC}^wV zO%&Shkzc1uo+mDB zA}oPg4!e=x@I%NK+%0B>DeEqoACQz*+1VeEhvL=rzeUEmC(S4uJ)UOT#dZZcjGzTm zhOn?HId~*9v4p_2c(5?E;%&w3j1wV6&J+-veG#!|&HqIy0ygV%J!|P57cq($@ToKML#lU%)orSBMMa>7mgSAIx;cMI{};ZoLzi6(1~Y_-yL*#^BB1;VWHFI>Pc<(Jz*tba6P5-ifspF7FOshIU%H{^NB=? z(mM#e+nDr^Cc1sWyzH!CaF55`@EeIMgZ+dik8?a{#0yMl^q=Tt5$fvTC|Y2 zLmURc{!yXKPBIi9b)jikllOWr7Ol;>uXNtCnWt#SPJ%oN{Oqu36)`4{CcXvg1T9cG zH*nX>CQ8fjEW-WkzqJ5TM}(`seS1(uioh3rU>=fm&mec3`6DGpRCvT0it)X9QBLvO zk)}+oQ0!0J?_a_wC6|AjU5ruqdPVX*i70=o>=iRo>XstWhe9<8n>_lg^M2NFhe=jG zoG~&&MB3dawXJ2){FW@9AiftdfRM}K$YUqVx@Zqf1-F@2B3vZ13&SL0QZr9`82t8- zTKggaIsE>}h>@p>sPP$GgJEO?t?0|$8 zCXXbQ`c|{%=bfJgz29L*l?O;}32ml=^U@$uPHKJPY#Fjr#tB~QUv%0bdDc}8S5G2= z*<%kQ3}(ALUVz-)f;alPusP!gfn(iGl(J+mjq)Pttuv8;i7k9 z`4&GApYK9s|4^mbXyGj_{Wuo$(s2tXT{!|H{m4s_)>I+1k_inKX!e>#X4{nLF&@F= z9V%R_AOT>OR#H_gMi}pr*2wzM?>aT>hpJ0`_E5BAaau&-dG+Bd?^uhysYb#YN?npl z=O|f8RDX)yndflrRg^)oDt*Ib)mG>%0?~BE*ayQeIS#4Vz&!4cb*{iwQVHN?Bui)! zWE+eWQZ2(Gym69WNI)YTn#D*JkwI3nO`>4r?rDejpCGA$@znf7eE`Vjws?aUTv@## z&N6BGr{H;Ke^tf&G~^yM=Ujn@Xd;SM64fVKu!09OU1=s;J!MYx9R+jkaj$^`e3U>s zn~NCCN;ist=)G)jCs$hDwrd!yp2P}+Injq<`Xpz;8&;Db(nqJkbTdv^f{4~JHw9~n z$^&Neg5vA<@Xn}U#6Gm)mah)iF~|eOgd`AO(@i?U*wOh}R^P|3iA$OjmM5E3_RW zL8cmLgt?UTI?ILqoZ*yh#=MpzjkZKdj=WT{&YPbWXrI;}oj4gWTgQqg5w6cNA`L$T z0f~I<>nN3?hhl>{RSi@rYkcrRg~|b?IVJ2v!`d%fQ0gCyuTd=%Nzylq)Z%dctRDKi z|Eoz9&LAZpT7RlkV9kKw+WHXbu>1+gAY6yUyP1}^DJ9ueH3~`&AN*+_$0Od|IiW7_ zDNMjBx%Y93IvPy;S}Gy2RO(fDV+}rWxglCsE+7L81Y5cT&aj{tqptms!@}u zOS*bRuiw!+j5Yf!54nZhh^nirCpv`BPU>Gdfy(||Kxo?7?E4|ia|fC#Z|G}bIOc%yp^$t}(VkdQkXT;gm(j43DxA?FKS57%YLI5G(kHZO7#9J&=%;E&>m4&%QWKXf&D#XD?&=%9{TgM(CqBT6_cM7 zXg_I|cTV)zc8xq?Hyqa3$@I5tc`R_ml~@x=#l%Q?;M`LQZ$hfX`j#bMQNOB)gO|aI%ozxd zO|7$53{2lu%=myM#tHikmRApKEFH@uzs&nOXW70%mri-aW?#BJFom0gF@e^?f(gAO z*2W0*2ov0EO_Vj^J$AngJXEyP(~+T*v+)aGAU3ah_uuyq)gMrDes|3UFUfPE@qR~o z&V@1wV+O?xTt)-+owBjcHkhdNo*?s~MC*_x-8`qyDme)oI1R^m?|om^eM9 z6jJY_zOEo-Ua!a987mhaF&d8?mfPPP^)W^E+f}0d+4x1Vny`tOgi%d>><3qyYEDx) zB*OY>NGp&1uWH;|+xX}9*LA%I73J*Gh}>~``>RH`U)f3LRvr)^jvXVeTom(!auYwO z+rK*_tT&$X3=8a;Ejya;NYAr7`FF zCv{zXbLq`Z+3~dUbUq9z`{?*|s^NZ$!&LsLA?)>WRq5bft+JNBSg2 z@IlXOe2&^A*`%BKO+O+HUr!vWssMYLLemSo$#nVN`FE4P?sV}v<1&TM`zj)`25Eg| z>rMHPeovGA``&}=I~%`HX7GPidIaiD7;MGnf-c6};kxCzf^oRY))@Gm^CQf$u|&h! z#`2D-l#Ni?D}s8fJIOr!=dvp<5rY7abuO(^!-1JaUaj24b8GD_+@G^3srT`0)wurm zo!mE>TSWoIfZ~JeSaFnxJ{u8L?pMTj>`-9q->s%K0RQ{0VaK|Cs`t;0b z^&)epu;tc%Y7b>etxNvi3qM)eGx%Ghly}nkXJ@;--=HNcMiy~&Bi^R_&c~0kVl|Qz`W2vAimmbXYGwJz*?{DojPY+jg=Q9W;=kU zMkZQ@W}DY$0MnABU27aOiFfKtj^=+|SrsQhpJ|I=P?xSMDtTW2n}1C({DHV-NpoOF z>a{3L(7K+>`$=8QAQ+iIl&;Yi4sUs3A?7RN_s*4a$4=MXlWLY%nJt`5E1I@}q*(Z= zGUK48C4Gr8UL^!^qReI6 zVDtx2P28BP*EZSW$J+YN=c06Qk8-i6z4g;&$!*~_PTFC^Ik=OB@ux4r`4ipuj6z!~ zP!m5_-fg9`!L}9uU+BE?epx!WhdekX$HY$4Z<#92ys;n8hlS}AY%*nj?Te~kSEK_Y zdlr&4_-mhR#lBHPC9vS5F-qSYahBu#sUi7Y!x1XOn84BZg_9o6&s|+CbLx}$w?c!` zBa!I5gC2s{E(l~Zn7KS0js`l1jC-G2)xmS_!XjN|btcM{W>dbQQ%f8rx?h^pe^?ei z=kQ@t6U@AL@r^$n4fQD8<9Th^NT=qqWaWjV&MYo2mR}!PNkj1Rh5X>!n@b#j%|Sll z0+l>y+CxZoMdqAtPom_Ry_VT(murk>gaysHNh+^m41i}&0n2hhCGC1?{6!Sbxpw{~ zFlcACX@Le;`hX)RGCzSNmQoI}d^JUM>9$t-^ei}(DuS_3T1g$rLrXn^8rnymLH}FM zAm8~@-Y3p^9c9spXRt9YiU1G7X6%LTcxNFQUdH5Tq;N5{LbW0 zM%-A|l_sXXPVQm`(h()_(cXxy-0ACDuCow^*49K9v2kU^n5cg(m5>%0;m;IrB&QjU zHDe{eh=)QIv9L{)Q!>vhiXM5A+-~O@mYELiwr?c}DA8%i`;E@PoOnB+_)_|JqEy8#>h&DA{RT5DA94jQHZ3f|NeSeZzj5W9=sv@M%%z&pNBS1PuESQa zohIkj9Cq&MszyWtIt zuFcRQrDVHeRab3IJC<5%(W`*QyH1GcCv&lH=TJx_RAiCK5UD$DFl^d_yFoLI3BJUzPSBlLyncZKZ zA-RfMKO9m>Qz)Hh8^f!P*%3x_DyX3p3M8kKkApl=T=&uk`M}APHYpw?yU2qik4#B^ zRvmXJS#wT>5h*AvORm6-zPTiJ;mrZ@qby{@eh7)y-WC9j*+zCPwVKTAYoVdg0gY_m zbu+)Y4k|97S?1Q0VFADX|+;?G8pW+F9kQ$9gunKIB9#;qA5Z?fc;f zkY9-qjH(L0CSARpdQCQEe-%V;kQU)F;q8g^I662N4^S&rIlZOW+$9r9BDn=u)ZtH* z^~pBT)6<-`CraXcf*=&Q8l;cVPx9o~#TF@zPE1SLv1T`4lYE>T!VX@5bo0^%4+_=em*obZh@9x zw!X_Si+s|m z=$LNg()Dd3@J8!`(EdCX1B2PSB-G_CIBv{wS2Jb!Q-S+()k=Q#o8}K5@P?*=$7aGD znZrniUc^-6>9?^B#(_4 z*iu3(tKS2KF=cI#ZHwEIb@&|xf2N1nw`HV}hD~dQ;}|x2P@oU>UY&n+1q-CzZuPZA z17FcrmqhcNnqqpzi0fMPsT0>|bVpsy)-c1dbq{hF{#j_@D8OKdjjU6=a;e;7IX2&& zb2EW@UUHZRWn%!LWMg~?{pzx9L2J6?BK_8@<~IUmg98fQM#V$I1>U#L(SV(6Wy`h% zwQ4cOX((o33-&BwUVqhQYN_85=QL76Jd>$Yd=>O)>m{aJR0qNTRfD)F+69P6KpkmC z$IB1C9Iwu)yX{K8VRrvmv4$|nidWY<!DL@$(muw+U6jJ z3A8IxAUjR}jrl?r!buM^a7zSO54S|PkDJ?&Mu1x-{LZkq_g?2Z$^}+t-Vg!t!=ya+ z^ez(j<)g8#@SRDM7aCA-Nohor+UbTY%yB3i7SLR1H^F!Iteas{I4xjth#jCSU2_0~ zaoQRO)-TVB%E?gwu`Xr%>@&wEtRpVGI<+0wfgzewpe69Ypf1f))+e)Hjs$s**C3H3 zF0JtmNE#E6PyE1=^mJdk+x{*$ziRho>S3Yo8hXt+^$X?NBltIL`d2qLE{c%cMMA0s zE6(}3S=W(dA+*OP%KN5L291^_k25d>|0iQL0rp=1{53Ej>J5-WxA*n+_4MT2pBxa= zw#$`Evazud=_)7?gs2%ClOi0|z{&V=tn_!o_OE-;5h1j z3n5ju$U?5}h{66c3dbkGY0)VlkNZ~;y5ay6a<|gMlj<7Y`CA*ff`x zmc|B1>&`om{&Vetr;euS=)(cTOF*}ZhHIT88{X@jdA(C^INQd`%4%Zd^*Y`^XR-x^ z!nqBY4gYTg0xw>#R^wg_{E$I1L$$NGlmCR7CG7vl z#tRJlbQ^b|CSf49E> zCm4`$0k(Aroz!E{|M09g*g%_>``YKR4YPkY;AaG&5dH_%H28mL-)9WaRhx7D`_#6{ ze>Xk^4p4~gpqdAp^G}Zbzk&s}Mf6||t4lp+)Xv%eE`;L%3fXolcrZBrV?|9GtNj<% zkJ$cQ_|*Z*q|vrl)sxQQe{%c(dG1UP(ukS%M@8*~?Y|2dc7Ve5fXW-4o&VEzz~68F zgb9-^@2dKl>;En^=>1y=qJG%c`>%G75%>@y$hLi}>}G2HcVTaU@DA%lOIR300t+i^ zTWd=T0*8lF;D6{pAk!l5^|G?GOr+a{<%dmC@_1goZbK^A7j`rs{;FJERaJ%5+}76C z)P&l$x3?!`08E|#;cdVSY(_RP*Up8bCPdSl_H9h-dRKC3Uje)iA)(O zP}0}eS5-YET(`lkAD{kr*aCl7G7{Lyi=msF8xt{7{EXwE)g@P0YhN|pEW${@-+oCG zh4cTL@&8W{Rgi&EQ7|o61K4z zZ>Rs=VShJ$ClQ|@v67>BhqR29NQr4DlVxU;h^L(UZq71%Vvm8jsU(X>fgM9RD`g%) zfHa%*R|}GUO#J6I1qF>^99A(kE#}4^6V}z;%rwtCE#(*;Ak$&tpYKX=y9}3`Y&kHI zw(BqBqwyYINCRvbWP7hmKAeaTh{XZGa$wzNEre8SM@BV&17oS8w~+-El&|4IjyojHC9@Zn5?m(U&CrsR^+tW5Nv#bMYSmH z5X~G-u5UFAGe2e^Nbo1tLn|v7NFUC6&ii{vnNw%Mh`p5>?-W^Y#V8FM+;n1b(3MTn1fVN(z9#u8$j2#5wy;1o@OzE zJ#}y~y{N17bQkCGIeTtmYfVALP)||ctt)FTsxK%g>Z~F`CrvG_wi%+V;%1s+`Ddo- zg&-0TJiTY!pirV3myM|8KqR*%NUAM8S#_Nkx1L|X)y2naVd-x0dAeaq7H3~JZ~$^{ zJ$$GWme!=>oox^J@;Ll6>p@RngE@Su`ikx(`>3q%wK9+lnc)MpvFy;N)@Q5_9zh7E z9gfg@35lAzyc!bHj*D$nMxrMgFlk0WqiNk#8D3=hlBGBKdPfGj zy1tZcVK1QP7*TAx+JH92Wp86sQ-QUxu%V@;HoG#XqoiVVDf%}gM5v~CtTW15{fhmc z$)x^`#0F+pvoh5u)+ zWX`j5xWEhB^Fp*NHHs{%%ud@M3;0pi40o9>^f$c3S6%`H6Oz{Ox~58#$1Mn}2)>qb z@jGyl+h^^22lU@tkt}Gb0EJpBss-sX^a{#YFl8OQ7_Q=KKBLt80`0zaGq{fK?%Dp` z_BF3xeHM+R7(}-;e5h!xE`87&_&SAG>Sh1L_>2j9e%GQ{7nN8G5-qTe1A|+)SYNTz zE@<{!C9}&oQo{ONT%M=?JJAKD$pWdzT9P@@HZ$lOPGH(zS`q`A?V>O3s@}aK!-djs z=W33p=o3;fBUx}|+3NDpAp44{qDR2}d9S~sx)NJOSJF4r|0_GkFKtYD2+ukS2)>mmHFF36?mSZ`qIe(`Ke}l zf|=H}h3)_e{9Qr!{{EI{hH(lw-E7}MlL76QBI38GE9$>7;(@RQd~j_ECvuIodRIj-b$0Wv3M+CG@pmA^ME6tS9%ikgbs$^ZsRmQixj zaF`igzgr?KY1G3y6?M(;t9;H;pl2ZvKxf6AVTZA8Q@H{^mp--?or?g=-+4$e`)B2J z>q$jjUxIlLxEc=&3p>j_r|7q$qsLPAC+rbVkZn=*_OH{17JT-*3)P^BgKaxag4~yw z_<{5-P~Ia6geB{iKa%oE_P49A>>28Vo+VY$-KPGChDg@nXo#B50sv=~WGZ7kTL%c< zoKMnUqvz0utKaS{!+V2bEywKET{cFdGLxRh{uzGRp9718*4Mh-AdHB=rePdd8xYML zXDtS5!k^Q+RuOL&3&mS@)!&ZW2@>32euW#At9vG0x7h@>!HDd|e`HH>{}n2_!b4bJ zse7X1o+uNyqzpx3n^Kj_Hn~uXs$#(Qihm>~#;@IxbxGOFwD~^^kPQ{^_O+Bl*%>{v zn9bF*uN`@wd_}#D$o+0(W>2(*owmW2SH%jrc5AD7Y%zS{e0WBN$~AjC-kCo+ahBeX z#+kY@@6RMkl5>z-toKWLvPC39IY7wre5TBq`;n__6&WJ|S^ z+hzsJuo`vRx7v48M#jner7N9lZ2G_RLys=Pgf3g(GO=Z5zDWmbXuW)!wtFRCMr;i` zIEbbG3`S!&fagzL+nID5PCF}&0~cd6;!0uR#8s!8|9mBC@zpa1cC>?*3m ztNFf|4Ary!Cg~roB|x){c~Q699R_X#W;|o znlDb!D(TxDwZYFg-Wxl-Jo za%-l?O5WM*>}qN0tZe4~0Ic8kX1A${C9L`&T3fq+>PB>bI9?IM(NLRwDmTxRN?9L1 zkd1%c%Fz1bBzr*Syk%xh8g;wn5)U(9+ZmQaLRP8Pp({hRUtP~9A^Nx+coYjldy!AN4q@9vJyDW2O2K#Z?3sui%ZKBP{Y%;9uinx9Td zO-=Uxxu1%fo}P*hcsp;6`OO5rtm2mdAjtSlvZjgB!l^!rY!lo}E#8Xk@hx&{FB-Nf|HD5pzqRf~mOF8R3J+iRq>+xJIHRB7^< zhS;LgXx}X_=CHX}QNj`H)5^l~9q-oP?jT6rvq!?V*FN1NW7LjftBU?ISMBF&V>q83 z$4s+!+DbXSnB4MamA;EaF6p|Awbv`Tz7azqdTF_wDM{!c`@YN{%%0jxFab_g$zQc6 z()j6VEp>d)Gs9I2{;>n&r@SsTG;C+pO#;%k!pcDygW=t*kuf0$PfrNu)LqZQ<|Y(y-ZQ z%=u3ffXahw|5XwxHKvH{q-Z?P&7-{kjk8!*EJZr4zE>{@q)dKy{uRK~I@kmRyS%qw z^xjaka{$087v1X{Y0Jj9BxD&BP;6|huhOM{Ptx2Mb+irNQ&Z3v7h9u_jN&aF83U*# zHLM?J;f)-J@)WF}DRm+&VyMkDgq`OBDWS;Eh&+N+9%tsKr`~7d z{hCZhE9V-1Y!vqo2SVaF%t?}`siPGD$&QKkr04B%y&N_5_#GNBEc1EsSG$rTT9X{Xd$$kSm zb6==U_umAsJ4T=mMM|nH=xmIteX0(bcOcDz8I9=t@+daW@~q(D5cHn;{}J_#!F9f0 zv~kkdb{gAhY&5oQ+qP|^jqRqfZL_hH#>Rd7``R ztld11>%RpZ+KT!9sDWw^Do@zpk8@df8mI4m-TZ6UIH~4*H1*kwcEBi~ z%Y6d<=W|QF>n1fU>_td*k=JG-1Bvjpt6ce9rfq#9b6UrFl0C=iFaPOr=fm1w*(1K| zYi=u}hbi@IMWLOkrswn0y8R~*!r0x>v=2m%asTbOy|aG+ynBI_^y~Lw{7}&Iw!N7+ z>e1pbXA(%BSc1Wyy{zkD(*NG|?dg2}+oSKps`YHq;ODKtC+llyTavS<@1=7-PzI!^ z^8H>uCCRf?Vq+(jOXc_uQqa;F?cbgmr}h&o33;EoKhC<{@SAgGWm8=i5Z9^N_wns8 zQV)iGuU3F0caznI)X&%M&(|JsBw&KK3pfG1P4UD(13uP3%wFI>8zem-trhS`c~7R4 zUvXXj0=(mi#pSo;+p7zE@3W8B3unOXeZ!$Yww6v)Nly=G*IY))({)@%#kf6{OJzP@ z)a89WcgFMI@65BJXi4I6`B%fEFo~QVYjjg?|HKFqiT4bEY|JuMJDTrfT=P!!dF{9b zS1SY{I8j58_t;{g)yk7p)m$uNv0m3>szW|3Ju38-k6+3_DN0nj_(sD1)yu9lISDK0 z+R?)BchxtNVC!rA2477-xfZ(MmZF}*v9zeBQWhsko^1~r=3@%+!uF5cnO{uKT-Skd zNOUZy*Mo=O3-sL9v@Y%MH9xpnVuhO=A@??Zy#QSNdXsAX-_J-{i!@w-P3|>7S=N|H z)(Qj@{~6Xn$VY33w|FrcZj{EfGtk#^}(pTUnG2Z5zPo17Z)>En%j1gxm zdTN@335Kc~`efd%l7s5va(2pyqdPF;%ox(_OV$|R{I#$D`LaA9m8_983R__f<6R%| zFy-EbmS|o3dgS}KIozYIsQo$*1QflN0*9{(TRO^e>Sy~&ineX@;`$#y7%O1w8_8@k zD|Bj{v3r8@OW;nwHTwRB^R%hHPym2&c)6H}{GJ>sYM!m4hNw1yxPq1yqdMvz(t5gx z=IA;nfg)49&b&GfbBiS}jah6tAmUed5BmolwXlvIg zChOPs@V}~1GLJLfzKVrIdtB+Bho%Uzt|{hD9#FctQ@;cB8t(M;2d9chVLIaeaaU($ zEY6C*kwC*hgJTUbk1(_DhtJTK?CQ5RR&CYc5X zYO1w4?DUyRr^jN~L-JgFyb{^i+R@N6lvC0A{_&0*+Szm$=)slY12>uNet!TIgb)2d zpav;V%t@0c?cwe8^gsJBJ_D(dF^p#CqX|47FCIT>kf7f`n+ANQ=H^Na?P#=#89x-yxV_l z;GHW(mNv~;kP=J#Yb;QXHH*^6_rrLhcg1L&197b%LDE4keofB?p zU-7S&6l#wDGCcua0Qw*8Ok_oUyJ8Ge)iq_P%25qis#q8^F=2$TkbEB-o1B&oOF*{G zYvmQ-x%@?@o*FBTZ9J--8bgE`Uh~CYMbmP%#eU_bzGxVmlvHw@tHCLzz0zvN08`pR zLR*thJUh5>&|xl~S(j;up8x&z&tqd1ord*6s^Oo+LJ?@@oEE~iRH3uoxnuXJ79$7k z(9lCeXi1l(d<474HPM4p&#yZsSEuFP+@ZIt;QrvQZZT~@TWkIsC+0~}!zt}hlzhHZ7VAYzy! zAVgDA(;4fz#i!fq6-iNd!X(&}E%~pBeqjN7WPlJTlC} z+^lEPt=paBZd$@_G+vv!^J#$R8Ir-NxxCkUeXr1{?DR%BTCVtY;nx^9DDCMMF>g4i zrQLBq_xD!?{h&Mv!ML5B)yxEk3jLSl)8TkLZL@*diQ8YgX4sDK&T9Rg)`TO-tor|G zX?s$Dc>gz!TeL?upl3=LlkQiMl4;}&`L$lC_v>h85e8H8+YjlGg>IO%)Y#X(uDDSz zL#GA!8X-{worR$3${+h#1K)>3N!6z&vg*cKg2>hvPdT69PM(aRTor@|dOdK3wpb zwvr?aazzx2gIM|<(|ES|EYE;1$1xC|V3D4PoJ1jm(DNSRB!j1pre|}AQ z`L@irA_zeZse=FfJ10G0JtQ?zx4Z*mIE?n#BcR#=~NE1ph6+t)=c-s>Q}4wIs|9b1j_C?brO50lkh?NU;!{CdJW(dKL(Z5&$@f+#Ds zV8OJ8+3ZL#)&G-MHpYJs@3C)M;Nv>JKz)zAty|?fi&Z%tr|DdJexPKHA;urWaDJWo@WMh!Fg%(a34GA0fy>S zf0cciYFg4Xq6Fb=$ZPrPlCZT!aIBKb*AkU#+?Qi*kxA`~;w8m8s1@>ySx#XiB9%6{Vcg5gA**+gv_(YQAjV zn~l@LmmZN_Q7aVDC4}!JdGY)&7W9w6!u33GAL%MLhROwWD%m{7gI;fvpf}LlLH3PQ zhpm4>JL)r~Bni?xl{=Z-@H(rGB!5i7^#09a(-I(atoSSF1P-5&9Z$6%GaNK?&dJ+3 zD&D}CEt~l{G2UmtLEvL_?VG~zrI-Qrf3-s~;OJR?I)g^Dq<0plo9d)7)&`t?&AU+=)Xrt%B=aV)z@Dr z@#XJnymi52wOpPL{D0rgNlT9h2Zk>$PW9V35guMC%fF+NDU!e!=K8(h#PdHe$Hg5Id(95q;zgdp;4xzI$TeA&(uj4{!{JO_yAesd% z46sLPgC_LxdEBHV@O#>k7kF<Opu z#iG+`@*B`lpxWEmWWANr)>A~Gpfyq`;16FkU0e*l#|WV<)p>UVHmK8L1NjP@I`G_m*jK4LLltcJyt^nU+Wjg(+&|_o1*ovTR8|Ki1JGSMH6`_8IYJw8JkF zxy)pL{vl#eBz@;i%a$8@DIBr?H!z-z>-qDM2t0C@tXqBk_qh&FIR4K;Mx4@yXqe%4 z&m?{y4!lm2&_&SK3x9ymz=3|9gv2WL_4;#@)|%t78{U1@CZFs7@%OxZ++Iyh$>%|{ zJCDbE>U!AUU~OSk**%-r`LGedtX;300KN~er-aVQK#*)+yd?XJFMqE6%a`|Id) ziZ5L0`;npFcE*n=tt{I_VP#M&z{uxD&~|92r4AY+l^nx#&RWVv_$?DOQVsBxIaXX>!-^Vh zy=Wn`Y+TV`v+KMcA$og!v{CozM`-={cir4WaBu`)`qwHTK{GiSu)df>P$la zjaPSEPOtRbc>lx9RlRRW%HU0(AKt^aO!htIrk&sn-yc2`@ z&v)h`jxlkI;kF6cHpe(QPKM~y85?HlnG^qM<57SE>?%qoU=Fc{JY$y`#p*I*5L|$O z03U-IE_%i-lfiXD@Ye$f-}zHekHx-9h`S(_-1T_q`v*umH}rxp_vGJC5P8^e#&tg5 z70{V8F&;=WsAgs=+A--f$T-$8bYQR2ZX6#`AS>6lVV02)>bJB<48+oPnWYqXjs!Bo zZj;+n@~(zBYjegT#+TYEsklifak@xwoaArWyq-atUyTc|B@{Bt(~IE~MK zB+?ZJ?&mvjBwTi@c1FMJ=%YOEnoJIEDyaBawB-erE14*2`kDY`#jTbw1ZguTZk1kb z%>YRnls?oJg#spoMM7}IZ4T?X5_-UWEWGB|X)PM1oX>Lmmg_|`C-X|3m3RVSqzZ}H ze|If^Oo07TPwX{y8d7#Z-t{Oa`?YzdsP3S*{CG3l9JH)9BGJnZl7EK4DS!=FEEO_E zOA@uTvOeDb2zVqHkQA>e`j;d+-UqfXK4)*A;9REO#u4fi<(iL-}+SlhIcf5g$&L? zZ*av314w!b6<#XQxe1A3mhTSl1lKj0DBO|ZkQ6Z_`i%$x`RdwGfbRdWCNRf8UsMpz zJo@?f?-@KMg2CfM;FjIVzZCQJ9lu}JXUstV)<4EdKp<>gjfIXUAU zmNAZOt1)%)g1=-6YKF`eC##Md73GU27FoUFI;yIjMJ-FDtyeq4!L&f;%uH66(~;WV#GA$@yu=E8Vs% zd99BlhlvnG`%2VO;jlX2PAjFw0lICRK77?0HuQ9CtXkZrc^S`LouQ+-xVq{m>cz7E z1ha&(>zmvjW>*8Y`a&%Xp`On*`6WL&tj%z2=+RVet1(c&CvWVT7Fmau8R~e)X=(7X zC(EGKbu}#^6Ht_7Lcz$KYyQHi9x{c+1$gfn1MR{3zg@3(t($H+>Pvt@?$e%H^9j)I zhUJAodFP5HEmexLI#MypegKB~$=MGZ$%#Yom9_RAFQ;w4aV-FQPPNwl<7O0{>aKkX zQkLnDYj?e7xHH@{u<5L~urQ(EitejWMwwM#PB@x8ueUF}0g$aRi?ul~&B5mQY(vby zc`hSpovG`sgm|$B6L~)1g1Z`+Jm_|SY!h1gkV*HX@u;=bIW@I#aPT{lJ3<@99;ZB> zS5G+I3g~4zjkU|1m^gco_kbk6RK&9m+GZc}Y1%E*#j~Lv zdF(KVc6~=0!ypu2FdDo!vXahRRu)Jg*1#sT-V_ezT#O zNopP1*fQypWmlJfGfCW~lH3RtbCbnIEN3b>AN|f|?ORzLRy4EnRNEu9@e9%xMv(EE z8o$z|s%a(>Iqc%dFpOg)B0Hwsg?Tf40p6AeiPdV`qH%}Adwn|{pyr7FN$PydSXgL% zp+V{M(_~n2DDzV`yg$Jox4df)C!c;oEo#da$cY>~52z{kmuH&mdZdzi6bsC5REXIu z+~F7;63=Pi!YpxfJ8+PjG}dd}$?Ti%2q{NOak=%!o5QQ9@#tnnS|k;=j*Owduf5a- zlMgjjmCHAB*cll~VUmt4=)#b`-~yR~0?Nn)nMDc54%pl++JA^KWQ99PO^&)d>bfE! zGtA&ZH}JBu^Rijj4eeSqt~ZP*LC-mwRn%3oE-eu7)W1IL*C2rgE)*MVo^WPJm!q#p z+KlU}Ps9-0wayTfBdpu6MS<*1#u`?BW?<&sb91aLh11e}(N3j8k<<9KOLmOfzySkD zzyURzHq5}L3l6+gG5TwsroE7I@oLhYp0q1KUY)wHd3Ly}N~bf_RBE4`VTMEfNH066 z!%&t^tS6}msBpxp$$%%U5M&D^EQZXF?#Owd_0{EVc6l^C2Pb_R*Y~C(Kp|7vdC_5QWv<4iCQggoN1+>Qv z@5lD7`#9iU^s!JO${Kol*mTcw?5V5)nge3xU7(NQaHXSnBs6n1Rkf8KVbd}lQ*s-^ zF_#P-<&KX10m@-iSr{u@eP~3Lg{(!8&m=j!fdQJV*Ot9(2c#W**HTi0w93#hM&M** zX3R>pf$!LDm@6KS6@xO?m|WoGxI%cKe;(Zc#3{W0MqXE>37{HSU|Rf>jpSzK*Yk&~ zZ_F!rVuk`p_Vc>R74+!J5fnPnq-8%bG!(vC$9%uJZ`cdRQDGiy!Ej5Yz?Kx9N25-DQVw=Y zOO>Lb-J}3;QX`rY^)hOdf(^8csLZQbdl+wjiQ$5;UQ9NUn_Lv7TX+vw=Y2W!Y!_P> z4UKR?#}L+yH0Pqb)%j=w>x$a1m(P`D_N(+2GY*=xn z3hZ;{uC|L9d|pXQkpw!UXvkxHW=Ys0xll_;=Ml=tb1A@Jsoy>u-7!JbFttIt2=JO* z=r+kaiHQ-wps1)KisbX7rbWe61nYfQka!f3@dgBi5*olE;Z;P_-HUFSqu5J2DW4p40x5l z)ub8EO5xuPjRB7&&jZp`kym#KnDP z<$Hhn<}9yO9G@f2Y*P*1e+J-R;*V13Di{<<5By5BSO{dI=dLz@C=*QCJPa0d_*E=l z_uWMwaR-AiI@UAPHe3uR`0!BT0Zx{lxxIV^c zUz}O5wv`POY8YpJBO1GM#UH3Qm;-1uVKYTM!$Y!du)~fuW0&Xn5qK#Wzr(9`oiyqi z5XA~sU?@ogAm5Gb5ZVI5#)8*)`v!0;dNG%@|4z*hmJ5xTeRyVMkU)`s{~kgG>w)ZW zOjY-N<$D>82~HvE9DyY?C^)LckV(rmZ#g_scgR23qb1v%3|Rhkrn+qG?{%&L5Vh@UzdP;mjuE4 zBJ}433~5H{H^}HRDsDA+u!7$rBL{e}&=pzK_oPt-wb9eB=oFhqbSax%*z9%KBeRlSKMPViC#?GB%!V7 zMO8I{B8Xd_XU!86G83*>*u9CtD;7BrJ>sq$pb$R%@swgm=(8yG?5LpFwmqYA)qm2Z zLpzG(2=7>{oo7jv%8bZTQq<7PC?*Yh3<~xQ1;rBX8L@ehTLCHv;j8h_TW z)@c4fElm?juR9L52!PEil>2%kGvYmFRRJ?e0vROEA#09qi$b5QMm3wmQ7VcgE~_Bn zR^a!3uRcdot)svSi)!N3#f_AlRTwKM_8y_MG5W&*88kBba73O%62}M+46*5UQC*)L zPc}IaT9BNdsnBIKMjYm1(iQk`}+BoB>Qy&U$0ny}mC z_E$ATP+t;0E5hkd32t!ce&ni9m!54KY(0{^*`l!6Al&+mz}U58xNn8O4I&E|dqj+S zJu_Tlvj|RkCzj1dJu~uB*iO8=nq)!`S+JR~C86N4>*;aCdwUd|n2E!vNZ}k&!bP7o zVc<{^pa-i4DZD4}>0|pw4J9bmnkK|GchFN(;iRe07^2yxoQjefBk!ZDHavD$4Vg6B z#K2S#hU}^4JcMzE_)uZ{`FcQmQhs_2fJ3Omjx~fRBf)Xj%|ZxcMgEes+5CNRzigh! z;6O7Z<`&G%prlsd@MVA5y``!gO|oow&n-;E$VMt!P%M>A{`1#}Aji!%y*#aVAkDW4 zQzio@1z~28>KRgqAXq$(R9f|b?}7-D0@nj*>#g?jpoQm8Pw%3}r!$4R(Q2}l%TEtb>#jgH2|ef6m@&Y0sE>N;KC?wB>>JZ|R& z!PzZu^;U}&=Q?lRd!)y;-8Gx_tgSYy3nU_8$V901n4~g7zd3-x<;T0119nfGt+pi` znZh?wlD<)hT?K^wCMpY|?SYq+c}87qx`G zx8&cDl4HL?1tBJ_{@+U=u&8xE8JZtFvRBY?IN*?eAVll})7iYxR5NsEM!SQz2evMb zu%MJ~vBQ*{qI60g*1Pp*T|-h|E_Y(HOW3|E0l#R8V-t%A|5su$pw5#iWVx9HeU3~738o30%fZb# z>_2g#AQpinWj1v#OZ+4z({Mxov&q&_TXl|?n`NCr2=HA+MzYak5<3(tvhO2J=(VCj zY1gr0o`_Iy^%es}Fb#JN11zVzkR>k4ke&Oi`_+1FnyJmi5YB?!a7dAy>x2J6_(daFt)68U&IbiCuT7*W5O*ktTO~jplVugh zoq`~qG)^)GIsHkg>SM+1zYx+4kISYo)x2`#s&o&{IK`zqSU!yE4g8Nyd&>L^Qjj)Z zAfSYY^HBcqH-QDsRZ$O%EDKaRg81~E}Q*Bbgjb?eBcOB?bIq$f`f;= z+~c7NCao24r1bqxTEb(q(dzcQAQ6$XUasL=bUR%DvM#IfyUVkOz=FmK)f8Awa~Q@M z2W@2>zHF5xrA{HB!1%YFE?NT`-!{9=7`aT!yNk_eaNd)(qkLb*dLvV|AOO%jJiqKy9K4W+IYry zT;lNDeSd_x_AyI09@1B+RbG#l=7$O!_WCpJyZsh1?0BH7)?zPLZoTXg0$+2tuy1ZJ z;b&o&NOV{DIoOTL1s5%!ex7y=th}Hj>D8sd#j>l{_xE&FO$`(I%P`ilYptqCq8E%Y*wIOmy^GG7(Uypyg#Yr9eR>c$mRF5fHS>mz41mW# zK9?h1N2aElUw%D2cwVVGAm-XVcWzQlyibr6s`3NI)n);ieBK-r5U!`z$20RQ4hP3A zz;o&q*mRkH0-mJ6^M3Ll-$w#*S?aO%Kyh+W6D~VNsdfc?1_TW45e?9K6yH_T^j=Fx zmh+>0Kk@Ws+XUlg*E7+tvrZJ$#OD4ESuVk#!GWk@p!`0P2<~jgkw=C_CVRXxyv-hB z=_D>$EWE(Y1JIs3*TY2dwqM1Qo|Z^`h2jc0B8a*+@X>W9PKdvc_YjDls=w(OaKOzR@sgeWUQMzL-P zkqaA2Hm>-iFdqSbyR0U7-=0dn&D)5==ArG_tBj4v?Q7V8#Z z<^n726BBX3rCOqlAJ*n_QUVBu^MH93G4eLD@^xarIZ{S1O^!$@My;njQ=az%liFSf&LpN7bQX| ztf*j6aIu%zIz?IV9$8HkRT+NCsp(h1#8$Kb$=S$gJesNRFa-6R^CP=Wvk@ zggXJh9D2AF;1r6BJ)}!Z5xFfv?t!6Q1R$FxKyf??C!%iog4Iqu9BMsPRS;T394XWn&1QAq$LjpSJ&fPLIGm{%T(yp7Xc+^JBX= z7?-o=arjUc8)xX;h)OQhdZ|jY`+*Y%okglt?m`kB50pFxGI)1X+@d&>)m#aQ6b)kz znJI#*EQH)CiPSxNGMzH7$C5fvYms(=`!C2kYp1%tU#KW9q!^H-!h4YtNWhIBuU4%bj;LCxCYB_MyjgFJWrBTCPcbsmBhPyu zBTnt^N?4LAsIkyb-U$bJ+^4SZe|sO5`ZK^*EN9X)Bhq=27Z3g`0aT2=_8dYaXxUdo zK~{*WNe7UZ%+%D}SwQ|3Ke@s0>m`%Jg(BfLDW72L?`y7UdSa?+dSEuV*a6vvLp3?G zSudA7@;zRNj2(H##{WJcJbG=U&T>8u&?}}xw`g4pLBrGZF2U%*szYZ$IlX_pQmml3 z1iNptXRern$op+Wpc1MO&NeENFgYZ`P=*jt@FK6VW0MKPP2|4%iHkRnGvEc�R;g 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

ddeE*SWKS`wD5C=M^ov`A=E-e{k-D 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 diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/test1.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/test1.md" deleted file mode 100644 index bce7de80..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/test1.md" +++ /dev/null @@ -1,73 +0,0 @@ -*斜体文字* - -_斜体文字_ - -**粗体文字** - -__粗体文字__ - -***粗斜体文字*** - -___粗斜体文字___ - -*** -* * * -****** -- - - ------- - -~~删除线~~ - -带下划线文本 - -# 一级标题 - -## 二级标题 - -### 三级标题 - -#### 四级标题 - -##### 五级标题 - -###### 六级标题 -[链接](http://a.com) -![图片](http://url/a.png) -> 引用 -* 第一项 -* 第二项 -* 第三项 - -+ 第一项 -+ 第二项 -+ 第三项 - -- 第一项 -- 第二项 -- 第三项 -1. 第一项 -2. 第二项 -3. 第三项 - -1. 第一项: - - 第一项嵌套的第一个元素 - - 第一项嵌套的第二个元素 -2. 第二项: - - 第二项嵌套的第一个元素 - - 第二项嵌套的第二个元素 -水平线: - ---- -带反引号的“内联代码” -``` -# 代码块 -print '3 个反引号或' -print '缩进 4 个空格' -``` - -> 区块引用 -> Markdown教程 -> 学的不仅是技术更是梦想 - - -SDFGSDFGSDFGSDFG \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/tone\351\203\250\347\275\262.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/tone\351\203\250\347\275\262.md" deleted file mode 100644 index 12f85c9b..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/tone\351\203\250\347\275\262.md" +++ /dev/null @@ -1,615 +0,0 @@ -# 部署说明 - -> 此文档以开源版本 T-One 最小单元部署举例说明,不保障系统的高可用及性能等 -> -> 若期望大规模集群化部署可以联系SIG项目组进行具体讨论。 -> 若遇到问题请参照文未的 FAQ 文档,或进 SIG 群联系我们。 - -**组件说明**: T-One 包含多个自研组件和几个开源组件,此文档以开源版本 T-One 最小单元部署举例说明。 - -* 自研组件:tone-web、tone-agent-proxy、tone-agent、tone-runner等。 -* 开源组件:mysql、kafka、redis、zookeeper - -**机器要求**: - -* 硬件要求:推荐使用 8c16g 以上规格机器。 -* OS 要求:推荐使用 Anolis OS 系统进行部署( 暂不支持debian、ubuntu等)。 - -**部署说明**: -- 主要分为安装环境、项目构建、项目启动、数据初始化等几个步骤。 -- 该文档以x86_64机器为例, 如果您的部署机器为其他arch类型的机器,则需要将docker-compose.yaml中指定的第三方开源组件镜像更换成对应的镜像源。 -- 可以自己指定安装目录,该文档以 ~/tone目录为例(推荐)。 - -# 部署步骤 -> 后续步骤以 Anolis OS 8.6 环境为示例进行行详细说明。 - -## 1. 环境准备 - -### a. 安装docker -``` - yum -y install yum-utils - yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo - yum install -y docker-ce # 若出错:yum install -y docker-ce --nobest --allowerasing - - # 启动docker - systemctl enable docker - systemctl start docker - systemctl status docker -``` -### b. 配置docker源 -``` - vim /etc/docker/daemon.json - { - "registry-mirrors": [ - "https://6kx4zyno.mirror.aliyuncs.com", - "https://docker.mirrors.ustc.edu.cn", - "http://hub-mirror.c.163.com", - "https://registry.docker-cn.com"] - } - systemctl restart docker - # 建议使用国内镜像源。 阿里云: https://6kx4zyno.mirror.aliyuncs.com,网易: http://hub-mirror.c.163.com -``` -### c. 安装docker-compose -``` - pip3 install --upgrade pip - pip3 install docker-compose - docker-compose --version -``` - -## 2. 项目构建 - -### a. 下载项目源码 -```shell -yum install -y git - -git clone --single-branch --branch master https://gitee.com/anolis/tone-web.git ~/tone/code/tone-web -git clone --single-branch --branch master https://gitee.com/anolis/tone-runner.git ~/tone/code/tone-runner -git clone --single-branch --branch master https://gitee.com/anolis/tone-agent-proxy.git ~/tone/code/tone-agent-proxy -git clone --single-branch --branch master https://gitee.com/anolis/tone-storage.git ~/tone/code/tone-storage -``` -下载后的目录结构: -``` -~/tone/code/ - ├── tone-web - ├── tone-runner - ├── tone-agent-proxy - └── tone-storage -``` - -### b. 集成前端代码 -```shell -# 下载前端代码包: -wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/tone-front-latest.zip -wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/toneagent-front-latest.zip -# 安装unzip命令 -yum install -y unzip -# 解压到指定目录 -unzip -j -o tone-front-latest.zip -d ~/tone/code/tone-web/static/front/ -unzip -j -o toneagent-front-latest.zip -d ~/tone/code/tone-agent-proxy/static/front/ -``` - -## 3. 项目配置 -### a. 下载 docker-compose.yaml -```shell -cd ~/tone -wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/docker-compose.yaml -``` - -### b. 设置并替换变量 -执行以下脚本(需手动替换`必填的`变量): -```shell -# 部署机外网IP地址(必填) -server_ip= - -# 账号密码(必填) -db_password= -redis_password= -tone_storage_password= - -# 镜像版本标签(非必改、默认latest) -version_tag=latest - -# token(非必改、可自动生成) -toneagent_access_key=$(uuidgen) -toneagent_secret_key=$(uuidgen) -admin_urls_token=$(uuidgen) -pub_api_token=$(uuidgen) - -sed -i "s/var_db_password/${db_password}/g" docker-compose.yaml -sed -i "s/var_redis_password/${redis_password}/g" docker-compose.yaml -sed -i "s/var_tone_storage/${tone_storage_password}/g" docker-compose.yaml -sed -i "s/var_toneagent_access_key/${toneagent_access_key}/g" docker-compose.yaml -sed -i "s/var_toneagent_secret_key/${toneagent_secret_key}/g" docker-compose.yaml -sed -i "s/var_admin_urls_token/${admin_urls_token}/g" docker-compose.yaml -sed -i "s/var_pub_api_token/${pub_api_token}/g" docker-compose.yaml -sed -i "s/var_version_tag/${version_tag}/g" docker-compose.yaml -sed -i "s/var_server_ip/${server_ip}/g" docker-compose.yaml -``` - -### c. 启动docker-compose -```shell -docker-compose -f ~/tone/docker-compose.yaml up --build -d -# 注:如代码有更新或首次部署,需要加 --build 参数才会自动重新打包镜像 -``` - -## 4. 数据初始化 -### a.初始化db -* 进入`mysql` docker 镜像中,`docker exec -it {数据库容器ID} bash` -* 连接数据库:`mysql -h 127.0.0.1 -P 3306 -u root -p` -* 创建 `T-One` 数据库 `tone-db`,`ToneAgent` 数据库 `toneagent-db` - ``` - CREATE DATABASE `tone-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; - CREATE DATABASE `toneagent-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; - ``` - 也可以直接通过 mysql 可视化界面初始化数据库 - -### b.初始化 `T-One` 数据 -浏览器或者curl命令请求接口($admin_urls_token可在docker-compose配置里查看或更改) -```shell -curl -s "http://${server_ip}:8080/admin/migrate/?token=${admin_urls_token}" -curl -s "http://${server_ip}:8080/admin/init_data/?token=${admin_urls_token}" -curl -s "http://${server_ip}:8080/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." -curl -s "http://${server_ip}:8081/admin/migrate/?token=${admin_urls_token}" -curl -s "http://${server_ip}:8081/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." -curl -s "http://${server_ip}:8081/admin/import_access_token/?token=${admin_urls_token}" -``` - -### c. `T-One` 关联依赖配置 -**系统执行任务还需对以下配置进行设置** - -- 配置 `T-One` 测试用例 -- 配置`T-One` 测试机器 -- 配置 `ToneAgent` `token` - - 在 ToneAgent 系统-账号管理中增加一组 token - - 更改 docker-compose 配置中的toneagent_access_key和toneagent_secret_key - -## 5. 验证 -使用浏览器打开链接查看: `T-One` 页面:`http://{host}:8080` `ToneAgent` 管理页面:`http://{host}:8081` - -## 6. T-One 多生态使用 -`T-One` + `TestLib` -### a. 创建 `TestLib` 数据库 -- 进入 mysql docker 镜像,docker exec -it {数据库容器ID} bash -- 连接数据库:mysql -h 127.0.0.1 -P 3306 -u root -p -- 创建 TestLib 数据库 testlib - - CREATE DATABASE \`test-lib\` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; -- 创建 TestLib 数据库表 -### testlib数据库初始化 -

- 点击展开/折叠脚本 - -```shell - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET NAMES utf8 */; -/*!50503 SET NAMES utf8mb4 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; - --- 表 test-lib.case 结构 -CREATE TABLE IF NOT EXISTS `case` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '测试用例名称', - `creator` varchar(64) NOT NULL COMMENT '负责人', - `type` enum('FUNCTIONAL','PERFORMANCE','STRESS','LOAD','SECURITY','COMPATIBILITY','OTHERS') NOT NULL COMMENT '测试用例类型', - `priority` enum('PRIORITY_0','PRIORITY_1','PRIORITY_2','PRIORITY_3') NOT NULL COMMENT '测试用例的优先级', - `suite_name` varchar(128) DEFAULT NULL COMMENT '测试套名称', - `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试用例执行方式,手动、自动', - `run_model` enum('SINGLE','CLUSTER') NOT NULL COMMENT '测试用例运行模式,单机、集群', - `is_available` tinyint(1) NOT NULL COMMENT '测试用例是否可用', - `tone_case` varchar(128) DEFAULT NULL COMMENT 'T-One测试用例,当run_method为自动的时候生效', - `device_type` varchar(128) DEFAULT 'unlimit' COMMENT '设备类型,可多选,默认支持所有设备', - `device_arch` varchar(256) NOT NULL COMMENT '设备架构类型,可多选,默认支撑所有类型', - `labels` varchar(256) DEFAULT NULL COMMENT '设备标签,多个用,隔开', - `desc` varchar(512) DEFAULT NULL COMMENT '用例描述', - `pre_condition` varchar(512) DEFAULT NULL COMMENT '前置条件', - `steps` json DEFAULT NULL COMMENT '操作步骤', - `custom_fields` json DEFAULT NULL COMMENT '测试用例扩展属性', - `parent` int(11) NOT NULL COMMENT '测试用例分类节点', - PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`), - KEY `ix_case_suite_name` (`suite_name`) -) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8; - --- 表 test-lib.case_label 结构 -CREATE TABLE IF NOT EXISTS `case_label` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '用例标签', - `creator` varchar(64) NOT NULL COMMENT '标签创建人', - PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`) -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; - --- 表 test-lib.case_label_map 结构 -CREATE TABLE IF NOT EXISTS `case_label_map` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `label_name` varchar(64) NOT NULL COMMENT '用例名称', - `case_id` int(11) NOT NULL COMMENT '用例ID', - PRIMARY KEY (`id`), - KEY `ix_case_label_map_label_name` (`label_name`) -) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8; - --- 表 test-lib.case_tree 结构 -CREATE TABLE IF NOT EXISTS `case_tree` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(16) NOT NULL COMMENT '用例结构树节点名称', - `parent` int(11) NOT NULL COMMENT '父节点id', - `level` int(11) NOT NULL COMMENT '树结构的深度', - `path` varchar(128) NOT NULL COMMENT '模块完整路径', - `children_nums` int(11) NOT NULL COMMENT '子节点数量', - PRIMARY KEY (`id`), - KEY `ix_case_tree_path` (`path`) -) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; - --- 表 test-lib.device 结构 -CREATE TABLE IF NOT EXISTS `device` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '设备名称', - `arch` enum('X86','ARCH64','RISCV','LOONGARCH','NOARCH','OTHERS') NOT NULL COMMENT '设备架构', - `ip` varchar(16) NOT NULL COMMENT '设备ip', - `type` enum('UNLIMIT','VM','DOCKER','PHYSICS') NOT NULL COMMENT '设备类型', - `sn` varchar(16) DEFAULT NULL COMMENT '设备序号', - `status` tinyint(1) NOT NULL COMMENT '设备是否可用', - `label` json DEFAULT NULL COMMENT '设备标签列表数组', - `owner` varchar(256) NOT NULL COMMENT '设备负责人', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; - --- 表 test-lib.device_label 结构 -CREATE TABLE IF NOT EXISTS `device_label` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '设备标签名称', - `color` varchar(32) NOT NULL COMMENT '设备标签颜色', - PRIMARY KEY (`id`), - UNIQUE KEY `ix_device_label_name` (`name`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; - --- 表 test-lib.device_label_relationship 结构 -CREATE TABLE IF NOT EXISTS `device_label_relationship` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `label_id` int(11) NOT NULL COMMENT '机器Label id', - `device_id` int(11) NOT NULL COMMENT '机器Label id', - `is_delete` tinyint(1) DEFAULT NULL COMMENT '对应关系是否删除', - PRIMARY KEY (`id`), - KEY `ix_device_label_relationship_device_id` (`device_id`), - KEY `ix_device_label_relationship_label_id` (`label_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - --- 表 test-lib.func_result 结构 -CREATE TABLE IF NOT EXISTS `func_result` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `sub_case_name` varchar(128) NOT NULL COMMENT 'tone job名称', - `sub_case_result` enum('SUCCESS','FAIL','SKIP') NOT NULL COMMENT '功能结果', - `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', - `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', - `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', - `task_id` int(11) NOT NULL COMMENT '测试方案id', - `current` json DEFAULT NULL, - `expect` json DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `ix_func_result_tone_suite_id` (`tone_suite_id`), - KEY `ix_func_result_task_id` (`task_id`), - KEY `ix_func_result_tone_case_id` (`tone_case_id`), - KEY `ix_func_result_tone_job_id` (`tone_job_id`) -) ENGINE=InnoDB AUTO_INCREMENT=479 DEFAULT CHARSET=utf8; - --- 表 test-lib.outline 结构 -CREATE TABLE IF NOT EXISTS `outline` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '测试大纲文件名', - `title` varchar(128) NOT NULL COMMENT '测试大纲的标题', - `owner` varchar(16) NOT NULL COMMENT '测试大纲负责人', - `tid` varchar(256) NOT NULL COMMENT 'oss文件地址', - `remark` varchar(64) DEFAULT NULL COMMENT '测试大纲备注描述信息', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; - --- 表 test-lib.perf_result 结构 -CREATE TABLE IF NOT EXISTS `perf_result` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `metric` varchar(128) NOT NULL COMMENT '指标名称', - `test_value` varchar(64) DEFAULT NULL COMMENT '测试值', - `cv_value` varchar(64) DEFAULT NULL COMMENT 'cv值', - `max_value` varchar(64) DEFAULT NULL COMMENT '最大值', - `min_value` varchar(64) DEFAULT NULL COMMENT '最小值', - `unit` varchar(64) DEFAULT NULL COMMENT '测试单位', - `track_result` enum('NA','INVALID','NORMAL','DECLINE','INCREASE') NOT NULL COMMENT '跟踪结果', - `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', - `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', - `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', - `task_id` int(11) NOT NULL COMMENT '测试方案id', - PRIMARY KEY (`id`), - KEY `ix_perf_result_task_id` (`task_id`), - KEY `ix_perf_result_tone_case_id` (`tone_case_id`), - KEY `ix_perf_result_tone_suite_id` (`tone_suite_id`), - KEY `ix_perf_result_tone_job_id` (`tone_job_id`) -) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; - --- 表 test-lib.plan 结构 -CREATE TABLE IF NOT EXISTS `plan` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `title` varchar(64) NOT NULL COMMENT '测试方案名称', - `req_id` int(11) DEFAULT NULL COMMENT '测试需求id', - `req_title` varchar(128) DEFAULT NULL COMMENT '测试需求标题', - `content` json DEFAULT NULL COMMENT '测试方案内容', - `status` varchar(16) NOT NULL COMMENT '测试方案阶段状态', - `cases` varchar(256) DEFAULT NULL COMMENT '测试用例,多个使用","隔开', - `tasks` varchar(256) DEFAULT NULL COMMENT '测试任务,多个使用","隔开', - `reviewers` varchar(256) NOT NULL COMMENT '方案评审人列表', - `owner` varchar(256) NOT NULL COMMENT '测试需求的负责人,多个以,隔开', - `report` tinyint(1) NOT NULL COMMENT '测试报告是否已生成', - PRIMARY KEY (`id`), - UNIQUE KEY `title` (`title`) -) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8; - --- 表 test-lib.plan_review 结构 -CREATE TABLE IF NOT EXISTS `plan_review` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `plan_id` int(11) NOT NULL COMMENT '测试方案id', - `reviewer` varchar(32) NOT NULL COMMENT '测试需方案的评审人', - `status` varchar(16) NOT NULL COMMENT '评审状态', - `desc` varchar(512) DEFAULT NULL COMMENT '评审内容', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - --- 表 test-lib.product_category 结构 -CREATE TABLE IF NOT EXISTS `product_category` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '大类名称', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; - --- 表 test-lib.product_plan 结构 -CREATE TABLE IF NOT EXISTS `product_plan` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `test_product_id` int(11) NOT NULL COMMENT '测试产品id', - `plan_id` int(11) NOT NULL COMMENT '测试产品实际复制执行的plan id', - `executor` varchar(256) NOT NULL COMMENT '测试产品执行人', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; - --- 表 test-lib.requirement 结构 -CREATE TABLE IF NOT EXISTS `requirement` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `title` varchar(128) NOT NULL COMMENT '测试需求标题', - `outline_id` int(11) DEFAULT NULL COMMENT '测试大纲id', - `outline_title` varchar(64) DEFAULT NULL COMMENT '测试大纲标题', - `content` json NOT NULL COMMENT '测试需求的描述内容', - `status` varchar(16) NOT NULL COMMENT '测试需求阶段', - `owner` varchar(16) NOT NULL COMMENT '测试需求的创建人', - `assignee` varchar(256) NOT NULL COMMENT '测试需求的指派人,多个以,隔开', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; - --- 表 test-lib.task 结构 -CREATE TABLE IF NOT EXISTS `task` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '任务名称', - `status` varchar(16) NOT NULL COMMENT '任务执行状态', - `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试任务执行方式', - `owner` varchar(256) NOT NULL COMMENT '任务执行人', - `plan_id` int(11) NOT NULL COMMENT '测试方案id', - `plan_title` varchar(256) NOT NULL COMMENT '测试方案标题', - `cases` varchar(256) NOT NULL COMMENT '测试用例,多个使用,隔开', - `desc` varchar(256) DEFAULT NULL COMMENT '备注', - `run_result` json DEFAULT NULL COMMENT '手动用例执行结果', - `config` json DEFAULT NULL COMMENT '测试任务配置', - `device_id` int(11) DEFAULT NULL COMMENT '测试设备ID', - `device_ip` varchar(256) DEFAULT NULL COMMENT '测试机器IP', - `workspace` varchar(128) NOT NULL COMMENT 'tone workspace', - `project` varchar(128) NOT NULL COMMENT 'tone project', - `job_type` varchar(128) NOT NULL COMMENT 'tone job type', - `test_type` varchar(32) DEFAULT 'others' COMMENT '测试任务类型', - `cluster` varchar(256) DEFAULT NULL COMMENT '测试机器集群名称', - `tags` varchar(256) DEFAULT NULL COMMENT '测试机器标签', - `tsn` varchar(256) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `ix_task_plan_id` (`plan_id`) -) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8; - --- 表 test-lib.test_product 结构 -CREATE TABLE IF NOT EXISTS `test_product` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(64) NOT NULL COMMENT '测试产品名称', - `category_id` int(11) NOT NULL COMMENT '大类id', - `origin_plan_id` int(11) NOT NULL COMMENT '测试产品对应的plan id', - `desc` varchar(256) DEFAULT NULL COMMENT '产品描述', - `test_method` varchar(256) DEFAULT NULL COMMENT '测试方法', - `test_requirement` varchar(256) DEFAULT NULL COMMENT '测试要求', - `need_config` tinyint(1) DEFAULT NULL COMMENT '是否扩展配置', - `owner` varchar(256) NOT NULL DEFAULT '' COMMENT '测试产品创建人', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; - --- 表 test-lib.test_suite 结构 -CREATE TABLE IF NOT EXISTS `test_suite` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(128) NOT NULL COMMENT '测试套名称', - `creator` varchar(64) NOT NULL COMMENT '测试套的创建人员', - PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`) -) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; - --- 表 test-lib.tone_case 结构 -CREATE TABLE IF NOT EXISTS `tone_case` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `tone_case_id` int(11) NOT NULL COMMENT 'tone用例ID', - `tone_case_name` varchar(256) NOT NULL COMMENT 'tone用例名称', - `suite_id` int(11) NOT NULL COMMENT 'suite ID', - `suite_name` varchar(256) NOT NULL COMMENT 'suite用例名称', - `test_type` varchar(64) DEFAULT NULL COMMENT '测试类型', - PRIMARY KEY (`id`), - KEY `ix_tone_case_tone_case_name` (`tone_case_name`), - KEY `ix_tone_case_suite_id` (`suite_id`), - KEY `ix_tone_case_suite_name` (`suite_name`) -) ENGINE=InnoDB AUTO_INCREMENT=603 DEFAULT CHARSET=utf8; - --- 表 test-lib.tone_job 结构 -CREATE TABLE IF NOT EXISTS `tone_job` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `name` varchar(100) NOT NULL COMMENT 'tone job名称', - `state` enum('PENDING','RUNNING','SUCCESS','FAIL','STOP','SKIP') NOT NULL COMMENT 'tone job状态', - `test_type` enum('FUNCTIONAL','PERFORMANCE') NOT NULL COMMENT '测试类型', - `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', - `tone_job_link` varchar(100) DEFAULT '' COMMENT 'tone job链接', - `task_id` int(11) NOT NULL COMMENT '测试方案id', - `server_info` json DEFAULT NULL COMMENT '存储tone job的机器信息', - PRIMARY KEY (`id`), - KEY `ix_tone_job_tone_job_id` (`tone_job_id`), - KEY `ix_tone_job_task_id` (`task_id`) -) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8; - --- 表 test-lib.tone_sync_pull 结构 -CREATE TABLE IF NOT EXISTS `tone_sync_pull` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=76149 DEFAULT CHARSET=utf8; - --- 表 test-lib.tone_sync_push 结构 -CREATE TABLE IF NOT EXISTS `tone_sync_push` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - --- 表 test-lib.user 结构 -CREATE TABLE IF NOT EXISTS `user` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', - `nick_name` varchar(64) DEFAULT NULL COMMENT '用户昵称,具有唯一性', - `email` varchar(64) NOT NULL COMMENT '用户邮箱', - `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', - `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', - PRIMARY KEY (`id`), - UNIQUE KEY `nick_name` (`nick_name`), - KEY `ix_user_user_name` (`user_name`) -) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; - --- 表 test-lib.user_open_source 结构 -CREATE TABLE IF NOT EXISTS `user_open_source` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', - `nick_name` varchar(64) NOT NULL COMMENT '用户昵称,具有唯一性', - `email` varchar(64) NOT NULL COMMENT '用户邮箱', - `password` varchar(64) NOT NULL COMMENT '用户密码,前端对密码md5加密后的值', - `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', - `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', - `token` varchar(256) NOT NULL COMMENT 'api访问凭证', - PRIMARY KEY (`id`), - UNIQUE KEY `nick_name` (`nick_name`), - UNIQUE KEY `email` (`email`), - KEY `ix_user_open_source_token` (`token`(255)) -) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; - --- 表 test-lib.user_role_op_record 结构 -CREATE TABLE IF NOT EXISTS `user_role_op_record` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', - `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `applicant` varchar(64) NOT NULL COMMENT '申请人name', - `applicant_id` int(11) NOT NULL COMMENT '申请人ID', - `apply_reason` varchar(512) DEFAULT NULL COMMENT '申请理由', - `signer` varchar(64) DEFAULT NULL COMMENT '评审人name', - `has_review` tinyint(1) NOT NULL COMMENT '是否已经审核', - `review_result` enum('INIT','PASS','FAIL') NOT NULL COMMENT '审核结果', - `review_reason` varchar(512) DEFAULT NULL COMMENT '评审意见', - `method` enum('APPROVE','UPGRADE','DOWNGRADE','DELETE') NOT NULL COMMENT '操作方式', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; - -/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; -/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; - - -``` -
- -### b.TestLib 服务依赖 -### c. clone test-lib代码到~/tone/code目录下 -```shell -git clone --single-branch --branch master https://gitee.com/anolis/testlib.git ~/tone/code/testlib -``` -### d.增加docker-compose配置 -```yaml -# docker-compose.yaml service下增加test-lib - test-lib: - build: - context: code/testlib/ - dockerfile: Dockerfile - args: - APP_NAME: test-lib - ENV: daily - image: test-lib:latest - ports: - - "8005:8005" - depends_on: - - mysql - - redis - environment: - <<: *common-variables - # db - db_url: mysql+aiomysql://${db_user}:{db_password}@mysql:3306/test-lib - # redis - redis_url: redis://:${redis_password}@redis:6379/10 - # app - tone_host: http://${server_ip}:8080/ - tone_token: tone_token - tone_user_name: tone_user_name - main_domain: http://${server_ip}:8005 - oss_url: http://${server_ip}:8005 -``` -#### e.重启服务 -```shell -docker-compose -f ~/tone/docker-compose.yaml up --build -d -``` -## 7. 独立部署 FAQ -https://tone.openanolis.cn/help_doc/12 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" deleted file mode 100644 index b09df7d0..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" +++ /dev/null @@ -1,70 +0,0 @@ -# 一级标题 -## 二级标题 -### 三级标题 -**粗体文本** - -__cuti__ - -*斜体文本* - -_xieti_ - -下划线 - -~~删除线~~ - -上标:Xy - -下标:An - -> 引用文本 -- 无序列表项1 - - 第二层 -- 无序列表项2 -* * * -1. 有序列表项1 -2. 有序列表项2 ---- -[链接文本](https://gitee.com/suli01/community/edit/master/sig/T-One/content/%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97/%E7%94%A8%E6%88%B7%E8%81%86%E5%90%AC/test.md) - -链接名称 - -'''python -def hello_world(): - print("Hello, world!") - -![示例图片](https://pic.rmb.bdstatic.com/bjh/gallery/03e17cba710868d9153176b50a5fca0d1090.jpeg#pic_center=100x100) - -| 列1 | 列2 | 列3 | -| --- | --- | --- | -| 单元格1 | 单元格2 | 单元格3 | -| 单元格4 | 单元格5 | 单元格6 | - - -| 左对齐 | 居中对齐 | 右对齐 | -|:-----|:------:|------:| -| 文本 | 文本 | 文本 | - -
图片名称
- - - - - - - - - - - - - -
值班人员星期一星期二星期三
张三李四王五
- -- [ ] :待完成事项 - -- [x] :已完成事项 - -
- 图片名称 -
diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" deleted file mode 100644 index d0a3a7f0..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" +++ /dev/null @@ -1,2 +0,0 @@ -# hello -![测试外链图片](https://up.enterdesk.com/2021/edpic/0a/13/7a/0a137aaa28f48af0349cee1e568c0a57_1.jpg) \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" deleted file mode 100644 index e5d110a5..00000000 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" +++ /dev/null @@ -1,2 +0,0 @@ -# hello, 欢迎来到聆听 .md -## 阿斯顿发射点 \ No newline at end of file -- Gitee From 3566366f720aa74b929e41599290b00f0d5bdbf6 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Mon, 20 Jan 2025 17:06:00 +0800 Subject: [PATCH 115/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9551-?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../000000000130_anolis.jpg" | Bin 0 -> 47154 bytes .../T-One\346\246\202\350\277\260.md" | 30 + .../assets/Dingtalk_20240614165831.jpg" | Bin 0 -> 6459 bytes .../assets/jiagou.jpeg" | Bin 0 -> 366652 bytes .../test1.md" | 73 +++ .../tone\351\203\250\347\275\262.md" | 615 ++++++++++++++++++ .../test.md" | 70 ++ ...26\351\223\276\345\233\276\347\211\207.md" | 2 + .../\350\201\206\345\220\254.md" | 2 + 9 files changed, 792 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/000000000130_anolis.jpg" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/T-One\346\246\202\350\277\260.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/assets/Dingtalk_20240614165831.jpg" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/assets/jiagou.jpeg" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/test1.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/tone\351\203\250\347\275\262.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/000000000130_anolis.jpg" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/000000000130_anolis.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..25e606c9c5d28fccaf9f6caa351e3720570e4162 GIT binary patch literal 47154 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 literal 0 HcmV?d00001 diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/T-One\346\246\202\350\277\260.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/T-One\346\246\202\350\277\260.md" new file mode 100644 index 00000000..74f3dbc4 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/T-One\346\246\202\350\277\260.md" @@ -0,0 +1,30 @@ +### T- One是什么 + T-One是一站式的自动化质量协作平台;打通了测试计划、测试准备、测试执行、测试分析、测试报告、覆盖率检测、智能Bisect,环境服务等流程的闭环,为社区研发提供一站式质量服务。 +​ + +### 平台架构 +![](assets/jiagou.jpeg) + +### 核心特点 +- 一站式质量平台:平台打通了测试准备、测试执行、测试分析、测试计划、测试报告、覆盖率检测、智能Bisect、智能巡检等流程全闭环,为社区研发提供一站式测试支撑。 + - 支持多CPU混合架构(x86、arm、loogarch、risc-v) + - 支持多操作系统类型(龙蜥OS、centos、debian等) + - 支持复杂环境测试(企业内网、独立隔离、弹性云虚拟机/容器、应用集群及多种混合环境) + +- 质量协作能力:通过分布式的业务架构和独立租户空间能力,支持多企业、多团队的质量协作模式。 +- 数据分析能力:平台提供了时序分析、对比分析,以及聚合生成测试报告的能力,在大量测试之后对数据进行分析以发现软件问题。 +- 开源软件包CI服务:社区开发者可以将自己的软件包(可来自代码托管平台如github/gitee/codeup等)注册到Testfarm, 平台会监控软件包的代码变更,一旦有变更则会立即触发测试,并将测试结果通知开发者,方便开源软件包引入。 +- 开发者资源服务:社区开发者可以reserve测试环境并登陆,方便在测试环境中进行测试及debug。 +- 缺陷定位诊断服务:对于发现的软件缺陷,平台可以提供了缺陷的自动化定位诊断能力,可以发现引入缺陷的commit地址。 + + +### 应用场景 +- 场景1:OS发布测试,每次AnolisOS的发布,社区测试团队会根据发布测试策略进行大规模测试,保障产品发布质量,外部用户可以在Testfarm查看发布测试数据。 +- 场景2:开源软件包CI,社区开发者可以将软件包注册到平台,平台会自动监控软件包的变更,一旦发生变更会立即进行测试并推送测试结果。 +- 场景3:自定义测试,社区开发者根据自己的需求可以在T-One平台进行在线测试,或者使用命令行测试。 +- 场景4:离线测试,对于网络不可达的测试环境,用户可以使用离线测试模式测试并上传数据。 +- 场景5:独立部署,外部用户也可以在自己环境下独立部署平台,测试并上传数据到Testfarm。 +- 场景6:登陆测试环境,社区开发者可以根据需要reserve测试环境登陆进行测试及debug。 +- 场景7:缺陷定位诊断,一旦测试出缺陷,平台会自动诊断缺陷引入的commit。 + + diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/assets/Dingtalk_20240614165831.jpg" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/assets/Dingtalk_20240614165831.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..925bf2945891170613821e8e7dbc9e4206d17c8d GIT binary patch literal 6459 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

}E@Hj0_{W?|f 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

FG!grkAXdJNt$uIvKqhcJq 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 z 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[WR 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ⅅQKHz};_SkLL8?V2PS1YROEdQ3~XQxay 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ċXdTaw*%m;m5ZDbWgJ_XqbT zDvAh;-~A5{-eY6$?_p6wFPKWC2wO#bCkhup5n5$xivQYC8gC{q6W18Df;8o)yZA^L z&19`0^;+FlAyp9lc`R#?1}XdxA=qZp@qYg0K_H~ccT+X*5)8#~rET{E?)6ete%?+` z>Pg;Oc!igL?}wr%P%Jl@>kT2>A_9lw&WZ1JDr##o*-z!EZ(sXULd{qi52l@J2FAZh)l%b1RxVsPVT45>GYK6W zs%mt)YBEJObA&^*vaO~&Ylbo`Q*J?uQnpw@EGyN#=FD{MpiJ?21iE=JK@!i{WQwiN z)*KO=f$)&wM8z%)PSI(CGAWa3)9c;ND@?)lyrRtaD7$GqMXV^g$953;;!hXxxUiRa z{)GPb`7iQmMGUkxRpBs!#wr?u=&Mts2N^sjCv}q8AWjT2j+a*tX4s1U)^X`h<$6f6 z<#{PRw?(ir$IPNe(R5FYC9daux!_Ty_s*Sduj|)adE_3Nm6{4cb89eLQ_KCsL(^t8 zmONhdjy;uav|LBMmFJmw)HSpDHl46wr2>kjJDF$H`h>YmCMPl;nd353r|-GB2~crJlEYSZdvg__fXQwTu_6lDVdjdWA1o{3pj<* zWO7`~@K{3uUOy}vzP|fwRJ|qtV1!mFv;onWLycv;NES?DdSWTx7<4q$E(7u-h5`*y zunjTjaPhRXv>5{Y=$2uqyQi2ZfQq)L2rSx1#qp2#kA?Cat1N}Vess|sMKCc!m>fu# zskZ_Dk$MRV&f0w`meIYU7U&TXTLZk#7Jyte?LOzQY4aWx7Jw$Q~AW05`zp#STqFF;8>m(vmt6lfA_v~Z zPR||?_~jnZv`K@EVgRKEX5W(W*9-znsc1ALK-W7`aQY%CLFZcpXF@&6^`$)77hpYo z+MF(7h6)8Jg-v8eiTVL$q!< z6Dva)^)DRY@#s3N<7D%mVKJO5Ef3}A=sBe0`p_8|XbHCSjuVlg^#tR(kG0h7_lfWM zl1KPfPXTED71gAg({M9iGpA9D(7lpLmYY^kHI2xI^)RNz_q_|9^Vt1u@Lt}?$Rx3q zHB5%ploO($xfB!a{`_da$~3pMA*$%)S5+tR16^{WCtPCoxk9|No(`ulTm=fi#KHxn8b$4Gmy;6T91*vrdDsFfq&&+a>I}QT$-}alE@Cye%#p7#M?m1`^VJfG8cOpRxv-IIy|LD(Bu zup^9K&aifKUsoB@Nn7bY)Aa1qEhPJzHOH=PpUXl~YKAlYhmBJ6h+Mf(of4$kGP zTX$P|+AfOJI{A+^{3aYTYfWZ-JyTk6^vZL><~Vh&vlYu3rfjlYLOQ3~Vuvc(WU3or zr1Tw_hLp&V{<6V6?{K~U=lAWc`Sn2g#B)Y1$I|vgI{Vms_kn4(^n+9`GM{>0jzVyc zw}D4rdDqgU7lE0S_m?prJ)yM*{lKmMrVAUiXJ%@od0D)1YmPYm1Oz%%dCc&P?81Gi zPrCw9tq1gXqQ{a;6W*LaTZ}hEfZQ8KgPkk$SnEiQR0cX@1pK7h#t)q&g}+E9;vJ`^ z)W#ra{#A7IZRFuvDtpnu`uUfL3)UPQ%^$9Gte&zFN_HT6wbgM%x*;df&FYfEG1M7C zi^8c2vThidKUDO4O3I6kMs#~2@X%(71?`{{b^!S4o*dmNZdgCkaA=OK8Oj^B=V<(E zwsIA@Dm!xAHWE_a&F{IWFkTgR4(!*CvG%g%MP)n?n_8LP-+zdm&-~kpr)ZgNFt64= z4y*IK#RIXN#67XEE}w2jH5KB|X!O9sgS0jZaz346t+tVpa;&*}P+mM;GizAtAr7oD zzJ8NePQ%;;ZuX_g*>X0l`h$sNY5e8_m@+(I; z9jJe?g@n)80~8;b0WsrkzymB6?GP=0@X-||R`xgwF~lER*GMXe0L{oJ8sw1>3;HW~ zavo)i>3u9hC@kMB(jhAQ8Hub)#;Im9oEt&u5LAAKA{9-T;Uo~ZvcZ1VM>HCI=tL08 z9Flu?l(}k&j~%E26#63lz55_*BPZ%M<>gJ&A*9Q{*81JdEHQB*O`<$`g(&RZBI5P) z3w;&((H>lRL1fAdngPe z|DM?l6daIXAD}C+F_N5}(4h!@0FsFhk z)}9(slQ13XTG~*X6#4QOT%rgitrTSyu@8O`9k`XdB8ZoQkhrIo8d4l1RUit!Yq#5nAZ7~&4Kb?jMk=5p zuYHaR;rgv^VHD49*kh>!z|9}MR5}9*m)B4g41#VUE=Qd|pgS2aVRN!DLyk8M2;8xU zx=|ud_tx=GP!?Arft%7gp$a6R5yvBExr3$A96Rqb3~A?zrw@N^$kb+lcVWq%aoY#g zWXAs4z&2E%MNRBYmsBxVs5cxWVO)jT|KoSKl21~`FfHXz+3PkL9R}?WHXW53AhnGb z!Mq_*Y(BCCa`ZKHSKw}p6k+;F^5wEpf^rpSaV&^{p{Wm57KC`!Mct0Jv~IQ84#2Za z>A?Li^|XuAgNufcu~$4l9l0MaMp-Xuv(YSd7CBwZ>>tHUI;A9$ zK#-m;DU$|e%TQK#{;0#|P0bfjRFzc{hEC26sIU}CwN+B#Ys2VaYkG<{uXO+H92g1x zFcbeye!yZmqHN*D8>nC~cx9t+At&AU;gHEAZr|6N{Q*wQ5b!{@_L99cM-CM>K~}?B zOA|;a^w3;LLYzFTNZh8jjuZUXLhd6?({M+9N+NJ=Qh7xG9?TBIL|^k79K1G8J$`zz-f z{LcoV(wMBU$-4#I1f!K9bZTyo5|~K0fND5mtn>zsr?P4I3HFCf&hvtjpoSy-bOwyR z7DxneuS-w~V(&}@1Qs>=3Wl0#-4R{FcJu1?JuFF(KutI@YBSL_Vu^TSVVcgrQu6lg z`YL)Ip8xX#@N}OSg>jFcT{w$&tTILH3^*z(&E{ojAo+Y z?}1f^ZFE!ZbKI||WR~c)hr|sW5*>-0=4vllV?4{AJ(}cb!0x)(d-$86*j=|}jQit;;=T9t#`2- z#ho=jO14r6+ifC^9n}o8@0M*VJbR^7(8uuqyQ03@vV94ocz_nB#FA7nFamBH10C~=;yg9masmmH zn2d70nZH%inRjtzGaUMs+&oxg1#A-4$XSByBQ)uCc^Ux|T6Ivk$P!;$l89Rc?^HZa z6xChNiRu{Ix=59@P)lsstJ=3q;ok_}(h6j}^-^s3-4C5n0$g0cS2P4Z#ORH%@NY0} zjNwypw3$A~wW@u6Y&10DWWyyBcSKA4t8&gP*5?Q7IgBO>KGX>FIODC@#CpfW(J7^2 zx|jrH%I&=Gt`ln_gzo=}L#_1t#8yul$wdEvVt^ZbcP$&%?5gj&kMX!1`dxNsE>%*2 z=l0ppYmZ(`XO-o6P#f2x`vbynvDMtW2gG(+z0Qs^@bXGC^5@q*`8# zJiTFiU|(aUyPn$A?7FA3IT~R0#sNc*>Dwv?!WJ61Sx>AC?j7pim<>8;(?Q8RQm^A0 z(xb5Fs}xiB6J+grKWeNr`IIyG$g3Eb7LAf&-1@_R4bL4W02C31vQW*^pA zZ#+Y6EF-PtXl6b~#rI^unQ*d!K<4-XeGy8xIKhWmn&tRk9B=1F3GH7j2>gw3*6UZ7 zZW*107M(EK$g26SgQ(6+ninA`ajbWZC63?slr$7#X}~w6_%&Q)*QtABV58!%GX2F+2q>XIczR{vfFXJ2Cay zf}uGwNA|O3H;Na9E5Oxm+Pr#*KtC^3!3uJ_WUc8tj!I6wDUB%4lmR1>e%UQ^wN>^- z22DIvc>)_0Y1HHaNB293pfK7_0EGzz4)$xs#)b>g`7*p+m3tPvk27D?TqZ(CY}1Ot zp#tkAAuymZrfX+e42w=nS~#K$#B|CYD`^lA?~-gg?1_QGE={V|k~Em5)J@lp8+g;Dz?dnI^n)@La~@$3lt_uC%ZL~I z^vaTvwO^kJDWYRcfPOsuR`-R*RSkAjzhLu&8rTn5ASvAKCUGM{xiKs{l|eazU2PVO z#7VA2?nW8cjE@o`FA6tLkqr>jD@4MwRaq~;A1rsC*O>^=dxPWqp(HsLbKQ7aKW7>? z#|rYIF!9$lQVE3=5@cZpPf-SqkW@cfb!Ko;dhzik843}dp2JqWDv~3{cINKG= zG4xObQGx|yfxpMQ?9q1r5^-E6|ntGW_mfP6Xxk~`3ZXYV$EVG;ggChqrl=%_L!gGzLdZ#&#c;iKcwNBjVDp^msR zN?}4wU-O}4Rsy)kzSL*yuPdj7govOIVM4DwDX^YW z{l+{+3e@%#B zM$lL$^lEJ**z(J%J-8{~UMzibIVWL^oEA&()K!q?-M@WsEKJ~9uyi@TwNfaP+s3i8@Q}Z5r*@NdR z2&sU<&KAlcl~f~f5Eqx!Gwk1T_|3p4Fdr)%3o0Y6!8z_1D2AB)%sr*x>Cv4uGVamk zNY4EwUBIeP)R%~Y9hE&uQ7lyYH-KB0tW%M)Tax8Ji!tmwZS&?x1%l&5AR zQx%IxDVgCt9I?e*98W+bEhJN*DU{6A3B!!q4nIQk60jer#>Cf_8AF@R2yD{dq8y>% z@5aY<+6rkGrY22CixG%9(?GqjpO`{X`%AvBOA7P`g`Y~yg}=nH zdNrBJre9~$+&9v`nJt>*2RZ$^CeYx%|2aJbN}L;G*Af&q{ql^OK!+bf<{}Le6@nHL zfVLa$Nr*&{jk$-}w}~}O7C}M;8Z_YU9W5F|l~LVq-iYI_=vbkyn}~rxw-YcI`4t5-@YD-9;$+u3LBUYgf_@kqx|k zm|kGcaM8N7G`q(H^Zx~QwdKBqOY;2!27Hre9y$Zj4CgSkm)#!S3qWTxUbH4I7PDX6 zOULp4RQb-kESXp`_}p_#@eZ>7=BG;dMUmZSf~sKjoCz7K^WdvBzQE@sJ2d8P)@_|iW3`1XqWlKRX)gX+8uO?{}# z3x3&Cxv|;ELAtA4@*)2sF*z$!_;@3e_Szi_zn@nmuJ7r zkTPGMP&Xwq3kF44rLs2?iO#FQ9+08)Hg%TZL>=eIYP?+Fm>OoeHi$K%!-(6u!4Mh< zV;&dJaJFh9CLr(Qn5>Shx61<`k(YI(ka^k?t81Rz-b=s9M5@m;$ybg#y?;#TNoZ>u z(<`(|Ix%hMCttK_f7+T>Q~5<+4vP+rF$qfWz1HL$92Ya<2Li5gNfI5;gW&`G>bD__ zOMg0>gwc2ja9m>JH!)(Nnc%AE53W4;IK9m*X=5n)L3+&|gYYXx-VjYiX}P1txfwc3 z-K-ieV+E+0g+_ zXUJ__P;C+>i%wdbVWm?7g$Ng&Tv2Ci_=iI!kXf5A>+SbjU{XO4>hkpVjr3+qc?XSd z=||H>gjh9KLh*`0z?;Y7hgmO*=AuF35zS>U+8bZfeAh!6xnkut#C?5A+5RY!rFCA4 z&W2XDWDGjyp^u7T!l-?#<7weR(|PII?e4oS(P^_-uzGerd97>lUY)48by!(`y24hp zZe%pHDHYT-O>aZ_X>$_2Pl%Eq0jF&`ur0w2K(HUGPRR0W>aEeZ`Z{(+!8_^3YJgfC zTAOB^5jbtoJYTo(8xA)AZj9rI!>VlynOvf3(7sZ&V$N4>H9j?+j1usqUKP(|UiYiu zx~)xqwI_rNvAk3Hi!k&wr>-^E7So>F@OK-Bc9;y#9V`IFYgD%K z+sC7BngS!7*_)PNU56M(ntgBj-Bjdm47&c7*B9f*YOZ=1#MQ&CrR_bu;z_CC_sx@S zsKtbYf)*RiG)RVPjHsVZUG&+IhqVmuvX5!N4tNr_;nT4>W<_opCR!r zC&sLtbpZ*T@!!LN!_G!N);=1qx9BF`xIWL92E12Y|G7%d=>fLq4Ld;q+G9n~i)Jm{ zzV}X{L+}AuH-FK+PI7QhUvp<_Ed&nQ3QrvHu?QR)AX;)$H0rqO)$sDgbq{EbRIk{q zyk!+F6#rGe{4?mh6spwM-_3P`%H!g;=$J-Y7pDNi)f(zG-w?+=0_C$|ad8QFj!%oy zb2)cDY)Z>^r&o~I zW9GQpVuP!+08X1@K5MPrZcPJ*VJGXf2l`+|Q5l9uRBbwbZkL&91&;-ZEfFImfZ14| zv(6Agw$yuF z<#4(PKI^j?QWyy=VY#iU!&i!^HO9Vjp}uxOn%6iLrfvIusg41;l(KGFfhiKTwsG)b z9j+rJfu{E*H>jQy9>^;EHmTZ=UBsc%I`-G{3bo>@!b_5OkBL~VVO@}PwdwdT@s{rpDZ$P z8>YzJMFpvEHIPO&r^heeMGt^@Qk7_*BT97OFQKy3AltCr2Oh{RCqoAwhTpbxb6aed z9YY&vnBbt{c5KQRhmx{3=z3`e08WUf@lZ+~0|9n72Hlmj41Zphwe&uCy2BU?>ZirX zLwc0hz~cAJS%2+pFH6cFmR{LqC!zn|V1edf)oZU@^gy(mzG^h4WjKuBWlgJQ_&qAM zKpn+alf7z7H}rZ6g}NN36qOry+g5vG z_Y02>GSdeCwy8Neph;h@fwp5)Iz@W>?Tive7#Lwd~TOl>eI`h zaAU|yZR$rF<1R?>CS$48?1ES7m$RC(#^V82+Pj+Ew#x;8DMG1b%3;qQ-sHznf7g$R z*@2!_=ZU$kbGZtbRX=W_RM&y)YxcFD74Vh)svY%-j}s_KAVGGOsS{%oI8k3~j2el# zmDS#0(9YrKSJ%WQu5^28zd&@aJ7!Bx+Rr0%1 z=a@pGVoh*#p;lSdO^`ui!_KAud~0H|pIzM) zA0Bm&F0Rk92&Oj53Qr}@qNrOZRGo|v5#xn$a9~n(&29Wl*mZYbjk$Ov3?wios#>jld z6!-^Fr*pmH&yqYTj@4vHq?{CQ&5iK8KsP;UnVbG(vmfdjtr??kqdM+8Af-k$k*sl` zra7%Imot?b@pKwj>Rpi8m^>8DyEpp|D?jpC>=H95rf19i4F=dIi z_IU(zzyF2j-;tQ@9K#9#v3V_g1Z&XTMTb7eOSf5<_z;=RYD+na2d*z}e=B=+W56c` z?4opk`)Uq5P0ZACnayu246N1#$)x3UW^EsHwg6N5?B<$~bs*5|){=dyb;Cji8o16x zWoMC#OP5kivQo-+*$hQ3L1_4*-in0X=Xn>zZT={w!hWv4Cdh6M#~G~!g9ck zmmSWdYiQRKFW#C8wf}o>_MRH$S*he?)PR?69TRoQ%2wq-f+^F(zKP1_Gk@RnuHrJg z?k?w&UU zPrp^mCm5CKuzY{?H#v1RTQ4LMJnEoNZ-HYqJliVE!Y6=)E*quJ<^`f0?ce@tPt1u9 z5Cl~81wl(5;Z7VdAUi$-)fP@9_xJ4!$1sO83RkrN8@Mhle4FPEcS(x>0P zu`yK1ar!MiFSl-Oq3KsS3N7L$IkZYBDjh_RfGDY7f%^q@j1=pKKFJO|NU#$5y2RP5 z>bxy(gm!9~(%I`YQ(M8lDy( z^xq3~LNkQPmQuAJx}q?cac{NG=E%9&(l;_Q|03;{-iIBHGBf4Trh`_(IZ2|Z%>jH7 zjyRwwtopGMVqJ;fYg$?*(|O<(gPc0U+;)>6+4jLPfVxk3enI~!^uwo#z?5{ro;*#X zxtm5WL@A6}LQCQ9KHBEf#AM{PT>yA$tCBJ*)bKg#kGT)+Q zQ(Bc?f{Lhynsp7PT5LU}a~oLRPiVR;C@t)98xjr^Rr~usLBi~;0k(^i_2zoe_{J-E z7gDpXSKAQ@{@w_y4Uk$Abm-&Bzz)YhbykaG-0Df+r9<+~w>}NCKQwt`3^lkp`fWAu zMv!dm-70@A`280RCW5zg5{O(ZKR!v+@DBgIEj;~**l*Z)u}?TsUju+6R?jupWS~}D zo@YUeOsRlx%#zy6DzZAF1CNAEh*)it>p>P1T6Qnl)iL+4tReM64Dg?Nb1@=&n0J)B zPXKwqv?qB(0Nc-d7vq}0w1{-k;J5tC@!y#S^1uIx><=K>F}tR&9+M7bg-T$qvbDdd zI~n!krBg4ZW|SF&k}h7wSTSOLpwfV4&q_dGj7IU5jJh;(Sb)d#JM|B%VbdUzL1)@) ztI+g3AsB#(1^F);1Vd=hhDi zG`cc~ZnMRTDNhS#jRwhl;UXxDV+;l^C$u{&SG$>5Bq}&CmJSch(#(eR$n3atJFb}A z0A#(zwTA;E!O@{<5Y_O?xs;sp_l5qy3)i4{T7gS|*BST)7p4VW_n(#_m65U|fye40 z>p|Cvdj{}@GP#(8Ei|+H+)Tb6gL>&25-ggf$?fM_C7O6z*occOz0tx6INb_x}acWX6x^8;S z%j{B3iRR!^7sr?h1fm9(}goCi}T?Cmop|94FHlI2rBXrPn<+J|6n-xm7v?lN9$Up~L%ick2J|O**_)=aKllq$N~gHKu`4p`kB zV0l8cb$F@+bF*Y{W0|7yTBG{JDg3*g!R{2t|8^ z48#cLY=eV?4FZ;|))k_P1BC-D)PaE^Pu~SLkTY9Zkm)R2Ru0Xk=eru6Vp)r>kXIaN za3EDHw?%r2MS6RC8~VQiw&+Mhq&KJM$0oZvdj{zFmL;1mE}Gyf*P-G!G06G$xQ~M$9#Ht8U)gda`qOC^=jMojv># zZLO`7tt|tC!{klkT=KS5b#8C(92ps7ADbl>J>SDUQS^MZe`2Y4T;aKE4z#t#mWoxY zR^@^-yLNbZcm>=R*0$T)Vz}w<=|#ZAR18D5d+?szHPIDB#eq3EFq`%ai5efP>-n}e zT9>j-J>OEv+Z>#{J0&msw9P1P@V3Z6jnbh*LnG|hy7#MXiZMMkZN-myEv0%^99SF& zT1UsnxLQZXMoFEG1O`#^Hnp|f0j=#FZEYQ$ty2?|BX&r3bdHXXceJ&un|mX;EoM9s zTFHOKfkkqlyDKJXLxZDzeSK-a4i2o>9mJP)+?t{1hw6I1lIO+gu`1UhIbiXDG%_~m z|J*GvWm$zEa;^#`GIi`y&O*mWZBFiNnesuJMfT;&3aU83LiP=j~+ zjSmiu_V@NpPK~YVU$bFweP??YdwRJ=y~4lMIk4>0Hj5rs*?6IBmE`y8>h2vaDz!dy z+v*&s2)J8uzzTy&QjF5=9ekam!=sav<7M(@?6l~{6sU#zji&YA%k;OkeQBK9`A*3hh0C0~4e1-NN49{-L2^vo%{A+B>?)TU$AGv+0_1 z_J!ydTNVOCM@RUDttzLUH)l)J*;%71R2*0_4onqo&${5e5R~h=giFmcM~&Pcp@_ku zAr89suFf2KT01(&C#L(PSBwu;L3bMtY~t9h+YENEQMf(5{j7`j&W?d0PiN-25AHVg zt|~Go2bO)>MuGA|F(5`q#-}D*{p9-MnJSwHh*4CK);Wg})4_(G9~~w6eil7X&fBYYsW`A=9N-`${5C9F zYU3uh{6!jdfz-yE5#U9?O3Vb_-VP>Co~9cc&1 z!+g``0oAE(B$#R)uP+A|Rlmssag|bW;4V1eOi$fv99!ML%E)b*;X@z#P%D{Z(v~d* zW=zq4YIodi`D#NTYYsV(*M{?{mKVSHrIRfaz1@B52kz`>>$LgY6@OAHIj=adF!-Wu)+4o=yWk% ztn_?igWp|@-A!8oE6AA~sBMp|AFP<_>FOCA9yDR|-^V`kvEh;7_SW{U>L}%sbn|T+ z$#Hn2&+CeLsghx4F%RvcI`2gsY}0j zw&rdbxK=)lk59(!5V2Kq2ub!cjEzl5sU*DOz;bYaYPD0*l!?`7y(?E9RzU1G)$?%) zyH1ySzS86s2Ud&&1drGgJR9Tr5%S1odeD}&7vxqYty3&VAFpuUBRLR8 za_L9$m2cf@+Hp>(RP>>r!5d$-+Lh&w7tte~MJ*G_(3|30vItSrR5t5CrN2#>t+nZKBN6Q!Z}<5u z>)H!e(6cvWm0EFN9vqlz=@=fF=;>*9nWH7I(7@#^eG&V4jPlWWwQC1ex$l8xJYGpud4 z2Wp&Y!k;Hmn_(tuH*FT?)a>+`wnvt@xpFr{(h9s<#%WuFdYa8n1qyVWdW%aKYDPl? zpo&x+SXvH*nAL-LjNC09jy=S&vJ!}39D-{CtAj7{Z=y;qnJ7#Vi_uU!R+ouOSmGiH zt+L(SIY7ot#zMkdio?PccP4DJO`n>@b<4S;Tt48?^R8kDJzp~#wj6VXq2jQPXf8UJ-#b2YZao(*i%G9zpS}Mq24j_HAsh&6 zwP`X|eoopg)6v@F4oCm3j0!_Tv0ulBhr@)OR_HV$7gE2wA8ftH%&%t4uOH?|$2JdD zWUPhc+w0KX)x`xnQx2E55=G{Vo*x|(FOHL?x0{!i<_g>0j05DZ9Oi6s%#ybv6>m)# zm!YaKvu*e(bTsjqdcJn_Z5fKLP%e}McS~ioQO~z_ba$?Vo?j5#H(4vYiv~!WIqZQ= za?PW>&07WeHrL#I)^Q&A5+p5?ZPAinv1wbJvT$fJ6zE+v-n_Y50ahHCg9FXuw7ByI zF^0Eyb(9NB8kw5G8i|XGG@}w1Oxwu(&`?~g*TC5vZzNWciUUi<0i!tge_ScX^E%Z+ z^3B)mQD;(S5oMU)D3D84E<6pHA07_(oVB(kL|&n)I4~a$5WJkW@lz1{oJUE_$b2wt z9wr349>j&Zo*xo#*f!1aI(YTB;=qz|V56RobMi&cw|958Z~Q*z^6B{{t3!oou^d?T zXy^QlRLyed>2SP>48e5(#7at?JeWS6hZqUOVdy~pVJ<>O_Ad5bte=AE(3uf50V zsESxi<)YsGS^4k>9*ENmA~xegr4tio9qrnzpQ$GX=^g`vP)A*?un11V!BQ6%4Nsv(xk$DGje zm7ZTd{#Kah#{t^DA@G@FIp%DQ4%LwPO3%-)eJZG>Wkvs0yEWbU7Mb5{@#W8LpGN&)1T4&c4mB`YkkX&e;in+KWOA4sjwmMXna4l}b@9yMfV+NSGTHX_=aE9R_b) zT#ZqxFs;xeBkJW~^W>E4>c>Y$ee4UW#FI5j{v=N_i#;LD{P7B8rU2;da5KRKug2uW zScm)Xry|AAMv4!Y6~ZRGP3H%;%cvko1SDm3vM!M4Crtr}XZG>25qV+oPl|t8#LTBG zkY~M;PDNxyx*|NYcH&utXC?xZsL^EslOeNVSsnQW# zL)%u)BsRlm+ch{Tf(&>v-S?&&aS>!lPht{Dl9#0<{YgVgAeaC-$Bh2QV={+TGRR86B+?+N)eiSRszfi=W@UxCI?VtWE`nd zs9&f4nl+yEBmiVGO(awN+&pa{;e;QUt2|xPdAoAb}|{gS;X+9016S2`S#t z;j-kbX~e)LNR&kcHnxzbpdnz+x6^Vpegc3Nujif#FXX2>Y1c})^ znX+NS28lgAJ&V8(GyDQniV%Tnp?KzkPf{C-MiJs!BTt&h;ZYKnXHFWGf-NiSl`OzK zSFKtF%qtYSUl`d9Qpu_8&T zbQnO&2w1u}NXSu}Pw+`381+q@4N9g(3>&Hgj{qJLkwoZcqRQetlPV0!f&lmR^&w0V zQl!h`C!DII=xJqDKbMIE2FT>L2GSxa655fdXrpY4Y*w#QY_yaV;wl9U!lcYfUP>%5 zc*Hd>NFj4c5j4HLN{1Yz6!HLn${vxBm?@c<#DIrHNcjOEBRo<72r|M9OvKMbtFp7w znTe2OM6O0eTsj&AWf6FStqRfwV2~?F)x?vA%v(Jx4pbbdII!g$pn0e@x+QfET}qGT z;G25STct>+i$tg?5x|}~|4AJ?D0Z4VY;W1Sle5k_=hE$cse+7G)iihH2TW zpY!AZPGTTdYcl-A5(U{&1;2s_jEoWiY)4_6o3?3Ge8gFORU2R^qfql?BF=gx&iIpv z?+fKMoN{S(m?81B9A%QeP&{+N_jJXA)6j;2?vBp(me#KJkU3Io)=x4&9!93He!NEaz0^Mu@0L2Yq z66vP^Q0+Vsrganzr&@bTkuC-P(gWkJTiF$nb@x`eSshP5tFQtb&=y)sqX^kL8cVlQ zbm~NH0YKwQ*HWJ1S{bmm)2yC^YA#Zz#wYZh(XrvlshVZ5X3d(+n*t*v4B2-QxfH}m zOq?k{iUuP^t_*;c3le!rSc-9Gr){J|0vL=$*;5D;?X;&V!`4707x*MBGkPn#CrAZ( zg#fQIi>Hu+Jq>g9v*JL-fr9+^+Ng3W)u;Pmx**KT?e^DDu_m+oKq8e zMTb*UB6F3VuM%NuJoqKbC5wok2=G*#CzvD&<}5TR5tl_UtV{70RSkH#kOYsQ7Epn2 zJhLKF1dxy@LebKplE_XdFK2lG6R<@_15NB~VunmceWgfGp7@!i&w`>#ng<8$!^&+Y z_MR|zV~MPct++ioJ~}=+JT@{EMsH`kg)dLZeLY>?F@4MTnk;dQh=B3bG|Wp9LQX`q zGVvfSS~41MbXay4IC~y^SOeqZgX=etQf~(a1~etFa!*fm2dL7h*7Pmq5`=lwW?KQ- z=B91>65e3=>eZ`rqLK@1*~zo_;<$(u9d)6M)L`;5^r?yLnaa}J7m8;tcxb(%FA{Ca zmV(qP)mAD6l9V$Iz*2~E&Rc-_DK8}@7izsqQe{c2m&i(#QA(E5%!hm>J%dv6Ewu1R zls(aAxl%+VdMX{k(58ySVQ&?bqRqSN}hI zcLDEbaV!r1xW(Pwkl>yK2uTPMoFc`&c%elL#T`ni7pKLw6ev~*uEmQJ0TL330kPxf zyx-Xk=e88?ZTjBZ@^8=Pe4gxYpWWHnnc3OdS$QxQr~Je=1Tt_^p>~-CIlXO($kS4VMETV#h-5+X1X;E$LNe1f5=C+s05ITwy*G}u zLri8k07AEDsV4}YAS-o1PKSzaCnbK7=ROP4N|v#hM7Q>RWF zZ@h7a2CF<$69ctK{C_C?uT59}x7uvQ$+X$b+brDV+oaj-+0v+#dl zl?*RUF~*D;)uTr@yd*tYH8@fBmzPYY<{-{;(+4yXw(4plD=N#JQ7el@w^&B2EHBNj z1wMnyvhup>8a|$;`k2dQJp~!klaU!SX3W}auPrWxm_o+etZK9FGs&S@vbxEd#m}s6 z6cH538V%{PuL7;OBDUOo;;8l4<=v;J2o?QlOOrtrS>Z3ea+tOtx_791##CW_3rG zvRSi6rQhWADr+GMFdNoXB7OUH^(y5p$h4)h;>H3`DlS_W>^Bi3G8NsfO=Z@N^dvRt zRmb*iDM|5c_T;kQKnXxdW^+92Nhu&hOlE_K0V4n90mYaik_{41akd2efdRvo_;2u! zIch_r#g?iz?4fY6$*f&!&sgOYwMVtB;UA&^#$h7M;9G*!2V9ARaKOG#o{9g$_k2vz@)=zc~THoYY~@jU2XLeqJ?$L`+fG> z?ZWfV-EsRJthezh!@5mnC6NGU{P;}{JLJHh|MX`Ytha7`ZA=2O7;c#Uw~h17x4-=m z+}~#Vm!vHBwB-L9OLWvv1T*jT)>{v^GUGjuJMOqkFTHfL%{KFvC|Kgmy?VJ&0;glg zjtA_&_j%`?H+uAFlA!mtIQ5qc)K_LE0rcGo#~=NxU;S#Yz4o$ZxY0%%nSc=vbhdeavvyMjoE3q#cnh>7+wqVHj;El# zSuUlkeV1K!IrNbI&ph+Yo;`aiC{a%EWrK#Cz$ztO3bZAv%M;C^mz^9i`ObH~v+~L- zOKEAEvOp=G5m4kSLx&C>1`ZskplrEb)hP?6pP4vP;Fg;Jh_L~-haY|@mWjYbeh@OM za*`QM^Am)xth6=pf1LuD(!wAS>>w~%0B{5^{9Je4b+_1J3thlZ0b4zZ6JF!KB2vB% zF>(b0&MNNNxpQaFEEpn!f--o@>8DD?^Am8GWPHR$)SEN=nNvI=kc($ovWY_R+?Ko{ zlceRg$o6$1i@g@@xZ{rcqv9az^4+_47lBxo)o$Io@dE13xld&cra9zRk*@>Zn%+u* zRtmII;2)p>#g#`xT8MU{{b)HV$Z7)>BoRz0UWrga^m*PzCQ-A?J z$_&EmEF^48=`3Q55Rr{fQ+^p_Hny@_zxAze5e$-pvv?Rj@xg&(~etTdg)d4$>E0{z+kxX#+&ZF_ui7S*gG_0*wDT9*ma-1cD?()M}GU; z-xAckPunYW%b0v6{MN))3baz7l>*C40s1YhqqNP8LZc7q!mYR7x>KjN-~RTuk2&TT zDYTG8%7+S~jwn5f(UUL9Th_A-U#FTtR!YtxLxxP5GDS|+NwMQ$`|Y=<_aF>fj~+dw zv)sh#I;A+Uh7KM2#1l`bQ7N@#RC96ou>ClNA9&yaVAU=UQ1W;Mg24eOaK1#4TwGaB zdBcP}Qsl31`ic!5xh#9e2;l6ry>mY}@%z)JfArIz{&e;ya{*T{QwAKQV3x@Ir5am* z{+$#E{wA)ivF2*%sg!42XPzS1#B`LxmWYcV3kzO&;f0k}T1iTlL%aZCx7~K@*RS`` z!F|h1ORl~4TBYioez#=jqR6yo2iM9=%j{EAfi@?p?sp6|iLbo!%9zpXh@f3I_i=Q2ziNrQeBqcxY|cIJ;ul|h5h#7KsPKP>6cmlA zAfJJm(&d+5&Vu~KFMe_K(MN2$=|)8A2PdDz;$*XGCgin+?u39AK`a}xYpt~wW0QD4 z^w8u-9(jbwW+g(lvPz}MR$OsKlrdN7)w83vuvWkKz3)i}1Sr7sQ>4BrRxd>qw@?YP zEc55jr@JL)m2L7P|3({a0Owx4`~UKnzx?#mPpK*m$<&rpfF44@fo41>g^f2}cgW!W zC!KVXMDQuiL4*1YA3j_yU$=x1+bEj~__q!?fN2|xb*fg2;&}?nsGT!sj)vrkfvzP^ z@85OTT|4cxowkG)NRGGsgxKMSA3l2YdT+fo{@ioVt^4c#2Y74vzn}n)r+|-S zpaoU_8XnN`xVXUq9B# z--2yTX{A6b1zIWa4^w~!qj@MXDwmRMu>t5(t|$hT6k5?>YP{wPV`<1qRpuh}l8rgW z;spy9d?gOlX4aesAH44iFZ}ua_up3|XhQ}KSZD23$Bi3jYYbDz9)$JQTj&1!AEXsy zQdd-D#jj(>Dl@lhuDQlfl?ssYRz-PqFcm!g^b;pfewxcZn-**j`d_yD?)d}NolD6N zhm4*SdA8kl+d+f+o_p>^ufP5}d;(@j&K|b_06+jqL_t)V9{g<+RGmhg*i7`ZpZ)Bj zi!K^4pwHQ7pS|A!2g&S}ws?YI;9!zH`|PuS3#2vWf22TW5GI+fn~itw)Fv0HuVZ`$ z@2n|QRajXKo?<3z;E+QOF>AJJVDF0+Q=AgvYn7RWyZPo53ESh3Kc4w(Zmyt33Cvn! z%{7>&2KdR7AD=mMrm6|jfC0TvJn{Q?+;PuMH{SBa(7bFXnt`4~sS>XX@+XG=$M$?P zGW_q%RhFkMc}Gx@126c2vS_ET>K^DWQdqx;9X4V7Sm!|&F0T3RcaK_HQ&&(}+*DBf z@~dyCXwwOsS;E2q_r$WqHY~FTZf(^*8Lb*KTbpi#8gy!ELwQR#{q-#H^VU zqO7zMJS+31CB;s9p}@wYHz;l{nD^P@n{U36FUUQYJ-T(KM*H>YJz&6qo;|x;6RU83 z#^>Fj%0MhE=+wUK;DZmMdf)(g3K@OeNC`dn@py8L*&Q)-=l~eL{>Gb2tCy5l#2Q5? zyRwSnf}#yJSX-Ac+w4DhNS7WxKV7uAh7ZFDw6gMATfiHeDlEH6DJ&?hC|_E=c=3{j zcinyGE<0~$>C7=aW;D!e>uQkT%+pU}i8dAl{eN@KZ}f|oUww;0RJA-mzvQBB-MU=# z^NXE5DlRK#BNzG(NBWXp-#$IoU1#K)YhEzxquK1*+WNGSGVQ-}_g}}3opG&gRq4-u zd@-~gd(^JPxPmS{I_tSBtvu|QKm%t zRr(4-4ewNAnkJ!4<|Y|#43|WSLtx2=MXuT?7$ikrPkyh6BsWTZW2E>gb3;?~)7YfYPLt4UPJUjjzSG-g^D`v7_6!uWDCip9GAO6QQ8#(8CVfV1spTxZ#$2?u`*$ zmnXNjCT_juq~Rk54<9^Ok0jXGT36ff=JcsEXUtx(@bdzv!y0S5w69uY^;K$X>RidX zWJz^pMH~IysYl~0+ErC>`iy_&m6vMk3tX*ZL0ca&3SV&EIh{Jh5i;FWM~}Xmx{qg2 zys2P|aiczb=e7GDeI|se$)5Z05yIi@(@&viY8t4i@+MLneJWP)HlH|Q(4axi=b`)x zE3I76==@&st~>2uj{tx$-+tR|1`i&nI@}q#(uxvac>dWJo_@STWy~bockTGCop+fq zVdGnGzne}-g#xAj^xzO+S=o{$i`rDCuS%qOKAMM=rhq>6NScE5X6hpa9PvLX@|3Y9 z;-|8HN{l?ojBEDY%FvtbARvH)lX`Bz z$uJXD5?PcIJ?3fQf{1CGc3h{08>D;N^D#K4X_1qtS z@WBV@5xnrltt3wJII#w1I>cVE+R7_*?bt5MXZJ203mcpJcJI8}iYrY1% zWZoRW$yHTl?Dtt~tu;*BR1{L4 zA3k`sm5*eol$A#}&T2Lktmd%k>l(|;SOotJtVtko>7b+dQr+&QyY|W3JJcEqNMpz<7E^p7LUr{Ujvi&!;E3fdx7^|qFluVph!wEs z?YF1gbI)CAYp^>P3YhUg3C3kZc}>33EM4jj8K6K_y95Y)Ggkrr`O`N23+W1qO9~re zx)QsPL$g#?+Wv2s_S);c5@f>z{QmI6x&8b1|K!uogcz`LLY0XLbIACqlyn6{*Q69>jYP6>5;zWK@g0V=gBAZVV>Yzy zYR4V7ArQ7*wN&RykfKr(HVP|zV*~p28!%`f{d@cEw>uiN?Y7%@?b?-AN_QxPacO|| z_ws9ROq)90nwYf?8!s0u_{_})V1mGVlqAoWf6ZwN>)qH9$Hppm+G!`~39xlU&{Gp2 zBXh@g9adRom9}lmKlotQspnjX&MgaonW}y+Nw@art!oYSVRJn6&_kPVzIn&?70^(1 zCJt?ii6GOe3AjPJ;Mc$YHU6TlYzm_Bg885F1(rB<8YWAg@iwC^lb3tX5_WJs8E5OR zvGU--L+`r#Zg)3eV=w}g=H{&@O?u~@cgzpf>q=11+QjSJ#(%%3hT{b>b3W>z@9f7| zb8#2SacM}O{n5cxfqH;G@On`9%|xJN7rRU@$Y{3yKAns#;dQqcJU=Y z4mKr=6s1k=2x_`irj)c32C}#EDkBN-^!MIF%HKpD^>o8E?Gt#tA2!07AR=ZSjZz5Cn5JrR+-Q3h_C1XtZnJp+oyB3h~?D-g(AH zpYV(VsA5`I)Qb#^Q z0M%t}4GWAqJ$rW55k`%&u(y8p4rNnA&Ts9wHFx;E_dghA{^J8VH-4XV(upGBP)oPM z;1NMWauHToQAsIZKADly*c?~dO2;)pDM5PHLefz*vZX=9tA?gD159+zr9^3`IyYT? zRRBCg1|-zl7n2I0zAF3Ire%GrxEw%v0xRNc6i_8LD$1|&PftIkduHTw+{X6YC{M)$ zh#V>86q!Xb&N-4X&ub{rkliUkzx!yHr?s>8~$q*RJa4 zKl^!-@aVZzzglD-IB?)P>#V-&su$bl5Q>`M!l$fM^U=Xb2Y#D26%-3NrDfsfh`ZCu z%e!~)Ow!j_W8_gs9d-VN7X{jBWkwZry9@4@pE>_QC1U7I$_)!JPSAM!W6wI{bQU;^ zMY?PMa~{G;TI?P36P=YM4~)!V!v_8S_kXzQrki9Y(j59S&{VkNivkk4n!0r9}7TMQSSrwBFs3+BsE+A@(`4VQs)8^~cp95l>Hf;wC7`QOD&z9bB z(@j74!LjVX9e3K!!7L)k&FUVb`hxnBf?}GH{4q&4-FzZBnKS=0ZST;jqm>Qye*XEV zOyNa~7A{`2=r>ngt)5$NxsCfF30ZS#c^UVRrGP{P*K)*>A&Vyps@M97Flo|uUAlCh zG2>%hWt(lc;)}W_ZBZb*^4J5`rj0XfO_yDE*{2KURaTTYxXd$6v9v{mYI9jG#t*zDxxV;TvY1*P}B()ry(2*NFXh_-+udG z&fD)!Gof04-StMUIuc)Adu_mrFTVng{A4C;)#M?&`r?Z&r1f+SGn|)Se%ZA#Q>MPh z2p~2G9k`z=NQAR(_RJVuL5Qor7<|deilG2vG?bi9eEEeJn+xh2YwM`ittL(C)2B~1 z8cK@8Q>&2X=&%~7$5p3gy6{c#K@?Ept{sgFY=ANmDk=$UJ~T{0v0BtV=i}L=3qZA3 z*M26ORv5n_z&J$M?B4N{K%rjVoC%c9r5k898CJa3M}A6*AAkIDg1W+x0S?_wojM(a zY15|t_{TqXG3t#sUN>vjC%^g4Z*&tlklxi-ANkQov+Tx!{HRf*w%KNDG&%94AHqbX zW_=>9AydG)*%2d#8f0h9oNWLexzb8ThPiV;<38v&V1OHdd9~~~$osNbW%xy?&>4e7 zFwWEHo+DT+WXRH!54Fe=wYR1%DLw8MPxHGkaUh0@q?AGvi4z!46=iY#Qtto$r&7>> z03dMlQ~vnbSZ|+&Nn^HDw8dLn(T#?>kBa<^WhdjHO@aMGdOSn90VxoLD{Y8I$$GF{51DVD|>C*nA2LB39C9X z+j5bDua71y{_A0(E#szat^(CWi`}AZ(!&K-aWiM7l%G2^z7 z2tr0!Tm#h@>r>q;3loN-g;}s`yW6|y5Yu2Dzy+u z)TpRxo8&W;Ls|mJg<79qK>@=w+6s7qXju%<)0V5Pw%Tmr!nmKTwtCrzqcD`@9D3-X z@@H7&p-mg#Z7y(Z$~wWEdGpDJ#1Mm;CD=`|2-w5~lFi@44?nD|Y|dHa5!{AJt9&MM zojP_V>x_B9A|6BK=%bG=E-hoaJp9OGih$G724Vx@zes3#^RJKm^QLY1kpmqO3y{fc zh)js3Ki~vbxv+K5J@*Wwv!>A$LWCVzmbZdfkt-{Abi~Qg;lqdQzyJQ1UwSF#8FRu8 z3}#g5x}YKVn{U2((#dD&qMy!RKrGY}-K?qE*5~bZoK#oeaN22S&_|UORjaSQ`k(&v z;o z)tZ2+-h#j?4Z@ps? zraoYHgeU~9PVikjL!uHJ$rU@{CCbL3mAFajW|v~ zn;L3NV({+31NXti%P+s?fj>T|)GasN%xy7px z3IgUpLXB@|78g^snHOd(VtSK8-Za2 zNbs{m#||n5C(WR0wZOh*DpraHDy>qls%yjF97Ib!mo2JOl3tMIOnbpX?Qq@M0vbJ( zU@HP*zpU{;HjXrdo=6@n zvMBzAi_e??3KS8Tg5pvEY=QG%nf{KLf^wg(&BBHJ&lb^ zmMpcEgCXaZGK&BD8#(tieHnS?|kQQ)&lL9rNZ(oU&9qwTw$fI#O_$3DNUHu z`Sbd^rInTCJ^`@fw{{>EbmtFJXliUSArIj!C^+YwGx>Ab9a*)wf8o+ge;zDNmbn}z z9Usm9goVjVNV;->aL7qXIJUlN;jgTd{|n?;;_>&_pebf*UMJDF(TJ10zBcY~@7=Rk zx}di3+N-ZK=|Wi+(&D9YF$M~|fYE<<+;;1+#~w9q+=kPpyl3-aVX1FV7rVZWDDdS2 zh;t1MjqklXRacjY_dd6${;r)nj~hQ$~rHCfX%9*{(i#nVRg9i^@Fn=L8 zzXQQiP@X)=@6a%4_uO+|o)4>$m+|r|uOcvmh74AhIa07vy-l%}8;9!}8{J_;sPON= z{rCT5?p%GRZJTzaMb9#adFGkt7~C@Rc%65_g;!m5)#Fb-fy=RksYKt4!Br_wO(2uvdPj7< zw0YQfS|)Bb(Y}{QAAchHNNFhzqYJ2oNP}san(IF{EhkdzehET&L!x&_hYLT3{E+u# zJP=feKvV}6C-2uU&UDIH@ zv?eZYCGM>O1=xc_h7J4d^Xl7fyTi@UQs^}QXIGB*x88dDCgUfd{DTioCY&;05Ei#| z1aYE4mU21)@H3c~^mBYRiYwQ_TE=Lzm8IxE27WAVp}zq=#e*f*D_Y8eEaYr@K}-I> zCxX$6nApIJ11?LcB{dNTgj|p2t+>w;#b*h5pv~6Ixaz}`MaaF%1|r)yP>2btjnHWY zo{4NANwchs3Gf+bTDr+0>)7=WOCKmHohz-TW-0oxymLGMqEQGF6I5^V0-&;nIo%VQ zv~wtsL;+EtV!f>>1|R{3`i@oz(9pAxG+LA@k-^ZVT}}1X8VHC+;VH=CT0{LKgc)Kq zA(UL6?|HR+bj}oLec}S*JCW{E5Lc`RgBluL&wyiNMr|;0!g%Mz)?IszpIKUs>%=b8_6#W0Rc4WL=Pwz3p<%l zuJZPK8ysvwCpX4Ky{4+FTz=?fKeB`M z*Gr@1V^2Q8r0m(F7dNyU(Ui){#N7e18C&gsVkOGl8orJKSpy(`B3+m(7#ICK&ie%4 z!(=Utjf->?Akr0~J*b_I?c>U^R4`^xG?=l{PiqIEd9Jy;FRpg)e`STEAYuKz z^Y)t{lYtGbzZDex`qHca{OW7oP!z)i*HwGtv4h!vq_215f5nwPRh5UzL^|dg#GS!Pj4Z`wxHkL+T{y5~Q-&T!Dho z<(eAZ{rJR_&sY{X=%D@j_3LxPEw{P*t+LF{C3`=jLz=6Q27FaYN4HOj+Ok=Bx81(o zp+lR6i>u8~LIET#W96!}w0*XpBoY^J$PfrimoDLVscDE+azYRYmy~|=(MND2e1J<- z3uTcU`BAk*UjxQ?^E&YTG%o@wlx9Jk3Lu4UP;jedF*gdxW8pOl_rkMGdpiU~smOl-vWZISl1vk2%^w!Amar1r3-- zZWo8pbSIv8;&$6^1uaJWtFOMvu!bbCYEe*N?Ep*jYK25`r_MGVzlno7K9UHZ(Hm^g zr%(4`E3U+**9X+7INhkfopHt)m?c=J?%1(|)gicz7`_7ixW#4@b1mMo1E4AbI4dN2 zcwvDHW6nPNYzHV%#w^bHWzF1Xn=SphWP%NlzMyDVO}I}^KmAmz6a-6eAGgWq*|R^n z>z=#8|Mv?)oa8vS&THpulGtb^sY86Wptuc+AAUHyU;kda@4ox9&%Z#Djk94UHpFM{ zY#E<5>tkzKy?b@HD8x_UHVqS}Bv&Cqu1sv--VwxD!&IGt8kb4M?Af!eq>bHp19LX& zOrrVNiYtw<(f6IV-X*({ zs11matD?zpb-F~sEC9AiNn{g*`RkBRUAqqL^+(NtttyT@@<@49nzw+u-(|b)wyUYD z)np24yY04q>ZxaKNu4@%x-LLb9CFBaMvPd|KI=t`s*x1qAi#qQrum8*TLV%I9@OXN zo9+lHN}FerfW;Uu;-DrTJ^l341JlvvOfDSs7T^6OuHso0qixQRHD~5^lRbn#sP$QeT^1}YtvJt_l$%9^u*nF*DPt2#GdL9hH&W2Pa*bWcAs z*j$CoQUuVrPW)6w07-MXsI;+BzZP+iYepto(U=Z_CprV3JH98Za;2&O2ejBTlLjNN zKn1xqEH4ERALT16+W@gaPQGz#@=7pBD$C<@Sm?^C;jwz|xfhX|gKz58X_Od7*u6}aGBDa^ zBED(qpi+P(6|rSqfB^AU1#<}4E}c4$8#m4lAm#+fQoNFF+O%noK=aP=LHFz3NAklD zKMYiC^iTa=b##cag9yQ&UQpJDzC0E8$`u2ojzJ>>pPEF(G0F&8RzcH9GYfSM88YO! zV~^()?$f8wuYY|R=Y=LXu?K(s55j~Ugx2tN6d)V8AjlAMlsq!YSwn0JeTtbXU{A`B zd4WrI_fS@mIql7HQi)DdgecN@^4B?_oTh)l_l6pbv($#WT>bV;S}C!JF<|Im*6Djw zXFUG+<7s2OJxBG1VDbw%;UU0~3B%Lpoe%1EE*E`)*UzQGq3Y{8iX#*dsb>!E6;_Jim)LsdB)vX6YhgG4Im_db6LY zlgFngU6~k0M3MVUiWe<0XRD}9-pqKgGLHVT!9pReW>~( zN^ISwuws^zbP!V&+Jb3IHl4*&{y6L>&p`(rpy6kqeePRt#U-3tA-zM#_EV-zF`w+; zuQxgs7ZtLhDNwa25|cu-Gha&cWU_9`39OcCg%1ym8@DkGKm2f3w{Bg*?AyP8k6wK~ ze4px%AVp?Ybsh$c5UeSeAMRjx>WU+nU0GF0qu54-ytsbiR-!dfXrjgiY zr=ms*hzMY)t$^jF6|Tu4b+!taocHd%1NVegAP$Zs1|g_%^tMm;2k(Cfi+lGPXR$(A zQ;{-5Xn59Rohg5+^36Bj{$%bPH*n}pg(AWhpy`aCf4+o^RG!mLJIzJRk3RNftipW}$e4XEmt1o3xJ@>6HtDRh&cP|& zim1o}L-#PNG0g9D$~4<+#~t^*I>%p&3Wg5pcksanhlmyy9CvJ-TxGY0(U5eQA)8oI z!fLOois_siXaP58%c7_XVhN6euZ#>zCkE-_Quj(_v1#9~!xDFCmMt?Qz)zhljOkD* zaiG7vraBf7oHg=vA$7ZU?SJ{J%l6xEzsFFqiYYHP0HA$%<7EkgEPjFUpiF-EHV=(haWlqY%5QzTduJU7k*iB+_53EZ0Ul@ zKqG}vCSZ9hh+8j;XWBQRV9N9NKCH75C-$d;1kyM{s0fTEc!Hv(f(Vh2C%R`IT*|}8 zr{Qq$s-dy2q}i3MVUiMWts_4Pc`MJce8C0+C(ewS5SmtnnG)3*Mk~zOmc~Krz{5Zj zlnDb!PP*SS6CpKs8TG_v08lM40;T}xTyK<3Twq~|%M)!#2C-UTsP`GQP%OxlCUrdP zj-;wKIMwVz;MnFGIa4XQ6pTxR5_u)I_KP6h-xtEu`9;VQYo^2pN+fW{h0iOkG#t;_ zHkSHjAb5DXq!F0Hm}0qrL>%%PkJ+%Qs*D@m&!HoRJB>DJ%dHFn`K=#SGC5S? zfgzb1l66a_M(gt{DS*q^fn45Z6^&?ql0$@@K7D$`(>->WHF)p5c@`HVOj35R@c$8EwU-gx!$1F3;e>gDqh#Uic|RW1y9thX(I~rFYyE#^7kvCO&Fu z)k5RwsTk*CBG%NcOV{z6Y~rlA0nt%%ix^Jg1#rV~-bv`z^>i>@rB zb94$aY)YxRnwq?gu$gJ-GE6%Ovp6ckDq^zxGDg=f9bGqQZ;pO);f3elefJ-TxV}NC zks=x!BYGIDbZdCUQn>1>t7xv8rAy%dlOJE~l+=0WU7+t}BS|gFo__idlbMBDVO0w* zuH;1(nK*I0ry4Xos2cviup1KnGOg zqQ#i*CP_^BcXiGpf0j4oVta8-p%sFYA`*xQp5`m=MA~JS*!9}CchBdZ3mHSes*3WJ zS6m4>-+udT1e`c=+`xf-Ep2_iXc1_FyLP&D?Q8;$Wkz&)TIzCjq73||21`r_8Ig^< zzy9@=habNGs8MU1Y@c<;Y0%SUFphKAB{7z(1 zxZws4`P?*Xxu>0W?x6ky=FFWn|C2czZa8Yk9kzqdS!bR*d)}P7+QyG>?DawTAQ~CA(xqAyg9#FC zv(=W+cIH7&5~jU`)iV%IZs6EI=_YtaXu7+F9qhxk{rmU7@WPAUe*LvW4?XCUPv&26 z!3EmJCUAzt=Iyi3J%=zNluwPr!C0bpQ@GqU^g+cxocWO=Iv}uL7!0}2|J)~4gCm$o zTl$na9tkKJglcZ)dQbW-&aFv7H=Gj3EWC5zO(3O=!gt?&S40L+LDw++Bm4U6uER^E zBjEVZ;Un;6=8RdEslSfmST@LEh<^R3Al|NN)21z{UbZgrbw$21UG3_EBsp|DjzjQV zS}=#9(>oB;E^jr&!E8f`3__L@{$moW`35X&=CrhJ3)-k%`py@mXbwF4^rab4hECQ- z4HOraSg(E-KYdemZLt1mEcT%wf^qy0P8c+3;Bm(ubLe4*v$9O> z+z)ZtWmoW`D3$xKy*Zmr+{i6$3l@CZrBg@M5?AAt%@Od?BI2MU>lYBnjtnUxuF=|d zhix8s;31$$rKZX68N*_dBG(mwLsVzXnEl(|{uWIZ%$o=2J@(pbz4g}m!@UpC(jb%4 z_~=Vf(ZxTxglTl>q2J97_vC)iQ*7q-4`lHqq%lx>+Zw)(0*IMkAyoFSAu_e_zyp&h zG4eyGxNnFemSwT=Ih@4{KhNxwPUDd@`h-T}UkF>YEY^($Wo`c2a?8!8PWyl@vH2Dg zu^ZD_lC<3GufM|}0fCK+U+vo1>210Z1yjVFB9>d!OZ+^=MIfwd8H5((qs%uc{7a^7 zK>(yNfMvqDNMVaDCVuwmLW-Wzufyk%JA{5A#a~2{48(BZF1YGi{*~3%bo)iY;6eTT zb?x5$s;jO^FGCH5K&0Ix2Of0D;6Vd(`id*8WZ1(bJ)bn_$?_OeVM3l@)vjH95RjYR zbPfa_NErlg?ckzWw%dLiaVcJc;As&SG(%BEMMS^zCBIF{^mE=Z#`+NF5NmqK%&_gQ`=e!nInikY+&szlOh}x;VOcB zamP-bY*U;$YnB;Q(!T@|ne1_MbK~U&X%`$r6Al!dg~YL&Y-lf{y$U9ob|$U!=PgiO08d{e!$UlxzSmxB9Tf$& zqt&6EtroG)5y$Ri`FUcJ3jOy~qlh1LCKYL)fcD}wYDo7qMj;FGGI~%5Ur4W+jFe0? z=c!C@-3&=R1_28SScK2N@B*2P1-0fTYu5^zs@UZMI2CEN%6Z&OaJ2|n=4a;VlTST9 ze!?azju`AZCg~e)7>>^;pL}xawCQ+lo`Y+{hYwk}aLIzXY{Gfu!E@0P7osjY;GhFL zc8Gm`u5cKmM)3UMUby|-<`thr6?4)Mi~B) zbihd~0J-X_t2NF5?5!r$r`^SYdO`H@M6uYYnMEk{PetUk0ggxsx3o{M-d@d`HB+TZnbYpM z&)y&}UhGoVinZ2S%~8W!Zo6Gy`*==VJCsCM4gcu@t#E{T!I2oyb$7(E28D$_zu;!X z7+J%H1Ba* z@ZbHh>(bf13oEQJM16T@`x$4R&$|acqi5*gp_<>fZ;!=`Ywc68pQ2s6Z6Lz{ zy8E8Ec-?@o)ub)<*nJnZgYeQzFMR*|NB8K_)j%M4JpJ^av}>7(UtDy|_m1w_GnR#4 zd+n_qx985@7BZR$LpxB+d#$%4l!BBEj^LU_mE(^+rhk9?)`F_KzvD=E-1&Qlf{aBr z*XV#JoN%n~V#y%Pne!+Z4mGOS zJ#rwQch1>;`}TBG2rDA%1i*nk_0%6IsP~f&@&WV9F8gJq#20-h$lwpo5C$-cB;<{c z>hj9y#w{X0%_2{7E5xBV!B8SULG(0d)639DU{}CDQPD}h5L6)xC#O*Q)%y7FD1aR# z2gMqbP>mfscEW@S9Q|B8Loqo&S@I!4fO<2HKfrB_k8ddU*QRkq0x@q5P{WAJ$M&3EjI zkw5x&b0d51s3Q&s!7POZw&@m|@36y;-v0EbKY#hvKZB`D5)@a}>&xH+NJqGYu-ql$ zg+)MdL*|Zcus`akBlKjRa)QFn1J<>(d+oLRYp=a&U$vif3g!_MbDpJ(7E>a`0$3fM z8OqM{U2bA==bd-67b5)-o zdEmbLci3+G7_FL`2=^LmtYewBv?7kl8mo!7B4&nE)o#1(Mxm6YOaF%q8|vHh9Xbs= z<&=|8KmBxhV4KP7Sy>vZe0H}xxug{1V8+bZ)?{p1G}3cXSdQCz%dL#ecHFGB)~ai) zvFhQ6AN=mr_kHtv`Umg(TAJG|HBEEAGN{Xd?oa{(Mh`4>MPBU9uJ~GOuD!#? ziyS+SX{7tWW&aNfLH`)@VnLrOG>Bq>;GmbMw>pAX0|xY4_~~cfE?wHZV8O!no!YOk z!tj?~c_qX<%`2=bC`grAzzji+W0Ubs3yjjIKp;z4N%93f!bKoP<EDk( zo)HRaafna@;%bzRgkEp=~=n1qwF@4j#g+bP|lW)!l$9a#4+Re3Sut?JY;w zFD)-F;bXH{Lfap4#G#wK^X{*HdD*~HP>8Y z=n5k)z4UV09b}a8v}Da(FwQTS8{HNJEndT6*P`S33Lp^Pm5m$H!*Q^hJ$E>Vo0olZorEzwV-?)l|ywZu^}n zt_3<^ci(+yf1iF{Z3X*}4?hx>wT8c-K-@<0KUwYgVoH3_LHkh%*WYlP4PXFBF{~VY z^kG+Cc`fr4TX}Z(-~Rx2d$y@E(jVjs+dJ?4!_!YcYiVewU3Tu*x4Yw@-cruYg7V5Z zY_`un`%Id&>1UrUG5vevt+%ZpF%ec=aj3;)-x73$T}5j5)FVhjM!Y2@i;Z;BBEvDq zo^;MRXUpXNaqMP0x;@A?A-C+>N&EfpfB*8!FP%UCQ>)WDAp6yJVgkv@)wy#Ao)Jsa z%!})qo(iw)<3KvUlE@YJq$% z#aeJUC5jgp>pouT9a<6X3eRt>HyYvw4jedo^k`tC;Z3pToHrt6Rj&vM2SlmXu)GvN zZF-E2O*YURznBMrm?X0X^>m!#am5S7@7Hg8Oy_Hp=4WOigWus<+JjEUcRY>D{8D~b zfDRhi_ks(5?Djj8Had-CkNmv<;RjbDRt}k0YqI7h~7^>4|GsRR*bnr~bl}Z$$LE2Tdu}j3r znzMoLtk;AI8@a%r>LD4lfHQc|&;+A?yY`hMS6$_U88hW%?vX=lXzpb!E00|(CMw!! zMb3~sW5#R_1I1O^=&Vf=YaU`(Th5$0t2UkTipg9Y^$vG3!4gPVU2Q#qe(}Xc)(z+# zW1h7LGuALZU5--D?u}~_#*G_mr?}&CS6y}OqmMnpgr$Xs4;$>_1S>FxRfD=d!1!+8 z&e}r3@F4^F#@4G}-^y5ZZNWbK>>D`!MObE};G+`@ahGdt+QjNSL(mghII4~DCbxKM z#_QV#g9i_B0u?Eol-6*8iJys#*&v~tVVa4rA*$kA_m&Z32impQ-@r;hpLpfgmxhL4 z{rqPzXLZe(G1CTA9KpfhX7hiR1I+9dtd@LXE&ZKyZIk~CkSa8-WrsHxB= zQ}j)Ocj1MX(84`>^%^v!{{#2^G4+eM_5dTc+G?xU&UtO(rkm}#`)>9s*n&&9S~2L+ zqx<7eK7H)5$NNcad|gdl@b?5$zbLOLg_}ihM!PY0&L{I$T5z#M05j|XA zG#;0hR|d8Xbv$_k`}aHNtTSiMS%4tkhZaZyZvH1(p%_viy0F#3fN}we#ltq0F|IGF z|NMz3o)|OAQpqUP`()1SlTSKnI0OqHZzx)ZlUP+;o^N(iC zobv9Jl~<097!q;AV&BEW? z?@VWZaJ^Nw38`cI5=En)F1C2dA~m`$_30;`JYe7bI(BU9B&Pw?229e<*RXKmlJ;%e za8vkjF!yEB#!d6)%su_|lZOoH&&BDpG^Dz^w&vA8zqbAcYiru8e|`%Q0&IQ#n{U76 zGohC5_uhA(S6+M7+qUIxk!!bIcQI#s_SqLreS<6o1-d*#dCxs}-ENz$A9>^vTcC~J zl!@h@sqei<&v)zAamO9Ex0=WOD!*lCVBdQ4o!PTKab*`pqzAft01dru4PQ@zJQRPK zN_1-5wpIM#l&Z~XgaliR)P(iY%dWQaw)*NTkDD;T@OD44}4@PA1 zCaxsvxZ_SVWXzg5gS}zo^~z3k*AuL{_Ug6uO=q2Xww(wJErROWuy*a*-gNy9Y>YUz zSX^vn%kY%^V@(BR(P0f7f>B0K@l-`N_98c1Eq$xaD^1|+6B#pRj6LlPBEf*d!nyJ0 zTVOJO{=!b39H)=*D=v^USLA_9>Y5Qkk*gXsG~w9RXqbE2$g|q2tLMv6P21$R+9o}B zReh6$w_X|bB^miUeQ1`;>#ukWQL^Mc~e$i$@1KCtIe@H1U}te z$4d`D@S;=qGfB#IJ{z|hXDwkL~ zHxw;de^gHVu|8gSI;jU*G|4mK0lTl>eyak{c!17QoJvv@- z$-sdFxkU|WX5Q8WY}`^XvZWP&Fm+(?mBlANy$v)X!!m~rI1)XDEJNPXWI4a$snQUy z7SVLJ7R#kfpFVxn)mCzX;+}i%H8w9zi&0q-Xq~dqkZt!p_YgVjoO3`(yH3IemGa6f zulcfyX`5|qFpT_Z@o>Vp(J(d9GNO|(pPpmlkS%5}MNN!fCB@ZnDYP&Yip5ec!#Y<-94Da2;A~f&8Bk$wL(GS6C>hPMaH- z*7y>)yAw0lWEi>9%4EhYOWc@eK;3xUMz%Adsvd+XRTY)<=gvhygB*4sV@PaW4Am>H zFr4y~GxdvD&7*d+tqGJvL747x4y1nk@y8Xkr6hBi0ZI?bX?=M7_>K8HoF4#?U|4|i zR%U#pnAHdkIir^Nj6@x|g)lkcp>xOSAx9qW_DiP5DW{y>seRliHFL&CI#KtYy)Hce z%*BhBeD{bW_>{F*)e5?1$7K_KI+*7_ez=`>*`-6rN|U|Oqt_cXYCYKI?bb0NYq|cU ziDi7={)f06GJGcip{EHjMr#Q&=-G_9KoAoU*We<)xR8I_k(-vuE}1 z-xrKO|M?9|oE9IpO-J>zcuK$Y(koo0!7`d0cEzb#K+IsRrwto6 zSi2s5{4p?PR?t2%&QP~az&6CbBz8KnY}Q?8jf!raY$Tyc_^i1h91w!1SK6+w+_eqv zoD_zawbx$T%uS2JN>2NhGl^XMd(lM~!AfeUd!08fE9NYQ1s+G>(L3riL)QlwwMzP{NzaPSb50YEfDPVlQLV_O7ilt_AYD^Z#j zK{ZFK#3LZ!l&8;4VYgR_S3YaJEt+Gxf~2TVpB^gYx>{wGk?fPBk2>^cKQD18&XzWd zF%1o&m#7JKP{ttO^&NNoZtncgtme&`%dVLVh(uRtIFY{1R-3-_&Xk}2{1;iFku-}3 z;9J2XnHeP*s#-jEjpb?XKPm73`LvB6H2(g&Ir@OEi%h7N4LIXRneWNC$;~(18XK&% z3>`i!b5Z}14V9zwG%45)nSH>)RN7T+1j0Aa^gu3@MkZKHTH-8L?>;?$aMB5F+LT>; z?G45ZGC_$nH@ES9YgZV!23`NQux_qsNg?m#R*DzbPw+W(-Ax!5j-@S^#0UhEgqQ8w zw#j?{GE*@fn_&nOO2H_F<$Q{7zx$49n{D5DajYt>hK0Y84l**?)t2P<&9~pRXJ+pF zc}(ZHrkwSe+ze4yb8Jq~BASzhkgpqIA2NK^r4C=m0wa)3`V8tzmc+tHd0FLo=bqoE zch{-YW}2?@?{#T&5{b4ZW@5^{Fg}E_64wkz9gKmR{4DH*$pLJCG6;d}2iopc# zf%z9fW2I2^Fk#LfcGw|c)>qfsZ?>em!5kG;gUUA|rcHF@%6wd*O$KKtwocinY2W7W@Iy}H_&qo-uqc3&mglSdQa+@_)uCMG$0 zs}JaO=+F*sj_4eD#G%Gr)fiL~)oYcNhyCIgml=s+sN)N{3-{{P>}HmMfXO51u1R8J z7l1_S$h3{x@zduJ+O)9^xxz7e)bpuHpiE5_C!(vYva+h`>KZ=(d@3UZ^aj4qU+`(xKelwCyn?12giwa^vN-eXM%E#N23mWYK5Z&V=+vRTk5Y!b)z@1W z#VRXBY6)mbjJy&u!a3qeS_F|$k8zBr{N39dRU>RyG)#4jlpBw{Kt5LZkwO ztolSv+p2c(DJ_nbaPBz;;idsH=aE3W`so0#^RA6un z7T{Mh!pt`RvvyBp%KZO-qBb((7YYv=FktxbK?@g!fDInhA8@sU6{;HfoUv&8Qn zarn@ogGC;BqBq?>@7qlS>nj`@yGM0PoGXQP5wzmx1K#J%1h`+OWBx=;1cCzN8-MM&Tvt6 zSb4+|NA9!FKI^WtrdPlC)#cPB6`7B{sTVXJEYfFB6a>JL2m(GDR{extus0o3@$@#_ zUdy&3$2VKqpb91lDKh1;5p%+X2|Drp_y2J{PK0*t6k)UW?>FeZ>C?oktCtcOJEark zaACMCUavGT>k$B!`|=y7NKsgUS|l^M)$r5LJiAY?9q;27Tl~=3zxAEd1>A4`+M;|0RoJdPc>VxjDmQ z(eeAo9HW-%y6`UPs74)RcM~Rq6#~9G0KIUIw1(xUz@R~cFqkS!q7@P-kOZtTDq|~M zL_CsUgy~6L6F>jsKE*F*3?e1LN<7k&q?0-y3*y(=dNOhTl)D%t5`+cHhsQ;`CPPAP3$897i?O%gN&aCIpP zJreWq!w&97_i(e#HlI6p z-iIH~&_id>|16(AW%3bJW}$uiWB?k()=#a-lEd`Z?_kcm2Vurc-o9b6clhwZR(f*} zwe}7@+2RU{6rzt56+u-xtqbjZPE}`FxVXk}X@#Dp;jLFhUemgEPuIc~6dZE!0q;$n z?y6PWL}X|U%S!Q}!otjbASl1z+K*6H8= z{d?ONW`h8>l9TevxJWEcMVM}thCi;V(vkQYL#SyMuyoBb7e9$fnwdJaVbZINzar|* zwdacHNke%W0*GPQ;eao1WB+OS|7Efmw}KV=CR=S|ZOq&(g1Oe->Q_;7_!M=;RaaTD zrmpGU`|nE&P|Zc@Za1Gt_r+UN0@qF!+kqU64^IrzBN;-Ye%EfDPd)92pUj$V6tQa` zd-6WRigNa74Dd3$kx{AOeOet-BS`{*lz6&`OhgLATxK8+&yc_5ahIr|YCw8_>K+GzA02(V%}K- zpaU}+;*%5%S|5Y0YS-50vA{4!+;9LuNuyH3eH=b+Oz}05kmLf!2V=DAt+(DGg^IVW zD0k!Sb=Uniizy6OTYc5hqt^%IjAb7xXex7ier+x5VZHS(C#zRob(L-wAKH$u55$U% z^}F0;rM?JcI*b+nja+FZr}SxIj#c+kV2WnyAn2pIGp8CM7c;&<)R*#{Y&(J~{j$Hp{|gh0={wW6xBz9F_-{O1Ie zB@F0EOtqTx9%)5Q+L4i9FvYrd?fCoO|KXOKZp0Dmu4vn-Yqz!6THRz@!G?5S=z<0F zIlJ{QOK=W=ktAiSYZf=xG(7*zv!-q4`Ac6E{q-$f+ z?igb%YXjx!tw7#F(wdv;{gY4m;pd+(Jm-S*nSZvtl$3HqG&|tQ43$lfQ(I|CSTh=~ z_lanZJ;TKQgZDqMN|%WVqZSc`KqR_>B#0b4fm!~baa`!6R&egP^Uf}vIwi}v)_xC> zMw+al0o`>#O=DHVu%tZh9vnY*lg&4u;ATzdg=T&HiB=P7>A5%M7PUVAehMHj;-Mk# z2xJMVJ&`mi@MX%G*a%*M9J1#cn^HYt*~v7C)zvn7g=;q0VY^4#MDX5}sZTxijQk+S ztMZD+9t)i&KmHPo49!zWOpHiNdd`{pV>8>Aw7frUYRA=A<1Vo#_S93)S!C@S&*@8Ri+b|kjp1wLGk&irR+8Vxw0@<`=`KI^(WoTk6t`S_v-Q6_iiqWSY ze`14m*Q02P%&2|XFpb5Qk@Jv|r)}6rj0r!31T3~S7(nH89tC=jAn9Lprfa3_s*QEH zn8h`jgW0jnAvkj76*e5R(IuDsRJP-f|K5}-(*XyNEiP*|V0!lK>LOFJ^x?;!J@n8+ zSqK3qIYfnKRtp6$g>dq`s3@94OMmbIHv##9k~{_-MZl3W`S)W=sR%2gv?TW9IoC(W zGNsDHhKbcSw*!3i(d>f`I!Jo2K7GzT_Z(fuH;Moxfi_DG8Z_t!KRm@pbQdqFwc!); zY%N%Q4F_72|2qoc4t5|lUNCVf0lda6q9vlF^n4{4;)f)q6d4d)2KmECPU|QbB+;v^ z%F>3L!dm+v3SxPUUChH}yAU6+JYm^4V||$1wq}O%i7R+{ufka3A)<{XLJu?;`aZD; ziIvh~f`O~&#RA_8)bwYfEExRE@Wv7q{=WH}H5wo9o;t4!J%IHyP{;i`j znb={nBP-@sRM-tdIDF|V=q}O0rw8x5Kjfe=w$;gn`gU>f2xePNrw3Nxd=;`ZV5hQ5 zVXyq&rt}!zV1mbtIhZ6g;{mb&0LhaxS6$V%(l!`9pKriI?STjEGjKqkv17+R_~3(i zuDOQ4*7UN*N%v;o z9!nndZ(=Xgp#Q6Yk|sx%f{ao$4|6a}sM)M4y_JH}v8tB(0#PL-20zob!Gi}9VB2lc z+1@9nTZc~VFv4XXJQO-;m`$-L;g^r|2DCc65lYMWP)|MeF zT}0>oYY8kXYwJV@2oy(tReGL%EE<`&ouBM*70Cl1 zGB{(#EQ#v%lunX!SsDB^bfT^C*Bsd^hei^FQa4p5+zJc=6%|B8)GJu7^`c%2e$=aYvC9=H7c9I;69pU6yYyZI1dh1u_?tXimvy8xLokW%@UmJ=*s@bG`)Gycx z&)eR1h$d9uS$i8=SECMbSsLOV&OiSg0;!YlN^(LNQ@2(Hx%?z%VUm291rSybn`os= zkW$IZZWm=0p=aw^9J-f~nBt3I8sAH5EhaY*6OXDhwO&9*R|F7(gC zJzkWBK8ochp@nO(Axtp5d39{k8oF+#PY>H-=zHFMw2stOf4A=-pWt#&X(n z*ie)fzp{W01y&|UW2ld0O@-diilw!GyYe4Q0ZprEhuR;$wa^-wNEJ4giTcQX`dUY$ zs^)~4Tkm*)*cdbLMhqPmhg!{rMNAisV1*qrP%vqQ6e@~m{YaHv)KrJUu$rp39{QGX z+wgQxb4E_XEh-wf+N?0Kw=34 z^E7vuv{3J8@9%#1yB|9CnD@Q+-IW!Ffm_W!zwX8x8iGGC7`NDqb8UxL&!-g)TYK}>fz7B|%u zmsdCXY~m*z*R7RfW9E}j{qP589Cp}Y)22Fk%Oa zpj&J+RZ-R0RF5R-qJO9qJ&ZA9#&A>{6)v`uk%8v+E0tQ-@jD6*IIT`l6m2>^4C0iv zmi*|4KiYlTlm+u&TKeiM%a$x<)QRI2g>dRu{`2LR7k}ehr>P+Boxovh90e~4$3mX* z;~&A9tArZEcdYAB?@>bro$1o?j(-QtEeubE@tpYWhtayE+YL9cL}1v+(G$*cEL&L{ z>O#kB#~rs#>vKXvlgX>YsDTI;dXc?Zvu1f#gI=LY7XaHnlPEJr;;Uf1c_j`}iTM^i zH+#00U5Nb*C z$DVqc@a#5qvX@WJ44>q`?enHl+mAGP@}(E&1wVLc7<vi|t35 z_(sAPr%8$eZxWpk+!&&K!)z#35WIY$AIA7wSr?pjp?1ue;6IF?D&l$tK9;Du+u#jZ z=4&kkQcKY>n7R!=^(o9>9XocPz4y5Nj(e}U?)sqmd^oW60mOwB1X8O_ARl|`*%x1a zrK#1B6_G4mxngw4j8aY9VVdyjtSt+(Df`?+UHh4BIs^7CJwWnkKvyZt;IBY)m+ zev{^ROqn!k+LX!9&wBRZ2k+C_z>9T6j?jpe9xBw1+0I!#)g1E);g&DZ*d5nGb* zstWybFC7J>!$wiphP}#*TPl%itlwkzsie=|r@BTy5TAx!4fwQu)V$m*$&Y^YcoQWE z>X*NK>Kon=rV5{P_PN@%CZmn9?l>s-~Dk%;(De)1E8 zH;Wc8Hh8a*YahkYn{-4~eK`23rKM)jAZu87+i|AG7d%z`}iB`m*JmREqwXKVXMrv z92QGSWU(qHaDv1KAq&s0RB&%aQx;2c@#8_)u%bK+cLiA5Cy#}$XIx{ZHQg~T9kv|r zsi$T={q)oLi{Qk$pv}#?KGfg*`HO{XPy>3gj^v1-EM$j>yO-vDnG$I-TV;9iWtaWY zMETEsE*wMTC?quT0G4N-dBzBqC{DwSjp5S)Bb(|L?!rU*z?K) zVdaGtGsX}&7(e>akG|mz!_|U4JOG&NcHTCF=vtaogM>kCI>8AARl&FR?6c3p2XT{C zjy&=Ra^?WsbIv(OG?8V4IQaCIJqsLKIur^UmQsX|5piq;L9J+8 zO(f2Y8PmnFg(>!QU&rsfQ)7Ld{*YlB9VUT98d=}Fv1(;8A1O$0b8JXjTRFYA8acvD zp>KTS8zxMKZhyXF%L=*#hAM-e`Vs&-b?O;N0q{6NF9Hp7zybU0y6Yt4K0L;1N}$Wc zDhG~ zb=O@o3JF6eCtN@Dyl@tCt>!}#bTl5oOY

!tZ;CYHP`zs%5L9s@Bf|BnDpS3uFEr_Ny=71yO`A3x2<`+6 z?(XjH?(XjH?(Xgog1bX-C%C)2liYACeWxCJqImCIIj{`I< zL~!EKGHV~ni>c2n`sO#CCtuHwAqrji5~O3Tl&3nlH!$PWPmVn4Kq8R!ZXEr`BzNi;B)P(TZQUub|LN^ZZC z$(U6)rHmX+{<4N!xZT%nmtBex1)@d}MDNS_ZNWL^_fI~zxjb(<#?vXaH3r!q(P>(g zknz8e%r~xepcRGNPtQA5IxA8|%Q84z#6?)(E!Po)Q`|r!T=h}IWU{jT08sjq1^H!r zbXp#hqk+Eg9X)0RAw`LpwFs*pfIa*JP~MMan2T~oEreh9 zhbvu{wqW}-NK8i&xdaNbAPz+xEGw;i*$9+yOv?yblFA2Zw?jw(r~3DC&toxd7=qW) z>2b9ciXZ`45`vHdz49xDUd~VM^lq5jV9~;Fn}?}<87X7pa~9@jQF}l0eV&uX>9ZM) z#Y|s&g(jBLujX5YcR!qF?UK^mxYqm+?o0OgMr^>u4exE=1q)G84i(f}s5F%jME?${k+p!sB1n3T9~KI+!39-KFy16W84T08FG=#FB5K-}eK4$-*ZA)aPmDi1&7bey zswWn{2;lM7_8Y-q zL}(p(USF=Gp^Vx0MsN{lki?yIBGdR#?oe2>_-qYGMZPc!R=`p>#7^aBvce9OFpgm~ z3oy5g_({nzDG~=NwMnpcSl`91FR-5ku+ivtO8lxjB)kSU5CDTKMTpACU}=dB;-F(W zKgTkg_Uj9-c0}aZA$X}WDtv>%MQ~{Sz!C88L$LirU_4pfZ5I{o0TYsE8K_Xr4BeN2 z@>|fD_!f9&fBW5L|8e5E19}B_5zK0ym=&}EXrTn^pBrl{*&zl;V#i~W$@wd6i*5vXqJH=Fl`>k(Ugt3wbEa=`B z-PkRTrj@~H%}ev?{O<=SiyAN)!mY(hLY*w z#7(d92pl44Ux64+&*hFqjX4&I1Hz4t$z&HH!uhGYqMnAm4%qfl{Qy%Se2pvUoh8_B zk1jc<#6rR6Xu{k>MM_#o+B~uOrhy1o+JLZLazw}T6VI;|MATmRejkH-sgfXAapPtP@#xDBRmSRT}h|KtWgs4UNqawbh1;<;AvxzzbW+qoE! z$TdEAI>Q6|-jj7iD6PT;8v+kuxQF1WS%!s=?78x?{jlYEJll9ox1dxSAEyAlJgv%F zfEHW%T)en3$cnm~tr$-fj$H4yOp(y-i@4u#je3y=>T==T(*lgQt-1err9PjS+))^-wMEkI! z7IAF8QJsRF4brscSWH@5DUc5V1(C>uAP_E+|8*C!H0Q>V@)T@7_2VJFlJ#2%TM9+q zsHM9N^nCZv2uK2>WhlYb!%Ai_6~`b7*79%4Jz0KCU;@_r)ml339?(O@aU-8H3!b`& zsFHg5W06-3!sLYvDw+fQI%PHzLpK!VE}M^wEW6}&NTE?F1|bC?jXtS!BuJs_RkyVi zG~V3BUQL>{%))Ak=VxXGbi|vF8*2Mp7~`)WZ7wHW}2Ggyr zU0Hg9Ur#}lD<^-8Gez#KtFHDki}<=fYg(n-wlN%Yfr3^^T@Lev|Nhd`^U+4{)Azi2 zZr_>94C!d8+STNR2$hBHJQHZY)Zdm74PYUdvOn@Vew*r^)L`P*;Yk=;u;{i>u<-VO3X8o$#{TY6V8AKwFF2ydCP; zNPQr69BgtBQqkIi#4Aw%IxqArTJjkML!r82N58@~n)>VMU!S5*DqtaHrZ|?SYlG9w z<_qA(=^ucrZW!r$wbp-$N;5vKl)f?(3Pp(Aqo^9mQ1R(d;1B>@S1CzBLoZ1B7PS%i zFKF#O$G-`(c+UnS@=PR;y4Sz_QkE5OrhJ_u-xzjF^N1M{T9_tvYKZ?PnFWd$qf(kMeOdTmdrnoQ5 z#I5P+9~-p?4`$>B@C(Ike;N;m9y)*SrZR{rUji)XGFD}2$}Yt(Pq4c_0)HOl@o9+g zMB~us2Jd7&(9AGlSAynw+f7}zZp)noJ%SU$MSYd_3qx!fv1&rr(Z+-FoJ=re1KAgw z2YFkponqd~k2iLm($eOy`G0gZW37QF8MrO&^erOL zw_WwaDmq`U`5sd1*N^AaS1HSJ4oMj|Rzddy#KONabcO1ws(aK(`I+S1QuUjO(H54M-m6%s(79bWLyU8iJ*Mf8+KzS zk6xHqZVU0>98TvB)#4Wxu4+)}d6Q*+$K)e(rA`kw4L7oabs^Eo3IISfckeIovix5|ipnE>zDVE$ zUjk2r9*c3d8j6Mb(}o)bfP^cIzqoPadc^d!ZSJ3C+RBq|>jQyA`tW*2nb zs`7=|>iqBNlGUskazh;um*+C}3Qvnid zjo#;1<3O0&w!=Iw8G0C*XTs*ez;pfjhwE|Ktnt>tfr2;rAZZN1hg|r2|B;LiIQgEtvH5@_kO`v*f$3RCl|*${yT zzQ>6nSwgvpVHKf-{YlVy4^^{VMQ7Elg7^<1ae@MI6w?<;XaL7P4v73bAJ)<>%E_;o zZjh$yF&>Au5pi@%=dgHz;A>?=PKPaPBVg|}iny8DGQUVkHbYiKLPvEuPs69iRgJIY zC3ncQ&i5j=ti3O``|Ek;ChlP9WfUsabi6|lvj80PD#Eq`VTjB7Vas|9x=E8z+b}=DIT)8}I;d2R?aWoIK>#3WEAbEq+)FbBv zTMh&8TvZjqTDw%UHh%WS?Ps;iWeV5G_0(atl0Oc2S>d1}tey7^GI~$6`PQW!)-gd zp1KO;tKi)vchcNM$ex{f3Ek)<=*l~x6Fz9cEd&$^iTf*6!s zTY&kjuNP)~X{gD%f-G!kBf1RAG$`|h2d3|f`s3Idnw&keLX4{I=-_Ba*p#?u8}fH` zeO$oYkD$tgrtY*EA52tL-1Q7c(QTsvybp)k<2)C`l7N*H$mibbXQUSEugriNx< zvZ`s|9-c6%d1Zn+}Ea{YU{&ZZnKyXC@DT*zVr0IKD7?sA#ml zrea5u3_=B_&(GZ51Z&M?_&~#ZX`IUJo}FTQ-xro&7V}6E`A`7f5UDV6h}2Kvs#3pJ zQ@;qja=39AP@rGt{iAfghHkDwtJRcoJze+5admQT*#+RXXXjF+w>cj}lXTIIeD$>X zfE!Rb-r=>g^0a#ZXmEU)U(6^4FZ#mqGntQ{ynnT0$Mh|2dSSnJb^Lx!4-%G{wP|sC z{>UjP1RQR^68o}mvZQat4LgY7>9pW7i5CXSPpgT=f4ui^&q8p=VZ{cT=V$*_`s!>j zk+ij4xewg9!6{Y5-n5?2yzBK@<`Yh%#Vu}AgqaxE5*E08DKANYsg~)4TQzWXr5OOQ zL_l|Of`OKQ7=vl*YPTTz1fE5}W=$k$OM5K@JteQ({t45zyHDL9l~XdJ`Jx|AAK_G3 zw(ULf;*Mj^_#Wr-9WN+!ehsxqM9r5jKPHj&_IUegs_?EQ1g^#{MezdiXCmvHiIWkB z{1O$eXJba`0T`jd;*8!!ybh)OF$MxG1@0qofk zYG{^qT4ugx#Q?Yni?NhZV1ltr*X3)rn611$n)H5N)r|0F*!!3pH+&op<-<9Mh{L&E z!~{jq4{f_7U%)UV^cYlP9+N(5KhAprSj)SK#NrNA7fthDldM>1BfqyR-z%+xsSI=}YVu}qnG##zLMiQtqX-I*(M$L`X5`LpV1>*N7JT7-Ai#@A z;G|ln=}agZKuc4(U$kz_v>nvNKJqS{TwKKiRKA`D8-dOC;ezknkxCn6*|Uge$PXPk zj$IC}{^vDV`c4I>FGyfSS*q3pl?`AOx{gXFskGdXN(JTM_sU=&*%5oNf54pz*=h8! z_(l%)qe?gxg+*jUva+ybGFGj|4FS7{90w5*1m@`=NoC6-NZH+MbB)AeMP)F4#X7fN zYu2R-C>`>-RpTRi&ztu2B*Rz|O&8zxcI!=GUU z%oy6ND*}%e`ygdY4K?Atj=%PLj+B*2xcg7#JlTBSAH)$cTaU-jt(Vc6K$b*eNAA;FqWg1<9-)U4`924dVJ3e(3sL=R${P=b&Q>8Nz*b=Bs` z$Nfw>6F;d$ltcm_R({yBGb5e`=cl~zgB#e!UqkZ0;uDdOK_JCvF& z8jCwdgkDFRHFr+veK;l7O2-LaeLs}se^fHL+@soX%Qh%NgP`-h22T#|HZX;$kfx+R(PO zvGjg@W9B8ZgkFGa83WDNtA{OuNvTd|yHZwro}BM)K4kbw4v{>)*=BoxKYDDxB>wfD zAyY4PHCGkny0DJ0_Q&Th4WD0$Mgzc^WL%yL5?_-QzF0T}>R46~BH9|ER2}}PWcWOd z^x1$ERaxjJO|LxH;9b;NnsiJE2ZJbtCqmZ-_JG>+nTP~g8T|sY#(052Awg-k-g7me zT}X|JC6+Y%1ApvGx?bV5YADF-k7NxcL18RD6v*(KR0TPbpVUfcg5PFCX4WINd*@8Y zUEGrrjFT!q+^4~<@I;Z%gLU%OZ(6Sw^@~ByO{izUPd`~(=m}n z_rLNJZFd#1c)syqUo{&@n4pmZ_lil{O7%QV3%qi89Ost1A50w=I2y_ntJ^XCDl9au zy~5(Z2IAK$)I~=~b4UuPv7{H$yQoj}*Kzj(=v}uB$MtBscDN5Bg&&GmK^L>xMbgd# z+3L#1Q=JGIjDsZ$Oj(k#>(_W(e}+Y^+8Tvi4vye?Tp$#Np;EtO|rzgLOpilvG~ zL}@k#j!UQ&cx^1sDMKMizbi;yCUxX%4t|onn>}fxOdYV4L(+T$B!~|q!iZ&v+H01o z!JKH_=F*y4))4juzU>cL=dG(=+_CT{fp)(!TnqJR5w+Rt-SYHQ)rEwu74K#&PvMbI_tQ*qM*!3T8|nolk#&@6rW|~Wd&upM&=%eZQ(g;M$k|- z!i+=))71Uk*4?`9cjpV83>PdlW36JSlC?EQY$Qu}q~LDJ0v0zkqyE)&EU<5?vU6KFiy{XJG-u1b%V0xZrWN;S0PhG%|(- z&Lne+5PnnDSp&ZwVf7V*Y!mB*9me)D1vfKX29UWL%Ao7|@5?T62Tpl3Lg8)bUUdQ{ zC#c)~qPJsrU3A?ZWXZwNpC=uDFCO&VAS$}sH2Ln`mor+SP%$TwYFAFBz{Twku1EuIHI<{LtxHK90cTzY zA6>a;Z;awLU`<$drU)Dx3Pbzo+MYm#Z6~Fmat~kyG&qz5`7s8UmiM6x_H~Hz%q@Vs zRwzj{NoBHHFKL?RLq5GBa3s{}x?H1i^-W+4Nqm9o3UwGJPw&)n2hu30yTG@%GwWae zSGxcfK!Q&H^QE)-v>JCoLzSoZy(;D?-C|ZJLrDf8?3KNJz{PMNNyR`}ZAEHHM4pD4 z?_e~c3uQ$jg_HTk)&6iV^=4@?l(*^xkgmDs*Y_~wqX(((woGF-J=?xZ6ir1fl=wnW z9bGQFN~6IeavoMlNIz4{8p^KsojPZ8#8cN+V-FnNVO5jmWH)Li)umXJi~&(q=)M`u zT~>nyv)S6~idRGZv!MctC}U*TVd{hX165A*4xv|eEKQ;(y)TW8Sy36*7{8mit?(j+ z**8pamIFC5OCBLp4fX}^6A7DM(f7lm^B{yH)z&p~V<$L#reZAg1FML=W1OV}ja79W z=0TWz21^_=K0Q;$krD1)RI0UX18-}ojGHf7aKX|t`ypOCYfL84)dvj*Cdi8QzDnpR zOh(3Y3RhpMbyh-(7A*_VW+#N*|0#vj3Ihqs+aj5AGrnPr#Rtyq(VE?r zzvPnhGV9!q@fDW~A_uMfSPE+2BBlJuzx#}SO<7A9QS35-v5`}R476l6t7~E5D};ZS z*G^zK=7UOWmPk0VYah5_2_s?soX2T{7oSxj?c7`!sBGSs?Ow3!+hmonQwXfO8P5n? z_a;a*$EPtaZ(RSK&p)?(&UO7?=kuXsrWHX@Nv?MivO;TV_@U$;MW8H|TxlI5Nw zy1?wa-dY%Vbn#sHp6$JVCenBQ*jYQb--+e}fVr6_h2r+&CKz;DW=Mkc`GIGJWbF&l zZwM1Uy{~{FW^WmDkd1=J#EGq|1OV#yl!cf|gx}WUfeQTOUO)xmg31-1@c5vLe_|l` zyIjP))w`ulAFh^Ve}{YfDQ{PiUz9+a#44JwAkt<|NNGutNtNPiNDv(vOw=JBcb2K~ za5SuGkHiu~Uv_jvo-r1O_t_!ikXq+vA($31y98p|mcOEuVXPa^txMGa8TcH>GOb2l zOMZh@`^7ZkkuSZrOt;(TFh~@3`gyUI)6r;R<`V%Ps^G=mdKI(J7sLE`mJ3{jC}^wV zO%&Shkzc1uo+mDB zA}oPg4!e=x@I%NK+%0B>DeEqoACQz*+1VeEhvL=rzeUEmC(S4uJ)UOT#dZZcjGzTm zhOn?HId~*9v4p_2c(5?E;%&w3j1wV6&J+-veG#!|&HqIy0ygV%J!|P57cq($@ToKML#lU%)orSBMMa>7mgSAIx;cMI{};ZoLzi6(1~Y_-yL*#^BB1;VWHFI>Pc<(Jz*tba6P5-ifspF7FOshIU%H{^NB=? z(mM#e+nDr^Cc1sWyzH!CaF55`@EeIMgZ+dik8?a{#0yMl^q=Tt5$fvTC|Y2 zLmURc{!yXKPBIi9b)jikllOWr7Ol;>uXNtCnWt#SPJ%oN{Oqu36)`4{CcXvg1T9cG zH*nX>CQ8fjEW-WkzqJ5TM}(`seS1(uioh3rU>=fm&mec3`6DGpRCvT0it)X9QBLvO zk)}+oQ0!0J?_a_wC6|AjU5ruqdPVX*i70=o>=iRo>XstWhe9<8n>_lg^M2NFhe=jG zoG~&&MB3dawXJ2){FW@9AiftdfRM}K$YUqVx@Zqf1-F@2B3vZ13&SL0QZr9`82t8- zTKggaIsE>}h>@p>sPP$GgJEO?t?0|$8 zCXXbQ`c|{%=bfJgz29L*l?O;}32ml=^U@$uPHKJPY#Fjr#tB~QUv%0bdDc}8S5G2= z*<%kQ3}(ALUVz-)f;alPusP!gfn(iGl(J+mjq)Pttuv8;i7k9 z`4&GApYK9s|4^mbXyGj_{Wuo$(s2tXT{!|H{m4s_)>I+1k_inKX!e>#X4{nLF&@F= z9V%R_AOT>OR#H_gMi}pr*2wzM?>aT>hpJ0`_E5BAaau&-dG+Bd?^uhysYb#YN?npl z=O|f8RDX)yndflrRg^)oDt*Ib)mG>%0?~BE*ayQeIS#4Vz&!4cb*{iwQVHN?Bui)! zWE+eWQZ2(Gym69WNI)YTn#D*JkwI3nO`>4r?rDejpCGA$@znf7eE`Vjws?aUTv@## z&N6BGr{H;Ke^tf&G~^yM=Ujn@Xd;SM64fVKu!09OU1=s;J!MYx9R+jkaj$^`e3U>s zn~NCCN;ist=)G)jCs$hDwrd!yp2P}+Injq<`Xpz;8&;Db(nqJkbTdv^f{4~JHw9~n z$^&Neg5vA<@Xn}U#6Gm)mah)iF~|eOgd`AO(@i?U*wOh}R^P|3iA$OjmM5E3_RW zL8cmLgt?UTI?ILqoZ*yh#=MpzjkZKdj=WT{&YPbWXrI;}oj4gWTgQqg5w6cNA`L$T z0f~I<>nN3?hhl>{RSi@rYkcrRg~|b?IVJ2v!`d%fQ0gCyuTd=%Nzylq)Z%dctRDKi z|Eoz9&LAZpT7RlkV9kKw+WHXbu>1+gAY6yUyP1}^DJ9ueH3~`&AN*+_$0Od|IiW7_ zDNMjBx%Y93IvPy;S}Gy2RO(fDV+}rWxglCsE+7L81Y5cT&aj{tqptms!@}u zOS*bRuiw!+j5Yf!54nZhh^nirCpv`BPU>Gdfy(||Kxo?7?E4|ia|fC#Z|G}bIOc%yp^$t}(VkdQkXT;gm(j43DxA?FKS57%YLI5G(kHZO7#9J&=%;E&>m4&%QWKXf&D#XD?&=%9{TgM(CqBT6_cM7 zXg_I|cTV)zc8xq?Hyqa3$@I5tc`R_ml~@x=#l%Q?;M`LQZ$hfX`j#bMQNOB)gO|aI%ozxd zO|7$53{2lu%=myM#tHikmRApKEFH@uzs&nOXW70%mri-aW?#BJFom0gF@e^?f(gAO z*2W0*2ov0EO_Vj^J$AngJXEyP(~+T*v+)aGAU3ah_uuyq)gMrDes|3UFUfPE@qR~o z&V@1wV+O?xTt)-+owBjcHkhdNo*?s~MC*_x-8`qyDme)oI1R^m?|om^eM9 z6jJY_zOEo-Ua!a987mhaF&d8?mfPPP^)W^E+f}0d+4x1Vny`tOgi%d>><3qyYEDx) zB*OY>NGp&1uWH;|+xX}9*LA%I73J*Gh}>~``>RH`U)f3LRvr)^jvXVeTom(!auYwO z+rK*_tT&$X3=8a;Ejya;NYAr7`FF zCv{zXbLq`Z+3~dUbUq9z`{?*|s^NZ$!&LsLA?)>WRq5bft+JNBSg2 z@IlXOe2&^A*`%BKO+O+HUr!vWssMYLLemSo$#nVN`FE4P?sV}v<1&TM`zj)`25Eg| z>rMHPeovGA``&}=I~%`HX7GPidIaiD7;MGnf-c6};kxCzf^oRY))@Gm^CQf$u|&h! z#`2D-l#Ni?D}s8fJIOr!=dvp<5rY7abuO(^!-1JaUaj24b8GD_+@G^3srT`0)wurm zo!mE>TSWoIfZ~JeSaFnxJ{u8L?pMTj>`-9q->s%K0RQ{0VaK|Cs`t;0b z^&)epu;tc%Y7b>etxNvi3qM)eGx%Ghly}nkXJ@;--=HNcMiy~&Bi^R_&c~0kVl|Qz`W2vAimmbXYGwJz*?{DojPY+jg=Q9W;=kU zMkZQ@W}DY$0MnABU27aOiFfKtj^=+|SrsQhpJ|I=P?xSMDtTW2n}1C({DHV-NpoOF z>a{3L(7K+>`$=8QAQ+iIl&;Yi4sUs3A?7RN_s*4a$4=MXlWLY%nJt`5E1I@}q*(Z= zGUK48C4Gr8UL^!^qReI6 zVDtx2P28BP*EZSW$J+YN=c06Qk8-i6z4g;&$!*~_PTFC^Ik=OB@ux4r`4ipuj6z!~ zP!m5_-fg9`!L}9uU+BE?epx!WhdekX$HY$4Z<#92ys;n8hlS}AY%*nj?Te~kSEK_Y zdlr&4_-mhR#lBHPC9vS5F-qSYahBu#sUi7Y!x1XOn84BZg_9o6&s|+CbLx}$w?c!` zBa!I5gC2s{E(l~Zn7KS0js`l1jC-G2)xmS_!XjN|btcM{W>dbQQ%f8rx?h^pe^?ei z=kQ@t6U@AL@r^$n4fQD8<9Th^NT=qqWaWjV&MYo2mR}!PNkj1Rh5X>!n@b#j%|Sll z0+l>y+CxZoMdqAtPom_Ry_VT(murk>gaysHNh+^m41i}&0n2hhCGC1?{6!Sbxpw{~ zFlcACX@Le;`hX)RGCzSNmQoI}d^JUM>9$t-^ei}(DuS_3T1g$rLrXn^8rnymLH}FM zAm8~@-Y3p^9c9spXRt9YiU1G7X6%LTcxNFQUdH5Tq;N5{LbW0 zM%-A|l_sXXPVQm`(h()_(cXxy-0ACDuCow^*49K9v2kU^n5cg(m5>%0;m;IrB&QjU zHDe{eh=)QIv9L{)Q!>vhiXM5A+-~O@mYELiwr?c}DA8%i`;E@PoOnB+_)_|JqEy8#>h&DA{RT5DA94jQHZ3f|NeSeZzj5W9=sv@M%%z&pNBS1PuESQa zohIkj9Cq&MszyWtIt zuFcRQrDVHeRab3IJC<5%(W`*QyH1GcCv&lH=TJx_RAiCK5UD$DFl^d_yFoLI3BJUzPSBlLyncZKZ zA-RfMKO9m>Qz)Hh8^f!P*%3x_DyX3p3M8kKkApl=T=&uk`M}APHYpw?yU2qik4#B^ zRvmXJS#wT>5h*AvORm6-zPTiJ;mrZ@qby{@eh7)y-WC9j*+zCPwVKTAYoVdg0gY_m zbu+)Y4k|97S?1Q0VFADX|+;?G8pW+F9kQ$9gunKIB9#;qA5Z?fc;f zkY9-qjH(L0CSARpdQCQEe-%V;kQU)F;q8g^I662N4^S&rIlZOW+$9r9BDn=u)ZtH* z^~pBT)6<-`CraXcf*=&Q8l;cVPx9o~#TF@zPE1SLv1T`4lYE>T!VX@5bo0^%4+_=em*obZh@9x zw!X_Si+s|m z=$LNg()Dd3@J8!`(EdCX1B2PSB-G_CIBv{wS2Jb!Q-S+()k=Q#o8}K5@P?*=$7aGD znZrniUc^-6>9?^B#(_4 z*iu3(tKS2KF=cI#ZHwEIb@&|xf2N1nw`HV}hD~dQ;}|x2P@oU>UY&n+1q-CzZuPZA z17FcrmqhcNnqqpzi0fMPsT0>|bVpsy)-c1dbq{hF{#j_@D8OKdjjU6=a;e;7IX2&& zb2EW@UUHZRWn%!LWMg~?{pzx9L2J6?BK_8@<~IUmg98fQM#V$I1>U#L(SV(6Wy`h% zwQ4cOX((o33-&BwUVqhQYN_85=QL76Jd>$Yd=>O)>m{aJR0qNTRfD)F+69P6KpkmC z$IB1C9Iwu)yX{K8VRrvmv4$|nidWY<!DL@$(muw+U6jJ z3A8IxAUjR}jrl?r!buM^a7zSO54S|PkDJ?&Mu1x-{LZkq_g?2Z$^}+t-Vg!t!=ya+ z^ez(j<)g8#@SRDM7aCA-Nohor+UbTY%yB3i7SLR1H^F!Iteas{I4xjth#jCSU2_0~ zaoQRO)-TVB%E?gwu`Xr%>@&wEtRpVGI<+0wfgzewpe69Ypf1f))+e)Hjs$s**C3H3 zF0JtmNE#E6PyE1=^mJdk+x{*$ziRho>S3Yo8hXt+^$X?NBltIL`d2qLE{c%cMMA0s zE6(}3S=W(dA+*OP%KN5L291^_k25d>|0iQL0rp=1{53Ej>J5-WxA*n+_4MT2pBxa= zw#$`Evazud=_)7?gs2%ClOi0|z{&V=tn_!o_OE-;5h1j z3n5ju$U?5}h{66c3dbkGY0)VlkNZ~;y5ay6a<|gMlj<7Y`CA*ff`x zmc|B1>&`om{&Vetr;euS=)(cTOF*}ZhHIT88{X@jdA(C^INQd`%4%Zd^*Y`^XR-x^ z!nqBY4gYTg0xw>#R^wg_{E$I1L$$NGlmCR7CG7vl z#tRJlbQ^b|CSf49E> zCm4`$0k(Aroz!E{|M09g*g%_>``YKR4YPkY;AaG&5dH_%H28mL-)9WaRhx7D`_#6{ ze>Xk^4p4~gpqdAp^G}Zbzk&s}Mf6||t4lp+)Xv%eE`;L%3fXolcrZBrV?|9GtNj<% zkJ$cQ_|*Z*q|vrl)sxQQe{%c(dG1UP(ukS%M@8*~?Y|2dc7Ve5fXW-4o&VEzz~68F zgb9-^@2dKl>;En^=>1y=qJG%c`>%G75%>@y$hLi}>}G2HcVTaU@DA%lOIR300t+i^ zTWd=T0*8lF;D6{pAk!l5^|G?GOr+a{<%dmC@_1goZbK^A7j`rs{;FJERaJ%5+}76C z)P&l$x3?!`08E|#;cdVSY(_RP*Up8bCPdSl_H9h-dRKC3Uje)iA)(O zP}0}eS5-YET(`lkAD{kr*aCl7G7{Lyi=msF8xt{7{EXwE)g@P0YhN|pEW${@-+oCG zh4cTL@&8W{Rgi&EQ7|o61K4z zZ>Rs=VShJ$ClQ|@v67>BhqR29NQr4DlVxU;h^L(UZq71%Vvm8jsU(X>fgM9RD`g%) zfHa%*R|}GUO#J6I1qF>^99A(kE#}4^6V}z;%rwtCE#(*;Ak$&tpYKX=y9}3`Y&kHI zw(BqBqwyYINCRvbWP7hmKAeaTh{XZGa$wzNEre8SM@BV&17oS8w~+-El&|4IjyojHC9@Zn5?m(U&CrsR^+tW5Nv#bMYSmH z5X~G-u5UFAGe2e^Nbo1tLn|v7NFUC6&ii{vnNw%Mh`p5>?-W^Y#V8FM+;n1b(3MTn1fVN(z9#u8$j2#5wy;1o@OzE zJ#}y~y{N17bQkCGIeTtmYfVALP)||ctt)FTsxK%g>Z~F`CrvG_wi%+V;%1s+`Ddo- zg&-0TJiTY!pirV3myM|8KqR*%NUAM8S#_Nkx1L|X)y2naVd-x0dAeaq7H3~JZ~$^{ zJ$$GWme!=>oox^J@;Ll6>p@RngE@Su`ikx(`>3q%wK9+lnc)MpvFy;N)@Q5_9zh7E z9gfg@35lAzyc!bHj*D$nMxrMgFlk0WqiNk#8D3=hlBGBKdPfGj zy1tZcVK1QP7*TAx+JH92Wp86sQ-QUxu%V@;HoG#XqoiVVDf%}gM5v~CtTW15{fhmc z$)x^`#0F+pvoh5u)+ zWX`j5xWEhB^Fp*NHHs{%%ud@M3;0pi40o9>^f$c3S6%`H6Oz{Ox~58#$1Mn}2)>qb z@jGyl+h^^22lU@tkt}Gb0EJpBss-sX^a{#YFl8OQ7_Q=KKBLt80`0zaGq{fK?%Dp` z_BF3xeHM+R7(}-;e5h!xE`87&_&SAG>Sh1L_>2j9e%GQ{7nN8G5-qTe1A|+)SYNTz zE@<{!C9}&oQo{ONT%M=?JJAKD$pWdzT9P@@HZ$lOPGH(zS`q`A?V>O3s@}aK!-djs z=W33p=o3;fBUx}|+3NDpAp44{qDR2}d9S~sx)NJOSJF4r|0_GkFKtYD2+ukS2)>mmHFF36?mSZ`qIe(`Ke}l zf|=H}h3)_e{9Qr!{{EI{hH(lw-E7}MlL76QBI38GE9$>7;(@RQd~j_ECvuIodRIj-b$0Wv3M+CG@pmA^ME6tS9%ikgbs$^ZsRmQixj zaF`igzgr?KY1G3y6?M(;t9;H;pl2ZvKxf6AVTZA8Q@H{^mp--?or?g=-+4$e`)B2J z>q$jjUxIlLxEc=&3p>j_r|7q$qsLPAC+rbVkZn=*_OH{17JT-*3)P^BgKaxag4~yw z_<{5-P~Ia6geB{iKa%oE_P49A>>28Vo+VY$-KPGChDg@nXo#B50sv=~WGZ7kTL%c< zoKMnUqvz0utKaS{!+V2bEywKET{cFdGLxRh{uzGRp9718*4Mh-AdHB=rePdd8xYML zXDtS5!k^Q+RuOL&3&mS@)!&ZW2@>32euW#At9vG0x7h@>!HDd|e`HH>{}n2_!b4bJ zse7X1o+uNyqzpx3n^Kj_Hn~uXs$#(Qihm>~#;@IxbxGOFwD~^^kPQ{^_O+Bl*%>{v zn9bF*uN`@wd_}#D$o+0(W>2(*owmW2SH%jrc5AD7Y%zS{e0WBN$~AjC-kCo+ahBeX z#+kY@@6RMkl5>z-toKWLvPC39IY7wre5TBq`;n__6&WJ|S^ z+hzsJuo`vRx7v48M#jner7N9lZ2G_RLys=Pgf3g(GO=Z5zDWmbXuW)!wtFRCMr;i` zIEbbG3`S!&fagzL+nID5PCF}&0~cd6;!0uR#8s!8|9mBC@zpa1cC>?*3m ztNFf|4Ary!Cg~roB|x){c~Q699R_X#W;|o znlDb!D(TxDwZYFg-Wxl-Jo za%-l?O5WM*>}qN0tZe4~0Ic8kX1A${C9L`&T3fq+>PB>bI9?IM(NLRwDmTxRN?9L1 zkd1%c%Fz1bBzr*Syk%xh8g;wn5)U(9+ZmQaLRP8Pp({hRUtP~9A^Nx+coYjldy!AN4q@9vJyDW2O2K#Z?3sui%ZKBP{Y%;9uinx9Td zO-=Uxxu1%fo}P*hcsp;6`OO5rtm2mdAjtSlvZjgB!l^!rY!lo}E#8Xk@hx&{FB-Nf|HD5pzqRf~mOF8R3J+iRq>+xJIHRB7^< zhS;LgXx}X_=CHX}QNj`H)5^l~9q-oP?jT6rvq!?V*FN1NW7LjftBU?ISMBF&V>q83 z$4s+!+DbXSnB4MamA;EaF6p|Awbv`Tz7azqdTF_wDM{!c`@YN{%%0jxFab_g$zQc6 z()j6VEp>d)Gs9I2{;>n&r@SsTG;C+pO#;%k!pcDygW=t*kuf0$PfrNu)LqZQ<|Y(y-ZQ z%=u3ffXahw|5XwxHKvH{q-Z?P&7-{kjk8!*EJZr4zE>{@q)dKy{uRK~I@kmRyS%qw z^xjaka{$087v1X{Y0Jj9BxD&BP;6|huhOM{Ptx2Mb+irNQ&Z3v7h9u_jN&aF83U*# zHLM?J;f)-J@)WF}DRm+&VyMkDgq`OBDWS;Eh&+N+9%tsKr`~7d z{hCZhE9V-1Y!vqo2SVaF%t?}`siPGD$&QKkr04B%y&N_5_#GNBEc1EsSG$rTT9X{Xd$$kSm zb6==U_umAsJ4T=mMM|nH=xmIteX0(bcOcDz8I9=t@+daW@~q(D5cHn;{}J_#!F9f0 zv~kkdb{gAhY&5oQ+qP|^jqRqfZL_hH#>Rd7``R ztld11>%RpZ+KT!9sDWw^Do@zpk8@df8mI4m-TZ6UIH~4*H1*kwcEBi~ z%Y6d<=W|QF>n1fU>_td*k=JG-1Bvjpt6ce9rfq#9b6UrFl0C=iFaPOr=fm1w*(1K| zYi=u}hbi@IMWLOkrswn0y8R~*!r0x>v=2m%asTbOy|aG+ynBI_^y~Lw{7}&Iw!N7+ z>e1pbXA(%BSc1Wyy{zkD(*NG|?dg2}+oSKps`YHq;ODKtC+llyTavS<@1=7-PzI!^ z^8H>uCCRf?Vq+(jOXc_uQqa;F?cbgmr}h&o33;EoKhC<{@SAgGWm8=i5Z9^N_wns8 zQV)iGuU3F0caznI)X&%M&(|JsBw&KK3pfG1P4UD(13uP3%wFI>8zem-trhS`c~7R4 zUvXXj0=(mi#pSo;+p7zE@3W8B3unOXeZ!$Yww6v)Nly=G*IY))({)@%#kf6{OJzP@ z)a89WcgFMI@65BJXi4I6`B%fEFo~QVYjjg?|HKFqiT4bEY|JuMJDTrfT=P!!dF{9b zS1SY{I8j58_t;{g)yk7p)m$uNv0m3>szW|3Ju38-k6+3_DN0nj_(sD1)yu9lISDK0 z+R?)BchxtNVC!rA2477-xfZ(MmZF}*v9zeBQWhsko^1~r=3@%+!uF5cnO{uKT-Skd zNOUZy*Mo=O3-sL9v@Y%MH9xpnVuhO=A@??Zy#QSNdXsAX-_J-{i!@w-P3|>7S=N|H z)(Qj@{~6Xn$VY33w|FrcZj{EfGtk#^}(pTUnG2Z5zPo17Z)>En%j1gxm zdTN@335Kc~`efd%l7s5va(2pyqdPF;%ox(_OV$|R{I#$D`LaA9m8_983R__f<6R%| zFy-EbmS|o3dgS}KIozYIsQo$*1QflN0*9{(TRO^e>Sy~&ineX@;`$#y7%O1w8_8@k zD|Bj{v3r8@OW;nwHTwRB^R%hHPym2&c)6H}{GJ>sYM!m4hNw1yxPq1yqdMvz(t5gx z=IA;nfg)49&b&GfbBiS}jah6tAmUed5BmolwXlvIg zChOPs@V}~1GLJLfzKVrIdtB+Bho%Uzt|{hD9#FctQ@;cB8t(M;2d9chVLIaeaaU($ zEY6C*kwC*hgJTUbk1(_DhtJTK?CQ5RR&CYc5X zYO1w4?DUyRr^jN~L-JgFyb{^i+R@N6lvC0A{_&0*+Szm$=)slY12>uNet!TIgb)2d zpav;V%t@0c?cwe8^gsJBJ_D(dF^p#CqX|47FCIT>kf7f`n+ANQ=H^Na?P#=#89x-yxV_l z;GHW(mNv~;kP=J#Yb;QXHH*^6_rrLhcg1L&197b%LDE4keofB?p zU-7S&6l#wDGCcua0Qw*8Ok_oUyJ8Ge)iq_P%25qis#q8^F=2$TkbEB-o1B&oOF*{G zYvmQ-x%@?@o*FBTZ9J--8bgE`Uh~CYMbmP%#eU_bzGxVmlvHw@tHCLzz0zvN08`pR zLR*thJUh5>&|xl~S(j;up8x&z&tqd1ord*6s^Oo+LJ?@@oEE~iRH3uoxnuXJ79$7k z(9lCeXi1l(d<474HPM4p&#yZsSEuFP+@ZIt;QrvQZZT~@TWkIsC+0~}!zt}hlzhHZ7VAYzy! zAVgDA(;4fz#i!fq6-iNd!X(&}E%~pBeqjN7WPlJTlC} z+^lEPt=paBZd$@_G+vv!^J#$R8Ir-NxxCkUeXr1{?DR%BTCVtY;nx^9DDCMMF>g4i zrQLBq_xD!?{h&Mv!ML5B)yxEk3jLSl)8TkLZL@*diQ8YgX4sDK&T9Rg)`TO-tor|G zX?s$Dc>gz!TeL?upl3=LlkQiMl4;}&`L$lC_v>h85e8H8+YjlGg>IO%)Y#X(uDDSz zL#GA!8X-{worR$3${+h#1K)>3N!6z&vg*cKg2>hvPdT69PM(aRTor@|dOdK3wpb zwvr?aazzx2gIM|<(|ES|EYE;1$1xC|V3D4PoJ1jm(DNSRB!j1pre|}AQ z`L@irA_zeZse=FfJ10G0JtQ?zx4Z*mIE?n#BcR#=~NE1ph6+t)=c-s>Q}4wIs|9b1j_C?brO50lkh?NU;!{CdJW(dKL(Z5&$@f+#Ds zV8OJ8+3ZL#)&G-MHpYJs@3C)M;Nv>JKz)zAty|?fi&Z%tr|DdJexPKHA;urWaDJWo@WMh!Fg%(a34GA0fy>S zf0cciYFg4Xq6Fb=$ZPrPlCZT!aIBKb*AkU#+?Qi*kxA`~;w8m8s1@>ySx#XiB9%6{Vcg5gA**+gv_(YQAjV zn~l@LmmZN_Q7aVDC4}!JdGY)&7W9w6!u33GAL%MLhROwWD%m{7gI;fvpf}LlLH3PQ zhpm4>JL)r~Bni?xl{=Z-@H(rGB!5i7^#09a(-I(atoSSF1P-5&9Z$6%GaNK?&dJ+3 zD&D}CEt~l{G2UmtLEvL_?VG~zrI-Qrf3-s~;OJR?I)g^Dq<0plo9d)7)&`t?&AU+=)Xrt%B=aV)z@Dr z@#XJnymi52wOpPL{D0rgNlT9h2Zk>$PW9V35guMC%fF+NDU!e!=K8(h#PdHe$Hg5Id(95q;zgdp;4xzI$TeA&(uj4{!{JO_yAesd% z46sLPgC_LxdEBHV@O#>k7kF<Opu z#iG+`@*B`lpxWEmWWANr)>A~Gpfyq`;16FkU0e*l#|WV<)p>UVHmK8L1NjP@I`G_m*jK4LLltcJyt^nU+Wjg(+&|_o1*ovTR8|Ki1JGSMH6`_8IYJw8JkF zxy)pL{vl#eBz@;i%a$8@DIBr?H!z-z>-qDM2t0C@tXqBk_qh&FIR4K;Mx4@yXqe%4 z&m?{y4!lm2&_&SK3x9ymz=3|9gv2WL_4;#@)|%t78{U1@CZFs7@%OxZ++Iyh$>%|{ zJCDbE>U!AUU~OSk**%-r`LGedtX;300KN~er-aVQK#*)+yd?XJFMqE6%a`|Id) ziZ5L0`;npFcE*n=tt{I_VP#M&z{uxD&~|92r4AY+l^nx#&RWVv_$?DOQVsBxIaXX>!-^Vh zy=Wn`Y+TV`v+KMcA$og!v{CozM`-={cir4WaBu`)`qwHTK{GiSu)df>P$la zjaPSEPOtRbc>lx9RlRRW%HU0(AKt^aO!htIrk&sn-yc2`@ z&v)h`jxlkI;kF6cHpe(QPKM~y85?HlnG^qM<57SE>?%qoU=Fc{JY$y`#p*I*5L|$O z03U-IE_%i-lfiXD@Ye$f-}zHekHx-9h`S(_-1T_q`v*umH}rxp_vGJC5P8^e#&tg5 z70{V8F&;=WsAgs=+A--f$T-$8bYQR2ZX6#`AS>6lVV02)>bJB<48+oPnWYqXjs!Bo zZj;+n@~(zBYjegT#+TYEsklifak@xwoaArWyq-atUyTc|B@{Bt(~IE~MK zB+?ZJ?&mvjBwTi@c1FMJ=%YOEnoJIEDyaBawB-erE14*2`kDY`#jTbw1ZguTZk1kb z%>YRnls?oJg#spoMM7}IZ4T?X5_-UWEWGB|X)PM1oX>Lmmg_|`C-X|3m3RVSqzZ}H ze|If^Oo07TPwX{y8d7#Z-t{Oa`?YzdsP3S*{CG3l9JH)9BGJnZl7EK4DS!=FEEO_E zOA@uTvOeDb2zVqHkQA>e`j;d+-UqfXK4)*A;9REO#u4fi<(iL-}+SlhIcf5g$&L? zZ*av314w!b6<#XQxe1A3mhTSl1lKj0DBO|ZkQ6Z_`i%$x`RdwGfbRdWCNRf8UsMpz zJo@?f?-@KMg2CfM;FjIVzZCQJ9lu}JXUstV)<4EdKp<>gjfIXUAU zmNAZOt1)%)g1=-6YKF`eC##Md73GU27FoUFI;yIjMJ-FDtyeq4!L&f;%uH66(~;WV#GA$@yu=E8Vs% zd99BlhlvnG`%2VO;jlX2PAjFw0lICRK77?0HuQ9CtXkZrc^S`LouQ+-xVq{m>cz7E z1ha&(>zmvjW>*8Y`a&%Xp`On*`6WL&tj%z2=+RVet1(c&CvWVT7Fmau8R~e)X=(7X zC(EGKbu}#^6Ht_7Lcz$KYyQHi9x{c+1$gfn1MR{3zg@3(t($H+>Pvt@?$e%H^9j)I zhUJAodFP5HEmexLI#MypegKB~$=MGZ$%#Yom9_RAFQ;w4aV-FQPPNwl<7O0{>aKkX zQkLnDYj?e7xHH@{u<5L~urQ(EitejWMwwM#PB@x8ueUF}0g$aRi?ul~&B5mQY(vby zc`hSpovG`sgm|$B6L~)1g1Z`+Jm_|SY!h1gkV*HX@u;=bIW@I#aPT{lJ3<@99;ZB> zS5G+I3g~4zjkU|1m^gco_kbk6RK&9m+GZc}Y1%E*#j~Lv zdF(KVc6~=0!ypu2FdDo!vXahRRu)Jg*1#sT-V_ezT#O zNopP1*fQypWmlJfGfCW~lH3RtbCbnIEN3b>AN|f|?ORzLRy4EnRNEu9@e9%xMv(EE z8o$z|s%a(>Iqc%dFpOg)B0Hwsg?Tf40p6AeiPdV`qH%}Adwn|{pyr7FN$PydSXgL% zp+V{M(_~n2DDzV`yg$Jox4df)C!c;oEo#da$cY>~52z{kmuH&mdZdzi6bsC5REXIu z+~F7;63=Pi!YpxfJ8+PjG}dd}$?Ti%2q{NOak=%!o5QQ9@#tnnS|k;=j*Owduf5a- zlMgjjmCHAB*cll~VUmt4=)#b`-~yR~0?Nn)nMDc54%pl++JA^KWQ99PO^&)d>bfE! zGtA&ZH}JBu^Rijj4eeSqt~ZP*LC-mwRn%3oE-eu7)W1IL*C2rgE)*MVo^WPJm!q#p z+KlU}Ps9-0wayTfBdpu6MS<*1#u`?BW?<&sb91aLh11e}(N3j8k<<9KOLmOfzySkD zzyURzHq5}L3l6+gG5TwsroE7I@oLhYp0q1KUY)wHd3Ly}N~bf_RBE4`VTMEfNH066 z!%&t^tS6}msBpxp$$%%U5M&D^EQZXF?#Owd_0{EVc6l^C2Pb_R*Y~C(Kp|7vdC_5QWv<4iCQggoN1+>Qv z@5lD7`#9iU^s!JO${Kol*mTcw?5V5)nge3xU7(NQaHXSnBs6n1Rkf8KVbd}lQ*s-^ zF_#P-<&KX10m@-iSr{u@eP~3Lg{(!8&m=j!fdQJV*Ot9(2c#W**HTi0w93#hM&M** zX3R>pf$!LDm@6KS6@xO?m|WoGxI%cKe;(Zc#3{W0MqXE>37{HSU|Rf>jpSzK*Yk&~ zZ_F!rVuk`p_Vc>R74+!J5fnPnq-8%bG!(vC$9%uJZ`cdRQDGiy!Ej5Yz?Kx9N25-DQVw=Y zOO>Lb-J}3;QX`rY^)hOdf(^8csLZQbdl+wjiQ$5;UQ9NUn_Lv7TX+vw=Y2W!Y!_P> z4UKR?#}L+yH0Pqb)%j=w>x$a1m(P`D_N(+2GY*=xn z3hZ;{uC|L9d|pXQkpw!UXvkxHW=Ys0xll_;=Ml=tb1A@Jsoy>u-7!JbFttIt2=JO* z=r+kaiHQ-wps1)KisbX7rbWe61nYfQka!f3@dgBi5*olE;Z;P_-HUFSqu5J2DW4p40x5l z)ub8EO5xuPjRB7&&jZp`kym#KnDP z<$Hhn<}9yO9G@f2Y*P*1e+J-R;*V13Di{<<5By5BSO{dI=dLz@C=*QCJPa0d_*E=l z_uWMwaR-AiI@UAPHe3uR`0!BT0Zx{lxxIV^c zUz}O5wv`POY8YpJBO1GM#UH3Qm;-1uVKYTM!$Y!du)~fuW0&Xn5qK#Wzr(9`oiyqi z5XA~sU?@ogAm5Gb5ZVI5#)8*)`v!0;dNG%@|4z*hmJ5xTeRyVMkU)`s{~kgG>w)ZW zOjY-N<$D>82~HvE9DyY?C^)LckV(rmZ#g_scgR23qb1v%3|Rhkrn+qG?{%&L5Vh@UzdP;mjuE4 zBJ}433~5H{H^}HRDsDA+u!7$rBL{e}&=pzK_oPt-wb9eB=oFhqbSax%*z9%KBeRlSKMPViC#?GB%!V7 zMO8I{B8Xd_XU!86G83*>*u9CtD;7BrJ>sq$pb$R%@swgm=(8yG?5LpFwmqYA)qm2Z zLpzG(2=7>{oo7jv%8bZTQq<7PC?*Yh3<~xQ1;rBX8L@ehTLCHv;j8h_TW z)@c4fElm?juR9L52!PEil>2%kGvYmFRRJ?e0vROEA#09qi$b5QMm3wmQ7VcgE~_Bn zR^a!3uRcdot)svSi)!N3#f_AlRTwKM_8y_MG5W&*88kBba73O%62}M+46*5UQC*)L zPc}IaT9BNdsnBIKMjYm1(iQk`}+BoB>Qy&U$0ny}mC z_E$ATP+t;0E5hkd32t!ce&ni9m!54KY(0{^*`l!6Al&+mz}U58xNn8O4I&E|dqj+S zJu_Tlvj|RkCzj1dJu~uB*iO8=nq)!`S+JR~C86N4>*;aCdwUd|n2E!vNZ}k&!bP7o zVc<{^pa-i4DZD4}>0|pw4J9bmnkK|GchFN(;iRe07^2yxoQjefBk!ZDHavD$4Vg6B z#K2S#hU}^4JcMzE_)uZ{`FcQmQhs_2fJ3Omjx~fRBf)Xj%|ZxcMgEes+5CNRzigh! z;6O7Z<`&G%prlsd@MVA5y``!gO|oow&n-;E$VMt!P%M>A{`1#}Aji!%y*#aVAkDW4 zQzio@1z~28>KRgqAXq$(R9f|b?}7-D0@nj*>#g?jpoQm8Pw%3}r!$4R(Q2}l%TEtb>#jgH2|ef6m@&Y0sE>N;KC?wB>>JZ|R& z!PzZu^;U}&=Q?lRd!)y;-8Gx_tgSYy3nU_8$V901n4~g7zd3-x<;T0119nfGt+pi` znZh?wlD<)hT?K^wCMpY|?SYq+c}87qx`G zx8&cDl4HL?1tBJ_{@+U=u&8xE8JZtFvRBY?IN*?eAVll})7iYxR5NsEM!SQz2evMb zu%MJ~vBQ*{qI60g*1Pp*T|-h|E_Y(HOW3|E0l#R8V-t%A|5su$pw5#iWVx9HeU3~738o30%fZb# z>_2g#AQpinWj1v#OZ+4z({Mxov&q&_TXl|?n`NCr2=HA+MzYak5<3(tvhO2J=(VCj zY1gr0o`_Iy^%es}Fb#JN11zVzkR>k4ke&Oi`_+1FnyJmi5YB?!a7dAy>x2J6_(daFt)68U&IbiCuT7*W5O*ktTO~jplVugh zoq`~qG)^)GIsHkg>SM+1zYx+4kISYo)x2`#s&o&{IK`zqSU!yE4g8Nyd&>L^Qjj)Z zAfSYY^HBcqH-QDsRZ$O%EDKaRg81~E}Q*Bbgjb?eBcOB?bIq$f`f;= z+~c7NCao24r1bqxTEb(q(dzcQAQ6$XUasL=bUR%DvM#IfyUVkOz=FmK)f8Awa~Q@M z2W@2>zHF5xrA{HB!1%YFE?NT`-!{9=7`aT!yNk_eaNd)(qkLb*dLvV|AOO%jJiqKy9K4W+IYry zT;lNDeSd_x_AyI09@1B+RbG#l=7$O!_WCpJyZsh1?0BH7)?zPLZoTXg0$+2tuy1ZJ z;b&o&NOV{DIoOTL1s5%!ex7y=th}Hj>D8sd#j>l{_xE&FO$`(I%P`ilYptqCq8E%Y*wIOmy^GG7(Uypyg#Yr9eR>c$mRF5fHS>mz41mW# zK9?h1N2aElUw%D2cwVVGAm-XVcWzQlyibr6s`3NI)n);ieBK-r5U!`z$20RQ4hP3A zz;o&q*mRkH0-mJ6^M3Ll-$w#*S?aO%Kyh+W6D~VNsdfc?1_TW45e?9K6yH_T^j=Fx zmh+>0Kk@Ws+XUlg*E7+tvrZJ$#OD4ESuVk#!GWk@p!`0P2<~jgkw=C_CVRXxyv-hB z=_D>$EWE(Y1JIs3*TY2dwqM1Qo|Z^`h2jc0B8a*+@X>W9PKdvc_YjDls=w(OaKOzR@sgeWUQMzL-P zkqaA2Hm>-iFdqSbyR0U7-=0dn&D)5==ArG_tBj4v?Q7V8#Z z<^n726BBX3rCOqlAJ*n_QUVBu^MH93G4eLD@^xarIZ{S1O^!$@My;njQ=az%liFSf&LpN7bQX| ztf*j6aIu%zIz?IV9$8HkRT+NCsp(h1#8$Kb$=S$gJesNRFa-6R^CP=Wvk@ zggXJh9D2AF;1r6BJ)}!Z5xFfv?t!6Q1R$FxKyf??C!%iog4Iqu9BMsPRS;T394XWn&1QAq$LjpSJ&fPLIGm{%T(yp7Xc+^JBX= z7?-o=arjUc8)xX;h)OQhdZ|jY`+*Y%okglt?m`kB50pFxGI)1X+@d&>)m#aQ6b)kz znJI#*EQH)CiPSxNGMzH7$C5fvYms(=`!C2kYp1%tU#KW9q!^H-!h4YtNWhIBuU4%bj;LCxCYB_MyjgFJWrBTCPcbsmBhPyu zBTnt^N?4LAsIkyb-U$bJ+^4SZe|sO5`ZK^*EN9X)Bhq=27Z3g`0aT2=_8dYaXxUdo zK~{*WNe7UZ%+%D}SwQ|3Ke@s0>m`%Jg(BfLDW72L?`y7UdSa?+dSEuV*a6vvLp3?G zSudA7@;zRNj2(H##{WJcJbG=U&T>8u&?}}xw`g4pLBrGZF2U%*szYZ$IlX_pQmml3 z1iNptXRern$op+Wpc1MO&NeENFgYZ`P=*jt@FK6VW0MKPP2|4%iHkRnGvEc�R;g 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

ddeE*SWKS`wD5C=M^ov`A=E-e{k-D z0bY>1fD%-n!R|K!k6S>3AiO+RA=-yA(EM`li1QL20YQIX2!w`2?taR57)FMHrXadu)&&eygxTOZ zFevH;K_P&u=1oBB)VWy0IX6V9Rho7FHh}t$N1sIG4Mjs@;@@hQiP(-0RUnIcjI}Jw zxvA1wsjvn(Xrw;O3ccoDxh8y7HR?kB10Z{^$ulWK6bGao0IX!{3R925Q7-m4VS~~essk!~e z4A)cmHmN-S!vJ6`uz`qGggZ~0akSp#2Tm8kL>{59!%?|@R`}Mq%Cz7#~#psY_&8Qwb`N<^3b< z>8ILg(4(1xHx!6$wMC!|FG@~G@R>oUn7s=>xEui;fdx#Xkv9X^_9(;pm_uFsW8pe6 zj))NITp*6yDqRrTXrji^{iEmP%9alwS`7lIq`g~z9H!3OeR*-VQmOShz%V{mI&u!Xt++>K$jIFgWDHn{`cxOL z!d62STU#DiDpl@WPw-5gIuEH^0-p62+sUb{v1uuAZU0Z-;7!c*nE*=sJH^OxON4MR zx%6;(N}6?tG@i>W;fbWGTpoo>*NY|73G&Y@R`W}s%lK+kWHY)N!Ld;<(moW6s~AbK zz-s}jWdC`syd!%F{fdb6pr>kLClv$Aw}dOmnkB`nAOXWh)D2cm$dN+L)P5A=lR-0T;5eh-{A=7gC&Snk|ayRc!xAo*a_9-JnI#bqG}kf}(bsaHMeu%SE8VU~EY}a(l+G{6iw!mI7Rza}$Fkk_+cBUYp?xH5-c@fO9Xh0; zb*Df6;(1Q3b{Xt1YSy}5u8}9mQu&Vq8~#%)@o2c!{&%BC_&Tou@Amq%r_FyevKOHZ zay3F0Z*&Bny*qxh$0d}*0!hQ&Q>JXfcZZJuoNHW}a5-2_N((Jpv>28wcAkBp?`pAJ zVf^aWsGlzuKZEO(le3(9iUj!$Oi(abT1qKbrePv~Klq1(IhHd>wFBBHJ?PB9QON#R zPhO_j#ZG00K#P z4A!=5!%&9g7)JJ<8&CN#dRFiBe#{f_=l|L&5l?8Beh|LcjS87gK&#>a^KHT)$K&~% z(>@hP9+yf$5R5CZv$lKQ7(PD+c#0GR!Z@+BR=n5Sau%;71c3;%lB^)Bj-l=2fhS*l zdpNJ+V0I{oA4!lyd~J#HC|QOyjs3EE;N2+XhNA6$zS8C^f!P9YtJSRc+ofD=7oMjX z;B~d){;*YT&gP_+*aZg~hlAeQ67g*Oon?s;-g#*n#=HH&Wek!Ru!vp=$tt{LmS%{l zg6TBjbi7oM428UF3~UIJo={m%p4^;b8)e}Uvo0}sy>~tBMqeZJ2ZRUNloU~EH|+P@ z>GF`Z6y}o216~>5JTWz;_h}AzdQlPWLDvIQBwj2wAgwTW>qt19!!M~o8ol}cu#(+Z46nqeB+c&? zAJ8PJy?{CBx7`MTkQ5PS1`iSDV#?ds^UX-mVzFG!W7CV*3_lYYrW9UDRJF zo*M>3a8RDLhej{Z)sRKauV!zp{sUW_&$@pDhiy2rL~VgMda@ykNCF`zh)=Pn67Mab ztqufz=n0)FB9EV*kini^74S?va0U3pfGq;d>%epn8(?sA$v~B7K9Pz-I{Zv;2^443 zi0c4p!(gZCf^L_H)RD9jK_0iu;QE99r#zwW)^`>ujM{tG4$3TZTPBt{Zn*OVVGcpT zKvatqM!2a-+QQ)%f$NWVa0nQ35_XF1;9cHAQLf&935A;lV}vG_rO206XE}D`+dgl0+L>O4Qi{C?VJ}$bmslfD zxcYj1Dv>KPir2oUgqsMEVN=e&xA>dCZ|EYa)N#I@5_H z-VZGLXZ{fe8+Rg}%)bvSm(j-F3NNJxV+IHGbGJdeRj#^~>@+gD#}oRa1wt6K$ES@B z5=77Tt6#c|hk3>SusaxD|9d;ZdhXpekO0)oDgM+pDGLpfem&1=osA}!qYzf-7X%W# z{d9Z$e0fq3hNKsAKDhN8W471(w9jjDxW3#$(_ui#v^Z8{I>zJ}Gkdv|>0wAxJ2Vdt z6e9?(mB%>Q#1Qg+dg_A&=ioADwph&-14TMJ&!9-)=t1AE9GFXf3xmLDU6U9Z@K%o} zw=}~S&n6%V%{7cF$IT-Jg@xB<4uu6|7B!N(y5y5b`bBz5wEe`Olm>FN4-Zr;{nmo} z`=UQLkPCn#iV!9A79?>JrKn|UsZi4+Sv}-?k9Zl-AIBbjYC*qd*lHOH0F=Y0EZ|f8Ut{1X9!(P||h^{c1}c zG5-7MuSr0{lSs>cPL*h^)F7@R28hQbL?gE<58MC$_3 zj43mkH+P--MDI`L77isr69Y*mK&^1~GT%Q0#(Lq$Qk(M%m+e}iLHm5;@#Nccnh}Dx z^i&;bi9&=3F%xtl<%Ecqb8-txoafd@_S*y~ONrgl#FB}lo*q$&A#ahV1C7;#oaa3z zK{~+brv6>|=jlS(KxRII86G}O5dJ82e9}o`e9BZNkLBIkQJv8HBGzJ37T)_&)}bzb zpVZu7esdW*v^l`vI5=pd0;76j?*z1C@DZCb+0>Xu2fUsAZ8p$EK1oU3yobj|%wD%= zH8N6*9w|!?%4JoP_=U;R?-u;peXlM~PM(gA8IEbj*{rD-wOrlMc!$0*iaI6cHoOe( z&=Gg4hja?}WpYWwO>!CsFea=5?p9Dz`VW^jO|BxeXgpsQ!CdSMgtE3ce z%!X%uU!QIyJ0&6bOy;LP1Sa3=H>yKHFhekf#u0|1@z@?ljx1HGMsILTXiCC<9r2Tz znHoQ{I&+Nad{JI|QkeI>O2uqsHV=_VlVOJ|9*e=~ZX*DM!{@3K5u5>%&SMWECZ$P0 zBZ2TGL;@YaqE!B|2vHDGN86nwmr5bcH+q3s7~CX9(LfqD;1bS!>}T}#GUe`=RXjze zqmsnA2u-?#^@u?XOqcAF*sYOm5%9pz8Q-4CNF8>LPke zDbGiX**OjBj9G#L{=LK0r|{xlAvY=zP$ox-^oylU6Zn04lC8a!~zY#J1$UnNWAN4W!ovw z^#`>`4Yt2nr}a>+@i}}Eh^jc^fZJ}h4g%_>p7U+HqwLA$ZB_97*S9#uTtVxd-tM*w zR=p-@ujur5LSDyy1Ixj1PBS!pyMXJ(zu2jJKs^Rjxe1b%RMe&IL=!3`2Vx}Je|@5; zY`0s^?dq__N4w!zIYtT=w<54!HyDC}T5shsx>FlfM=C47aLG{?kf`k#!0V%ut3--V z&r45QW6P)PW{@7`W0YE3G-mnL97IN1<=gXPu=q?H0X9@@&DNl}agwo^8zEyt^n>|z zd?|xY&0>$rc5_dSQIoMr(2s}rhhIqFwX1IzW_pCLd!g+7Vu%G=oQq!mwqNX-49w`h zFRfU;19T*Pvr3fnWs&E$bcAr^T9)kP^cM4pl=hRoZyL}0aUzd5w4^uJ+w{Lh`|E?v zT2`txqKL}?U5w-B$ekL+Mf7_=)P&MmZ#9$y+{8Eten`UUf#6uhyB|F-w}i!#bgux} zZm?8$qovv*OK^AN*SB||m%VDcU(Cm42L*TUxLk!XPvC3N>abr}qL5!B(DEyKfaab6 z%2QH?KkYCCe@2JSs732L?%_l#zsF)ma;0ibHaE?2VC5A2X|hj{b4!4HlxS(q+GY|u z)CcKWisF;-p}at?6uIwf5ke3w#lv4qvy7-wph7L>=P?fV&DeX3WN~Q_^!ggG{l|DD zdF9~jNbBJU1Wka5KZaFh0=$Q zRc`^{jUUN@vl=}tQCrB~OX9e&pTFzEDT|GK1!x<7H$I&lc&x#nyUP_KJ} zhm3VG_YchyP~d6N8D%CNTKxcyOA4vXP?0{UdE!S5xZqxBq*%6Tig2@{RYQc}$ZGJ0 zVqKjLn)p;zF{O?VlA^3iBsAP!5!vbwI+iEcRgx$V`QH%^^hzN(QZZMx?W9o1=&*V5 zr0|6BMDl)7+aC!E3Ut{;UBgizr>Znh+W@>H5Wjhp^)L4Ba-(%>eCq3INm|5A!HHsW z46}Rb%j2b1z3H>xoA=|1*PearR*gOV64Q}3pW)4P2otBiYMV(~4Lxn)%4mWmx8riM zPoFAy4heDW)#OFg4h)$ zBL2k2e)4KfU^WuJ5NcvnYqDgm+o&~WvaU>8K2OH=DQa`w#c#xnIn>qpPu^kIK8d;< zqIEz2K^yAbVhHS-?ZpmoN#L`dr^;QcU1tn>eokZ0$0w803dwYmi{yAkSAu_K9chWi zccr(CXb^{1olR$?XIH(hx9Uf%IAlo4P0ZD1m`P*YD6#Y5$WOm74^LpaCQooR=s&Hj zRrDMOeQml?Af!$VfIE|PkvK)HtuPm?qC$)@gPQcmWi@+K)*L)^q({ ztgGmjm@t32djfA6ka;7(R?7v<0|nnber?&I)#|rGut0CfG6$I$C8y;;9S0y_s-oa? z94u_7|@GyJM2+4 zw~k7O3MRsw{Ox9UgA|~BVTK;=;;$g&tnabeWqHL}f3{;G4Cc9#m|v=(L-p6F^vJab zErQYOtH(ITc8-poQ##F1pyLfB=?f~bJgf*X1v=Ce`K-tsF&@E&el{Y~UAJea>6w}R z-B8aN%<)Pmgl0;zR($@Clgh7gqT#KHm>xBs)0EDrV8kzP&__tcP;H$m;@XF$!5WGh z${Al9TB((iAYU)MoR1K_Hd!KwVVX3>?Hl$O&k(_gXq7F&D&r(re9jAfq|%BLk$<829my!AnK$)V#1y!4I@Xpd+Az zDBFje)$!7cv_*8#XSIPEnBQ~QoVxsI68#x~vn{NC{bm89k&Eje- z6hcvNt!^Y1V_Dlcs$g=@V39bxc8a31!d?;5iws^Wn*|Own4ZLgEgUswC<~Oxr^ja^ zqZ*u$5#{-EQ6Iq^uRGDe12?as@g@xUK|RKN`C^5~@#XVIO?5C70`wb?sjADWJF?$U zkMDWQKTN~CW4sn<4U#OTO*S-1!Xh47Xo7Y^hc=AHY@o*`_<9{g$YW=`qJ2jfZodSiC|rErh`5N;Mb(%vd=jqNMMn{f(&3d z^!YGd)^ZvxdZs^lrc|c*_8ZR0tLj>E=0%~w9t5wEfA)6VqY=8%s&6YssYiA)vak5$H zCvq@110D2!{(7)zN)n+cZbJ!k4az;*bcju)Ji>DDq(9rhSXUqc%JXFAW9}fxK!ZrIRap7&?t&!v+cqYTO@kq5{Bu_~+rj1*wR)~g25hb0sDP%b zdvq9a4<(sumAHXtP*jNMF{hL%4L)MnmxH~<#U@cctKb%@LC{`;VT4R?>Qi)Hnx3=y zx3mBY_GPSCxIO8}I|)rH*FcTCNz4ff6l)7LS}3zjV$&yN!(bhzYkK;MK4TF3?4>*T zgvqg#kRo{5qnN%dDMp{M`6K@=tqrx42rcvh%qzV^E$a!Kc$>C1q^!u&xOPn?(JB`w z1e%zr!oAz(7>y!m_%o4SK9}D$TqeYA+a?i(B&|4VL}Kp3wDtgq)-^tTUI$)x#=!=-w20rIXAOQOOAjz ziqGVTcT@vO7Wp^a;%ZP5GsL(by$~Z1DUHr4;!Lw>v(_k>t}`8qJ9AS!))8l!#;l1HjTHDzK&@c7fUH< zy4}vjx1SeH1&UL05Hvl_1`I&rIt+%g>_j4A4ea)-kVSe%pHRnn%PFX)e@&R*BEh7# z2chE}sd_|0(SG1M;Mh_}8?heW%E+FN=p1zc*+IhOqMwz`e|MVJ=Tnqfd<=`yeoBUh zxls^i5TbSVFH)9TO0ccBjsJ;7KrMC1+{xJ*HwK^ScwB1?N?~mbiWng-jO-1~jiJtM zPZq(S-2O%ci^}n;h+2xIn_(7B6*s*(yO)8vw1;wH4n;~g${q#rB-12e+uukrelv7_ z;{Vx3ND=wEgiREC`CjuI_lE=+a72_&)%Jl}XO&&lZQ~9OzX=7#*SbgN51VYHRy&>a zR~Jq{B!XLE!X%g(Hk#3*=lYSw8E!2;hAd5&zwx}xy15;FhB8=ph z8TL6m;7PlbfXoVSU__5TFrI=BUZ;4K*i?PGjwAmi5c^I8%j~Eux^1Smb---6(tg3S z40Di&2H~szK^f-OynJ`61P}qWHQ1fz5`=fpwSPSoD4S2%)~hA{{O3 z;`5exYcv<`1xMoi{)dXX(?sG1h@bs%6#_EDeC((f2xMSkpx&FX9o-#pWnd$Yrmn&< z)fM}w6n=2RBn_2^e2(1&^-5CM;CpDAio!hq_EzmSsgZ!P6CcqIb=k45Yn^%0=%HbvzM;r1h@@LQIaax< zxsxRx9v&5X4ZNeIsTe26NjYZWKvoH#_2(U(Iu42Mg64EIUE1~YylpOgE+ zVeg+Dsjdp+9+>}mPBet*X*kk5IKViN}q{p0ravU9~|$I3#z_XD~zz#fFJoVu~3*D|Pri&5pBs$k*&I;%gXr z3w2`9;9)g-^x)e#-PPvN2QcitwX8FWlBq>1M0wo+L2T$XPULXl2NhG?yKHQ*KeKjQCa4etS9^e*rxP zZ0&TOy#~?dMU@?_*v!NX5U+FBy5Tv4%C???;Vx@K;fGk8z(QCvC1zR6p+t9wBfr#FQLXEhGfng&-0d z-@HKKMon9jF+i~LWpS34gAt)xG@}9+@bS00(~kpQrBo+DkO7LX0own^%K}uHuWjxi3vZ1hH->D6`Yfx zCApMg)c?v{0~Te7lN@R{{KZyoU6gtuG|X!PiMtX@!??+AqO*q_1?Zq4l(;suA(F14 zo&|;rt=bteIPUBKmDK+lPRQ&|;PsXu1#f43O*h6lo;UF00+;>&{M&0?~#ZB6#}V$E9wC@)h}$h+%e=>Z#lrX z1FXpY|2298*wF`ex&E#XIq6;E!mR2142WRoWMp#t9z-$Y#jRxGx zD6vfpP0xRQ>_1=BI|n!wy;}xbZrvOxPN{|;WG7wC@?u&pNB0&ME&k^fI|Z{lovicV z2uPvAul-5X2pv%4?^mDhMh-DmbL(`(;Q!5H?MDc>9RGVzLBaAhss+@y`b8zV@f)S> zJAJO#PYg45*j9e<8P9&3DJA|_73qQ%w!x*f1kLm((znZ?N0z@|_t4No+Rx{r3KVH2k= z{Mpl+n+BTpea6?n>XQV`?6b7!A@24|!gH032n@Kw_*&S($GIN46Nlqt({5e{%jwTE zfWrU3N4~BxnNj~3Z^|NU5>FO2CZbHCNykv6)GpA+&dEBy^Awzug;$f!QpHUc+(Qdv zYPm#%Y_jLcYC8<6i$e|}b}!q;lT}hekqTF*2$}r(KfVF*6+E+}<9V^AXa*w7^QiZm za5=fBEtn(?T4`(JmWBj~_L|6;CGk6)A3IgxX_V57ny~MU)-5fR9gg2-BHFZI4X65;ethC~SvSuqa2cn2P~EJ(7X!Z=TOn;QGs_W=$|QOt1?S1 zj^job=j2iL&+6%Ph@a&RtstAx68?Vf6QyHCZ`#Nq+AO_~_8_U|*) zn>Q#b+_f$sKxp>I00!DSkN1yCot%~NJDzuWEuWUANH}tKo?>jjC2_VqzZqU9t52Qv z>f&v@uB%DxYnkWtYu=e7In_9#$h*Tg`%ATZ^lw!C_^g$I4#Y7ns2EL{DMHT4XvD2j zGhsp)n&~4J2zcEu6Ga*DUM9_7g^Al_p0{;O@dMnqfBh(D{ZXfh;i}aoc>P;TcT4bJ zZ!s2ozI9R6&&<#hEut0HtR>utwR+|zfy?gf&GHe4k=-eZvivnW9?51%J7VXcF>!Ch z*|NZEDf@QJo<7d&mRNJhRBp4Ps^a~H%J*zKj7s+im z9(6FtTp)Ofum2p*^4y32nXvm8YXE3A0ZFnanx6_N_L^ilH)Z78kjHN{S%SLqi_wql6O{5df{^h{1i*$`Sk3D)0T)>SzYtnnUd_ zHT@Gb-whRt3dKPP=cQ`5Z3Rn@RE5d6%vR6FqqzUvq&_zP=pqCv^*CrsXP0PwXss-G zafHg2AT3wEUr47ryUEIQMJ6Rs@Hw&$FH>`&!Ueu}R{#5=o7hzI?HAC(?f1x2zfrg7 z#dEUXunLo!*k{2Kj-l);^NaY99(VS@*UbUZ%%VIJ(eWp2VcMvc zyk4uT;J4)$B)vSRa$%7O`;6nn@Bk5!yuUuvl7cvXGS3xKD@nD##%J8}dm`Lugh|UM z^S-5_jV07R&kPv55CCseY+GcyQ)zF1q=QV!=8B{( zr?+iItmZ^gOwf$-p;Bl0-Ll6-iV`N`Wa*pkXU;btVRmbif3~*xYTWK7^L{He`m=1T z9!mndccXv?#^RV;VKk*TLx}xpW%Dlfi~hW$_~H*U?cU|6-%12`mgRrGsf#UNk|V(r zeX40RD921Jw}`6l^d%1XS>I)CiqSStgHpF+8BSo}Ine(1^ZgACwrR9zL!E+1d`4}q zj@tb=Ji$PkSYS`8=1D({zF6NP(V_m9) zx(bb-g(f*4EyH>HAlM6M8l(p>Y<3E*@YpfWA*7 z{3PwKh7>Z%@GHe6D`@e=_(3TfvoBK%^P)^o zGO8$c^~2@rmB~|B9*y8Ts3I&KS8gsBf$B^eA_6-XDPKswm#9fEhR6xtj=&}Um&CE9usp+T=yNS=F}q-hfvh%is6U+8UY=ZobQq+_0OFL0mfm=frW zg0alfk_;q*ki_>3hK=TAK zauT>SK9kmsVNha~^ErFUIh)VAo;%9h%-Uc1C_LHzu^0n;kpffDtvE(GqDOgTDNm+P zg8H=+7j6P24X}&JQ}X-Iy!jjg@gxow;}d6T-9Ru3NADY>?%jXzzPr5@BtdHeyT|Li z^ubu3p>L(-Nyg51l1XM*wr(g16>Bh~W&SDVxm8U$;;YDL(CjzV@W~BHbK}!IheU{G zO|kOJw8LIxRxhZ@%LYknWx}Pj4ahSUCp)BN?;3{-hI@6EAgmWwLhWQ!j*dx@@afTK zIkNPrY^i6zaFcKy)SVve;^3kEaC=es?FJX3q@#d`|3xeY`pT>nGoQM#Mw>ENvIeTx zOY##0GZ+dvzmWf@hIBRtRSpd(ROdc059B3DAQUanl`4t>U+k%;w+@t>Ls5wlvxW2G z2IW&2v?|nLRPo!Ald)sW{2kYutZi%<(2@&1zEIK99+zf0eE9o%$H`%%uKGK(CIOXX zR3ayuSn7nsBL=Gh0*cwX?UCA0z(#LM+&+pSK1vV@P8MLa0553bfbGXlRl zvmAar0-c~5wW83PND6#>{KZlXg`(nx5A@0NN!6x9k-S@;fai_aO94-I#edFry^xIl z?a%L?_m}T9is`BVsU!0E*#(rSvnYXaCWdaV=vC@>d%hJw!6re`1zT?h%m2#tpF1te z-Y;4}{*@ha-QVWlSLU@PTV3r)R4QGzavJN*vD0t}Vw?aqHfozHZp2>yp)>z1!ZjLA zf&>>aPs>B~yP%1yh9HH9*U$dv8>}nzP#k3p*o21SKTuwEWk5}+?%mz}Z%CZxB)d=9 zb{Z0CgcURvKI+Rv3S(MQQV1*sW?)>?DzVk~exk1xtE$G7YMM^>$zNJGHoCs9_|NOB*u*r!a`b>vBW7ujzSWPz}3fn;EKI=Lz;UYD)KlsJ2uDNH4z1I+3_a zcMYz+IOEuns$l~T5)YUtA#16M58ke>uDd;bDuXUxfaZfZ5}`k$9w7Jx>d8u~QzvW< zqT;Z*?W9Rj>@eU1#NN+D7=nQCC=Ey@al4p3>i%=}2WSI_W_!!8)MP~AGH*1PBdvYG zi(kv+b!@U*D+AJ*z{WD*0yaGk$Dv3Zy%wv*8VNW_`ZG!qPtn!So3x7QubYi3e*t6u zyPy$OVlVyEnZsJyF=uQG$N2 zPe3qKgZIPPYcLWOZLNP~16!a|820hB%2uNKbt)V)GMUhFtSb%Dm zw^q8Yo|t<+LNJ_3CQh2%)M8NoE|8Ac@!AkY;<*DMiTaa;-|M@ls!;}qIl2I7?DC6+ zrKPQyY;egN;ddy)VLQ?99aRt{f}U)b>X8KKOpKc4z4|WmxDkMc3c$NG69kqY1$ilm z8RwI{aC_YzoY%CsI1fk@$RZ{J5@73`FoIFJ1mKyz1IXIt`mHQ);wb(4ELxXpodMr= zb_;{J%FG?FtJGq?KznvBiHx~oi}4#T^&%j9qxwtFJ^)?+tMx;`B74^6ynkP1tO<0D z08bgCbRD2r6eI%R%8Qv9YY;g&xpBk?nR^6cJt%B2DlPjJ>lyC-_<%3G?6be2(;OtagWtn z1!XzF)jMx>{$BeTCKLQCc%@3G_EQ!QGoZJR0_Zg8cqEH5R+#Z6I5GF+lqn)4h0Z-A-4vUw! z0@rDho1+caZNINq0251c`|!56y0CjekdcYWJYhsNvKQd36ZLR&>7bnRmTOn91Hgbz z+Y#l-w+nv^#N}Fj%hC9S-3O10^@ycRZByzq5;y44*vkz=@6#TUKX%W+G5|pm+X4il z0iFLVFH?`fNP1i=?QKdHL>kf*?l%KLV3mX`D}vq z{r9ydy28?dMyq|FNU-8Nx%c_$w=t=r9>eFUtDhb9sE0_0oNx$SCjU1< zO@jkIH`3rxLgTCcv#|xh2FC1VN?FUD)=3}SZ1THz`g5aukxw9uFLokKa1$C-ji4dt zlyla*-@PBEvUqLZ!MT{Rq|5gJPac9Z^UpEPDO)~W{xp#vK|k8CU0tY||0z|%hcSe* z(VR>ik*Z_`wTUM}2XQs`DQ+D!l1f{EHrLi(}QM>!BttF-(IyW zwl;>yhc72=R;qb`2LzxoD3x=S=TTU(sjCad5O8PuY*dGvMVhdff-Ayexg0jZ1IkrL zAn>T#4zRU>FefuCW%yzY@Tv|ow$`ej-o19Zv$$==-Fp4WbC=t1kVllyqj3FZ3qRhm zWL!@3eI8xk=JmZ9!ZVhRa_1`ZGQV2HjnKRLan6z>E>lcGEA1_FQ^<^gkQ|u^M^G|> z3^y|>1sa1g1VP5nK#7t_Sv?vxlhI;|?JYH+;0L?{2@HfE4$MGX^`GJH$gvaosP!s$ z11JP33&~RBNx#Z|`8bivI%z-JV`7jBLEAx)l&(Z& zsYKKF5h)sMa@WO^whL#+e}ZQ10Rbcw>^&6ttk{qFMIG9W1{5zV1R7vmKQwiR;8}&< zFxzLwbDBr@ToyX~1o)C_d)_lAQ9FXJbT7s|mmG*^YtbI_1X?b|U5a3R7G}!|7|J}C z&a~J}Eq-wLbhsQ!eD(xr`~^$jbxA4zQdB}?c1 z&-y3#k3WF=XFS;d-=h&2c91&CbtXBKIRGl``{eYNknQ97aSVypX&Yh+BMBZ-*y`86 zKx`I3yGQX90LxI-yH4|$8TD)dv|~YS{Z+(%heH3rtYG5B*Ln-l=P@WEDyDsz31K3a zGixP+r5^j+>iuCOG^23Ad>AMWD-+TB70i`jS@gkUz$6OwFq7Al@3Eb`>fP7w2k=JN zrmxe26$;3c!Bz}x8Ip4*jmZ*00Z-Vdk=v+t?1_|U>5=x^-CBj`6?CXy2n``GTr$*4 zc-M*d^pd|>qZBXqBm|flWC7`R?)imy|BwsoOeBt{{(zKFwF02^{M++HzI6+3RMC+r ztWD&v&34g1!Z^)ykHfxUj#C3>#acj%xUR-IPiZ6isc$(c=E@cUx2czRzpy?h@D_ao;l7sK9B`%P}0PX0R7k7t;4U8S~pB|16Z{ssE##YG7#IlW(w zvnb+lt4Wbqv~Y%vjk)rHKkF2^3`I_|9K|huu0OCaPh-^&ZPoKe4wew@_c118X+KDO zd9YE*d!Gj!OXcK4`wsF~mPmN@d4FrX--wgyq{^PPaKqG7I-B1(Qq}pU4q9S5OqbmF;ez1cx z>HA%q8IM`-6>v%Q?o_tnIRE9HI=>6DG113k(iOcAkHneS?QJw0!@P8paMdg?Npn(# z7R)4rq~_K@Y;gm4VgQFiPQevR03vo77l%?PORASl7CJE4A>>u>fDCOGGU5jlaDX`n z2usmTrQ2IT*ty$02ao|vo$j(;sF{$qH_fbv9x_tGY(puKa`FnAq%;)WoM&Q<>G#!$ zM^@itVLs56p_C__bA^N~A5GMgPIrHD;SG zVEeUa5!#<>l@$Js3z~+It2_ujWMvIdqDAoh0!XRs32W575%)lnjH7%c(o=>r{MiNl zYE`N#-_aLc=Tbs`7ce0{qfSk-FLc~RE}L(=D~50IK6i4k_1X_N#_PJj{XY8;*bq44 z#9gyVI^W2s5MSke$IW2fdWWTW)-u^GLH-2)`k}E&0Y7y0Q*=teB2b3jQDsL@Qu57X zh3|mn9m_d!ar(jkvBTsD@_nay#Q+ZK7_GlpUXed;BBVZF+h{URWMulQw(W8pUU%SzGF}ALgn|Obx^P6(;`C{JH19}f? zD0qVtn`W^$#Era97Vt;j04qJfIw?P|!547en+mQ&-lIRbkK{X``T)a|L}4SZDPp^L z*<|Rx2FCvQ)D9EK7aAdet_4GtP10?bKqq7N5rP$3h6o1Mein>A6>9aXuD6NO3zpqn z!`C?hI*8F5Aw`_x5JR#LHY7q8!Qx4d(b?fsM>)A59S#K(_mBkUOCm+Of2if8kMlDx zW9qlJApoF@6O+%5Q2g~WXT4Rh#_m)u$pLmTo|Sh>W1Rq@w?#oy(Y8us#NDf1m`dn_ zvV`Yvaz+lHd%drF5bZnXtOmXGPYDAr{baBe1!9*3$eqkY*Q-ue$@qI{qxA6gPRMDU zx{~UWhe@m>>e-JFan5tMpqW4wb4~o_;fES3mxx6?QVeq+FqY#7aq=@?h%*S}hOsqU zK5wby-S0|^Eye_bL5h1$ez&I$3o684W^#B%?stN=t8`%mO&@eRTFQHqC(*2;AAqx} zG82CO!lioZys^4?NF~y!+}<^pQ%pxDopE)8xqokJN(#*SXYGyH%Z``F(;lx0Y01Hy zjn*67x5{4pDBr(tDky|2Dsl?j2{BZ8cnBkY+YM9}&$AK9>AsO86gW_(zo)1>io#>9F=)Tdpp;IOv72ENM}n533db0u43{I6fy&nz z;EC3`zCK=V-QQn5WxIJ*^YK4_T9x1JyRde;|h+H zaQkQ~4haP=Vo*1}5F>t$NOA^r&V`D9_8L|EsrJHmiY0map@i@58xQW`UP)Tv2o-FO zXuFDJ4vIORs# zpj<1K3v%o+{MlqJaT_Gcfw_&%<}XhvXGY(CUrTZIC7zrTGx~nf0l+x^@+2db?mr2O zV3c4CPY@NC!~#L312#ckJ0JctVP(90J6Y@Kgd`BCNj3Fx3y8Y1T8%qcZP4OWKVg4a z`h7IBuZ!68!O~=~PUDn*I>QV#h$2Kwv%1`}9Xr$zVlQ@e6Inx-JfJjz^OU}yhp$$r z%-#D#Et8S&1CIYGL`j)dyH}~6KLmRR-Z&XxzqKYq*hfAD8bztu)itI;D`0V9(_R+qgvn9@f}p| z4zDBXTv@xHD8vT1;hh2uiftLWi!tVk=%h)f(XQfYMtgH`O}y&Wg3AV-q6CzkHKVEt zqUrTeF>gKwp-gSr+iqp={CPt1;`2kyb^BA3GmfT`J~3}TPNr2_R*X(TnuFXA#Z<$g zkM)=0X?jLDNtKjYzvcCLWgDd4SnS-=Mb`--!A8~DsFSBt%CuG<8Qa@$`a@dADowg; zD>9g$e3-0W5!=HSKoATulEHm->d~zI=;fuF06G;Q3rGcIviBWYv=o@Xw%Vg`6V^n3 zMdE;MKJ?So8U%6~i^7G}h0e~E0ZAAswp@Vmmw75e6^bXE`DVJ~S3*pn=EOC*0^U-= zfE<*<_3x4e4FtrvS9xB>WJaU~6(=NAo!*6r79wTdy|CEteJW=9#2&e-w}ZaqEyBK* zovF6720wRMntVx+F*qQ8_Z^@O1r6f?<8#{X55MQE|5nI%Jw zgK=>y%rE79zpaJKTdHt_a*h>29a6CTLiQP;&dus2VNFafYOYlplRY7jl;_QujmDEJ z>YUM*SZl1IKpdVBBU=1p~h$*^hW9ZagjdH!_ap~J0nWu{J60J+FW40qmjlYNBJ~J1&zr!rz{QVYxz&oPZ-pWrROw$} zs^A1?=V?$JLa$Le%j)M6NCb(@;_k7<57cQb$?bt;s#*Y2O>;oQ4G@oEtv2hNu^cqn zy309&gLFpL`fw=`wtbK7zeGO8^Tzf-?5H7Qx}oz@#h|2{MLNmqG?p@}lFo7248)1N zAwsn;eeWrgLf$J?%7QgEn;5%;io?v_EVvE`jxQ82&}5L6K$p4(11Irisff37ctiSu z&>U&X{$YJ)Qr~+Fb(9SD&Y~=qw69OsyFswOhwx`AmM2vwj%afhJx=H2_>oaM6X5DE z?+b$1&-R;cE;e_Bes5}YxVy0_k!FbhRNg@k;r--wsZ~dHHyayaA5E5>ZLrd1%R3z~ z%a6Z}K^cmbv_IAUD-i|M3$ilm{DQBXKAJJfSoq5MNs+eqNSTCWY_jf5GBjObX1>sg z%-WNXq5(6H)Dzw&Fca^0i;j`+e)Gz)Dh|1pIg7~#1Kx*E{4de$g=G8i7U{=U8&45O zk)hCP@@9oRrFgE1tHpXNyvCw=%l5GVyCZD5%1}nRbCOQEtk~|IKa30Fz~EFhX@ZBBqb$9 zRYjpCcOM^xzCOBi(Sak5d=Dqqwh!wpXD%)#FLM88tgYn`dkz>mLThLmXwqkXGi~Ax zr)b=gi)fLrv=uJ^5E49cv0(Q8>a>2OK#O$BshSUZQbDeBg^`Jg#%2^~Z^J1v4wQNs zTqT&Y)baAh<_V%UE!9jyDf1cfWGTIf3S{+Wm_vd$;Bu9L(ykbMP7A;tW3^m0YbV56 z)X)(6r_gbGi;G|Dq)$70%sSXAZu;&MBg z1u{~1HEn4&*++;dwGk;JeK&f()xN*Q3G9V`K4N}~#F=aPS^2233uDnKI-36HSmf8H zyz0Se`n^xJmRls)|RBMgS*7q_LN)- zGgmp5Gr6=+!tSerfT42D?U>lebC*Atx0~m4S!dHdfH)x$_JQZ$cKhw?*!}q9YSp&3 z3l5p6ZbrCh=!4Hef=oO?Rl}f*Yw(xOLtk$182x^7*RfF!GN=ON{K3=(O8BJK&up*0 ztoWL^-G0qZ!V7xL?{$&mnIT5s%nfev2^=}lMYlSoI6GUde-s^02LP!Jswwws6ftzyk}_>hO<}e$^)l}@j?kICftXZC{R=SAV+|!U71^`*NCdac zd?6w#GUSqI3eYK!l=wE|%eEidq^DrosITeje?`zT|1*VwS<9*kDKgV~jW=!}ugwsk z3HkQ{Gn@ynD-E^wkYV9=5gL2ByK0DX|HQFXoJiH!0gREnTRl=!IVB9^J{>-2~FGX zklZ+1?5mJa*yuIg-!LvOhJQS;0yJ}-j4*=_VhX>~)1c5mS*RKbc<81j)D@F67KbRo z3FB9loyXdd+8=+AgD0wLF?mRm)e31Uat0`@k~fF$R&-ABkX)dn0)*c6^yQYcQH<}! zI`tQrW{CJN^};U84Sli9Erz~-TP>i;CKJKjQFLz)On1=&<7KabYLF+ydRyF;F;_X! zcbX4J`PC%(6*=%{U8z)Kr`mxaRd4@6J^v!+0L{od^W!#Uqoppf0>>l8r7BiV^GD(> zLQmu7@pUmyC%9<%=eiDTYecxY<=&7}qz`N-|16ZE6IvNCvrU zuPmKXx4WoXRG)LMC0yQydRek~Gy4U*1>j?ArQBg*_?K&2EGIzV`kC3`c&TFmrDj6% z$;3V5F|-?{xP1!+Jkv5pfJM1PyZ7L5U+}S)!oaCp%Sa5RJ+nK0JW9XZfN#=a?r1X0 z9l$)IO1RJqe?SD53pp!(uPjhzp=XZ$!M`wz(^Y5b1ivmg4hw$a)(aevX zJX3`#U=+Kmw}GXHKOTMrdm(495?jM@?YnFHnj7NMCqa3!3Ia|Hy7+Xu+!od}(SK{S zM;E@->JLksy?Vbod@1O$5>%+9K3!ph$*WVNP5qm^TEZr|^DOt%6;SWe8?=ChDc1nBna_XPn2xei-QR10 z4udCfT>0P4(CBHO!R`NsnQ-KbuAl}pfz{ZzjCuMQ&woODXtksz<87u(9EH<2i$ODge8W8alTG!sum&3^vaK4rAY2*vAB2!%*B%_`x_4XKdhU>X+|XGcTjGT zvRe_10)I0?YnX9FN?pkO{ndFHzEK7)H%eF6##q}6X#Ytxj5lahe;LX1qGcSftsldE znNJA?!`)?fhy~!$D0yf61T2RJK{Qt4 z8P_sQLX@FrIx_;`%}0fB@sK}@TNqgc4o|}nm3iMEVwITmWqsFNWvA7wLGsS&>4$3WG?k;{_Zus95Pt8J#HjyGH z|LbPbu*8mSzTdZ3*Dk)Fw{N(Dg=`m*H!IzZvYHKeahX%h8F6Z0DU*g3c+@*L9R+G|}|kW&cwn z>?i)K5eVN>)&HvzddR@}&CKGUa^mWwJyX>BTO}6E&G-^B)u#=}n?znY`SkOUOiVaM z_`CIQh}B}#Mr59zkY{8Biy``{d*S0&m>w0FI~z(Z7XHN$h&Y})w*PUBs3nqZb=fXH zpc9O}dUiq|@?k=U1)p5{8I)J~d{ z-#Nu?5WL+Qi7)tdp9+EDSuaz2kjdn`MHzv4*ix1UJk-holODvrGUydo|cq_k$y*MytSES znV`>4Qe<4PsUUU|9yTd90zfq6z1=+?6{`FNT%u%I`% z4^D(lDKbLcC%h#tt{os4CJdahI_S#B`p#wp*-V4P20F@cirGy~*)?mqb%sCmEvw|u z1V))+TkcYqWTWcH5_RFK7u8Tg`fc7TA0f+_P2!4?!*vk_12~%8;&ksRh~tDpM8w5o zjFkXsvl@_rSt+=eBlL84)Y_xcdvMMKeFxXC=#opS*6VO zD;O|zAiy}(llF)_2$YUk6O;YD>lQ1s<#}(<+;zKR-Mgym*0_`^q5hqOx>1yg*^Ufq z*56A1t-l5{P@#wPzG7LURdEZK!$mQyhBlx^wjDQYkyq4I+RfF~+8} z{noheYBhiXt!EXBwi)B?pwQXlTrOEkfs5R{;TjWH6n$qye%}UyQ*l+;lS)$ZDFf~a z23kz((06#>ElxFS0=~4y5X83zGC4DaK}fLgU&TvW`wlFa_pmSty#~=wYugw5oyP$> z=SfrwHJx?&bT-G~Dt;O+Fq?1e^gW+s)=b<&R?HPuV1C&RTx0?Ynb!3D zUn<(@rr)U}qOdPd<038Xpb1AML2f9!QllNFN5o&_21vC{1Y_e` z2)k9n61slWXakU!6$ng=3r?*I+I+rxm+^r;g%!F5FdfzwZB9R;CntYd!@KlvCGltr zadjfC_bR&ygXb1Wuo*T2~~!Hj(x19pmJ`I(ProE=5s{WoXB@JM*TLYUV4d=z~vJ{q_lN z0blzs;#k(-oup;Vh!{!5s7hm!GRP{1ao=Vv^X1dYUJcxR7!(BhH zV0I^)YcS0J_SxmA7BZ=&_DEpOiS>%8tRP{YHlVRP1j=`XMR_*@?*{UC7rZFG>vEB| zu?y0;U`i5km+?iQ^GeA*hHrmo&b*5K_-x?p#<_2G3#*L=-Y~egM-IP1{}bf~GjwiI zpjs4OgoQ@LmJJQ|>lz$Jte|ZmpLY>`X0#csoS}}HGl47~C!_QAp*QbaMmxTe<~@JB zNO?R3m~VB>EJ&y`vlUVTmpDpdvLq9gnS54(e;o^yKOmZhnJd`G@1|f=wM5A*sj`Nv`rqWO=7H@crb82}Ny13Y-+6d46M&3~N8ENCyO z5(p(`JVGoSzE9`!aYSnpSK?Fg_=ZtVxzvuUg;j$TsWU3|L55xRa%Ij!kPH?1T@-ZMD?OR(F+ z;r$+O-huEj%9{M-#6?8V#4@cID$8d_+sEa4O~pRU@9FR|RqPgOO2Z?ND$o=l`XL;J zhvQ&~LHPNsv6-4$CI2AWf$7Aof?DZ$5X&1SH`8lZ>BJ7*wDljx9QNfQTaFYs+4ST02vgk~n%^D~7yz$T4A$3RMt zZ?xE~5wH3d6sWK!VHtyB4PpOvv%a|a=JuBaD^{Xw81AnG!3br=O?Z+>q-y5sD*6=% zTTN#4lMmN1N9Vnwe@+Vm}_Jl)rd z_iJ@qb{LI#6w#-F@OaVJ$f=0WiWKEX9Kr*w+=T1cwKDf6d#5x;e`zn3v@Ea6w^3{- zaTlX6Ttu_9@7!En;SRZO7OM zeG}cd+8%&KK^l%~Mvzyi&U9QQC-E3-u-0Ydk0dI-9FFxBkHqvb(TG>tuVcjA3%i+g z3Dt*k`O3x23O&0e$Jnj-8HWc?cnueQoB!_uh5!}PslVIAoq>1aYbErNT0o>k z!G;X=gZJ)BWkHUGmYk@OaP>BV8JRjDiRR`+D24CHro{PevsXsZvw&S$V)bEK&`~KT z;0sfAGM=X(j*Ij9xd2!_y3PLL`GxR(mkv`hV}GTzJk8cDKD@hCWFA~iZKJ6vs(``+ zRcOevia&yG;#IteU-!YRrM>deFgJNzf2$ZucObF%@>=OP#BC2mFqyIqwDGu}1ED30 zKfLRwxc|iRpymM9jDDJe$wH_JbF!n6?Jrj~TKeq{&8Bec!iN*}j#e?{iQXr_gEXaV z1OXV5P!mQJ((zdA7{8M;jKR*==vk}8@8>JchteTD2wp)wl4n7qom=R&YSvMgM~D1i zU^f*H7~*0^kFUpcd6ng*7GuUJ6pOZQBY7?mWy@HC-}3ld-D$;BiBH2`_hxk5KzySDNdTDmsKu(iFH7WjcwJ$2OJzIx0GdU|eQ?`7LV zpjk3x-E8gOy~RL-!K;5BJE!cpRM)B;dnfX8)|^|sN+jfmvu&!YC;yM`@`!HbLpjJ< zBPJDVG*?jyuW5@Y#9o&y0MiyNaNcq|nnZD_7;ghv^23l~V%TU?`0Zb?9f1C;mPx3y zLYwrqxwsk#kGYZ8DA_-mwo!YQc>=MGDx`DO5CVDQ7 z3Mc&Zw`oWO5*}ehaqH-E7KeBKXbLq>tUJ5_lFy(`5|jsc3*c5N`V}aA za5RAT`{VUcBoEnToUWXg@Av0gPc6|-{0%9psViOEJbNkLPUNJ<9uQt>h9<nSjoqaTaLH1^e#1wWS4w{ z75Obf^e^2H!h`-|dZF}ojpN5j+9PVg88TRLXsj)m05_>KM)~57gKS-^sB~7KvZz(7 z4=mHd(Lz~zb7Or`*Z(g(28|oV9l`I-sNWdWu`IM+MlMvS(w168BDiUJ_hVd`bvw*^ zhkvdtgbZS^``)vjo~$8qbhLSBclv4=y~inAv8#zV9VUpse_mv<{6uKJHe| zC|a8NLJ=&|UZ08jITjOIFXLO#S!oUe;u_Zsga+xR){&^Gg3Y$jjD73^t&|7 z!^K4?j<0HC{v&-USn*Nj3E>Ogq+?mSnPX8wDP*%_jvrlrKvT?y{L}dyF{vmbuUEDO z(=K*+erN-t2q&Ht21=RFJWcu$+EU$P4z3fXk*9#?m0=JX!xCsj#zY6lom37*%Yqn4 zyd}bsW}oJ@k;?SPY2CeTiL)Dio_&v7?ho>m?du ze>1>c^=oQ+70Bsv?s%e3v_ofX-w1d)x2`tTd)j$jJG;RbE;YeEDLik}3DlnYUlzbR zdtDo}VjCkBv#R+cptub8!_yGnj#8++|N3}E#gFX-dYg+?OIdSeLynQ9O3AB3B^}_7 zjp@O+_G4#|pFiKCQvkK}lI@(8@ck%m4zcgV;}Rg_`##%RBjNr=J%hy%>3WL~yl9$> zuQh1L<+6K070&$KZcGx+a7Z~`JKT2Zd%}){ap4ZyyCqpa}bn4ii8K zKAbhPLU+g*xi}*z+{AJye}3GSx%j?|LbbsaTfJZPVEMbGL`y8kKKtLB2YBW*$(nT7 zjg0q;%3J@d1}dS_X~3iL^AhT$RV*22mMe~HVix#41-C;nR@=!dUcv<5E*o8zc ztD%3Kw>1~yPHTO(I%_tg@sk|T5VG@O->Qu2f)aZ$RF+qa=eOhk{52UNnqyGQFip@h z#Phr>JCV}(3!6^YBe!F=`&;+J`^)?$kU|+F#Ot~fIzI09PB?)X7M#c_Pjm>3TFZ3L zF;m!Ves(T~cKgjP1d2{?T1nMi;PyIe-m$AlTk0ALu0JsJ-S<4xl4nwpl9LnmEU+-a zUKcx)gxMf)?lOI%(y$+nWpVH+xl0js^!#TnQPb3PxgN@x%6i#f^Nlw|`SU9?$;N!6 z!4c(cs=jsf%yd|i2EQM)8eFa%{S+K*(#OsuoO?G0#CH7{!lob&+?g3~LW@Iti3%rb z)0|mFr!%pvcuGlOrjSmjz^@StBgt9s^qiX@pXm_^fZ#EYKsnF%J@5@CN5<4=;TL4o zIGY&nuOZEf{yWnLOEPK6>AGW~opSPf)k+%EW-xf5QtnSJ*;1pq%oJac%1@1Q!X{)LCTre(g02^Q1ecvl|zg$w>IS$ht z9o^tPuLj<>jD?Baz!~SkI3Nwd=oQYefsV%B;R}ZR(nQbg8{}DeLS1CQKCXacuN=>XP#~n99qEPfXM{;a1C^18l$^E>w1^l#7eT2=1V z8W|BtV7~vcL0J(@4$G>!wTcz~zj6{)^1oJ*WL{cw_P@q_wA|NxCA!i>HFDda7M^%8 zxeBC<7$DDX{D2C9ha&o=pSsRGK_uQd*ls$P_j=I$9J5J9TB?&`;NbqxZSfCCbP>X2 zBaEk~z8(t|<(x&}XY<3tUz`0z_j?g-HGQ$jFlTmloWS|@6p#yV|7^~N=#cOheze%m z`FUIp+f`MfkYRhT+KxQk9!lvD_~TS&hvz2K)5ACbBS?5dc{rmKYg}n4A`o#R>8jay zU>@45CmFXt(bkfw(2o1^_8p+Y#HA?&XHXC5Le*~L`JIZ5I7GxpWyZo=wvZWI7;4NS zL+RAAe|VpZH$Xveux;sOwK+(A=F$woeq%?FvfryvgGdZPRT&ImTq1c@PP8-}cOy;ktHWjlWKp{s| zqW$FiS4$S|r`q6xH5Y@eX`)S@+`(wyMz=sl+R}#0daKtnIBB83mX`oGG<~33KC%DxS>d--+Dxdq2CaZvxRJ<>CUUO`XcODo5+7{Li~_fz7WV!>d?) zt}62ptr}DhNiMEz@F**fS$4o?4IWKB9%P%=DnXIq`lAnqz~gk$bhYKz8AMeTN)dkY zxyeK!d^3pB!9L=Z3a&r8hY7f5E7e(oEXZP)U%&O2K$B6WBq)18iPc zOBKYJC#p=I_S1x2?XxLa%)UNC4Xc*$Qj%-`wa$1q@+O*JXKrz7rL#l z_XK`Saj%DdlRshHw$A@djQk9(2sS-EHd;gFwH`s^2_Fh?&EE^x@$t^)K%dD)Nk0|} zPqIQ|i+fv$FzEbrs$(1w^@u{Gy}+BxT7g3B)^67r%X?Ie2y2$C-D$h7;RKnou=ov0oPPSF)>= zFe}i6TVq1SB{B5!GV=5{3B@Ais9byd8^4aM-P$pWJ=(Ku=HBB zr753`al2Wy-*pCd_3RL08qQwW*F*qYV2E2CIe!P}dsgJ(FYQ@AEK(g5(hlryd(;k- zu*6@^0RIm%Z;2kUHR-&{|1MCNe+zW{w*p-pLoF1P(Fe+T)^$t$Woq~zRsyB~AGf#+ z-PzJYIc-gNImLb~`TJ(hevK9UTM?ZDk+_ddplHTzZD~NOX3p)#o*#VXH)t~{IfT#X zBQ~Q6l`_M_`{=sOhc@G8K>Dun`2$~tJwzjIGf7gpG)N?yO?2PL-hDwlt$#{ z=8K;X8x#qGEtaQ?IL3Z@YC*Wfp6@62c0l)z+p&pj(6(JY#XiPKKB%q|KA_qEVe=Pu z^Jfx5jf^w{l70v?HQZtS5qFI#SN*jvJ)?MyHbi|)E9W0iS3D!#g0{1zU4(Vv<47~g z>`iKvge2;)&MjoHn0_^59x+q;GRlZpx&@}UYX=n44LYqypPKIT_%$_`ECqBre@qr`PpCG`1^UJu50~;o|Fg$y31}1o-<+f4HIiv<~23s0}rMgEE@u@YlYi zAnfVKh!?pJ-BsB$Y8jB%j5*t@tyBocpiaYQPJid>PD4$i&nVc*Tw3qL22W3ukhj!o zO%Qsj>7n{-0yj;ap2KWDY<-CN{palkRG@;%&WA%4SYlGv%W>?lcfYyKpD)4(*uw9V zw?%n-j-JsT=AQAg1C4dU_Wgr$@AwlE)C@iq4%`@0A?+YMloFr7n>#W`gTpBBx{ghvBx6xLUx!v1aMfNp~`~w8l(*FXq zQiR=pLfq%d;oc`7-~G7!`BIvqOwTyku}|`$tEm?_W$d&9)bqLP?SmKOwSpdhD9TF) z;C_w2U!|!0>bZ*+dEE|$0H?R-==3SDqdD?en8tl>R zqTj%&Bg~Q@PHUSsMH^w+>u>Jou&IGh5&>;kb@e~5@8|KXo!HzsuyWG&`0_3R`v8yH z?C;w#_)CQ-f2uCMnaw|}HQ&P9>BhL9f^l)x=Ng{}oHf2G|F^L|e*Ak=ei-_e*Zye7JfIdJUG_Qgun|BX zUdh^s#jG4_orv520-AgKZw6f##1m0 z$5{zT=#L}VRZD$3`!>Z*AfKj{Bmf=O*P5IeR@nPpe8{q2V=x^9HaYBeCuX6WDz0>gz6t!gS_sad#i8C8@-dXi^i5P+(^RJV zeh<3ms5E)J?gur9EUyzI1&U-^Z{pJ?d$kSS*Y)iI-7ZP_T*bq21nq}MhMt{V$-5(g zP+CWG7VEaTAtu=P9~jh%4aP}_*k7!ilF*rvN;c+e8|TceI~Ks@i(x0b2EJt&1pv+( zY@Gefa?ucrUQ(>g>kvvj7~KY}6!$&8qx%hamK?!zX~;q}#g=hSvJz$_(nz5t3#UJAPv2dgZ^^4-5U=85t7)A@40k*cQ}6}9UxDp*W2WsDMG)U0{OLUA(S?|JsP!*6su+FO|mmPiHrt>xHkD%@eQ$uP#25_yLx&EY3SA{N~dT zRN?Q#_;2NkdCD&qLym$THXjQw5mbhK9`LXv0x)qw((9!VvzWFinx?C_1kT+()B5&` z1@FhF&Oe8od~GIofftE}OH6jnRuUv$+I-b&_F02Tt&w1N&&DecewDv!O&Llaf5h#N zy_%!yZ7lc+isLfSL-s7$0QZV-hT1RThiF4Z!GP?-qk+j?X~tZm@24V#?U^qWG7i|U zy3-T%^&Kx8pQ{K}hjAxH&G=#dFbe#Va79TF*&eL#(XYS?;#3hhr-Y%Z=HxH2`oet* zOdd;6zG7z~s5IHVaHA)9K~pr&Pm#^V!_`-#CehTq*{^qI=|*m6HcW;?=JBCk_I&i! z$#^m_Gat3+v)X55jE`5BDHQ}91DtAD9797^L;5NX!m%z&Xq0b99r8}^?!rNre!tA- z7y=A~Xb9!#1o>!5~n;OV)V9JKRsfZnwabHj@yXY^4(DBOtdOf`XD|Tl86MR zRd3=1DU8<4DtMuD%?Bn#s?;FAdL3nKg~d}{o1mxu*Eko`-_+d6eK#V3Jz7Si8YXDb zmUQy)Emspqu2jm^)wMO%6;+IkUZqB9IMEt2Yfu8%0SjaaW!a$5s^GkZ|IDR$0$w#T zK?kK$7LdCDb=`N5d)WaVhG|$Dt8U&ls`^YO5IXyDC4Iz)uv*VmYcv@q9X2<;{NHia z!x%L0@M4VZv-;^@9sBVBDtwJfd>?Lj(JSRhC@5zJyke*&z7vWp9ghlg1BFj1%+Hct(BwXE~=?A`V?-k!B`X3K+Zy^;*Fr|9LN z5{7%LhHE?fjs{)HI;Ry`+9;?(nHtP6>1;Q6P%T3gZmPW$A7vFl@G%MQ{%g?V+N$YEtYUU3+Qj}{RuY!U|PI6O;IgFCuSh8RHR)9_vCVhDc5PlF^)Df_=2 zQpW!}q~FTb`E}IcznoI(_V=Pr#ZosCq=Qj^u+%mNko-~aJ)Y`G6%F~twDS7*nnvS1 zuH!TxR`F2d3;_Yb(LW}->K5G=gUA*EW|N~2wVxxlp)mPjLKBUZhRot7^2c!k?pKSJU!_|)DbkgAL% z;o1x`8Ncj&*{IUzw%)>@z;s>ZfWXdRF2l~q2-m&Zu~UuoMRdOnNlzdSd&fa_3D}u? zsq6eyFvMaVEW(hPn@ib8QyEQ7Z(kJ_HG-kXRZ1-|Xy(l9dnNHPVkp`J(33X z@*r0Fko*k{j9NsJwt=Ch?j&Wi5S;)|PfOPVhF0{*vMT zRPS}gw1B2^xX*+V_dNDU5M11j-nY`NIb?ezd?~HhL*pzANP29i+C{)~Z5a`+VrKd^ z#lpFuhK;=$-JM+B@hY%A<>mSy2HKn)=1BAr&En}|UaV;!(I&shwqp!G`y5}Pj%q3YZwEu3yk4z}_=5rD1RZQ1^ zhfa?sykuDX^Qi4Gq9jpihHYeCDCJp{Yx7QQXCUI2m#uvKieENwr((GeM@efK)Xk^Iv0HY@wyQhMSfQ_iVXxkT&1Z zk7^2LrHvG8N5LaAhhS+r(Vs>eQ8|RJZm*nLR6YN={TNM03nm0@L}?;F3jXfAcq^W~2}(NUR@DC};6 zV7fde0xyF%Eh~E>Nh^!7hxP>m6&l{XUpFOlY^L&OGs$ zKT((hnN6x+lF+$iTg`@4lPP8mBO#7io_~L*-do|*R6pIPtta!5^K7sy)}PERnHQJM zY9CN6TJ$9dg@#uLEj9{k%r!*yB`%lvwz!902Q;(SIR)danwJL5018@{y1*O<;RBq z6$w0`E2}cPe>)kd7z{y${^~bZgsn#Oq*N;EAkRe~1-eq+;36~nA};Cmq-@Fofv~wm?-o6VIZqOi4AnJ!?l4ng2{6lNr{?GV>~1IBqyPlX(gEhY}alMw`~5KMc}G?D;imer1k;U*21 z*P-Xof7NoPguf>K_J4mqh9s!;_b+vlq2+*4?U73EYqA(YVsSc}C!)?fs-G0^URFj; z8+CIXcZ72hwIUx2M

9qK>|Man};1+FfwKY{e-jJ==t2Fo*4=Il;`!KNBjTm~Hl(xFeP#=Mqb82d~gqBeK6t!OV`aAMc5XQt57 zO%?ZA`Vm#!SykN7+cCS4?*CMcRVOhj(TG#UpwzNtU={JzA=yh>-;e^VDKP@)E(M0X zc(n>`zf@B}zfgiv@*wfZeZPoR6y}!}`LxL}ZP6WlC^$D2ZYn%TuL({GL$URd2G@eo zJFYhyl0=FKvE=A?Nn)>It9aNq?cmtXn%I!o^PCj$ltgrXaV7-8rnG?&`t0gkaK_+N zShPqv_9P7xO6<^-eckU3QcQ$p`=!Bql)y8pzr?JoiXdlhz{6@kJ3ZBYDRYk{sj{}t z6)dBzrI_QaeqwBQAl5|eAgTUHP*Vs*9YS2O;}gU9-47q!j6|yCXolkI$eb`@U0-ew zUPUOnRs0mbxslRnAfWA8pV2@7wpLsV^gQ5*8S^Jo4Rm{5^%?yLf5TWNBkUG6lV|Mo z)v(7K>`FiEfnnki5n1YD%VBjL8HpN2I&O!J9ZqrfBDoBb1xyy6K4C9ykcU4Wd;fWj zB$Jd-4bL^FD+(RU+Me6ljxbJPk;D%Q22cG6QHZV+>BIVJE)4VKo7n0YVlq;5&1%(2 zZ?^g4iFog@tO~`Hi?p;j3Dsq`KD*lL?{I{%7YI^Np_7Bcfq~x|r3NKEga#X(jgLQs zzk>P~4e~s6Q-^+ctxvnPUpx(&F1_y_@bAN_!6a54A2X&fI8mc7n2jBE zs?nYlIB}U20(JR2`qU7kHE3?VGiq%fOd%W-h`8pHlnKc^?QN^41TrjTUB|CGrVcO1 z4Jd^heHY>6n^psbe@Fjxa~|9=|991Yh7VP-`cI#Hi~1+gRc#y zM(%Ob*=K8>#MXjETY%$TNGrbIB|uGpgL0yhrM&~zwJKBX91QLF4VriiuIyykgnRfP z6WdoT2rvgvjd@D)fCR7+ZBhWZJ>L@)l+bG8u7G+a%RY1wEvQnmaSQp%obbM%W{$AJ z7Rd*}8BI53tH6*{DoYTI9*)jffi(n8nk|7YA}dE+YCjngN`m8*Hb7XwoKRZut*f!e z%wVsqq@)@_CZsoAp=~_?QibY zo?u^F35*ZJ@6+E|)M>k5eI8pcI=bjj=)u7PCqF|O+{xL=`lgn5&FkuTa)v;CbxZh7 z0ZxjXu$NJ`bJ#P7kiET7(dA{SdgI&tGSfG-bm&vXW#@b%Mkrx@JP*UAI3i_drJ{M)oYv5 z7^gA7_#V27Uoj&KCciUbIV?}SU-66`n5_Uz+H7Tz1r=OzTu+#gej^8_Ze$>SrvAJW z_K~%FbRvqlJ^hX{*DL{Mb*Ke_7roel~#R`^BvO)S;(rWd@ zFpiyroyJyQQ1F9MGK#m@OUf|uOB(vYZH?-1yIv7XyBnR4svSX#F22R<9B$g>F z!j1SVf682)l(;0NMsv1wi1-KC=)9&@sG=E8hqOQR`_}K5Co9Ji>L6CUQ96=LHwBzN zob2`4845fT7yPvMWeO+D-tRC68Osh8X%VoM%N`cowOK=mkeZD%l64=Ih{s9ge3v`@ zUoP;UhBg@~_hd~|n@zvI%c@)ac2962V!VoG4?ghmU}C_~XU%XfE#~wvE=Q?G(f>Tv z|GIWFE5%9xo$sdWn%1}qrw+f!ciWG`L50Ew=QObuZ?n|Kl{LyBref)98*pX2DE_Bf zhG(}(&y{Rv;ijcnd~(diuRR1kmJ`a|-St9^L@hrfPovGIk-qB1;F}VI3v>sJn-@5$ z^$vzY&1j*n`5L&HQ#W)F&d=cA4xZ$>HNjn7yqIZHX1_^MO-qfb(T$EY@Nfmy zziGu-1!b(Aos7Fty;}hGr;TzQRH%Qx6HT%2GgvZeU2($;>=ELwra?TAZ4hm~D z>SuB{9L)V| zA)UJ3lCmBbB7=gH={L4q!b8vrI^b@QdI;hrovprwElm|{@BL-l=+Yyu?LNTAX7btX zCOQDq=XSn0zduEH`Je0CI1{Srm*DLr2{qljCZHa>_W~Nu?zf=bdR?E6l$GkvDm%ZT zuf6+#*6P)?Wfm5AkUm_n@eQQQN4dq7WMjn%iAQqaQ(H-Yxmf!$gk${udRW40DqqO` zV6p-#(pPChKe~Nyn$l%(tAycc1Ci$Y2=V7HZ-2#IXER-^&HxKT;;($6KQw%~rCqt0 zf5Db2>O~cB=th720U8_eA{V2<{mGRY<>b7imDLk0w0GYk(&bOI#mnuTl)V7MjwNYP zpyVbI7Pq#8gPs&CTs;1Hx`ER%EzJn?2q=M_y+=zG-~NpttKzy)Ph4Fv5}x>c2PGj% zX-`U?d<71Sgzhf#iNF@@>%Ic>&jy7IW{t8hlVF(lGxb?vH=2*ksR+0NsnfOkt>C}fzf~V?cJaERRZW*cByjfZRmnU# zG!9{x=lO|05O)KKcS0?6NGk3~vG~?-xq*GY0`aTcw|WIr*<3l1a4FqDdVN%wQ3Xo2 zx00vsihVCsS&E^`=9gQpDx`k%c)qh7XL%Z>XI2)T^3JBts?H|bp2SJlk$H1TiQ?qW zB+JL!TYSNa@u7Z68rCbD6j&JQaaF@CuEkF=ZE-(_T`OvVA$X!MSA9tDEIqHulS*2> zWz0wbvqt!GjpO-&n;LA1+W!;-e9Y@E|r{ntgRT7 zy6Ry=`h-=CX6o6>1^id

c9Y-03PRv4zCt95Ao&taBRypQ2A1HlyyAnv`W^J_)=u zye!glRHDvzO*`DL+dcbno!_=n3QG3HZkFu(b)&6N7bh_b4`BlW)1}{8E=VJkSnf_1 z81f&>LlZxwT1nn;-InnK!0q~FFMbz=Fw-(2{*Xr298je83rSNjDb#^(cDg1|2=K@O zN1LW)cqE%K=3nPhCx;}BWRqJqCfft=*-W7d;BE}Uua5XuV+5OTw5V%1)nQ%G{NnUO zpv_|S4)1&9&u+B#Z^dpAY67np-Vt{f>&^hVH{L~5K~GP&(6p9ARu|v3EDLyD_=6%v z#I~!~6YU?B5I&y#Zy-ABdM-MphCHepTIheykIjK$1p4ATTjI|FNtyILD^@uj&qOwi z9~oI!hKm0wG$Lvc*R{8%@td}nRqab$B0VmHk=w<2z_{=8!w8{&FF5QKacV|{&AJ$s zY?~|>XWke84*Exh$5_ng(LXLjkgRq;ro7hzZvWF&1)R%kLWeNC~>v=yqvecoBeRC?|u)jjIylg+UBW; zukEYH2tXiUDyIIGUVwao&d>jiex+!{9~0hdq8jH5PTIbOfx2d{ZV_I|!v;pq=+@m< z%NFzwYGnm2j&a>F>bEal=WCVz8Pn%HfSJfVK`7qp@~92r-r!0+tYt6bukqaL?$eHV z(8?Vig=7EYgH0ms3c#3xpGsPB)V4jeEw+V*RwUa_0Xz5IjpJzoUJE0!coN5+ep*Ma z1e)|A)c9*oS%2@rZ%zO=$zFAR=X*s-K>Jgq(&5zG4gm7IZfxvD=dL1hfIWMt25@tK zDj~z3lw}dw=KLKU5($2evBCz{{+K?2C2sgw&@oo>zMQX&*=?|%dIt_Y*e6A-Ju4)l zrt9xIM*Fzj>;Qf4eJI17A&OD)5T`#jnKeE6H|DltD3Vj>S{$tN_knu@HD1)U4;>7e zE@x(mPx9CxJIDTU*F7CwZtTe$lVB^TTT9($4li8zvGr}y|=?MwmZ8#8p)uHSOWPS zPv%vufT7jfuW$F=XH64!Rn?(ndz!BRqO>YmD($K%NmpY#rn^Q{Q?)_A+{?g8_~w|V zfR(h{$;REPvl-{hZ#>~IHYa3URhN9r6Xpk2XH9cnbL9a$lEN06T2S393%ZUA#e4+s zg^>3jKtJqqzc>!|foM|)xA*MNmHaTymB3yo2}oWdWtJ-B``D3^iO)^|>5x8F+V+`n zkW_>Dg>=bG5Z&4l>ipYvLaYl#hjC8;a9*xaWf<)uA?4L+z@3axfa7hJmGx9#dk=$P z>XEWuT+yo25)*iL;F$8=Zfvvb>M9spu$rr)d34EcQ#<T!R z)(hj#b849Z24e*%J}M|s3b@~ze~EmoQBQFJ)2F8WK40qE-#Z&>_*_J9lXn0sR*H0v zcJ1HGGd_2@n(>!{|N2$|a{rpw#_GFTdaT*8yarEY^kJW}EorF3J3kxGP#46_CUo3v85B$iNKVk+m>!|;%`ZXEe z7EVhIJzyB!FoL>YCITJW&a|rX`8($bgI77$<5*C*OuHx;S)oWvE+trvDmKnfAQ}8; z-?M$z)IU0QNdX3&THz;~&$8KV=i2OIwV1EPQpN@b7AYVeS-924;1hF=NfGLVQt-FW z0nJwo$$J;(KiEJ3g5q!g4hUkevnZP*PBqdJJ|{u&#zss{cOIWAx4`&!E0A7o$p2Zs zgXT67{`Q27RG^3q5+m0q$AMol4cBhg#g9738g=~ID zn282}4B@!i!gtm%fb`XUTG0M#3mMVPm*SK-aBt?q@CV%e?`rEyAQbf%e~f)y_Xcle z1xocX+E%ozyrr^}@^SHyfn)0sSp=a&sAAU5F(6z`?}vHMy{{SqCJq#ln@GS?cRWT@ zz({B7^r`a4F?G&)(**NqFFGpOq{n7(@ETM5vcul!RPY8q(!BE&E$s0=bph8~Ma0YB z^JzVQfDJ`GAguEp6K~n*i|bk_JO-ycI{=CG3@gwbjwkxld>ACF@7TJ~!ez3B|2cl+ zsd1#BV?W)%1)TT=hQLJjXTj*FlCQ0x5sOr7r+Cji(-4dTK3pt0>R#Rb@r~MP6ApzN z!cqKa7JOOrKc&C$tUrN9&grY$9`vuf`b2qM@DclFAAh!=zYM;Gf{;z|w1BTuX_(=? z?ummQmj4FNo1+~@Vocb-$yjy&12e*-f88x$D_i>=-M0cR(WLK0P`LZ2f9JaI5+r`K zQi@>wRV3Y*bBxC2`p>&r1>(wYJ)d+^H(75|Hbr^mP!sa_J=u#~ehEGJR8m+aaMr>~ z&@g}2eN#Xo2zbNa-nz>%(9_b(Ea+Kp`&0ObvfnfC=Z0$EOWlvNmitwEzsi5p(*fO| zZSDc*M6W~pg&~o16978~%ChSn1(qkD8=5${ImQ3l^JxDKnU_+ivupdoKdL{sygW*2 zrTvt85Hi^`o^euOpm+Xpeh-N%XmV)i)p>gHSv26Z1O7|k%go>XaIzDIHtMIn9Ol16 zZ+7opV=4WWzh9-k#Z2U+Vg7u$5ZLA@Fl&!S6r4^m-6jxv#>P3 zyA*?_c@|3EyRGcdN_*;fDlhPhzNrwHb!{Xi!9ssDjbBaBzgv%C=6?X7cUf%aFtxH6 zz5TW(A~I&!tKl;M2fA)TyEc;(52&e&Mlke$Yl5Z>1ZX7%&9J{{MYjPk)f_797b-7| z9Q@4IoI1M>dL5}ViIbH>4iS!9A}+p0mduqFS5~FDhr_=)!j9R_C;K)hu)6BRCLP)* z2yQGLd!T;7g9-|PHs@Qw?dtBL*3MYmtmF86cif32m-%gl#BG%9<8ef!M$$5Q9|s%H zfiOYfyy2~|b!nF69|6ltKE*u?9y|cyo`yta!1genhg zu%8#BtDgH#@b0eJGyd0Sd#C5qv)Rs4>IUF(TWg@=x*gd|J9wOR5dJ}Sdv@J_(`uY;L~< zV4j!XkX~PvP<4F{OTiAULg8_Rus`0mzCP!bAn>ZibTR?y4Y5Y-aGV^>IlzZV5VrW z0kq^6fX$&NoP-rgR$wcYOhpBQ%>09{%oHZarb=DUqez!B$q{S25C$HLk%+daAc)-a zTf^+9h$Xb(C(Dmz>xWtygg|EK+yn8}RuUAxFl!=OnikObja-)>1mCt~$T` zCEdX0{|p*|AC#_DHZ2=%_xMJUUJv6rsWjW_PIK}0sk(o6v@H@+?$7u}jd(DFSRU#*-B{l(g44KKl40TP@ zWMCd|(ySNy_69s;rUi8x-+80#ZC7P?+FS&b6Mt(4R-rN4; z&-#@Kg-aD~CdfQdCXC28zXpH)R%$n0Wx@Hp9oQ)dNemLH9&hMn=unHgz#_+Wfc6I$ z1Buk5p46koAh=HYLS4r+c@YjXWT6{Gs{sj$jcDH4JtN?#?lLzJq3ya4Zb1zbYq#4x z&L^iKM@2{n5I@KrE;^U0kXobn=^A10C>lWO328DN8%{Y79o{$IU?@|{q?}C}-5t2r zWN0&8774Cr0%K1h#`)Rs2POI>V@)(NCt5rE5wz0?V7r5Y4T(M98+8=9gb|WK4c^_6 zJ7kAErnB)4BR>d2Dc_l4)zQ9`WY}Ao$T;&JW@p6-ik^Xy;?ywb=x2n?qF=)9ZZRN{e%*r>KC?QNhP6;rG6ER^@Gk~xv*>T26Xya-&&Y& zPX`OexlS6C^?Xd%_vB+$gPEbo3#!IKJ(lpBx6JQt6Dj2L%KrQb4m;w)KKO%KH}6Wo zW_dh>dlM%j+M7P4s&2z)aq-!@@&Jqn0i4E-sxdjtE77c7jYv=sjsyg(0Ji&equsUZ zG(uX>_ocD>{eU6-PbQ!J&oAE(Pd)D)hToDiRnKU6JKWH2}%_(c`~wUa$$fE zR)*LdO!B^fyC!(^Q_}&U(OLks2h1=>m6Q4C_72#|rc8#Hqbp@(0}v ztodwEnF+BuZLJ@rH9DM=0{UP1R$S5i{Q8-?zU?Yin1o?QxkEXLK9{#%tmb8^# z{jyjUL=1Jcq5NCwIY!sjCaaAq-7`diSBuq#(gN`-hZ+C36^_Os94joC9M4rbMRKKV8El{4r z5#!hD%`d{Qmb;gfzL-;rVgBZE`hv$5H-RR+**cbSYMk{B!_(Z&rm6}$j;#RIt$fj& z47)CKnx%9rgl)P8^Er3&1-WvUm9L(_2r1Y~yN-)T9-Gd8v5SwZT0`5rn@Ii(;Rj8B z9WIYKRP7ZN`|*slLT#CQYZn%^ch3r9`I`j9+nW+iO^;OP?a4!m!uS8^Cexl(R(~g; z-)x@nZ1+rss_uB68zz)Bx{}BG+6g(U&hXlg_j~=9Lrb^jer=$jYHGSkDIADW;ntCN z*R6HGBc5X)pjpcKHO?@SBON^y%kYwb?|MA{OEq6?Xt!>AhTS%LC)LQ0$|Q{ucE#~w zAsOge2<{edt~$zeLeO^Z4G0Ea#q|!4J0tX9V65PIDMa;9=v459tl5j_B2fw#mS~s8 zdvu5jW=abJhpYX8s|*fX5i~4_Lyhux1w@^P!mw)cJGk*MF4^}|njAmx2U_!w<9^8< z4hk-Ucw%^2l(5B}s2%gZGt5Hdrt9F;<|-uW(J9yvQ&}-irM|2>gQ1CQ<&=rAR-B_eBcIgf05z%g=w5wVyEWsQ$3H655rZn%lFpm7%z|F ztR`wYZ54%7b#;B?K<(w*U)kk`$zG{rFtiMloO_dq2)uWg z-YIxHJjt~Pi+Z6Mly4BII9yslsdLRNNNxN1jxT!R)|PO!-5uvuLe zrRXcFX}W9$B3=NW0b%x)=kQu%3fb)4;c4*Hm%beHBO?Ry{|Rfq^ZvIs=ZMEp{rPf) z0q5I{$qm?!Dl03CZvPDnTSp<6ZTmS#k(q6twEzT$?1;%CW4Ye zlA`pPv{+DRw%wqF0a{+BYYh8Eq;ma8EA+eddbm(fVf*))_MxHw z7}nV23$^z3lTp&kqNp_F=QeXmaF+P7=GcSRV7X~FJn_Ej{3iDYI|5bFG(rDuUnr#~ zw=59I7!X_tvuIbZ)ej*ZNUowX#|s`iivC&n*J){iKZi?Mw+~Z=9Gaa$J9QwJ?gI~o zfcysu6e5AOAq7)@8c2NNOlF>b!#8M9HOPEr3($?Al){w$>qz;)Qy69z!Hri?P z-M3?2BIO15PNM+V_aCR|Kv*PJzg`L4j5c0xBOtBc(W2xkmGlsuOsX`Ozc{ zC`BkDVZ;`uo+np6L}}ba^xVEFA}|5a2T94)U2`y>`nSSA3sy_a$s+YJsB(4puBE49 zgZ2G1-WH6+e+DJeYrh@qZI1+Cpy5-~xh%ShGMotD5IAe33CGj&U_Alsw zR=k!+0mAnQ&Ic9I8&y(OTHDy9enJn)nGk(x3xl|%BeHJqTKXWZSlvUS@Sh&L9IpI9 zQQFJ)BnA1WIJ-Z!ttuP;%De=j^3R>PT+Vw~`GBJn^1r0%FiJzWs`0PIQKZ#+tvrIN~uaJJ??srk^-(;QmY0cEF`YX+~! z>JLoa0r`4BN?2XETU@jIy0G(WKOLi?yT&44NEbx7h430dyO~whT5RfdV)=b>krme}8S&&se|r z0wVhFT(QT&@_Y|?phBsX!L%<1a2|yz(f&7k6jhCjAbY1V?U#RJ144(BGl6Eck`#Rc zw*~ZAt*4R!mRAbeyg#@ z^^gM_d;tc*hN_kxFkJ|q{qC<@SmzC-GLGAr}u`0m^Oz^{0ss{ZlPirMFRC?Sa@NRxmB!uuFT-asR7 z#H;CFHqgTCI8~1+KaXvVd?ZN;8M}hhQX!a3Mz}8XD5C_B9Be zOY!J@(2j7}tr*>Bw`>4>$nk#d+&Aj+zD0icmwU#w ziuSJUfJl+XAEwo~um1n{EFJ?s=XRU&50mN#O)a>$xDTk$RBL601%QVfpQp-ktavGT z+kc~+3tQB2n!MC)OTX>dtrNh%d)rGD7RPg-j84p_l1=4AM$zA0((|&Z-w_6$`p@%a z^S)tz@6SM^W1fpQIx5Negc{x$3_Lq*WlS5N6x! zaXTX%TlW+KzZPcMCqBTafRNm#SZnP5dG9M~NQ#oUSZI<(@|RMmHwNWT9&?3e{$grE zbp@R5OGQ zp+%D(Q!qYLw-gCRF%$V=_8qGeQGoqN71?zV)cJ8i>|#Vz1W=In^9WE1I<7NBlY|nA z+shyfwtN6L)fY%0u?`FKGDV*{Gx^9>yvurPbBMkBF`;XV}AK^GsM5@6MP3Q}{ z&b=OJT2Z0(-7L(hNgYm&4`&)pfGuJNUoh3tI7o&%i^Kq9AYcegUZc?8vDvQU@s-D} zQ&&|t=E?utTRr<=sJ*V=Oxr$-+hvNzp^yn(iCIpzR?FFZDd{hPmwSx{#jwVNs5k?^ zv3iaqaY8R0lj8?@Bl?jnC?Rk;bX{{%QO zUQ6pZkjvrf3^Oa{Ig>ePdgTW8p4q@S-JSKd0LG9TA)z(PXSNzZrsu-+v;k~P%~RZG z6S~)pzv<7a>M{D0DaqwBkD+-c#7JQ~HivQ2M>~Li(!v4u=k0#UioXd4*$by?03{-j zmK%@b5N zFAnSF89;1H)7(XVKOgyuOYF<&Au{5r=Ob}!6xaJHLE-@IK4yT0af-1Q0 z4gNd)O!$6V*z6l9W2I0wu$;CSaQWKg>)>hL@C{|EP~?;7le%95`gx4Af)Tind%oGE zBn!s2!fVs8A#Z6$@&I=o@_kKm9GuA!#^3V1HzL~dSzWk8N7L7LkpD|Bd0zPs7$uNF zsVo8<{h>FbQoUa&IWBlyw$V>!jT-?F_}45GB2A&E0wV4Af-3%xfkgI7MIvituCrM4 zuzw3>s`Y@NbAPdBJgm5;@3is2zqatuNSlw`A9~q&q=!1xEuVbP27jtm#~BBUt1_ph z*T`6U<(l=d$Ur-F#JxKl8Bu5Fl+5Chn8l9fqY&PPNwVZ{Qc-)jY8LowM4=4WF(|kS?tGjaxidH%|6F#64t`n}j|L z=`AQmw3J-<_B$A?m(%A)QUfl47mVC13G!^)D^ZNGK8)4X(Ki=JRh8M>@-aUw{&&^3 z=Q@UgpTr0NHuzkq^)CnW`*d7i&;{KZvTCU-AjyI-Cet$j=LSpFrn^mMqj_)U)a2Dn z?Vd2AK!;Sj>o=&X%_8aMTs-o#tpI*ZKFGAR#A5G!1#N(HJr0TLZ+tpmS|Qs zH_HAC_{?Jm5#2eh>?gPNq)RxVgokp$VPC8^<;lR=mgb)X=5`-qGOo>R%h*$Z9Yb!6 z3A?}7c7Hj31^^uC@q9ZeX_~-58k+MJI4w4FWbL2At8DY}lSw`R<0jKrMeh)*oWXJ@ z9&04pW?<`UTet!&l7LtdvoVCDbA^5CowtBERpXV3(;L=loZ50vOo0ITdUJA5p7*4r zAVz8YvaT#$Yn--QPvz7Gey$vGlg>cPFz4(tAtA;*+k?Q2YSAQ2f*BdS$nWdF3OYc^ z69{x0I77%n39=hm<9q4U4CAaa&@*F}AeyC=d!S+&6^uCyGn-7~a1V^sYHTQ?n|Q|B z00NdMvC(Df%9XRD*HOUEjK3;UaBPgM!?q zPQ0)7%@{NoV^qa;XB%@TgYUW=a$#v|*RLS&%Zsf71e~E9VC?!Y0TNfgP4i{~u}VK~#UwWc zcj_{%PrwrZss$_&F*d8L9Aw4QsVCwKZ@U~RGwj&>@4yVXq3{}51|NaBr{ePq10-8Xm_c2j4l>|V@ zpF;xPjpwenb5o{eNs25>ehqMkx8VTGIQKP_4O$r$We9I_*&RZ!^Q+(=%Vrsq7YuDL zhuY+FuQS7J9L+sX4+XJ*>ka@uj@#R=w<*lBdGaZdu%Z*&5+ORn6n8UVhM0?z7a0GW zKsFYJ=pk#P(f`LnVk|&OL)AEhCvsQFt48N|0M+kn=xh($>v4-klt?^JEg-_UjyIg7 z$BrTp#4I(IJL?;nBkfRwq2xYfFe?ZRnRxW7m`fh5nfIf|{Dn^ASw8~`X{v-P(ZQCK zNf^5-#6D~FIVX5q78+IseB_NB?+v);eubv~y5l&VkoYzxsi5Bqd_=<2S0s*s0jW(V(a|k*D zWwYP=Ug^EAT13S2fEHS0uVnUjtcVAo7*8gOJF66gPU5rZ^fZvlkNj2&0Ph0L5gTBpv1JP=>W%GRE>p%fcyZGI&3)!d0+gwNQwO-Tp zfJyHaP@J)NXnS@OgrsHi7RJ7;uK2g_Y0EzR&FkB*nu6kljuXHOLx?0`pp}yK1_CIl z4?HU=BkUm*%RX!MYy8!BNJxkbI-w;(X9^|JsbKPiU&&Vd65~gsq8AW8r|OXUj;|#xDTJURi`Md+lci>Ny{4MF>&V6 z&Mkfd#oM~~%LTFC59PxNkpMBmZEi`Pf^OzR3rPF7yOA~P`+Yp*m$smY#o)1K$k3pd1A(kA^C8+3ypQTb!b% zxjh0ky^3o6UIgSSd^c0SA1Q+z9E)5Lc8MQ1Al@) zCQT`NnU~8bSyIug1LPUjB8f1gO^%@(WtJ3cU+??Fzn~>++%`R?8K!u0HgEZ^RwgB6 zI-3J4U2J41RV*pN3kVLXl-6-<+HSbsPJe8m3YBuOL^26~-mL>WtllTbw zb~SBq6#&Q3aT$_f#xd0!k!Dd&Ep1wCmTW0AifeN}nB|%-G5xdWY-n))4230_@oBfq zVX?vk0gI?!v$#<`e|@o!H}1e-R{}Om>{`+tjNIw0s@Zn$9b?EY=k5HcdEK)wh^{i@ zYi0tU!VJQkaC0u;U+?6$4GokVBR$Fec0QLIO$rmNJ3^EBnq4>iP#ApjD1TZB@ktnI zjJxA4T1T$=ON%jQO&J#Qxln%V8^PIFYEsc=Vj^?LChHEnw&?(Wt7*!^e3U3?x z6_x(V9i^peYW=nYE=2Vky}OmJP@IvJ{LjA|y^Z@G_cPH28>+w$=1gMudHg z?qllOUPy}5%I{~P^FVdGFEGIu3>qj`rRJ>0`!|*bqs+jw$WWK1L56|m;?qJ^QErq)iu&y!L#<(l|q&3!k)nL!ZD(0Si? z6mCpUmiF zb$3n2zV*IpRrTlV8AiK==wv*O!;Gqbp|$|e)?cimt?U#q0+0@{utKYgoPOsoyyCIQ zfnOwS9-ASSy~}9CzF9uHY3tS_Mc7@LB*7wQDVDd&7MPZs(YDJH*~Moui?Y8jj?}c4 zwW*NRsGSSpue?pkWNQ5J`|*!jS0w-Kj_`4#uk+%{G%w#mitS+qw!r6TEbw+Ft+wGv z3GwMjU(`=~dACk~tjIqIM<3JNM*=yS0}O!`htP2KuY)nLTES4CeTAH{Eq#XOPuG=R@V2I~Fz1`3MAFO+_Cb?))W9ks9ct7B;ci^w;ydp*rr*9XEBEH0Iz%xf9j~ z+$dZ)SoPNqXxgwjuko{r`Zmq|ntpzkOSAEF86(0C6K22#te?XGJ}FgZ z6ueETp$z&YQyX}35Jm)x6PGj2ddk?+k$PXVC}?J}A@Oho4SjP!0jV~9ew6p#Mdd{` zV%;y;g;rqYKY?$yX5=3H!SS^K;rHtTuTn2h_Jk9$`tv51f?PITMO7Ka{9)G0pb*^X zLouKeBf8mFa-S5;MKb;@pCex@36q=TOVxi}$erd+IU&CcIq0Ok!)mXzPC7u3HRtma zlA)koMSK@~1Fbo9WYL=zkEG>V%We#dYxK}>zzXWPeGx_Z zr|t?QdjIMJ;!b_fYxRLnEzL-6x9h~~0^^Z@q0IUUfZv{%!;ECt|h)yotu>x@DyVOpa)V zzknVZua|?gis$38D9jH*l%Y0U+qO}H_N(_3c|xlFCT+VAx>2>yQW{IPpQF-6&W<~A zT#w7fM{Mk{;^8Wi*2;*p;A4Nl7R&$k#WAbaRMLqUsTRDfcuj8@$#2vAn~x`t%PNEg zQam;|BxQ>bT0N;_F1|}@+O|Rhw(F5pIBAnzq?L!}0qU*9gA0qx)xl;DAJ>M2glv|n z=;(5>a-Tz`W2Y!Jk+Z}*N_zGR5J@d@#YCEt<0dgfw80kq-*hwqV;CwJYJ9SBZHOT0 zx`|N8FY8QYG#o48+oT12Ku#H;;O`p5$Vd?I-zyN8P!Y5%N`RT+9gp)rn<4(eCxQTD zg4oxYd_C*O+c-LOrj6cqc-md|SC#tFm#VTZVwV^Hpka6DvKWIf{nuJr?hK}nBXNl!xqnJ~#x#u5>Y$?lMa8Dur zq@IO?Xd#uxrszLHG`~VJ$aP&N7u?f_Jnl5PwCanw-;Tu*`5qenkuep}^aXxb3~t_0 z)en;zjc{glIjvXMb76BC6U*oTXv|C03yT+x(_K@=+($=WcX^0D7F#}B0E9M!r$WuU zXk45csyA4_tuLn#iWm#?Mf>IPy^TG@9r?u>*teY6!*ZJ(t#tW5Bo98{2sw@Bp$SH8 z5caF98`qm&g6Pf}-xsQVWkutVoSsq49g-Jzcymki8D|Hb&exTL%x88Q&c8^fVH7L$ z(eZkNzgKu*aN@$(587lTZUu=?H9++)gknbL4+ic%)n%*}`NhGMeuGai*ppyOY7SGR5<@?V z$pu6KcOScsf0cU+%EVk5padbG;4 z^^O6$Nld{z(8o3TNY}m{X7I?piUt*TxX9cJmpKB*nYN~;USGL!$JgHX=nq9u`v4t- zCDq9^`uz_`(x2rFHT)4{F z-H8(;=&--AfT#9?y8rYMpqKO5<&be`jw0P`jxk%RCmTy3Tpc zqUzy)go=4VNstQUt-Vf)PDE}35%}W<;DP}BoBxkOl6%n7d>(X66ZTDeyl?Zx**kaxt`9`>Pzyh=d^A1DUEpP@`q-U zJ|pl0T>}O|;uQ8g6~r|Kf8({EP4UFFKx@6y6=&(eq*OvnVWxR5%GC^ia*0+$!Ub*k z11IWXzaxA<-0qv#HM{l=Kua<%g~m2Xz|u?aS>8MOdp$!boD#Dm$MWkR6@C&=x!E7M zT{sFtgkL3#T&A0Ihx^cb8%I?k@+dr_KE42xRTNxgmiOOZay`nmC6(mOrYY{aOg7^X z^?V40!NE`a44X~E(H@3fLeCMG%{C=+>mPj`P4>a3Ecvd#=RUe_lNrvAESA0RZgP<% z6jXc)Q6|Wm^KT~YeE-S&+KQHxl@ZjQQXl7+#{6U)whRmvOz zmfXNQw;f#$q@&PF`+EMCg`iZ=&+WXhLvHq(!)lWuGI`lx4|uwm z_?5`btm-R%%EWRS^tCaLrSrAVhPYd;o06-MF9&qfA~Zy&c^xZ!epvjWrcBQqFs)yA zS=xAyyz|wp$%`i*jEw%7^D+@{z3`qyVWe=N={Vs`V_3q%=WLK+ty^E+PoriChk+MN zk*f_<)(@UvD`ZAEgY`_IRn?h{k5%`$oKhfVujI>ib+QWmgjXBgz`Epw8a ze^|N@VfM*D6(}TW?C@{@_SrEWhYAT_bW~X3a(UvvpCJ{;_rQ_@iP4la*)CMrE&l5u z9%%n`58|qxfSg+H+7!%$zlrqG_d-_^F-$$y{~D6FN+NR)sg9&}LDuWGx*nUIl<{nE zuHMNC+u#rvw|X&~>9MysRQnvW=7o0fm}taU8P2 zlbID!4@g=_qbB~2^FGWcv2;CrZTBRHwgn=k*-8MlSvI|Nm>ng`z zUeGQmMH4?Hqoob=x5|(qv8>0CGr|{P4q$> zW)pO``;q7frRT{dyg`^4y>7xHz7s}CjQ05aaOgnbX~ z`qQ)Wg>jmh(XAB4Pikp&>(SqDgfM$fnmTA3 zQ7yO^QQWe_XqjAOMDiUR0VHF29*-V8Ah8)wTlcj$);EeKIK5}iAoRsGVT;m+Rurzc zUA#09vNm*pH_P)h4V-Qm2`V_N1EC3?J{V`1YJwe&SVl%Ii`>zZ{ixTFff0MriLPd8 zQH8+y`pvHGU=fPYS0pzRIFjL#9OLbk(jX$kFJpo+ZI=Sy=MJ);> zcYi&i>&;}mw%#7SzIxyI?zaW3hx+|@UINZercM2zKiQo{gZv-a-@K`*p*CEH`7DgD zhKmSAgUTEZ91q>PnwR*!u766DTHtf%9#bxPE@Rzo!6!37F zWHK8qU&k8*)j21@M_754&6nJn1)HvC_?~7TaY%hdbMUJ6hv%FW5wyiz%eD^Sh-vZV zm5;X#*tN?FI(tLWJhvmH!_m54o9h@=XkkxU`y-?;Y-w)8x^AM?ww5II_@2j5Dvx>M z1bl$U7&(^?I#lk=D5m{EP5Xk;fyaV#%oadGr|7x9=y_cf^&zBs9vqzDD4?%moc=sU zEcy}ixuySEx7Y4Q71Tds+aA7FyND~`D;eBZY|SUIh(=RcPDoXVdr<3Q1*icN#(($YkWG z=&-Nzdu?Y@#HS>K$PehO{UyoJY5>7?3 z9G8@8L6py=WS84KDyFTCBHPmv=y=58woWDMTj4|5Cu^A6HAivqnc;;K_ZFI#*X*@< z52`#~KkrS%vmN<7)2|i)a+JmVZ|i=aN60EM16r%wI8Ec#lHo21ZJ_wywJn8v67~{bHX@6;2r^+8Y=77fwkm!3^ z_b4VxHDLWoD29X(7H^G@Br~-z9+~F_<^Hl&8!PiJ&T}(!q+&6xQ0YFd(X`B5N9{R? z|FO=<&^oiUx`_Pwo?3er&j#yTlE#A4fouly19~WFektYHe69+{p>Qxb({b#V-)DC> zb2yr8D>Nz0{6bQgQv`aLaJ&;WQ|F*Cp)co>c}6C12_zYJQur#&*d7|uDqCBeJER2L z9hfg=D7<*qfZwLU91li*xzRMwah~(D>3sN;dP|t?;#wx{C61?*A`yT~si1Ma+56gV z(!)Ie4UUVVxK{+6$i7W>Cvlmacv-ZgGSKrvU`OuSO8;#&^GheSNSO+s8I9`5Z`XVE!w+Y996luw1FBWUOObKxEYo&{ z(rfZzRdr<+pI0`LYE9@xVh(R6w8J=EA|*k%J+&hsg!6B|!1a5-(KnR#`26}j96GC34zmAn9ma2}RX*E%yHdxvz}~>*2KeoV`q_TjvwNKG z@Od7mIH$4PrzP-<`j}tKi>oi~0-rBsU+oD71@wMhw+wmum1TwlQmU1-?rX(=W3(Do z?^rn!trz;RL@tln)Q(^j@Y?@Wwd^8tZ0v*FFougz+w3?^cTVJuz)%oeJ%jpg`nmLa zFm&?jGVnd7G8mSgSS|wBmU_Q;)Ej>~)OUKmRF-sf@r*ol`ymw>!e<5R`hm5?U06>e za8WmEXJsKBl74^mOkWATz~6Qd_e#RK$q~zsOUV7W?$CwysFO5Xkfkc(A+z6vgCgWI zUMWcZ=JKVS-GtS_li#)Rf}$YdPd2HA_-n9GKT#I(6F^iSFx{iaUbDH!fXs{Z>uE@Z@{0uLIzpJ4qnKPCJh zZ}i8ldBFWYH0#xRzuzTDB$-7fQZ0_SDNz+QA@fU(tizT*R(Ia{2#vWZqy|_D4f#y}#zkU@{vKS7lg+RbrY80Z6_m5gigY*7rn7ZHTd6^rp zqI7dzzBd*Bvtd!B^xRSm@}0OQn!HqVKUe=V*dNc9lnK@}<0mXTM1AkKwF<82Mg0?| zigT^0&&#K7x7k6=wXtB?95(YRBHLkmclUJLG*K5M7+T(-3VULJn2|#yTpwgLOh6a0 zclJ?57ynnw`i^rqO#Zxmn&1v6qswLJWS<`EHU>nS2q+h=s$X2aJ9#pjQhWw-a1Z{0 zTbRfeq)cJx+jVp2jC^mGw3p&eV48iF69u}IzQd2HNC^EpF}Wk@C1rK%tGo#*L#iRm zi6ohXZcz;=+UbWm&bu)6=97uDe=}@H7^xhZBUOryIjcW5#nJ-*sc}jPq3lKi$d-Rj zQ?1*5(p}Ey>YR@tjm?QU*`9lo&Fel_K0v4nk3Xj(AUTKmAuUDELo|g%(~=fIB$Zgr z?6H=68w&YCvQ;kAw_iTL6bO8zP5a(%BX)f0@?1RMCmp3{XvK*K`akcRiU_4iWDqzL zzvnmo3rKS8{`w$X(lm#UIX?^i-Z&^dF#uGixvGU8MJlzZBpkQR+CjlD%0i!Ry)LE= zD3U~H2GgVj7ybxZiH@GwmuNL%M{u9|$kG2iU(flsKSIY8v&*A?eLL<)F$(x~hN`nV zC7li@2gCH8Z|wB4+3DKc%u~eSVIF?2NJX-nT&v5EW7wL)rhGJbEC1#HDi+Wcei)94 z$Fe5E(x#R;AAsLm#fCNRb!e!xAr>*rW%|cW=etyNcf7VahNn=<^P>5CM$k~AjfV9i z(7J~Ep+Px@^Y$8i(3?JBa+5rSnjbM|1D@ zX;~mWY=|AW7sQ%VajzyrNXeRL`FwGW+BdhYpl-t1TF!K@P8{c&-HTq+)o%OOWNgNN|k#4sOX z4m~a|5e^7&cnOkInAqnD!@~n0)_)<`Fd*0Tae!~IXE~ms{!2m5dsN-)cHq+wmT#@g z2FnN}t&Lp261Qz!#wNC_1HJN|^GCS!|9f|S3lUkZL8>^J7^$g&PXxFl;I0IiGA!#S zG7T+7NkGG;=j||NM!mT8PP#OZ2n=TN}RE=Usyc>ip>~YwF{8 zO(dU2irYBn8L2{yr_pWPcZh4v=z4z~4}>BX6XgYH?uxp#w9)|+qsyY^7rqt;?`!T9 zgU?H9$m%r?hxc=sCq0Q!$_N3vfVlP00MuTXctdcAR!@=Wysmc*(I|c?mPme#d7V|c zE;mBdVTAvg_dAWsHIq%&-cS_ZO(80fPZ(4!K({K@(i(GFs3oV%0je&Zo~sFHT4jG@ zsU^{U1h32`73w|%9pGt=hT9lIEL;>=|K?{PZe~**F$8ldiYVM~G=xqY2tO;2MFC;! z+vhpqm-l);&#$0dp)z%!{NUs_2H%@{4avF)*9t2v672**MFqx59IdGVElsYE@Q)+k zw{t#ci;Yw!-nf|}7_{=+ zngI+v1eZmBnG!@Zs+a<;DjKFk&#?)^X(m)*L?#ZOrS1p}mc`mj7@@a+NgYmU7apWb z5RxbeWRktcC}D__hn}fKU~_?3Eo%A5Zhn-_Eya^Fi>RWa>S2z-d%SLN4+7b#L%kp*Kg zEzGmT0mrl*x+XkCVSj@ZE~Dl4OBvJ_gPF~@%e(u3@>fl3wwudeu3tWgt69O;TNnj; z)V7YPMs@7+Dy`#-x)8$7hMlXMmj(At&7G6k^naoHLq$=SFL_L$p|VM*`QP5e2|rBB zR0w?1Xs&=$?v6nm4m6NpNc(Uc)ZCw?cLZv7Xp#U%%9-Dl*H--qiG2b5Fzb{JdR2N| zuy&6s+i|%*-zAg)=Xg&8>&!Bz--0SGzw2`7oSqKnvWi(Z_GD`3z@mloR6MD=jin`< zOm6X@2Rvw(BCWiy{=IzXL07i`lG*jFz_+hw9JB%@@1l0Hn_t|3wT22tQxYqRf4mKk zJHF5fr!^mWagibk4>b)h+Nb+-DEq& z(S}XNR1>aMa(S$W+$=vLEvF)kD>!$CsI);{xjm3``q z^WJ!t9WiqA!i|6Rl>Z$&I5Q2XYK7U<3EcserVB?=vf5j)pHK=U@0JqwK+(+KYA=4yw(a&1} z0*a8(!a8`mTcMXL>AlMe$0^W<*u1?$&F^_u*6@YJ7WAyvUQq;OXmJ(s4yhFx0q(bX zND&@~A5lK#NpDWi$wYRp^Ee4S!HDvQa6#< z;(7ikd%!3}@0{rpUg)K1>;t#}vQHJrFnVJ<{YwNdFt)J0qO#i7)`n^I4MmC2Dbsrq ze^j4h>y(m}N$j=nTnP&}?}L{xL8E-*OVlz@F3pRLT-ttF;Gx~7?u&;{BmL1gnC1r_ zf#%@FR)xUJa6uIHE_3VH%Ajt&1w9mUHluD>C6?QoA)h&#SNY54GYZ#Y#vW%GQjj^O z8ujw*Z7&LO-=@cRPu>m(>O%A@<20e@*0pHvb(usWUKh;gsn&YSWnzmC5?N+7t(z7x zGD>%1-(LavefYf(mpfRZiAtQm^*P8-TkaAloR~ff+_xmyHdi>_!yC`+yxt2B)69KG zVg+*}1xdMdA;dCruU=f4m4Fr>R7bs?`I1Ct82F{s@Dv1)J`Tiy)TAp3Rr%IDo=;;^ zP^&dO)#^0hz(r;!x{4uuOoVMR@{204uUdpDaFHl{U!{T9IiQY&;d^i)n0m`uUY$!W zWN}!*`mO89Vr>*b2^Jhme(wqx?wTNSGqK|{eE?_UnbZHo90t{AP7m5d!~4YS{Z3OB zdi*1J?~CFX$CvlJ_FQ!ge@-uxUvXrAJni`wlrw%0+Ab~o)Dy|nHg2Rfq8jP-_r{p3gkH zy1~`T7~|vcpboaIHs$kl_U78og0=JrCRWSU7I3cTXk_S}R=*X`I6=NbWhz7vMp{mZ zs&ZPg(6$uB?FDB24Eo)z0pC`oh<_qrtjlKH&opSOfV*AhW7~Yh_v?DE_(-t+8^6ow zD(U~GV?>5rdftG1sEhcncCJ6XZw7Em(ppjYZ^&`s)t|x1I02VG7ht-2zebj&^tD^7 zYj0EN5+Z6UxXX_}TPl)&Bj{cw z%IQXZ7+}zprn;2FmgIRuc%^lnu0dWz8}BEDJMZ2KHLF@PwJzPfI3A9ZQ1A}DG}6RU z&rw$v40WW`%;0u5eIQn@ zObXP1>@$Zh0>+u(ribQYja?|eUWK2{2QwO7H~d!C!7Kvnnm?U4N$41Y@YkqS>J3CsA)A91F$Gsqn>a?P#b%|4qHw3N z<{$B*@e)v*Sh}S4MVOZ(Jv0=Kf)n$2%F^XX8{h>tzr9uk9=&e3LlrPly=rCY7E)Um-LPhJx6KN2BJnhXd*p=?dV7NXzJk5Uq&C%5Ab^7MVI6XD~o%bB|eTI#bB+@4f}=@*`Yo)#MpKt5YoS zh*>*|fboZ^oPD*UZd##sXTO*Lq&(d(l&o05o^ngcL4#(ZrF{0VVz>>~{bMScVF8S> zEW$xvnUL$LSafs%OR~g>jT_8tNt)sg8MkHkFsL20qq0?q?2b#VR4wB1pd$~(>MbLZ zb@ssMOnVzxL(O7XL20s1;nfPPjOn@Inu9It0>#!*M=+{y$H#ZE`sjSo7QEuX?L0cG zY~MN0e|#j@#qv~4^(C=X(GJ`+2rCM&evjGT*+ezz*RjuL4(;-CO!am`eSQ($r_U!p zA1;2zMrbL%&~tr2S}?16YryJX)IZoM*dgoEFhnv!9UUxNY%s!hvmd=xr}MVOSEQw? zyNyWKQH-dDl~UYWkEY;E*A8IUU)}ym59h1~Z#%#c7QIf;ipf@DHE_6o2yg-A1JFZB z=W*IoG*w^*mYk*S<>L?)w&}?PG3IFy@Rpv!?;y(A7=#)5A2yHK%hlEK99+zI>&AmW z=*rTEU(9g_(-?mD+|L+g#bUhP3A^K5C`4U18>XvW-{LRubm#W`V?WFJJi;SS`mgU6 z2(jD^(~M52;pU~EM0Puqh_q+EQ<{lhW0AK#I_UjkSc3#XJLGl4NnLr7Fnc+8V6||O zT9ghPHs-FIh>iD4Id+Tf%~?!`^o4m~_?rH&&GIMVmqXjHot-DzxPuAWBdBqFbmhep zwvF9oNf-ldaZL7mrc&Q|ds;ZOQ{LTnjjKDiq}u)N7X6<2&;2h(D;y0}bdMW(voUxh zf4z*p?;ai7KW0G41wc0_OT3_8y*XO_b;z# zT^Qi%fz-!qoR_BrdcEbJg5s|7k-%Q~555gn&Y!9itGbH^vH5yZjMDsPxRp$f-TM%R zpx(grivqG=TZbP^2rAjHHx`@b--xA&YQeHbCgdf`InuCC7iP-f5yz|@HAp!L9kZUG z*XqSM^cwKf(lC@}TrA2I_Cp~ZnfZ(wY%CU`d~$k z8mIq$$dG@(Xcsn8)G%w6mf$F6;8roz(wv`2<-9N1f7u2ttT{a$8Ux=R@wgS+3W~C9 z-2C92#Js|G2K;>|-wm9mDJLCqg?xt7GIV_ z@tNN)Pmb-%lLc!F5?F-(?sEHyeUC%UVP@?RS17bgGFq_;>`1VTP5Z1rU2Z^x!xEI1 z1+7#xmtxY@7Q=Q)5TIg_9)j%IM$wsGLGwUdE5)ly= zb{ISE>YWTe(`Nb*NECWA&D| zNfqqj%w_pQ^@p{|0_71T?ZFQTJf%gVkv9#wQWBCjS_P`><@82R&%(y8J5_`i_KowF z6BAkBHInK)@f4CO030wqr|JB<*q|H*VG^Q#SlVL9b3=4dd*$BUImr$T(uHP&Wrr8n z;iyno@Y3XG6~V1yGFeZrectqH9EsBMpX z%<%!~H{*+(I_FDIly#x+2KB zgi!b+rX;~pis_@3C2}OH3HSe=H6nxFUDn2+k@w~Gl8XJ)K(<}O=m1oKfWXd{l@Qg? zzOjcN^*97&*8*eW=3ow{MLvdtLU>Bu7y8YfY6H$zDh+sB=`(yc2N zBp!MErN?;zQ7@Xe)B=gI`iC8UmR4ki7b|vP`vU|axLS@WhBw3+zVL*Vi#84 zVEwu&zr9&XkTDhD-m;0l&yfvIY3<<{D@#Gi4|`l{^HPx4u#tUvW1q*%|2*!?T8@P6F|uPf zFwYUMdJ#`r@er8HI5Bhxy~Py6Z_65XCNt1Zj!;m*1ofIYnzT-3tFHK*zp4+Ksm!^O z4JlUEF)n+;iur8bE|7}{keA8UBRx_XW>G_MHWo|xI!`YWALuKYw~zM#5nKYI+2*9= z8e7qTl?c=@M4v089bmNz%RRNfBCQ^S5n7K(BO4oq4jm7AkyJ_MS^Ff>FD7L>G?4c# zClyf+riGeG#i1-$q60`Kt_33?i-^sFC`XxZaycFu_ZALF7?wM{(mw7FFOSdZ+{>}= zN`RnB4_?E%&;2cinv=bI0%hYP6AzZ6*?uSsn=vWqwW$$4_9REappsAo z{s54J)gvS$;Zr0WJ`cOdDi`sDAhH?(tF*sD16nlw%2bMYwxh>i6_i99XvyX^LRLcx zN*2f-YSAEf*+dH?3Lg+^gJqAt&~hsU!jxOu(he8OzZhMgJCd-WLvG6Xq14D37(L#n zWCvj95D9T`v{A`KXQ0aGAWy;nCi8Ct7K;;GYYyL-!>n__Bp?e#m|?0oeUf#Sv}6}~ zXlydfFL$}X5xVy_C4hb<6+imKB(4zQ#yvWt;$r-V{w8#w$rJ$a{t`Fn-5v`mt%g-g zVSGk|yd9-njOeL_T<&(i%34|gFMAI!y9Gv}b-dA7D1KsW1R`6iomhNW0tyea3kRRR zCwz{%u0&pu%$TLqU(vTKKho!4Ip%RcXjm&PZmnuf=ly8)WIy&H>DbOTOI1T%lON=r zeZfLPr{23H8yL+<(E8_>(svn@y71Cv_`z#1kv_LM9w{JnIW#f$1*c)Pi9d!>5@+f*(1m$fvpzZEVjLrFBSD8&cz6LZX9{= zV_AJAf5~9!_iDb;6FZ?#QO=O;Y&pGih0J`bqLDu~hlgz8p5B+Vc7ydNn*>ZzU$HO| zM?qj1LT4Po?j|W$22ujh_<`%yjJ7*I$9x zpBttqyD1@2uW8;!Z~>&Q6pm7q^U>9TLuGXC7k|8TjvS!01#1mrgL^fp< z&|TBQ)lOXzpgEjAz(wtWqX*Z$%lHS$qe4vHX?;2V2xNJG(T~jQ7$KUVqjtIXIEda zrDrSeJ_#91bEBChQ`sRKH#gQ<*b9nK+? zO%fHX)^ZXEoI-^q56meJ80A>D$fRhLq zq0b^Do2HRFPy{rl+8GMI(q2vhzcY2&8R!oKx6G(67CNEtDd$XSH=c?QS6D!_niF>E z`Y!mu_E{XWM|)aV9S{5uF3597RR9ZeRc6k_Xx)7{MtBQESY9ARKFERd|cTT~LmV!-@@N*fvNQ*p6 z($a06Ut5Ny5xPsEbAgt`M3r0){#q2fG#vVU@BsQx^UQqwIT(kxlWW6oZ8*BCzK*ITFlmay{UQP?j? zU`1aMw$J4E%`*=NWP<=bl*JG>GPXJ-afOUZy;1{8go`jB+<~ z9Wg!@_4K&0c~p)SV={6b;RlyfQ$t{5@>Ozxh2%j2yz*JcdYXb0kQFVs1AB`kX0!{gMREl5O`R;bn{%WbV0}6Ab!g4gBkh8_2l=_tIT$}wvk-8vobyiC@!@xkEE=0q48h^}lpjS&V^$N7?Z~GR zU1eTF2$}SZix~WPMt2=CNj|AT z%+BP-VU%38NX&2^gYO7IJ4nxus5SBGf8YL`qbTpXmo-_FAItoHe7Zn0!<4haX0zgx zuo*=p?Dx&D@^qa4p(hA`|NDK-WL+7nm&CF6rD4pD?sy`r@}IvU^&ud;ldmOiF%W$< za{sF=kuzNkjJ2(cj)(X~{6Ons$Ph0fwLd=60ADC&wtCQhk{t32tMBQlEVXHfr@Q0Y zrN~*Ioh@M-5huDjoq;y!wy%K~b!5d<9meF_v;A+mE}Jnca28;P|6T$iQ;@m=SVYaE z8Z(Ym6_~pHQlV!)V%#xjL~#`Co6mbod|HGxqm5a9VU?j8hL{QW%f+qHOiT*iH!*3s zw7qHz1lxJ)fW$j&tZ>jvAqX6cQ${L&tKpd_Br<*w+e3i;LV6cG5C(_yIHVuVXdG}T z+L9_Jc0|*$hH2mV%?R{1fn=+?SW-hx7^qIIDav+xZS)*OhWCd4C5$1M9G}frR4w&Z zQe##!ZeX}qEQ}zemCR2=hLMVUYXB367amRNok4=`KBN^b&n(Ki?Ch-=D~d#;cS(nQ zy=N6yl$T;FNZuoW-VpJcq#v4Vd95C%R}E*!?b73rK3LUQnGlz`C^ekx;LwpqG-H3y z(nzGBr05))?>jOPRq@;J1utn$J7)oL_r_Z&>QG&0c!4eGEz=5+qhuUP4q1n~Ll>iD z770VE`>|=3DX%ju!aIj8$w%*vp2has%q!!OYXmAqXuFS!XQCxDVg88sx%I6dHG7r_ z4EvFG5knL`^hD`n2I)kmwGIKH^=k9mJE{9?LP9&V1+Fu6nR*4F}MD znHUs;%eOMynjFLFZF)$4ypH;c(JWVd)X!%>?mt#_fEBC8L`r_a2hRc}$La<|2}hVc z$2h;`3)k+kvy#$>+GHdsML`U^qiM50^1r)* z)c`2aMKSYRTBy=31HX~g8+gS$mUPp@G1xU z#`fCIkmPJ&dPlva2?9y+4uZL#4}hOOk>7BmnF4KzPbpXPU?taXAy+JTLu(nEAWi#) zNq_x(s$i;BvB*nriwMLV(wwaJQ|}{gR8K zij-Fzm&z99NZz&g*HV|U>u{)W3$hNRp8kZzOj}7xE0hXh9Jc3lVah8T$E1OwlMYsx zqd;1>TfXx<-V3{wAI=_Sd|ehEshAvK1W{f>iy(Flaf{dq4-t}T0zwi3+Ivh&IxE_$29L^|pl;^KU4k>ExQ&Q)|LN*>o9pB>AfKfMH z)=C9lmw!N?R6~L@&Ny0{s94HO(A!bdvZr9P4a?MFfv3WtiSCVVEs5+`D${RN2ld^z zCn(`}P=jx`&5(MB3R+T|pU5tbybf!RunSV>Y{NND(b+nb`=}uKzO?_zO}3=85|5CZ|Tb{v!gO;UZZox7$?eYp+j5IOXfWbycYH*JtIJoWD?- z8_Y1X$vacf10dzFcZK#UI7e6|l50 zhz)GezebKj)8PVBqnqp>cIWna9+~m^Ypnxoa82 zO~URruSD#Tc7}Pbw>Y)SgLps)6T<%-Ee(~VX-gydt&44*aW)-npgD|>WGzF?3^3rjRoKZH1j~c8lHZ(cDk+ON*a@uIndq7$LcK7{lduihZNa`Fe`dVZao_2dx*L?%B_K6FlC}Mc+Owqd~YRErc z*?4&_cH8xu-FUmu`f0UmJ)p3g5h5~md3D4tTSAh{(_SR6ofO=}El$+9+TR3Yn$ptx z>qEj~Q!WoAm2A!>{lDOgD~Zi{<&mrL+leu-VjuQjEAoL-U!TRnk>vRHTIKll@DThg z`f5>PCArYt{dnKp`9bdmY$Vw2&{dsmg711TJ~1iTQZc@s^FamWpCxNVx|;+Y$QT5Ij8NQv^a$5`Q8^aEGb{&FLerh(+{Ns8Ddm2gyrYU0OKROmalTPK4kf8S-^B*Zq=`|p_e>$U%J z>Sk3Kgm;9!R5qD-e2IZSqQVve+LSrh{Q_($ICF*&LRcs|L4j7 z-NnBLJwl4)TvLA!Gm%#r5h9ViY literal 0 HcmV?d00001 diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/test1.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/test1.md" new file mode 100644 index 00000000..bce7de80 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/test1.md" @@ -0,0 +1,73 @@ +*斜体文字* + +_斜体文字_ + +**粗体文字** + +__粗体文字__ + +***粗斜体文字*** + +___粗斜体文字___ + +*** +* * * +****** +- - - +------ + +~~删除线~~ + +带下划线文本 + +# 一级标题 + +## 二级标题 + +### 三级标题 + +#### 四级标题 + +##### 五级标题 + +###### 六级标题 +[链接](http://a.com) +![图片](http://url/a.png) +> 引用 +* 第一项 +* 第二项 +* 第三项 + ++ 第一项 ++ 第二项 ++ 第三项 + +- 第一项 +- 第二项 +- 第三项 +1. 第一项 +2. 第二项 +3. 第三项 + +1. 第一项: + - 第一项嵌套的第一个元素 + - 第一项嵌套的第二个元素 +2. 第二项: + - 第二项嵌套的第一个元素 + - 第二项嵌套的第二个元素 +水平线: + +--- +带反引号的“内联代码” +``` +# 代码块 +print '3 个反引号或' +print '缩进 4 个空格' +``` + +> 区块引用 +> Markdown教程 +> 学的不仅是技术更是梦想 + + +SDFGSDFGSDFGSDFG \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/tone\351\203\250\347\275\262.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/tone\351\203\250\347\275\262.md" new file mode 100644 index 00000000..12f85c9b --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/tone\351\203\250\347\275\262.md" @@ -0,0 +1,615 @@ +# 部署说明 + +> 此文档以开源版本 T-One 最小单元部署举例说明,不保障系统的高可用及性能等 +> +> 若期望大规模集群化部署可以联系SIG项目组进行具体讨论。 +> 若遇到问题请参照文未的 FAQ 文档,或进 SIG 群联系我们。 + +**组件说明**: T-One 包含多个自研组件和几个开源组件,此文档以开源版本 T-One 最小单元部署举例说明。 + +* 自研组件:tone-web、tone-agent-proxy、tone-agent、tone-runner等。 +* 开源组件:mysql、kafka、redis、zookeeper + +**机器要求**: + +* 硬件要求:推荐使用 8c16g 以上规格机器。 +* OS 要求:推荐使用 Anolis OS 系统进行部署( 暂不支持debian、ubuntu等)。 + +**部署说明**: +- 主要分为安装环境、项目构建、项目启动、数据初始化等几个步骤。 +- 该文档以x86_64机器为例, 如果您的部署机器为其他arch类型的机器,则需要将docker-compose.yaml中指定的第三方开源组件镜像更换成对应的镜像源。 +- 可以自己指定安装目录,该文档以 ~/tone目录为例(推荐)。 + +# 部署步骤 +> 后续步骤以 Anolis OS 8.6 环境为示例进行行详细说明。 + +## 1. 环境准备 + +### a. 安装docker +``` + yum -y install yum-utils + yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo + yum install -y docker-ce # 若出错:yum install -y docker-ce --nobest --allowerasing + + # 启动docker + systemctl enable docker + systemctl start docker + systemctl status docker +``` +### b. 配置docker源 +``` + vim /etc/docker/daemon.json + { + "registry-mirrors": [ + "https://6kx4zyno.mirror.aliyuncs.com", + "https://docker.mirrors.ustc.edu.cn", + "http://hub-mirror.c.163.com", + "https://registry.docker-cn.com"] + } + systemctl restart docker + # 建议使用国内镜像源。 阿里云: https://6kx4zyno.mirror.aliyuncs.com,网易: http://hub-mirror.c.163.com +``` +### c. 安装docker-compose +``` + pip3 install --upgrade pip + pip3 install docker-compose + docker-compose --version +``` + +## 2. 项目构建 + +### a. 下载项目源码 +```shell +yum install -y git + +git clone --single-branch --branch master https://gitee.com/anolis/tone-web.git ~/tone/code/tone-web +git clone --single-branch --branch master https://gitee.com/anolis/tone-runner.git ~/tone/code/tone-runner +git clone --single-branch --branch master https://gitee.com/anolis/tone-agent-proxy.git ~/tone/code/tone-agent-proxy +git clone --single-branch --branch master https://gitee.com/anolis/tone-storage.git ~/tone/code/tone-storage +``` +下载后的目录结构: +``` +~/tone/code/ + ├── tone-web + ├── tone-runner + ├── tone-agent-proxy + └── tone-storage +``` + +### b. 集成前端代码 +```shell +# 下载前端代码包: +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/tone-front-latest.zip +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/toneagent-front-latest.zip +# 安装unzip命令 +yum install -y unzip +# 解压到指定目录 +unzip -j -o tone-front-latest.zip -d ~/tone/code/tone-web/static/front/ +unzip -j -o toneagent-front-latest.zip -d ~/tone/code/tone-agent-proxy/static/front/ +``` + +## 3. 项目配置 +### a. 下载 docker-compose.yaml +```shell +cd ~/tone +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/docker-compose.yaml +``` + +### b. 设置并替换变量 +执行以下脚本(需手动替换`必填的`变量): +```shell +# 部署机外网IP地址(必填) +server_ip= + +# 账号密码(必填) +db_password= +redis_password= +tone_storage_password= + +# 镜像版本标签(非必改、默认latest) +version_tag=latest + +# token(非必改、可自动生成) +toneagent_access_key=$(uuidgen) +toneagent_secret_key=$(uuidgen) +admin_urls_token=$(uuidgen) +pub_api_token=$(uuidgen) + +sed -i "s/var_db_password/${db_password}/g" docker-compose.yaml +sed -i "s/var_redis_password/${redis_password}/g" docker-compose.yaml +sed -i "s/var_tone_storage/${tone_storage_password}/g" docker-compose.yaml +sed -i "s/var_toneagent_access_key/${toneagent_access_key}/g" docker-compose.yaml +sed -i "s/var_toneagent_secret_key/${toneagent_secret_key}/g" docker-compose.yaml +sed -i "s/var_admin_urls_token/${admin_urls_token}/g" docker-compose.yaml +sed -i "s/var_pub_api_token/${pub_api_token}/g" docker-compose.yaml +sed -i "s/var_version_tag/${version_tag}/g" docker-compose.yaml +sed -i "s/var_server_ip/${server_ip}/g" docker-compose.yaml +``` + +### c. 启动docker-compose +```shell +docker-compose -f ~/tone/docker-compose.yaml up --build -d +# 注:如代码有更新或首次部署,需要加 --build 参数才会自动重新打包镜像 +``` + +## 4. 数据初始化 +### a.初始化db +* 进入`mysql` docker 镜像中,`docker exec -it {数据库容器ID} bash` +* 连接数据库:`mysql -h 127.0.0.1 -P 3306 -u root -p` +* 创建 `T-One` 数据库 `tone-db`,`ToneAgent` 数据库 `toneagent-db` + ``` + CREATE DATABASE `tone-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; + CREATE DATABASE `toneagent-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; + ``` + 也可以直接通过 mysql 可视化界面初始化数据库 + +### b.初始化 `T-One` 数据 +浏览器或者curl命令请求接口($admin_urls_token可在docker-compose配置里查看或更改) +```shell +curl -s "http://${server_ip}:8080/admin/migrate/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8080/admin/init_data/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8080/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." +curl -s "http://${server_ip}:8081/admin/migrate/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8081/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." +curl -s "http://${server_ip}:8081/admin/import_access_token/?token=${admin_urls_token}" +``` + +### c. `T-One` 关联依赖配置 +**系统执行任务还需对以下配置进行设置** + +- 配置 `T-One` 测试用例 +- 配置`T-One` 测试机器 +- 配置 `ToneAgent` `token` + - 在 ToneAgent 系统-账号管理中增加一组 token + - 更改 docker-compose 配置中的toneagent_access_key和toneagent_secret_key + +## 5. 验证 +使用浏览器打开链接查看: `T-One` 页面:`http://{host}:8080` `ToneAgent` 管理页面:`http://{host}:8081` + +## 6. T-One 多生态使用 +`T-One` + `TestLib` +### a. 创建 `TestLib` 数据库 +- 进入 mysql docker 镜像,docker exec -it {数据库容器ID} bash +- 连接数据库:mysql -h 127.0.0.1 -P 3306 -u root -p +- 创建 TestLib 数据库 testlib + + CREATE DATABASE \`test-lib\` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; +- 创建 TestLib 数据库表 +### testlib数据库初始化 +

+ 点击展开/折叠脚本 + +```shell + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; + +-- 表 test-lib.case 结构 +CREATE TABLE IF NOT EXISTS `case` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试用例名称', + `creator` varchar(64) NOT NULL COMMENT '负责人', + `type` enum('FUNCTIONAL','PERFORMANCE','STRESS','LOAD','SECURITY','COMPATIBILITY','OTHERS') NOT NULL COMMENT '测试用例类型', + `priority` enum('PRIORITY_0','PRIORITY_1','PRIORITY_2','PRIORITY_3') NOT NULL COMMENT '测试用例的优先级', + `suite_name` varchar(128) DEFAULT NULL COMMENT '测试套名称', + `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试用例执行方式,手动、自动', + `run_model` enum('SINGLE','CLUSTER') NOT NULL COMMENT '测试用例运行模式,单机、集群', + `is_available` tinyint(1) NOT NULL COMMENT '测试用例是否可用', + `tone_case` varchar(128) DEFAULT NULL COMMENT 'T-One测试用例,当run_method为自动的时候生效', + `device_type` varchar(128) DEFAULT 'unlimit' COMMENT '设备类型,可多选,默认支持所有设备', + `device_arch` varchar(256) NOT NULL COMMENT '设备架构类型,可多选,默认支撑所有类型', + `labels` varchar(256) DEFAULT NULL COMMENT '设备标签,多个用,隔开', + `desc` varchar(512) DEFAULT NULL COMMENT '用例描述', + `pre_condition` varchar(512) DEFAULT NULL COMMENT '前置条件', + `steps` json DEFAULT NULL COMMENT '操作步骤', + `custom_fields` json DEFAULT NULL COMMENT '测试用例扩展属性', + `parent` int(11) NOT NULL COMMENT '测试用例分类节点', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`), + KEY `ix_case_suite_name` (`suite_name`) +) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_label 结构 +CREATE TABLE IF NOT EXISTS `case_label` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '用例标签', + `creator` varchar(64) NOT NULL COMMENT '标签创建人', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_label_map 结构 +CREATE TABLE IF NOT EXISTS `case_label_map` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `label_name` varchar(64) NOT NULL COMMENT '用例名称', + `case_id` int(11) NOT NULL COMMENT '用例ID', + PRIMARY KEY (`id`), + KEY `ix_case_label_map_label_name` (`label_name`) +) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_tree 结构 +CREATE TABLE IF NOT EXISTS `case_tree` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(16) NOT NULL COMMENT '用例结构树节点名称', + `parent` int(11) NOT NULL COMMENT '父节点id', + `level` int(11) NOT NULL COMMENT '树结构的深度', + `path` varchar(128) NOT NULL COMMENT '模块完整路径', + `children_nums` int(11) NOT NULL COMMENT '子节点数量', + PRIMARY KEY (`id`), + KEY `ix_case_tree_path` (`path`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device 结构 +CREATE TABLE IF NOT EXISTS `device` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '设备名称', + `arch` enum('X86','ARCH64','RISCV','LOONGARCH','NOARCH','OTHERS') NOT NULL COMMENT '设备架构', + `ip` varchar(16) NOT NULL COMMENT '设备ip', + `type` enum('UNLIMIT','VM','DOCKER','PHYSICS') NOT NULL COMMENT '设备类型', + `sn` varchar(16) DEFAULT NULL COMMENT '设备序号', + `status` tinyint(1) NOT NULL COMMENT '设备是否可用', + `label` json DEFAULT NULL COMMENT '设备标签列表数组', + `owner` varchar(256) NOT NULL COMMENT '设备负责人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device_label 结构 +CREATE TABLE IF NOT EXISTS `device_label` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '设备标签名称', + `color` varchar(32) NOT NULL COMMENT '设备标签颜色', + PRIMARY KEY (`id`), + UNIQUE KEY `ix_device_label_name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device_label_relationship 结构 +CREATE TABLE IF NOT EXISTS `device_label_relationship` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `label_id` int(11) NOT NULL COMMENT '机器Label id', + `device_id` int(11) NOT NULL COMMENT '机器Label id', + `is_delete` tinyint(1) DEFAULT NULL COMMENT '对应关系是否删除', + PRIMARY KEY (`id`), + KEY `ix_device_label_relationship_device_id` (`device_id`), + KEY `ix_device_label_relationship_label_id` (`label_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.func_result 结构 +CREATE TABLE IF NOT EXISTS `func_result` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `sub_case_name` varchar(128) NOT NULL COMMENT 'tone job名称', + `sub_case_result` enum('SUCCESS','FAIL','SKIP') NOT NULL COMMENT '功能结果', + `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', + `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + `current` json DEFAULT NULL, + `expect` json DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ix_func_result_tone_suite_id` (`tone_suite_id`), + KEY `ix_func_result_task_id` (`task_id`), + KEY `ix_func_result_tone_case_id` (`tone_case_id`), + KEY `ix_func_result_tone_job_id` (`tone_job_id`) +) ENGINE=InnoDB AUTO_INCREMENT=479 DEFAULT CHARSET=utf8; + +-- 表 test-lib.outline 结构 +CREATE TABLE IF NOT EXISTS `outline` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试大纲文件名', + `title` varchar(128) NOT NULL COMMENT '测试大纲的标题', + `owner` varchar(16) NOT NULL COMMENT '测试大纲负责人', + `tid` varchar(256) NOT NULL COMMENT 'oss文件地址', + `remark` varchar(64) DEFAULT NULL COMMENT '测试大纲备注描述信息', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + +-- 表 test-lib.perf_result 结构 +CREATE TABLE IF NOT EXISTS `perf_result` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `metric` varchar(128) NOT NULL COMMENT '指标名称', + `test_value` varchar(64) DEFAULT NULL COMMENT '测试值', + `cv_value` varchar(64) DEFAULT NULL COMMENT 'cv值', + `max_value` varchar(64) DEFAULT NULL COMMENT '最大值', + `min_value` varchar(64) DEFAULT NULL COMMENT '最小值', + `unit` varchar(64) DEFAULT NULL COMMENT '测试单位', + `track_result` enum('NA','INVALID','NORMAL','DECLINE','INCREASE') NOT NULL COMMENT '跟踪结果', + `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', + `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + PRIMARY KEY (`id`), + KEY `ix_perf_result_task_id` (`task_id`), + KEY `ix_perf_result_tone_case_id` (`tone_case_id`), + KEY `ix_perf_result_tone_suite_id` (`tone_suite_id`), + KEY `ix_perf_result_tone_job_id` (`tone_job_id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +-- 表 test-lib.plan 结构 +CREATE TABLE IF NOT EXISTS `plan` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `title` varchar(64) NOT NULL COMMENT '测试方案名称', + `req_id` int(11) DEFAULT NULL COMMENT '测试需求id', + `req_title` varchar(128) DEFAULT NULL COMMENT '测试需求标题', + `content` json DEFAULT NULL COMMENT '测试方案内容', + `status` varchar(16) NOT NULL COMMENT '测试方案阶段状态', + `cases` varchar(256) DEFAULT NULL COMMENT '测试用例,多个使用","隔开', + `tasks` varchar(256) DEFAULT NULL COMMENT '测试任务,多个使用","隔开', + `reviewers` varchar(256) NOT NULL COMMENT '方案评审人列表', + `owner` varchar(256) NOT NULL COMMENT '测试需求的负责人,多个以,隔开', + `report` tinyint(1) NOT NULL COMMENT '测试报告是否已生成', + PRIMARY KEY (`id`), + UNIQUE KEY `title` (`title`) +) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8; + +-- 表 test-lib.plan_review 结构 +CREATE TABLE IF NOT EXISTS `plan_review` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `plan_id` int(11) NOT NULL COMMENT '测试方案id', + `reviewer` varchar(32) NOT NULL COMMENT '测试需方案的评审人', + `status` varchar(16) NOT NULL COMMENT '评审状态', + `desc` varchar(512) DEFAULT NULL COMMENT '评审内容', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.product_category 结构 +CREATE TABLE IF NOT EXISTS `product_category` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '大类名称', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- 表 test-lib.product_plan 结构 +CREATE TABLE IF NOT EXISTS `product_plan` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `test_product_id` int(11) NOT NULL COMMENT '测试产品id', + `plan_id` int(11) NOT NULL COMMENT '测试产品实际复制执行的plan id', + `executor` varchar(256) NOT NULL COMMENT '测试产品执行人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + +-- 表 test-lib.requirement 结构 +CREATE TABLE IF NOT EXISTS `requirement` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `title` varchar(128) NOT NULL COMMENT '测试需求标题', + `outline_id` int(11) DEFAULT NULL COMMENT '测试大纲id', + `outline_title` varchar(64) DEFAULT NULL COMMENT '测试大纲标题', + `content` json NOT NULL COMMENT '测试需求的描述内容', + `status` varchar(16) NOT NULL COMMENT '测试需求阶段', + `owner` varchar(16) NOT NULL COMMENT '测试需求的创建人', + `assignee` varchar(256) NOT NULL COMMENT '测试需求的指派人,多个以,隔开', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; + +-- 表 test-lib.task 结构 +CREATE TABLE IF NOT EXISTS `task` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '任务名称', + `status` varchar(16) NOT NULL COMMENT '任务执行状态', + `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试任务执行方式', + `owner` varchar(256) NOT NULL COMMENT '任务执行人', + `plan_id` int(11) NOT NULL COMMENT '测试方案id', + `plan_title` varchar(256) NOT NULL COMMENT '测试方案标题', + `cases` varchar(256) NOT NULL COMMENT '测试用例,多个使用,隔开', + `desc` varchar(256) DEFAULT NULL COMMENT '备注', + `run_result` json DEFAULT NULL COMMENT '手动用例执行结果', + `config` json DEFAULT NULL COMMENT '测试任务配置', + `device_id` int(11) DEFAULT NULL COMMENT '测试设备ID', + `device_ip` varchar(256) DEFAULT NULL COMMENT '测试机器IP', + `workspace` varchar(128) NOT NULL COMMENT 'tone workspace', + `project` varchar(128) NOT NULL COMMENT 'tone project', + `job_type` varchar(128) NOT NULL COMMENT 'tone job type', + `test_type` varchar(32) DEFAULT 'others' COMMENT '测试任务类型', + `cluster` varchar(256) DEFAULT NULL COMMENT '测试机器集群名称', + `tags` varchar(256) DEFAULT NULL COMMENT '测试机器标签', + `tsn` varchar(256) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ix_task_plan_id` (`plan_id`) +) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8; + +-- 表 test-lib.test_product 结构 +CREATE TABLE IF NOT EXISTS `test_product` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试产品名称', + `category_id` int(11) NOT NULL COMMENT '大类id', + `origin_plan_id` int(11) NOT NULL COMMENT '测试产品对应的plan id', + `desc` varchar(256) DEFAULT NULL COMMENT '产品描述', + `test_method` varchar(256) DEFAULT NULL COMMENT '测试方法', + `test_requirement` varchar(256) DEFAULT NULL COMMENT '测试要求', + `need_config` tinyint(1) DEFAULT NULL COMMENT '是否扩展配置', + `owner` varchar(256) NOT NULL DEFAULT '' COMMENT '测试产品创建人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +-- 表 test-lib.test_suite 结构 +CREATE TABLE IF NOT EXISTS `test_suite` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(128) NOT NULL COMMENT '测试套名称', + `creator` varchar(64) NOT NULL COMMENT '测试套的创建人员', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_case 结构 +CREATE TABLE IF NOT EXISTS `tone_case` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `tone_case_id` int(11) NOT NULL COMMENT 'tone用例ID', + `tone_case_name` varchar(256) NOT NULL COMMENT 'tone用例名称', + `suite_id` int(11) NOT NULL COMMENT 'suite ID', + `suite_name` varchar(256) NOT NULL COMMENT 'suite用例名称', + `test_type` varchar(64) DEFAULT NULL COMMENT '测试类型', + PRIMARY KEY (`id`), + KEY `ix_tone_case_tone_case_name` (`tone_case_name`), + KEY `ix_tone_case_suite_id` (`suite_id`), + KEY `ix_tone_case_suite_name` (`suite_name`) +) ENGINE=InnoDB AUTO_INCREMENT=603 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_job 结构 +CREATE TABLE IF NOT EXISTS `tone_job` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(100) NOT NULL COMMENT 'tone job名称', + `state` enum('PENDING','RUNNING','SUCCESS','FAIL','STOP','SKIP') NOT NULL COMMENT 'tone job状态', + `test_type` enum('FUNCTIONAL','PERFORMANCE') NOT NULL COMMENT '测试类型', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `tone_job_link` varchar(100) DEFAULT '' COMMENT 'tone job链接', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + `server_info` json DEFAULT NULL COMMENT '存储tone job的机器信息', + PRIMARY KEY (`id`), + KEY `ix_tone_job_tone_job_id` (`tone_job_id`), + KEY `ix_tone_job_task_id` (`task_id`) +) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_sync_pull 结构 +CREATE TABLE IF NOT EXISTS `tone_sync_pull` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=76149 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_sync_push 结构 +CREATE TABLE IF NOT EXISTS `tone_sync_push` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.user 结构 +CREATE TABLE IF NOT EXISTS `user` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', + `nick_name` varchar(64) DEFAULT NULL COMMENT '用户昵称,具有唯一性', + `email` varchar(64) NOT NULL COMMENT '用户邮箱', + `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', + `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', + PRIMARY KEY (`id`), + UNIQUE KEY `nick_name` (`nick_name`), + KEY `ix_user_user_name` (`user_name`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; + +-- 表 test-lib.user_open_source 结构 +CREATE TABLE IF NOT EXISTS `user_open_source` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', + `nick_name` varchar(64) NOT NULL COMMENT '用户昵称,具有唯一性', + `email` varchar(64) NOT NULL COMMENT '用户邮箱', + `password` varchar(64) NOT NULL COMMENT '用户密码,前端对密码md5加密后的值', + `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', + `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', + `token` varchar(256) NOT NULL COMMENT 'api访问凭证', + PRIMARY KEY (`id`), + UNIQUE KEY `nick_name` (`nick_name`), + UNIQUE KEY `email` (`email`), + KEY `ix_user_open_source_token` (`token`(255)) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; + +-- 表 test-lib.user_role_op_record 结构 +CREATE TABLE IF NOT EXISTS `user_role_op_record` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `applicant` varchar(64) NOT NULL COMMENT '申请人name', + `applicant_id` int(11) NOT NULL COMMENT '申请人ID', + `apply_reason` varchar(512) DEFAULT NULL COMMENT '申请理由', + `signer` varchar(64) DEFAULT NULL COMMENT '评审人name', + `has_review` tinyint(1) NOT NULL COMMENT '是否已经审核', + `review_result` enum('INIT','PASS','FAIL') NOT NULL COMMENT '审核结果', + `review_reason` varchar(512) DEFAULT NULL COMMENT '评审意见', + `method` enum('APPROVE','UPGRADE','DOWNGRADE','DELETE') NOT NULL COMMENT '操作方式', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; + + +``` +
+ +### b.TestLib 服务依赖 +### c. clone test-lib代码到~/tone/code目录下 +```shell +git clone --single-branch --branch master https://gitee.com/anolis/testlib.git ~/tone/code/testlib +``` +### d.增加docker-compose配置 +```yaml +# docker-compose.yaml service下增加test-lib + test-lib: + build: + context: code/testlib/ + dockerfile: Dockerfile + args: + APP_NAME: test-lib + ENV: daily + image: test-lib:latest + ports: + - "8005:8005" + depends_on: + - mysql + - redis + environment: + <<: *common-variables + # db + db_url: mysql+aiomysql://${db_user}:{db_password}@mysql:3306/test-lib + # redis + redis_url: redis://:${redis_password}@redis:6379/10 + # app + tone_host: http://${server_ip}:8080/ + tone_token: tone_token + tone_user_name: tone_user_name + main_domain: http://${server_ip}:8005 + oss_url: http://${server_ip}:8005 +``` +#### e.重启服务 +```shell +docker-compose -f ~/tone/docker-compose.yaml up --build -d +``` +## 7. 独立部署 FAQ +https://tone.openanolis.cn/help_doc/12 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" new file mode 100644 index 00000000..b09df7d0 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test.md" @@ -0,0 +1,70 @@ +# 一级标题 +## 二级标题 +### 三级标题 +**粗体文本** + +__cuti__ + +*斜体文本* + +_xieti_ + +下划线 + +~~删除线~~ + +上标:Xy + +下标:An + +> 引用文本 +- 无序列表项1 + - 第二层 +- 无序列表项2 +* * * +1. 有序列表项1 +2. 有序列表项2 +--- +[链接文本](https://gitee.com/suli01/community/edit/master/sig/T-One/content/%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97/%E7%94%A8%E6%88%B7%E8%81%86%E5%90%AC/test.md) + +链接名称 + +'''python +def hello_world(): + print("Hello, world!") + +![示例图片](https://pic.rmb.bdstatic.com/bjh/gallery/03e17cba710868d9153176b50a5fca0d1090.jpeg#pic_center=100x100) + +| 列1 | 列2 | 列3 | +| --- | --- | --- | +| 单元格1 | 单元格2 | 单元格3 | +| 单元格4 | 单元格5 | 单元格6 | + + +| 左对齐 | 居中对齐 | 右对齐 | +|:-----|:------:|------:| +| 文本 | 文本 | 文本 | + +
图片名称
+ + + + + + + + + + + + + +
值班人员星期一星期二星期三
张三李四王五
+ +- [ ] :待完成事项 + +- [x] :已完成事项 + +
+ 图片名称 +
diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" new file mode 100644 index 00000000..d0a3a7f0 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" @@ -0,0 +1,2 @@ +# hello +![测试外链图片](https://up.enterdesk.com/2021/edpic/0a/13/7a/0a137aaa28f48af0349cee1e568c0a57_1.jpg) \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" new file mode 100644 index 00000000..e5d110a5 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/\350\201\206\345\220\254.md" @@ -0,0 +1,2 @@ +# hello, 欢迎来到聆听 .md +## 阿斯顿发射点 \ No newline at end of file -- Gitee From 34ea7fa444f50e02ff24368823bc50057343e1df Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Mon, 20 Jan 2025 17:09:23 +0800 Subject: [PATCH 116/135] =?UTF-8?q?sig=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=9552-?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../atone\351\203\250\347\275\262.md" | 615 ++++++++++++++++++ .../test.md" | 70 ++ ...26\351\223\276\345\233\276\347\211\207.md" | 2 + .../\350\201\206\345\220\254.md" | 2 + 4 files changed, 689 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/atone\351\203\250\347\275\262.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/test.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\350\201\206\345\220\254.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/atone\351\203\250\347\275\262.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/atone\351\203\250\347\275\262.md" new file mode 100644 index 00000000..12f85c9b --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/atone\351\203\250\347\275\262.md" @@ -0,0 +1,615 @@ +# 部署说明 + +> 此文档以开源版本 T-One 最小单元部署举例说明,不保障系统的高可用及性能等 +> +> 若期望大规模集群化部署可以联系SIG项目组进行具体讨论。 +> 若遇到问题请参照文未的 FAQ 文档,或进 SIG 群联系我们。 + +**组件说明**: T-One 包含多个自研组件和几个开源组件,此文档以开源版本 T-One 最小单元部署举例说明。 + +* 自研组件:tone-web、tone-agent-proxy、tone-agent、tone-runner等。 +* 开源组件:mysql、kafka、redis、zookeeper + +**机器要求**: + +* 硬件要求:推荐使用 8c16g 以上规格机器。 +* OS 要求:推荐使用 Anolis OS 系统进行部署( 暂不支持debian、ubuntu等)。 + +**部署说明**: +- 主要分为安装环境、项目构建、项目启动、数据初始化等几个步骤。 +- 该文档以x86_64机器为例, 如果您的部署机器为其他arch类型的机器,则需要将docker-compose.yaml中指定的第三方开源组件镜像更换成对应的镜像源。 +- 可以自己指定安装目录,该文档以 ~/tone目录为例(推荐)。 + +# 部署步骤 +> 后续步骤以 Anolis OS 8.6 环境为示例进行行详细说明。 + +## 1. 环境准备 + +### a. 安装docker +``` + yum -y install yum-utils + yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo + yum install -y docker-ce # 若出错:yum install -y docker-ce --nobest --allowerasing + + # 启动docker + systemctl enable docker + systemctl start docker + systemctl status docker +``` +### b. 配置docker源 +``` + vim /etc/docker/daemon.json + { + "registry-mirrors": [ + "https://6kx4zyno.mirror.aliyuncs.com", + "https://docker.mirrors.ustc.edu.cn", + "http://hub-mirror.c.163.com", + "https://registry.docker-cn.com"] + } + systemctl restart docker + # 建议使用国内镜像源。 阿里云: https://6kx4zyno.mirror.aliyuncs.com,网易: http://hub-mirror.c.163.com +``` +### c. 安装docker-compose +``` + pip3 install --upgrade pip + pip3 install docker-compose + docker-compose --version +``` + +## 2. 项目构建 + +### a. 下载项目源码 +```shell +yum install -y git + +git clone --single-branch --branch master https://gitee.com/anolis/tone-web.git ~/tone/code/tone-web +git clone --single-branch --branch master https://gitee.com/anolis/tone-runner.git ~/tone/code/tone-runner +git clone --single-branch --branch master https://gitee.com/anolis/tone-agent-proxy.git ~/tone/code/tone-agent-proxy +git clone --single-branch --branch master https://gitee.com/anolis/tone-storage.git ~/tone/code/tone-storage +``` +下载后的目录结构: +``` +~/tone/code/ + ├── tone-web + ├── tone-runner + ├── tone-agent-proxy + └── tone-storage +``` + +### b. 集成前端代码 +```shell +# 下载前端代码包: +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/tone-front-latest.zip +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/front/toneagent-front-latest.zip +# 安装unzip命令 +yum install -y unzip +# 解压到指定目录 +unzip -j -o tone-front-latest.zip -d ~/tone/code/tone-web/static/front/ +unzip -j -o toneagent-front-latest.zip -d ~/tone/code/tone-agent-proxy/static/front/ +``` + +## 3. 项目配置 +### a. 下载 docker-compose.yaml +```shell +cd ~/tone +wget https://anolis-service-pub.oss-cn-zhangjiakou.aliyuncs.com/biz-resource/tone/deploy/docker-compose.yaml +``` + +### b. 设置并替换变量 +执行以下脚本(需手动替换`必填的`变量): +```shell +# 部署机外网IP地址(必填) +server_ip= + +# 账号密码(必填) +db_password= +redis_password= +tone_storage_password= + +# 镜像版本标签(非必改、默认latest) +version_tag=latest + +# token(非必改、可自动生成) +toneagent_access_key=$(uuidgen) +toneagent_secret_key=$(uuidgen) +admin_urls_token=$(uuidgen) +pub_api_token=$(uuidgen) + +sed -i "s/var_db_password/${db_password}/g" docker-compose.yaml +sed -i "s/var_redis_password/${redis_password}/g" docker-compose.yaml +sed -i "s/var_tone_storage/${tone_storage_password}/g" docker-compose.yaml +sed -i "s/var_toneagent_access_key/${toneagent_access_key}/g" docker-compose.yaml +sed -i "s/var_toneagent_secret_key/${toneagent_secret_key}/g" docker-compose.yaml +sed -i "s/var_admin_urls_token/${admin_urls_token}/g" docker-compose.yaml +sed -i "s/var_pub_api_token/${pub_api_token}/g" docker-compose.yaml +sed -i "s/var_version_tag/${version_tag}/g" docker-compose.yaml +sed -i "s/var_server_ip/${server_ip}/g" docker-compose.yaml +``` + +### c. 启动docker-compose +```shell +docker-compose -f ~/tone/docker-compose.yaml up --build -d +# 注:如代码有更新或首次部署,需要加 --build 参数才会自动重新打包镜像 +``` + +## 4. 数据初始化 +### a.初始化db +* 进入`mysql` docker 镜像中,`docker exec -it {数据库容器ID} bash` +* 连接数据库:`mysql -h 127.0.0.1 -P 3306 -u root -p` +* 创建 `T-One` 数据库 `tone-db`,`ToneAgent` 数据库 `toneagent-db` + ``` + CREATE DATABASE `tone-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; + CREATE DATABASE `toneagent-db` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; + ``` + 也可以直接通过 mysql 可视化界面初始化数据库 + +### b.初始化 `T-One` 数据 +浏览器或者curl命令请求接口($admin_urls_token可在docker-compose配置里查看或更改) +```shell +curl -s "http://${server_ip}:8080/admin/migrate/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8080/admin/init_data/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8080/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." +curl -s "http://${server_ip}:8081/admin/migrate/?token=${admin_urls_token}" +curl -s "http://${server_ip}:8081/admin/create_superuser/?token=${admin_urls_token}&username=admin&password=admin123." +curl -s "http://${server_ip}:8081/admin/import_access_token/?token=${admin_urls_token}" +``` + +### c. `T-One` 关联依赖配置 +**系统执行任务还需对以下配置进行设置** + +- 配置 `T-One` 测试用例 +- 配置`T-One` 测试机器 +- 配置 `ToneAgent` `token` + - 在 ToneAgent 系统-账号管理中增加一组 token + - 更改 docker-compose 配置中的toneagent_access_key和toneagent_secret_key + +## 5. 验证 +使用浏览器打开链接查看: `T-One` 页面:`http://{host}:8080` `ToneAgent` 管理页面:`http://{host}:8081` + +## 6. T-One 多生态使用 +`T-One` + `TestLib` +### a. 创建 `TestLib` 数据库 +- 进入 mysql docker 镜像,docker exec -it {数据库容器ID} bash +- 连接数据库:mysql -h 127.0.0.1 -P 3306 -u root -p +- 创建 TestLib 数据库 testlib + + CREATE DATABASE \`test-lib\` CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; +- 创建 TestLib 数据库表 +### testlib数据库初始化 +
+ 点击展开/折叠脚本 + +```shell + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; + +-- 表 test-lib.case 结构 +CREATE TABLE IF NOT EXISTS `case` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试用例名称', + `creator` varchar(64) NOT NULL COMMENT '负责人', + `type` enum('FUNCTIONAL','PERFORMANCE','STRESS','LOAD','SECURITY','COMPATIBILITY','OTHERS') NOT NULL COMMENT '测试用例类型', + `priority` enum('PRIORITY_0','PRIORITY_1','PRIORITY_2','PRIORITY_3') NOT NULL COMMENT '测试用例的优先级', + `suite_name` varchar(128) DEFAULT NULL COMMENT '测试套名称', + `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试用例执行方式,手动、自动', + `run_model` enum('SINGLE','CLUSTER') NOT NULL COMMENT '测试用例运行模式,单机、集群', + `is_available` tinyint(1) NOT NULL COMMENT '测试用例是否可用', + `tone_case` varchar(128) DEFAULT NULL COMMENT 'T-One测试用例,当run_method为自动的时候生效', + `device_type` varchar(128) DEFAULT 'unlimit' COMMENT '设备类型,可多选,默认支持所有设备', + `device_arch` varchar(256) NOT NULL COMMENT '设备架构类型,可多选,默认支撑所有类型', + `labels` varchar(256) DEFAULT NULL COMMENT '设备标签,多个用,隔开', + `desc` varchar(512) DEFAULT NULL COMMENT '用例描述', + `pre_condition` varchar(512) DEFAULT NULL COMMENT '前置条件', + `steps` json DEFAULT NULL COMMENT '操作步骤', + `custom_fields` json DEFAULT NULL COMMENT '测试用例扩展属性', + `parent` int(11) NOT NULL COMMENT '测试用例分类节点', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`), + KEY `ix_case_suite_name` (`suite_name`) +) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_label 结构 +CREATE TABLE IF NOT EXISTS `case_label` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '用例标签', + `creator` varchar(64) NOT NULL COMMENT '标签创建人', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_label_map 结构 +CREATE TABLE IF NOT EXISTS `case_label_map` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `label_name` varchar(64) NOT NULL COMMENT '用例名称', + `case_id` int(11) NOT NULL COMMENT '用例ID', + PRIMARY KEY (`id`), + KEY `ix_case_label_map_label_name` (`label_name`) +) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8; + +-- 表 test-lib.case_tree 结构 +CREATE TABLE IF NOT EXISTS `case_tree` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(16) NOT NULL COMMENT '用例结构树节点名称', + `parent` int(11) NOT NULL COMMENT '父节点id', + `level` int(11) NOT NULL COMMENT '树结构的深度', + `path` varchar(128) NOT NULL COMMENT '模块完整路径', + `children_nums` int(11) NOT NULL COMMENT '子节点数量', + PRIMARY KEY (`id`), + KEY `ix_case_tree_path` (`path`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device 结构 +CREATE TABLE IF NOT EXISTS `device` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '设备名称', + `arch` enum('X86','ARCH64','RISCV','LOONGARCH','NOARCH','OTHERS') NOT NULL COMMENT '设备架构', + `ip` varchar(16) NOT NULL COMMENT '设备ip', + `type` enum('UNLIMIT','VM','DOCKER','PHYSICS') NOT NULL COMMENT '设备类型', + `sn` varchar(16) DEFAULT NULL COMMENT '设备序号', + `status` tinyint(1) NOT NULL COMMENT '设备是否可用', + `label` json DEFAULT NULL COMMENT '设备标签列表数组', + `owner` varchar(256) NOT NULL COMMENT '设备负责人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device_label 结构 +CREATE TABLE IF NOT EXISTS `device_label` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '设备标签名称', + `color` varchar(32) NOT NULL COMMENT '设备标签颜色', + PRIMARY KEY (`id`), + UNIQUE KEY `ix_device_label_name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +-- 表 test-lib.device_label_relationship 结构 +CREATE TABLE IF NOT EXISTS `device_label_relationship` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `label_id` int(11) NOT NULL COMMENT '机器Label id', + `device_id` int(11) NOT NULL COMMENT '机器Label id', + `is_delete` tinyint(1) DEFAULT NULL COMMENT '对应关系是否删除', + PRIMARY KEY (`id`), + KEY `ix_device_label_relationship_device_id` (`device_id`), + KEY `ix_device_label_relationship_label_id` (`label_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.func_result 结构 +CREATE TABLE IF NOT EXISTS `func_result` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `sub_case_name` varchar(128) NOT NULL COMMENT 'tone job名称', + `sub_case_result` enum('SUCCESS','FAIL','SKIP') NOT NULL COMMENT '功能结果', + `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', + `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + `current` json DEFAULT NULL, + `expect` json DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ix_func_result_tone_suite_id` (`tone_suite_id`), + KEY `ix_func_result_task_id` (`task_id`), + KEY `ix_func_result_tone_case_id` (`tone_case_id`), + KEY `ix_func_result_tone_job_id` (`tone_job_id`) +) ENGINE=InnoDB AUTO_INCREMENT=479 DEFAULT CHARSET=utf8; + +-- 表 test-lib.outline 结构 +CREATE TABLE IF NOT EXISTS `outline` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试大纲文件名', + `title` varchar(128) NOT NULL COMMENT '测试大纲的标题', + `owner` varchar(16) NOT NULL COMMENT '测试大纲负责人', + `tid` varchar(256) NOT NULL COMMENT 'oss文件地址', + `remark` varchar(64) DEFAULT NULL COMMENT '测试大纲备注描述信息', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + +-- 表 test-lib.perf_result 结构 +CREATE TABLE IF NOT EXISTS `perf_result` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `metric` varchar(128) NOT NULL COMMENT '指标名称', + `test_value` varchar(64) DEFAULT NULL COMMENT '测试值', + `cv_value` varchar(64) DEFAULT NULL COMMENT 'cv值', + `max_value` varchar(64) DEFAULT NULL COMMENT '最大值', + `min_value` varchar(64) DEFAULT NULL COMMENT '最小值', + `unit` varchar(64) DEFAULT NULL COMMENT '测试单位', + `track_result` enum('NA','INVALID','NORMAL','DECLINE','INCREASE') NOT NULL COMMENT '跟踪结果', + `tone_suite_id` int(11) NOT NULL COMMENT 'suite id', + `tone_case_id` int(11) NOT NULL COMMENT 'tone case id', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + PRIMARY KEY (`id`), + KEY `ix_perf_result_task_id` (`task_id`), + KEY `ix_perf_result_tone_case_id` (`tone_case_id`), + KEY `ix_perf_result_tone_suite_id` (`tone_suite_id`), + KEY `ix_perf_result_tone_job_id` (`tone_job_id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +-- 表 test-lib.plan 结构 +CREATE TABLE IF NOT EXISTS `plan` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `title` varchar(64) NOT NULL COMMENT '测试方案名称', + `req_id` int(11) DEFAULT NULL COMMENT '测试需求id', + `req_title` varchar(128) DEFAULT NULL COMMENT '测试需求标题', + `content` json DEFAULT NULL COMMENT '测试方案内容', + `status` varchar(16) NOT NULL COMMENT '测试方案阶段状态', + `cases` varchar(256) DEFAULT NULL COMMENT '测试用例,多个使用","隔开', + `tasks` varchar(256) DEFAULT NULL COMMENT '测试任务,多个使用","隔开', + `reviewers` varchar(256) NOT NULL COMMENT '方案评审人列表', + `owner` varchar(256) NOT NULL COMMENT '测试需求的负责人,多个以,隔开', + `report` tinyint(1) NOT NULL COMMENT '测试报告是否已生成', + PRIMARY KEY (`id`), + UNIQUE KEY `title` (`title`) +) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8; + +-- 表 test-lib.plan_review 结构 +CREATE TABLE IF NOT EXISTS `plan_review` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `plan_id` int(11) NOT NULL COMMENT '测试方案id', + `reviewer` varchar(32) NOT NULL COMMENT '测试需方案的评审人', + `status` varchar(16) NOT NULL COMMENT '评审状态', + `desc` varchar(512) DEFAULT NULL COMMENT '评审内容', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.product_category 结构 +CREATE TABLE IF NOT EXISTS `product_category` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '大类名称', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- 表 test-lib.product_plan 结构 +CREATE TABLE IF NOT EXISTS `product_plan` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `test_product_id` int(11) NOT NULL COMMENT '测试产品id', + `plan_id` int(11) NOT NULL COMMENT '测试产品实际复制执行的plan id', + `executor` varchar(256) NOT NULL COMMENT '测试产品执行人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + +-- 表 test-lib.requirement 结构 +CREATE TABLE IF NOT EXISTS `requirement` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `title` varchar(128) NOT NULL COMMENT '测试需求标题', + `outline_id` int(11) DEFAULT NULL COMMENT '测试大纲id', + `outline_title` varchar(64) DEFAULT NULL COMMENT '测试大纲标题', + `content` json NOT NULL COMMENT '测试需求的描述内容', + `status` varchar(16) NOT NULL COMMENT '测试需求阶段', + `owner` varchar(16) NOT NULL COMMENT '测试需求的创建人', + `assignee` varchar(256) NOT NULL COMMENT '测试需求的指派人,多个以,隔开', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; + +-- 表 test-lib.task 结构 +CREATE TABLE IF NOT EXISTS `task` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '任务名称', + `status` varchar(16) NOT NULL COMMENT '任务执行状态', + `run_method` enum('MANUAL','AUTO') NOT NULL COMMENT '测试任务执行方式', + `owner` varchar(256) NOT NULL COMMENT '任务执行人', + `plan_id` int(11) NOT NULL COMMENT '测试方案id', + `plan_title` varchar(256) NOT NULL COMMENT '测试方案标题', + `cases` varchar(256) NOT NULL COMMENT '测试用例,多个使用,隔开', + `desc` varchar(256) DEFAULT NULL COMMENT '备注', + `run_result` json DEFAULT NULL COMMENT '手动用例执行结果', + `config` json DEFAULT NULL COMMENT '测试任务配置', + `device_id` int(11) DEFAULT NULL COMMENT '测试设备ID', + `device_ip` varchar(256) DEFAULT NULL COMMENT '测试机器IP', + `workspace` varchar(128) NOT NULL COMMENT 'tone workspace', + `project` varchar(128) NOT NULL COMMENT 'tone project', + `job_type` varchar(128) NOT NULL COMMENT 'tone job type', + `test_type` varchar(32) DEFAULT 'others' COMMENT '测试任务类型', + `cluster` varchar(256) DEFAULT NULL COMMENT '测试机器集群名称', + `tags` varchar(256) DEFAULT NULL COMMENT '测试机器标签', + `tsn` varchar(256) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ix_task_plan_id` (`plan_id`) +) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8; + +-- 表 test-lib.test_product 结构 +CREATE TABLE IF NOT EXISTS `test_product` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(64) NOT NULL COMMENT '测试产品名称', + `category_id` int(11) NOT NULL COMMENT '大类id', + `origin_plan_id` int(11) NOT NULL COMMENT '测试产品对应的plan id', + `desc` varchar(256) DEFAULT NULL COMMENT '产品描述', + `test_method` varchar(256) DEFAULT NULL COMMENT '测试方法', + `test_requirement` varchar(256) DEFAULT NULL COMMENT '测试要求', + `need_config` tinyint(1) DEFAULT NULL COMMENT '是否扩展配置', + `owner` varchar(256) NOT NULL DEFAULT '' COMMENT '测试产品创建人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +-- 表 test-lib.test_suite 结构 +CREATE TABLE IF NOT EXISTS `test_suite` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(128) NOT NULL COMMENT '测试套名称', + `creator` varchar(64) NOT NULL COMMENT '测试套的创建人员', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_case 结构 +CREATE TABLE IF NOT EXISTS `tone_case` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `tone_case_id` int(11) NOT NULL COMMENT 'tone用例ID', + `tone_case_name` varchar(256) NOT NULL COMMENT 'tone用例名称', + `suite_id` int(11) NOT NULL COMMENT 'suite ID', + `suite_name` varchar(256) NOT NULL COMMENT 'suite用例名称', + `test_type` varchar(64) DEFAULT NULL COMMENT '测试类型', + PRIMARY KEY (`id`), + KEY `ix_tone_case_tone_case_name` (`tone_case_name`), + KEY `ix_tone_case_suite_id` (`suite_id`), + KEY `ix_tone_case_suite_name` (`suite_name`) +) ENGINE=InnoDB AUTO_INCREMENT=603 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_job 结构 +CREATE TABLE IF NOT EXISTS `tone_job` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `name` varchar(100) NOT NULL COMMENT 'tone job名称', + `state` enum('PENDING','RUNNING','SUCCESS','FAIL','STOP','SKIP') NOT NULL COMMENT 'tone job状态', + `test_type` enum('FUNCTIONAL','PERFORMANCE') NOT NULL COMMENT '测试类型', + `tone_job_id` int(11) NOT NULL COMMENT 'tone job id', + `tone_job_link` varchar(100) DEFAULT '' COMMENT 'tone job链接', + `task_id` int(11) NOT NULL COMMENT '测试方案id', + `server_info` json DEFAULT NULL COMMENT '存储tone job的机器信息', + PRIMARY KEY (`id`), + KEY `ix_tone_job_tone_job_id` (`tone_job_id`), + KEY `ix_tone_job_task_id` (`task_id`) +) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_sync_pull 结构 +CREATE TABLE IF NOT EXISTS `tone_sync_pull` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=76149 DEFAULT CHARSET=utf8; + +-- 表 test-lib.tone_sync_push 结构 +CREATE TABLE IF NOT EXISTS `tone_sync_push` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 表 test-lib.user 结构 +CREATE TABLE IF NOT EXISTS `user` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', + `nick_name` varchar(64) DEFAULT NULL COMMENT '用户昵称,具有唯一性', + `email` varchar(64) NOT NULL COMMENT '用户邮箱', + `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', + `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', + PRIMARY KEY (`id`), + UNIQUE KEY `nick_name` (`nick_name`), + KEY `ix_user_user_name` (`user_name`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; + +-- 表 test-lib.user_open_source 结构 +CREATE TABLE IF NOT EXISTS `user_open_source` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `user_name` varchar(256) DEFAULT NULL COMMENT '用户名称', + `nick_name` varchar(64) NOT NULL COMMENT '用户昵称,具有唯一性', + `email` varchar(64) NOT NULL COMMENT '用户邮箱', + `password` varchar(64) NOT NULL COMMENT '用户密码,前端对密码md5加密后的值', + `avatar_url` varchar(512) DEFAULT NULL COMMENT '用户头像地址', + `role` enum('ADMIN','SENIOR','JUNIOR','COMMON') NOT NULL DEFAULT 'COMMON', + `token` varchar(256) NOT NULL COMMENT 'api访问凭证', + PRIMARY KEY (`id`), + UNIQUE KEY `nick_name` (`nick_name`), + UNIQUE KEY `email` (`email`), + KEY `ix_user_open_source_token` (`token`(255)) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; + +-- 表 test-lib.user_role_op_record 结构 +CREATE TABLE IF NOT EXISTS `user_role_op_record` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', + `gmt_created` datetime DEFAULT NULL COMMENT '创建时间', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `applicant` varchar(64) NOT NULL COMMENT '申请人name', + `applicant_id` int(11) NOT NULL COMMENT '申请人ID', + `apply_reason` varchar(512) DEFAULT NULL COMMENT '申请理由', + `signer` varchar(64) DEFAULT NULL COMMENT '评审人name', + `has_review` tinyint(1) NOT NULL COMMENT '是否已经审核', + `review_result` enum('INIT','PASS','FAIL') NOT NULL COMMENT '审核结果', + `review_reason` varchar(512) DEFAULT NULL COMMENT '评审意见', + `method` enum('APPROVE','UPGRADE','DOWNGRADE','DELETE') NOT NULL COMMENT '操作方式', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; + + +``` +
+ +### b.TestLib 服务依赖 +### c. clone test-lib代码到~/tone/code目录下 +```shell +git clone --single-branch --branch master https://gitee.com/anolis/testlib.git ~/tone/code/testlib +``` +### d.增加docker-compose配置 +```yaml +# docker-compose.yaml service下增加test-lib + test-lib: + build: + context: code/testlib/ + dockerfile: Dockerfile + args: + APP_NAME: test-lib + ENV: daily + image: test-lib:latest + ports: + - "8005:8005" + depends_on: + - mysql + - redis + environment: + <<: *common-variables + # db + db_url: mysql+aiomysql://${db_user}:{db_password}@mysql:3306/test-lib + # redis + redis_url: redis://:${redis_password}@redis:6379/10 + # app + tone_host: http://${server_ip}:8080/ + tone_token: tone_token + tone_user_name: tone_user_name + main_domain: http://${server_ip}:8005 + oss_url: http://${server_ip}:8005 +``` +#### e.重启服务 +```shell +docker-compose -f ~/tone/docker-compose.yaml up --build -d +``` +## 7. 独立部署 FAQ +https://tone.openanolis.cn/help_doc/12 \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/test.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/test.md" new file mode 100644 index 00000000..b09df7d0 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/test.md" @@ -0,0 +1,70 @@ +# 一级标题 +## 二级标题 +### 三级标题 +**粗体文本** + +__cuti__ + +*斜体文本* + +_xieti_ + +下划线 + +~~删除线~~ + +上标:Xy + +下标:An + +> 引用文本 +- 无序列表项1 + - 第二层 +- 无序列表项2 +* * * +1. 有序列表项1 +2. 有序列表项2 +--- +[链接文本](https://gitee.com/suli01/community/edit/master/sig/T-One/content/%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97/%E7%94%A8%E6%88%B7%E8%81%86%E5%90%AC/test.md) + +链接名称 + +'''python +def hello_world(): + print("Hello, world!") + +![示例图片](https://pic.rmb.bdstatic.com/bjh/gallery/03e17cba710868d9153176b50a5fca0d1090.jpeg#pic_center=100x100) + +| 列1 | 列2 | 列3 | +| --- | --- | --- | +| 单元格1 | 单元格2 | 单元格3 | +| 单元格4 | 单元格5 | 单元格6 | + + +| 左对齐 | 居中对齐 | 右对齐 | +|:-----|:------:|------:| +| 文本 | 文本 | 文本 | + +
图片名称
+ + + + + + + + + + + + + +
值班人员星期一星期二星期三
张三李四王五
+ +- [ ] :待完成事项 + +- [x] :已完成事项 + +
+ 图片名称 +
diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" new file mode 100644 index 00000000..d0a3a7f0 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" @@ -0,0 +1,2 @@ +# hello +![测试外链图片](https://up.enterdesk.com/2021/edpic/0a/13/7a/0a137aaa28f48af0349cee1e568c0a57_1.jpg) \ No newline at end of file diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\350\201\206\345\220\254.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\350\201\206\345\220\254.md" new file mode 100644 index 00000000..e5d110a5 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/a\347\224\250\346\210\267\350\201\206\345\220\254-copy/\350\201\206\345\220\254.md" @@ -0,0 +1,2 @@ +# hello, 欢迎来到聆听 .md +## 阿斯顿发射点 \ No newline at end of file -- Gitee From 9160e2c4ce1f09cf82845ee6840d3165cb22f309 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Wed, 22 Jan 2025 10:27:24 +0800 Subject: [PATCH 117/135] =?UTF-8?q?markdown=E8=A7=A3=E6=9E=90=E5=99=A8?= =?UTF-8?q?=EF=BC=8C=E8=A1=A8=E6=A0=BC=E9=83=BD=E9=9C=80=E8=A6=81=E5=9C=A8?= =?UTF-8?q?=E4=B8=8A=E9=9D=A2=E7=A9=BA=E4=B8=80=E8=A1=8C=E6=89=8D=E8=83=BD?= =?UTF-8?q?=E6=AD=A3=E8=A7=A3=E6=9E=90=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test002.md" | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test002.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test002.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test002.md" new file mode 100644 index 00000000..b09df7d0 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test002.md" @@ -0,0 +1,70 @@ +# 一级标题 +## 二级标题 +### 三级标题 +**粗体文本** + +__cuti__ + +*斜体文本* + +_xieti_ + +下划线 + +~~删除线~~ + +上标:Xy + +下标:An + +> 引用文本 +- 无序列表项1 + - 第二层 +- 无序列表项2 +* * * +1. 有序列表项1 +2. 有序列表项2 +--- +[链接文本](https://gitee.com/suli01/community/edit/master/sig/T-One/content/%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97/%E7%94%A8%E6%88%B7%E8%81%86%E5%90%AC/test.md) + +链接名称 + +'''python +def hello_world(): + print("Hello, world!") + +![示例图片](https://pic.rmb.bdstatic.com/bjh/gallery/03e17cba710868d9153176b50a5fca0d1090.jpeg#pic_center=100x100) + +| 列1 | 列2 | 列3 | +| --- | --- | --- | +| 单元格1 | 单元格2 | 单元格3 | +| 单元格4 | 单元格5 | 单元格6 | + + +| 左对齐 | 居中对齐 | 右对齐 | +|:-----|:------:|------:| +| 文本 | 文本 | 文本 | + +
图片名称
+ + + + + + + + + + + + + +
值班人员星期一星期二星期三
张三李四王五
+ +- [ ] :待完成事项 + +- [x] :已完成事项 + +
+ 图片名称 +
-- Gitee From 60db1d35398661cc53e4dfa31fecb05d84cd2d86 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Wed, 22 Jan 2025 10:28:32 +0800 Subject: [PATCH 118/135] =?UTF-8?q?markdown=E8=A7=A3=E6=9E=90=E5=99=A8?= =?UTF-8?q?=EF=BC=8C=E8=A1=A8=E6=A0=BC=E9=83=BD=E9=9C=80=E8=A6=81=E5=9C=A8?= =?UTF-8?q?=E4=B8=8A=E9=9D=A2=E7=A9=BA=E4=B8=80=E8=A1=8C=E6=89=8D=E8=83=BD?= =?UTF-8?q?=E6=AD=A3=E8=A7=A3=E6=9E=90=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test002.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test002.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test002.md" index b09df7d0..10b7ec6e 100644 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test002.md" +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test002.md" @@ -62,6 +62,10 @@ def hello_world(): - [ ] :待完成事项 +| 列1 | 列2 | 列3 | +| --- | --- | --- | +| 单元格1 | 单元格2 | 单元格3 | +| 单元格4 | 单元格5 | 单元格6 | - [x] :已完成事项 -- Gitee From 5d8c3c8cd88bb345cb740e506a7863bfa053b743 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Wed, 22 Jan 2025 16:18:01 +0800 Subject: [PATCH 119/135] =?UTF-8?q?markdown=E8=A7=A3=E6=9E=90=E5=99=A8?= =?UTF-8?q?=EF=BC=8C=E8=A1=A8=E6=A0=BC=E9=83=BD=E9=9C=80=E8=A6=81=E5=9C=A8?= =?UTF-8?q?=E4=B8=8A=E9=9D=A2=E7=A9=BA=E4=B8=80=E8=A1=8C=E6=89=8D=E8=83=BD?= =?UTF-8?q?=E6=AD=A3=E8=A7=A3=E6=9E=90=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test003.md" | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test003.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test003.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test003.md" new file mode 100644 index 00000000..8bd71d17 --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test003.md" @@ -0,0 +1,75 @@ +# 一级标题 +## 二级标题 +### 三级标题 +**粗体文本** + +__cuti__ + +*斜体文本* + +_xieti_ + +下划线 + +~~删除线~~ + +上标:Xy + +下标:An + +> 引用文本 +- 无序列表项1 + - 第二层 +- 无序列表项2 +* * * +1. 有序列表项1 +2. 有序列表项2 +--- +[链接文本](https://gitee.com/suli01/community/edit/master/sig/T-One/content/%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97/%E7%94%A8%E6%88%B7%E8%81%86%E5%90%AC/test.md) + +链接名称 + +'''python +def hello_world(): + print("Hello, world!") + +![示例图片](https://pic.rmb.bdstatic.com/bjh/gallery/03e17cba710868d9153176b50a5fca0d1090.jpeg#pic_center=100x100) + +| 列1 | 列2 | 列3 | +| --- | --- | --- | +| 单元格1 | 单元格2 | 单元格3 | +| 单元格4 | 单元格5 | 单元格6 | +| 左对齐 | 居中对齐 | 右对齐 | +|:-----|:------:|------:| +| 文本 | 文本 | 文本 | + +
图片名称
+ + + + + + + + + + + + + +
值班人员星期一星期二星期三
张三李四王五
+| 左对齐 | 居中对齐 | 右对齐 | +|:-----|:------:|------:| +| 文本 | 文本 | 文本 | + +- [ ] :待完成事项 +| 列1 | 列2 | 列3 | +| --- | --- | --- | +| 单元格1 | 单元格2 | 单元格3 | +| 单元格4 | 单元格5 | 单元格6 | + +- [x] :已完成事项 + +
+ 图片名称 +
-- Gitee From d3c66c3d7cd23eb28996560dca025da75c18ad57 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Wed, 22 Jan 2025 16:18:25 +0800 Subject: [PATCH 120/135] =?UTF-8?q?markdown=E8=A7=A3=E6=9E=90=E5=99=A8?= =?UTF-8?q?=EF=BC=8C=E8=A1=A8=E6=A0=BC=E9=83=BD=E9=9C=80=E8=A6=81=E5=9C=A8?= =?UTF-8?q?=E4=B8=8A=E9=9D=A2=E7=A9=BA=E4=B8=80=E8=A1=8C=E6=89=8D=E8=83=BD?= =?UTF-8?q?=E6=AD=A3=E8=A7=A3=E6=9E=90=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\347\224\250\346\210\267\350\201\206\345\220\254/test002.md" | 1 - 1 file changed, 1 deletion(-) diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test002.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test002.md" index 10b7ec6e..b7290856 100644 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test002.md" +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test002.md" @@ -34,7 +34,6 @@ def hello_world(): print("Hello, world!") ![示例图片](https://pic.rmb.bdstatic.com/bjh/gallery/03e17cba710868d9153176b50a5fca0d1090.jpeg#pic_center=100x100) - | 列1 | 列2 | 列3 | | --- | --- | --- | | 单元格1 | 单元格2 | 单元格3 | -- Gitee From 704019977cef8d42d85cbf10de1127ef76ccc912 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Wed, 22 Jan 2025 18:12:49 +0800 Subject: [PATCH 121/135] =?UTF-8?q?markdown=E8=A7=A3=E6=9E=90=E5=99=A8?= =?UTF-8?q?=EF=BC=8C=E8=A1=A8=E6=A0=BC=E9=83=BD=E9=9C=80=E8=A6=81=E5=9C=A8?= =?UTF-8?q?=E4=B8=8A=E9=9D=A2=E7=A9=BA=E4=B8=80=E8=A1=8C=E6=89=8D=E8=83=BD?= =?UTF-8?q?=E6=AD=A3=E8=A7=A3=E6=9E=90=E4=BC=98=E5=8C=96=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test003.md" | 5 ++ .../test004.md" | 80 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test004.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test003.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test003.md" index 8bd71d17..8cd3daee 100644 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test003.md" +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test003.md" @@ -67,6 +67,11 @@ def hello_world(): | --- | --- | --- | | 单元格1 | 单元格2 | 单元格3 | | 单元格4 | 单元格5 | 单元格6 | +- [ ] :待完成事项2 + | 列1 | 列2 | 列3 | + | --- | --- | --- | + | 单元格1 | 单元格2 | 单元格3 | + | 单元格4 | 单元格5 | 单元格6 | - [x] :已完成事项 diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test004.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test004.md" new file mode 100644 index 00000000..8cd3daee --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test004.md" @@ -0,0 +1,80 @@ +# 一级标题 +## 二级标题 +### 三级标题 +**粗体文本** + +__cuti__ + +*斜体文本* + +_xieti_ + +下划线 + +~~删除线~~ + +上标:Xy + +下标:An + +> 引用文本 +- 无序列表项1 + - 第二层 +- 无序列表项2 +* * * +1. 有序列表项1 +2. 有序列表项2 +--- +[链接文本](https://gitee.com/suli01/community/edit/master/sig/T-One/content/%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97/%E7%94%A8%E6%88%B7%E8%81%86%E5%90%AC/test.md) + +链接名称 + +'''python +def hello_world(): + print("Hello, world!") + +![示例图片](https://pic.rmb.bdstatic.com/bjh/gallery/03e17cba710868d9153176b50a5fca0d1090.jpeg#pic_center=100x100) + +| 列1 | 列2 | 列3 | +| --- | --- | --- | +| 单元格1 | 单元格2 | 单元格3 | +| 单元格4 | 单元格5 | 单元格6 | +| 左对齐 | 居中对齐 | 右对齐 | +|:-----|:------:|------:| +| 文本 | 文本 | 文本 | + +
图片名称
+ + + + + + + + + + + + + +
值班人员星期一星期二星期三
张三李四王五
+| 左对齐 | 居中对齐 | 右对齐 | +|:-----|:------:|------:| +| 文本 | 文本 | 文本 | + +- [ ] :待完成事项 +| 列1 | 列2 | 列3 | +| --- | --- | --- | +| 单元格1 | 单元格2 | 单元格3 | +| 单元格4 | 单元格5 | 单元格6 | +- [ ] :待完成事项2 + | 列1 | 列2 | 列3 | + | --- | --- | --- | + | 单元格1 | 单元格2 | 单元格3 | + | 单元格4 | 单元格5 | 单元格6 | + +- [x] :已完成事项 + +
+ 图片名称 +
-- Gitee From ce6aa5900a50ec34c4cac4a6e7f8bf5cbfda8457 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Wed, 22 Jan 2025 18:25:41 +0800 Subject: [PATCH 122/135] =?UTF-8?q?markdown=E8=A7=A3=E6=9E=90=E5=99=A8?= =?UTF-8?q?=EF=BC=8C=E8=A1=A8=E6=A0=BC=E9=83=BD=E9=9C=80=E8=A6=81=E5=9C=A8?= =?UTF-8?q?=E4=B8=8A=E9=9D=A2=E7=A9=BA=E4=B8=80=E8=A1=8C=E6=89=8D=E8=83=BD?= =?UTF-8?q?=E6=AD=A3=E8=A7=A3=E6=9E=90=E4=BC=98=E5=8C=96=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test003.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test003.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test003.md" index 8cd3daee..41e1c3d0 100644 --- "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test003.md" +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test003.md" @@ -68,10 +68,10 @@ def hello_world(): | 单元格1 | 单元格2 | 单元格3 | | 单元格4 | 单元格5 | 单元格6 | - [ ] :待完成事项2 - | 列1 | 列2 | 列3 | - | --- | --- | --- | - | 单元格1 | 单元格2 | 单元格3 | - | 单元格4 | 单元格5 | 单元格6 | +| 列1 | 列2 | 列3 | +| --- | --- | --- | +| 单元格1 | 单元格2 | 单元格3 | +| 单元格4 | 单元格5 | 单元格6 | - [x] :已完成事项 -- Gitee From 60d3e6246b159fc21110ce1a8c7c1ec5d866d17f Mon Sep 17 00:00:00 2001 From: WB01533938 Date: Thu, 23 Jan 2025 10:07:06 +0800 Subject: [PATCH 123/135] =?UTF-8?q?ci:=20=E6=9B=B4=E6=96=B0=20T-One-copy2?= =?UTF-8?q?=20SIG=20=E6=88=90=E5=91=98=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改成员 suqingming 的 OpenAnolis ID为 sULI01 - 修改成员 suqingming 的 Gitee ID 为 SULI0 --- .../best.md" | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 "sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/best.md" diff --git "a/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/best.md" "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/best.md" new file mode 100644 index 00000000..35e5c9a6 --- /dev/null +++ "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/best.md" @@ -0,0 +1,75 @@ +# 一级标题 +## 二级标题 +### 三级标题 +**粗体文本** + +__cuti__ + +*斜体文本* + +_xieti_ + +下划线 + +~~删除线~~ + +上标:Xy + +下标:An + +> 引用文本 +- 无序列表项1 + - 第二层 +- 无序列表项2 +* * * +1. 有序列表项1 +2. 有序列表项2 +--- +[链接文本](https://gitee.com/suli01/community/edit/master/sig/T-One/content/%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97/%E7%94%A8%E6%88%B7%E8%81%86%E5%90%AC/test.md) + +链接名称 + +'''python +def hello_world(): + print("Hello, world!") + +![示例图片](https://pic.rmb.bdstatic.com/bjh/gallery/03e17cba710868d9153176b50a5fca0d1090.jpeg#pic_center=100x100) + +| 列1 | 列2 | 列3 | +| --- | --- | --- | +| 单元格1 | 单元格2 | 单元格3 | +| 单元格4 | 单元格5 | 单元格6 | + + +| 左对齐 | 居中对齐 | 右对齐 | +|:-----|:------:|------:| +| 文本 | 文本 | 文本 | + + +验证无空行表格 +| 左对齐 | 居中对齐 | 右对齐 | +|:-----|:------:|------:| +| 文本 | 文本 | 文本 | +
图片名称
+ + + + + + + + + + + + + +
值班人员星期一星期二星期三
张三李四王五
+ +- [ ] :待完成事项 + +- [x] :已完成事项 + +
+ 图片名称 +
-- Gitee From c549e9965f4ddadc6c32277609d200852970d77b Mon Sep 17 00:00:00 2001 From: WB01533938 Date: Thu, 23 Jan 2025 10:09:41 +0800 Subject: [PATCH 124/135] =?UTF-8?q?ci:=20=E6=9B=B4=E6=96=B0=20T-One-copy2?= =?UTF-8?q?=20SIG=20=E6=88=90=E5=91=98=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改成员 suqingming 的 OpenAnolis ID为 sULI01 - 修改成员 suqingming 的 Gitee ID 为 SULI0 --- .../\347\224\250\346\210\267\346\214\207\345\215\227/best.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/best.md" "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/best.md" index 35e5c9a6..e114af0d 100644 --- "a/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/best.md" +++ "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/best.md" @@ -50,7 +50,7 @@ def hello_world(): | 左对齐 | 居中对齐 | 右对齐 | |:-----|:------:|------:| | 文本 | 文本 | 文本 | -
图片名称
+
图片名称
-- Gitee From b68a8085143053535a5fd88c327544d2bfa321b3 Mon Sep 17 00:00:00 2001 From: WB01533938 Date: Thu, 23 Jan 2025 10:16:09 +0800 Subject: [PATCH 125/135] =?UTF-8?q?ci:=20=E6=9B=B4=E6=96=B0=20T-One-copy2?= =?UTF-8?q?=20SIG=20=E6=88=90=E5=91=98=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改成员 suqingming 的 OpenAnolis ID为 sULI01 - 修改成员 suqingming 的 Gitee ID 为 SULI0 --- .../bbbb.md" | 73 +++++++++++++++++++ .../zzzz.md" | 73 +++++++++++++++++++ 2 files changed, 146 insertions(+) create mode 100644 "sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/bbbb.md" create mode 100644 "sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/zzzz.md" diff --git "a/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/bbbb.md" "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/bbbb.md" new file mode 100644 index 00000000..bce7de80 --- /dev/null +++ "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/bbbb.md" @@ -0,0 +1,73 @@ +*斜体文字* + +_斜体文字_ + +**粗体文字** + +__粗体文字__ + +***粗斜体文字*** + +___粗斜体文字___ + +*** +* * * +****** +- - - +------ + +~~删除线~~ + +带下划线文本 + +# 一级标题 + +## 二级标题 + +### 三级标题 + +#### 四级标题 + +##### 五级标题 + +###### 六级标题 +[链接](http://a.com) +![图片](http://url/a.png) +> 引用 +* 第一项 +* 第二项 +* 第三项 + ++ 第一项 ++ 第二项 ++ 第三项 + +- 第一项 +- 第二项 +- 第三项 +1. 第一项 +2. 第二项 +3. 第三项 + +1. 第一项: + - 第一项嵌套的第一个元素 + - 第一项嵌套的第二个元素 +2. 第二项: + - 第二项嵌套的第一个元素 + - 第二项嵌套的第二个元素 +水平线: + +--- +带反引号的“内联代码” +``` +# 代码块 +print '3 个反引号或' +print '缩进 4 个空格' +``` + +> 区块引用 +> Markdown教程 +> 学的不仅是技术更是梦想 + + +SDFGSDFGSDFGSDFG \ No newline at end of file diff --git "a/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/zzzz.md" "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/zzzz.md" new file mode 100644 index 00000000..bce7de80 --- /dev/null +++ "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/zzzz.md" @@ -0,0 +1,73 @@ +*斜体文字* + +_斜体文字_ + +**粗体文字** + +__粗体文字__ + +***粗斜体文字*** + +___粗斜体文字___ + +*** +* * * +****** +- - - +------ + +~~删除线~~ + +带下划线文本 + +# 一级标题 + +## 二级标题 + +### 三级标题 + +#### 四级标题 + +##### 五级标题 + +###### 六级标题 +[链接](http://a.com) +![图片](http://url/a.png) +> 引用 +* 第一项 +* 第二项 +* 第三项 + ++ 第一项 ++ 第二项 ++ 第三项 + +- 第一项 +- 第二项 +- 第三项 +1. 第一项 +2. 第二项 +3. 第三项 + +1. 第一项: + - 第一项嵌套的第一个元素 + - 第一项嵌套的第二个元素 +2. 第二项: + - 第二项嵌套的第一个元素 + - 第二项嵌套的第二个元素 +水平线: + +--- +带反引号的“内联代码” +``` +# 代码块 +print '3 个反引号或' +print '缩进 4 个空格' +``` + +> 区块引用 +> Markdown教程 +> 学的不仅是技术更是梦想 + + +SDFGSDFGSDFGSDFG \ No newline at end of file -- Gitee From 992e0e87a2f3d2dbdcb73430be7c9325f812f912 Mon Sep 17 00:00:00 2001 From: yutt Date: Fri, 24 Jan 2025 06:03:23 +0000 Subject: [PATCH 126/135] =?UTF-8?q?=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yutt --- ...\265\213\350\257\225\346\212\245\345\221\212.md" | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git "a/sig/Cloud Kernel/content/\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227/\351\276\231\350\234\245 ANCK 5.10 \345\200\232\345\244\251\345\271\263\345\217\260 MPAM \346\265\213\350\257\225\346\212\245\345\221\212.md" "b/sig/Cloud Kernel/content/\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227/\351\276\231\350\234\245 ANCK 5.10 \345\200\232\345\244\251\345\271\263\345\217\260 MPAM \346\265\213\350\257\225\346\212\245\345\221\212.md" index b3230c28..c9b09914 100644 --- "a/sig/Cloud Kernel/content/\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227/\351\276\231\350\234\245 ANCK 5.10 \345\200\232\345\244\251\345\271\263\345\217\260 MPAM \346\265\213\350\257\225\346\212\245\345\221\212.md" +++ "b/sig/Cloud Kernel/content/\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227/\351\276\231\350\234\245 ANCK 5.10 \345\200\232\345\244\251\345\271\263\345\217\260 MPAM \346\265\213\350\257\225\346\212\245\345\221\212.md" @@ -998,4 +998,15 @@ RIS>1时无法写入 -Reserved \ No newline at end of file +Reserved + + + + +T-One 系统的相关材料: + +部署手册(SIG):https://openanolis.cn/sig/t-one/doc/477143281756406096 + +社区版系统链接:https://tone.openanolis.cn/ + +T-One 帮助文档:https://tone.openanolis.cn/help_doc/2 \ No newline at end of file -- Gitee From cfbf370ea8ab907a19c3cf6675c724c66c2f39e3 Mon Sep 17 00:00:00 2001 From: yutt Date: Fri, 24 Jan 2025 06:07:40 +0000 Subject: [PATCH 127/135] 333333333333333333333333333333 Signed-off-by: yutt --- ...0 MPAM \346\265\213\350\257\225\346\212\245\345\221\212.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/sig/Cloud Kernel/content/\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227/\351\276\231\350\234\245 ANCK 5.10 \345\200\232\345\244\251\345\271\263\345\217\260 MPAM \346\265\213\350\257\225\346\212\245\345\221\212.md" "b/sig/Cloud Kernel/content/\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227/\351\276\231\350\234\245 ANCK 5.10 \345\200\232\345\244\251\345\271\263\345\217\260 MPAM \346\265\213\350\257\225\346\212\245\345\221\212.md" index c9b09914..13d6e53e 100644 --- "a/sig/Cloud Kernel/content/\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227/\351\276\231\350\234\245 ANCK 5.10 \345\200\232\345\244\251\345\271\263\345\217\260 MPAM \346\265\213\350\257\225\346\212\245\345\221\212.md" +++ "b/sig/Cloud Kernel/content/\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227/\351\276\231\350\234\245 ANCK 5.10 \345\200\232\345\244\251\345\271\263\345\217\260 MPAM \346\265\213\350\257\225\346\212\245\345\221\212.md" @@ -1000,8 +1000,11 @@ RIS>1时无法写入 Reserved +--------------------------------------------------------------------- +333333333333333333333333333333 + T-One 系统的相关材料: -- Gitee From 1ed006376e210fc4cea5c68f74a7f7151ac98dfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E7=AB=8B?= <404325854@qq.com> Date: Mon, 27 Jan 2025 07:32:02 +0000 Subject: [PATCH 128/135] =?UTF-8?q?update=20sig/T-One-copy2/content/?= =?UTF-8?q?=E5=BC=80=E5=8F=91=E6=89=8B=E5=86=8C/test.md.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 苏立 <404325854@qq.com> --- .../test.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/sig/T-One-copy2/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" "b/sig/T-One-copy2/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" index 9dca95d4..5e3440a9 100644 --- "a/sig/T-One-copy2/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" +++ "b/sig/T-One-copy2/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" @@ -4,12 +4,12 @@ HCT密码计算套件的目录结构如下: hygon-devkit/ ├─ hct -  ├──pkg -  │ ├── hct_1.0.0.20230224_rc -  │ ├── hct_1.0.1.20230512_rc -  │ └── hct_1.1.0.20230730_rc -  │ -  └── README.md + ├──pkg + │ ├── hct_1.0.0.20230224_rc + │ ├── hct_1.0.1.20230512_rc + │ └── hct_1.1.0.20230730_rc + │ + └── README.md \* pkg目录:内含各版本hct密码计算套件。 -- Gitee From 1f97094ebc2e8aed3508661eb1564c809cc056f2 Mon Sep 17 00:00:00 2001 From: yk01062356 Date: Wed, 5 Feb 2025 14:08:16 +0800 Subject: [PATCH 129/135] =?UTF-8?q?markdown=E8=A7=A3=E6=9E=90=E5=99=A8?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E5=87=BA=E7=8E=B0 ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test005.md" | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 "sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test005.md" diff --git "a/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test005.md" "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test005.md" new file mode 100644 index 00000000..ede9631c --- /dev/null +++ "b/sig/Anolis\350\277\201\347\247\273SIG/content/\347\224\250\346\210\267\346\214\207\345\215\2272/\347\224\250\346\210\267\350\201\206\345\220\254/test005.md" @@ -0,0 +1,12 @@ +HCT密码计算套件的目录结构如下: 阿斯顿法师打发斯蒂芬 44444444444444444444444444444444444444444444444444444 hygon-devkit/ + +├─ hct +├──pkg +│ ├── hct_1.0.0.20230224_rc +│ ├── hct_1.0.1.20230512_rc +│ └── hct_1.1.0.20230730_rc +│ +└── README.md +* pkg目录:内含各版本hct密码计算套件。 + +* README.md文件:有关HCT的简单情况。 \ No newline at end of file -- Gitee From 8162d19717817b872c18fa95b00e684ad05269c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E7=AB=8B?= <404325854@qq.com> Date: Thu, 6 Feb 2025 08:09:05 +0000 Subject: [PATCH 130/135] =?UTF-8?q?update=20sig/T-One-copy3/content/?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=8C=87=E5=8D=97/a=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=81=86=E5=90=AC-cpoy/=E6=B5=8B=E8=AF=95=E5=A4=96=E9=93=BE?= =?UTF-8?q?=E5=9B=BE=E7=89=87.md.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 苏立 <404325854@qq.com> --- ...\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-cpoy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-cpoy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" index d0a3a7f0..c91d73c9 100644 --- "a/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-cpoy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" +++ "b/sig/T-One-copy3/content/\347\224\250\346\210\267\346\214\207\345\215\227/a\347\224\250\346\210\267\350\201\206\345\220\254-cpoy/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" @@ -1,2 +1,2 @@ # hello -![测试外链图片](https://up.enterdesk.com/2021/edpic/0a/13/7a/0a137aaa28f48af0349cee1e568c0a57_1.jpg) \ No newline at end of file +![测试外链图片](https://gitee.com/lylinux/DjangoBlog/blob/master/docs/imgs/wechat.jpg) \ No newline at end of file -- Gitee From 03dd146abcc10f2e35e0ca1512bf041573a7ee0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E7=AB=8B?= <404325854@qq.com> Date: Thu, 6 Feb 2025 08:11:34 +0000 Subject: [PATCH 131/135] =?UTF-8?q?update=20sig/T-One-copy2/content/?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=8C=87=E5=8D=97/=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=81=86=E5=90=AC/=E6=B5=8B=E8=AF=95=E5=A4=96=E9=93=BE?= =?UTF-8?q?=E5=9B=BE=E7=89=87.md.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 苏立 <404325854@qq.com> --- ...\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" index d0a3a7f0..c91d73c9 100644 --- "a/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" +++ "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" @@ -1,2 +1,2 @@ # hello -![测试外链图片](https://up.enterdesk.com/2021/edpic/0a/13/7a/0a137aaa28f48af0349cee1e568c0a57_1.jpg) \ No newline at end of file +![测试外链图片](https://gitee.com/lylinux/DjangoBlog/blob/master/docs/imgs/wechat.jpg) \ No newline at end of file -- Gitee From 347cf4680c1bffb281c34a721a73f8e0d7d29dc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E7=AB=8B?= <404325854@qq.com> Date: Thu, 6 Feb 2025 08:17:12 +0000 Subject: [PATCH 132/135] =?UTF-8?q?update=20sig/T-One-copy2/content/?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=8C=87=E5=8D=97/=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=81=86=E5=90=AC/=E6=B5=8B=E8=AF=95=E5=A4=96=E9=93=BE?= =?UTF-8?q?=E5=9B=BE=E7=89=87.md.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 苏立 <404325854@qq.com> --- ...\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" index c91d73c9..5dbae354 100644 --- "a/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" +++ "b/sig/T-One-copy2/content/\347\224\250\346\210\267\346\214\207\345\215\227/\347\224\250\346\210\267\350\201\206\345\220\254/\346\265\213\350\257\225\345\244\226\351\223\276\345\233\276\347\211\207.md" @@ -1,2 +1,2 @@ # hello -![测试外链图片](https://gitee.com/lylinux/DjangoBlog/blob/master/docs/imgs/wechat.jpg) \ No newline at end of file +![测试外链图片](https://day-oss.openanolis.cn/fragment/bekcbqkwbqrirrbyahjr) \ No newline at end of file -- Gitee From 990c2ab4ef53819b4e9401c28910660fca659748 Mon Sep 17 00:00:00 2001 From: yutt Date: Fri, 7 Feb 2025 03:09:09 +0000 Subject: [PATCH 133/135] =?UTF-8?q?update=20sig/T-One-copy3/content/?= =?UTF-8?q?=E5=BC=80=E5=8F=91=E6=89=8B=E5=86=8C/test.md.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yutt --- .../test.md" | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git "a/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" "b/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" index 9dca95d4..d177268c 100644 --- "a/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" +++ "b/sig/T-One-copy3/content/\345\274\200\345\217\221\346\211\213\345\206\214/test.md" @@ -13,4 +13,7 @@ hygon-devkit/ \* pkg目录:内含各版本hct密码计算套件。 -\* README.md文件:有关HCT的简单情况。 \ No newline at end of file +\* README.md文件:有关HCT的简单情况。 + + +hhhhh\njjjjjjjjj \t9009090 \ No newline at end of file -- Gitee From 3ed3aa7d8d6140b42fd1453d7ae4916cff18b111 Mon Sep 17 00:00:00 2001 From: yutt Date: Wed, 12 Feb 2025 07:57:45 +0000 Subject: [PATCH 134/135] =?UTF-8?q?=E4=BF=AE=E6=94=B9TC=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yutt --- TC_Project.yml | 116 +++++++++++++++++-------------------------------- 1 file changed, 40 insertions(+), 76 deletions(-) diff --git a/TC_Project.yml b/TC_Project.yml index 316351aa..f865a29a 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -1,90 +1,54 @@ projects: - - project_id: TC2024120502 + - project_id: TC2024120201 # 项目id repos: - - repo_name: openanolis-copy/docs - dir_or_files: - - project_id: TC2024121101 - repos: - - repo_name: openanolis-copy/docs - dir_or_files: - - dddd2323 - - project_id: TC2024080201 - repos: - - repo_name: openanolis-copy/community - dir_or_files: - - sig/AI - - sig/AI/sig-info.yaml - - sig/AI/README.md - - project_id: TC2024080202 - repos: - - repo_name: openanolis-copy/community2 - dir_or_files: - - sig/AI - - sig/AI/sig-info.yaml - - sig/AI/README.md - - project_id: TC2024080403 - repos: - - repo_name: openanolis-copy/community - dir_or_files: - - sig/AI/content - - sig/AI/sig-info.yaml - - sig/AI/README.md - - project_id: TC2024080503 - repos: - - repo_name: openanolis-copy/community + - repo_name: anolis/cloud-kernel # 仓库 + dir_or_files: # 仓库内文件或文件夹, 为空时表示所有目录 + - + - repo_name: src-anolis-sig/cloud-kernel dir_or_files: - - sig/AI/content - - sig/AI/sig-info.yaml - - sig/AI/README.md - - project_id: TC2024080812 + - + - project_id: TC2024080201 # 知识库文档共建,项目 Sponsor:林生(阿里云),徐国振(浪潮信息) repos: - - repo_name: anolis/anolis7.9els - dir_or_files: + - repo_name: https://gitee.com/anolis/anolis-kb # 仓库 - - project_id: TC2024120001 + - project_id: TC2024080205 # 龙蜥社区 AI 容器镜像商业参考实现建设,项目 Sponsor:宋凯(浪潮信息),王洪虎(龙芯),徐春梅(阿里云) repos: - - repo_name: openanolis-copy/docs - dir_or_files: - - DEVELOPER_DOCS - - CESHI_ZHUANYONG/CI及代码门禁/日志文件 + - repo_name: https://gitee.com/anolis/anolis-container # 仓库 - - project_id: TC2024110203 - repos: - - repo_name: anolis/qemu-kvm - dir_or_files: - - project_id: TC2024120201 - repos: - - repo_name: src-anolis-os/qemu - dir_or_files: - - project_id: TC2024120201 - repos: - - repo_name: src-anolis-os/edk2 - dir_or_files: - - project_id: TC2024120201 + - project_id: TC2024080206 # 龙蜥社区 AI 容器组件 Pyhon Whl 软件仓建设,项目 Sponsor:宋凯(浪潮信息),王洪虎(龙芯),徐春梅(阿里云) repos: - - repo_name: src-anolis-os/libvirt - dir_or_files: - - project_id: TC2024120201 + - repo_name: # 仓库 + + - project_id: TC2024080202 # Anolis OS 7 YUM 源维护项目,项目 Sponsor:崔湛(统信),庞训磊(阿里云) repos: - - repo_name: src-anolis-os/gcc - dir_or_files: - - project_id: TC2024120201 + - repo_name: https://gitee.com/anolis/anolis7.9els # 仓库 + + - project_id: TC2024080204 # [安全漏洞机制共建] 共建安全漏洞管理机制,项目 Sponsor:张世乐(阿里云),徐国振(浪潮信息),谈虎(中兴通讯),崔湛(统信软件),贺春妮(中科方德),段廷银(中科曙光),史建才(北京红旗),安全委员会,Distro SIG,Cloud Kernel SIG repos: - - repo_name: src-anolis-os/tpm2-tools - dir_or_files: - - project_id: TC2024120201 + - repo_name: https://gitee.com/src-anolis-os # group组下所有仓库 + + - repo_name: https://gitee.com/src-anolis-sig + + - project_id: TC2024110201 # [龙芯架构支持] 发行版龙芯处理器支持,项目 Sponsor:王洪虎(龙芯中科),高畅(阿里云),LoongArch SIG,Distro SIG,Cloud Kernel SIG repos: - - repo_name: src-anolis-os/tpm2-abrmd - dir_or_files: - - project_id: TC2024110202 + - repo_name: https://gitee.com/src-anolis-os # group组 + + - repo_name: https://gitee.com/src-anolis-sig + + - project_id: TC2024110202 # [申威架构支持] 发行版申威处理器支持,项目 Sponsor:崔巍(电科申泰),韩笑(阿里云),申威架构 SIG,Distro SIG,Cloud Kernel SIG repos: - - repo_name: anolis/cloud-kernel - dir_or_files: - - project_id: TC2024110202 + - repo_name: https://gitee.com/src-anolis-os # group组 + + - repo_name: https://gitee.com/src-anolis-sig + + - project_id: TC2024110203 # [GNR架构支持] 发行版 Intel 处理器支持,项目 Sponsor:李崇(英特尔),尚旭春(阿里云),Xuchun(SIG 管理员)Intel Arch SIG,Distro SIG,Cloud Kernel SIG repos: - - repo_name: src-anolis-sig/cloud-kernel - dir_or_files: - - project_id: TC2024080205 + - repo_name: https://gitee.com/src-anolis-os # group组 + + - repo_name: https://gitee.com/src-anolis-sig + + - project_id: TC2024120201 # [海光四号架构支持] 发行版海光处理器支持,项目 Sponsor:李伟(海光信息),易兴睿(阿里云),Hygon Arch SIG,Distro SIG,Cloud Kernel SIG repos: - - repo_name: anolis/anolis-container - dir_or_files: \ No newline at end of file + - repo_name: https://gitee.com/src-anolis-os # group组 + + - repo_name: https://gitee.com/src-anolis-sig \ No newline at end of file -- Gitee From 73830b422e40c12aff3395b6da3375d4af1c74f4 Mon Sep 17 00:00:00 2001 From: yutt Date: Wed, 12 Feb 2025 08:04:06 +0000 Subject: [PATCH 135/135] =?UTF-8?q?=E4=BF=AE=E6=94=B9TC=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yutt --- TC_Project.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TC_Project.yml b/TC_Project.yml index f865a29a..7159efd9 100644 --- a/TC_Project.yml +++ b/TC_Project.yml @@ -13,11 +13,11 @@ projects: - project_id: TC2024080205 # 龙蜥社区 AI 容器镜像商业参考实现建设,项目 Sponsor:宋凯(浪潮信息),王洪虎(龙芯),徐春梅(阿里云) repos: - - repo_name: https://gitee.com/anolis/anolis-container # 仓库 + - repo_name: anolis/anolis-container - project_id: TC2024080206 # 龙蜥社区 AI 容器组件 Pyhon Whl 软件仓建设,项目 Sponsor:宋凯(浪潮信息),王洪虎(龙芯),徐春梅(阿里云) repos: - - repo_name: # 仓库 + - repo_name: src-anolis-whl - project_id: TC2024080202 # Anolis OS 7 YUM 源维护项目,项目 Sponsor:崔湛(统信),庞训磊(阿里云) repos: -- Gitee