docs: rewrite README and AGENTS.md etc..
This commit is contained in:
1 parent
cc64df3e70
commit
a9bf849697
22 files changed
+514
-665
No files matched your search
+15
-15
@@ -1,6 +1,6 @@
|
||||
# C# 代码风格
|
||||
|
||||
基线是 [dotnet/runtime 编码风格](https://github.com/dotnet/runtime/blob/main/docs/coding-guidelines/coding-style.md),再加上本项目的补充规则。所有能自动检查的规则都写在 `.editorconfig` 或 `BannedSymbols.txt` 里,**违反即编译失败**(`EnforceCodeStyleInBuild` + `TreatWarningsAsErrors`);无法自动检查的规则由代码评审把关。
|
||||
基线是 [dotnet/runtime 编码风格](https://github.com/dotnet/runtime/blob/main/docs/coding-guidelines/coding-style.md),再加上本项目的补充规则。所有能自动检查的规则都写在 `.editorconfig` 或 `BannedSymbols.txt` 里,违反即编译失败(`EnforceCodeStyleInBuild` + `TreatWarningsAsErrors`);无法自动检查的规则由代码评审把关。
|
||||
|
||||
## 1. 格式与命名(`.editorconfig` 强制)
|
||||
|
||||
@@ -26,21 +26,21 @@
|
||||
|
||||
## 2. 命名语义
|
||||
|
||||
- **名称里带单位**:`timeoutMs`、`rttUs`、`payloadBytes`。API 内部统一用 `TimeSpan`,只在边界(线协议、配置、JSON)使用带单位后缀的整数。
|
||||
- 名称里带单位:`timeoutMs`、`rttUs`、`payloadBytes`。API 内部统一用 `TimeSpan`,只在边界(线协议、配置、JSON)使用带单位后缀的整数。
|
||||
- 不使用 `Manager`、`Helper`、`Util`、`Service`(ASP.NET 约定位置除外)之类的模糊名称,名称要说明职责:`UploadQueue`、`SessionTable`、`ResultWriter`。
|
||||
- 布尔值使用 `is`/`has`/`can` 前缀;返回“成功与否加输出值”的方法使用 `TryXxx(out ...)`。
|
||||
|
||||
## 3. 类型与数据
|
||||
|
||||
- 契约和领域值使用 `sealed record` 或 `readonly record struct`,并且不可变。
|
||||
- 热路径上的计数器和缓冲区使用可变 `struct` 或 `sealed class`,**所有权要写清楚**(谁创建、谁归还池)。
|
||||
- 热路径上的计数器和缓冲区使用可变 `struct` 或 `sealed class`,所有权要写清楚(谁创建、谁归还池)。
|
||||
- ID 使用强类型(`readonly record struct ProbeId(string Value)`),不直接传裸 `string`。
|
||||
- 枚举序列化成 snake_case 字符串(`JsonStringEnumConverter<T>` + `JsonStringEnumMemberName`);新增枚举值不属于破坏性变更,但所有消费方都必须能处理未知值。
|
||||
- 可空性:公共成员必须标注;使用 `!` 抑制警告时,同一行要写注释说明理由。
|
||||
|
||||
## 4. 错误处理
|
||||
|
||||
- **预期内的失败不抛异常**:超时、拒绝连接、认证失败、校验失败都返回结构化结果,其中包含 `ErrorCode`。
|
||||
- 预期内的失败不抛异常:超时、拒绝连接、认证失败、校验失败都返回结构化结果,其中包含 `ErrorCode`。
|
||||
- 异常只用于程序缺陷或无法继续运行的状态;只在边界(会话循环、请求管线、进程入口)捕获,并记录日志。
|
||||
- 禁止空 `catch`;捕获 `OperationCanceledException` 时必须确认它确实来自自己的取消令牌。
|
||||
|
||||
@@ -61,8 +61,8 @@
|
||||
|
||||
- 序列化只使用 `System.Text.Json` 源生成上下文(或手写的二进制编解码);禁用无上下文的 `JsonSerializer.Serialize<T>(T)` 重载。
|
||||
- 不做程序集扫描、`Activator.CreateInstance`、`Type.GetType(string)`、动态代理或 `Reflection.Emit`。
|
||||
- **Probe/Agent**:不使用 DI 容器,在 `Program.cs` 中手工组装对象,依赖关系一眼可见;不使用 LINQ;不使用 `HttpClient`(Agent 的 WebSocket 使用 `ClientWebSocket`)。
|
||||
- **Backend**:使用 `CreateSlimBuilder` + Minimal API;只能通过 `Microsoft.Data.Sqlite` 执行手写的参数化 SQL,禁止字符串拼接 SQL。
|
||||
- Probe/Agent:不使用 DI 容器,在 `Program.cs` 中手工组装对象,依赖关系一眼可见;不使用 LINQ;不使用 `HttpClient`(Agent 的 WebSocket 使用 `ClientWebSocket`)。
|
||||
- Backend:使用 `CreateSlimBuilder` + Minimal API;只能通过 `Microsoft.Data.Sqlite` 执行手写的参数化 SQL,禁止字符串拼接 SQL。
|
||||
- 热路径:使用 `Span<T>`、`stackalloc`(≤ 256 B)、`ArrayPool<byte>.Shared`;每个包的处理过程中不分配内存、不写日志。
|
||||
- 新增任何第三方包之前,需要先更新 [project-layout.md](project-layout.md) 第 3 节的依赖表,并在 PR 中说明理由。
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
|
||||
- 由 `BannedSymbols.Node.txt` 在编译期强制:禁止启动进程、动态加载程序集或本机库、使用 `HttpClient`、在配置目录以外写文件。唯一的豁免点是 `Fleet.Hosting.ConfigStore`,豁免必须写 `#pragma` 并附上理由注释。注册在 `fleet-enroll` 中完成,更新由节点宿主机上的更新器完成,常驻进程不需要这些能力。
|
||||
- 节点不能新增任何“由远端触发的非采集动作”对应的 RPC 方法。凡是新增 RPC 方法的 PR,都要在描述中说明它不会扩大权限边界。
|
||||
- Backend 下发的任何参数都要先经过 `ParamSpec` 校验,再经过本地硬上限(`BudgetGuard`)检查,**两道校验都不能省略**。
|
||||
- Backend 下发的任何参数都要先经过 `ParamSpec` 校验,再经过本地硬上限(`BudgetGuard`)检查,两道校验都不能省略。
|
||||
- 日志中不能出现私钥、签名、`session_key`、令牌或 MAC。
|
||||
|
||||
## 9.1 Fleet 的通用性
|
||||
@@ -85,15 +85,15 @@
|
||||
- `backend/fleet/**` 不能引用任何 `MoShiro.*`,也不能出现产品相关的概念、命名或默认值(例如端口 7443、`moshiro` 字样),由 `ArchitectureTests` 和代码评审把关。
|
||||
- 新增的公开 API 如果只有 MoShiro 使用,应先放在 MoShiro 中,等出现第二个使用者后再下沉到 Fleet。
|
||||
- Fleet 永远不提供 exec、shell、文件读写或远程下发代码的方法,这条规则不接受例外。
|
||||
- 公开 API 的变更记录在 `PublicAPI.Unshipped.txt` 中;PR 描述需要说明是否属于破坏性变更。
|
||||
- Fleet 公开 API 的变更,PR 描述需说明是否属于破坏性变更(不使用 PublicApiAnalyzers)。
|
||||
|
||||
## 10. 声明式扩展的写法
|
||||
|
||||
- **Kind**:只放在 `Protocol/Catalog/Kinds`,一个 Kind 一个静态字段;参数一律使用 `P.Int`、`P.Enum` 等 `ParamSpec` 写出默认值和上下限,禁止写没有上下限的参数。
|
||||
- **积木**:实现对应的积木接口,在 `BlockRegistry` 中注册一行;积木内部不能读取全局配置,所有输入都来自参数。
|
||||
- **指标**:只放在 `Analysis/Metrics`,一行一个 `MetricDef`;指标 id 使用 `领域.名称`(如 `tcp.stall`),导出值为 `id.统计量`(如 `rtt.p95`)。已发布的 id 不能改名,只能新增。
|
||||
- **算子**:纯函数,输入列视图,输出累加器更新;每个算子都要有边界用例测试(空输入、单个样本、乱序、时钟回绕)。
|
||||
- **模型**:只读取指标,不读取原始列;评分函数需要有单调性测试(指标变差时,分数不能升高)。
|
||||
- Kind:只放在 `Protocol/Catalog/Kinds`,一个 Kind 一个静态字段;参数一律使用 `P.Int`、`P.Enum` 等 `ParamSpec` 写出默认值和上下限,禁止写没有上下限的参数。
|
||||
- 积木:实现拨号方 / 监听方接口,在 `BlockCatalog` 中登记 Kind 到积木的映射;积木内部不能读取全局配置,所有输入都来自参数。
|
||||
- 指标:只放在 `Analysis/Metrics`,一行一个 `MetricDef`,并加入 `MetricRegistry.All`;指标 id 使用 `领域.名称`(如 `tcp.stall`),导出值为 `id.统计量`(如 `rtt.p95`)。已发布的 id 不能改名,只能新增。
|
||||
- 算子:纯函数,输入列视图,输出累加器更新;每个算子都要有边界用例测试(空输入、单个样本、乱序、时钟回绕)。
|
||||
- 模型:只读取指标,不读取原始列;评分函数需要有单调性测试(指标变差时,分数不能升高)。
|
||||
|
||||
## 11. 测试
|
||||
|
||||
@@ -102,10 +102,10 @@
|
||||
- 协议编解码必须有“黄金字节”测试:固定的输入对应固定的字节序列。布局发生变化时测试会失败,提醒升级协议版本。
|
||||
- 采集端必须覆盖:逐包记录的完整性(发送数 = 记录数)、丢失标记、重复、乱序、非法长度、重放、会话过期、版本不兼容。
|
||||
- 分析模型必须有“黄金原始块 → 期望输出”的测试;模型升版时,同时更新期望输出并说明原因。
|
||||
- e2e 测试在 Windows 和 Linux 上对 **AOT 发布产物**运行,而不是对 JIT 构建运行。
|
||||
- 端到端测试应针对 AOT 发布产物运行,而不是 JIT 构建。
|
||||
|
||||
## 12. 提交与评审
|
||||
|
||||
- 提交信息使用 `<范围>: <摘要>` 格式,范围取值为 `probe`、`agent`、`backend`、`shared`、`web`、`docs`、`scripts`。
|
||||
- 提交信息使用 `<范围>: <摘要>` 格式,范围取 `probe`、`agent`、`backend`、`shared`、`web`、`docs`、`scripts`;是否触发 CI 的标记见 [AGENTS.md](../../AGENTS.md)。
|
||||
- 修改 `backend/shared/MoShiro.Protocol` 的 PR 必须说明兼容性影响(新增字段、行为变化、需要升级版本)。
|
||||
- 修改 `backend/openapi/v1.json` 的 PR 必须按照 [api.md](../api/api.md) 第 7 节的「版本与兼容性」判断是否属于破坏性变更。
|
||||
+35
-33
@@ -2,18 +2,18 @@
|
||||
|
||||
## 1. 目标
|
||||
|
||||
1. **三个独立项目加一个前端**:Probe、Agent、Backend 各自拥有解决方案,可以单独构建、测试和发布;Web 是独立的 Vite 项目(`web/`)。
|
||||
2. **通用能力只写一次**:TCP/QUIC Datagram/TLS/ICMP 采集积木(类似 iperf3 的能力,但只记录原始数据)放在 `MoShiro.Measurement` 中,Probe 和 Agent 共用;采集方法(Kind)由积木组合声明而成。
|
||||
3. **节点机制通用化**:注册、身份、连接、RPC、可靠上报、状态同步、宿主,由与业务无关的 **Fleet** 框架提供(见 [../backend/fleet/README.md](../../backend/fleet/README.md))。MoShiro 只写业务,其他产品也可以复用 Fleet。
|
||||
4. **改一处,整条链路受益**:协议、原始数据格式、测试方案、指标、错误码、版本号、编译设置、代码风格都只有**一个真源**。改动之后,下游要么自动更新,要么在编译期或 CI 中直接报错。
|
||||
5. **模块化**:Probe/Agent 由可插拔的模块组成;Backend 按层分成多个项目,层之间的依赖在编译期强制。
|
||||
6. **Probe/Agent 轻量**:运行时只依赖 BCL 和仓库内的库,不引用任何 NuGet 包。
|
||||
1. 三个独立项目加一个前端:Probe、Agent、Backend 各自拥有解决方案,可以单独构建、测试和发布;Web 是独立的 Vite 项目(`web/`)。
|
||||
2. 通用能力只写一次:TCP/QUIC Datagram/TLS/ICMP 采集积木(类似 iperf3 的能力,但只记录原始数据)放在 `MoShiro.Measurement` 中,Probe 和 Agent 共用;采集方法(Kind)由积木组合声明而成。
|
||||
3. 节点机制通用化:注册、身份、连接、RPC、可靠上报、状态同步、宿主,由与业务无关的 Fleet 框架提供(见 [Fleet 文档](../../backend/fleet/README.md))。MoShiro 只写业务,其他产品也可以复用 Fleet。
|
||||
4. 单一真源:协议、原始数据格式、测试方案、指标、错误码、版本号、编译设置、代码风格都只有一处定义,改动后下游自动更新,或在编译期、CI 中报错。
|
||||
5. 模块化:Probe/Agent 由可插拔的模块组成;Backend 按层分成多个项目,层之间的依赖在编译期强制。
|
||||
6. 轻量:运行时只依赖 BCL 和仓库内的库,不引用任何 NuGet 包。
|
||||
|
||||
## 2. 仓库布局
|
||||
|
||||
```text
|
||||
moshiro/
|
||||
├─ README.md TODO.md AGENTS.md .gitignore
|
||||
├─ README.md AGENTS.md .gitignore
|
||||
├─ docs/
|
||||
├─ scripts/ # publish / package / smoke / stability 等脚本
|
||||
├─ packaging/ # install.sh、systemd 单元、OpenWrt 文件
|
||||
@@ -32,8 +32,8 @@ moshiro/
|
||||
│ ├─ tools/ fleet-enroll
|
||||
│ └─ tests/
|
||||
├─ shared/ # MoShiro 自己的共享库
|
||||
│ ├─ MoShiro.Protocol/ # 契约真源:Kind/Plan 目录、任务集、moshiro.* 方法、UDP 包、RawChunk、错误码
|
||||
│ ├─ MoShiro.Measurement/ # 采集引擎:积木、Recorder、任务调和(见 measurement.md)
|
||||
│ ├─ MoShiro.Protocol/ # 契约真源:Kind 目录、任务集、moshiro.* 方法、测量包、RawChunk、错误码
|
||||
│ ├─ MoShiro.Measurement/ # 采集引擎:积木、行表、合并、预算(见 measurement.md)
|
||||
│ └─ tests/
|
||||
├─ probe/ src/MoShiro.Probe/ tests/ # 家宽端采集器
|
||||
├─ agent/ src/MoShiro.Agent/ tests/ # VPS 端采集器
|
||||
@@ -46,7 +46,7 @@ moshiro/
|
||||
│ └─ MoShiro.Backend.Storage.Sqlite/ # 端口接口的实现,同时实现 IFleetStore
|
||||
├─ tests/
|
||||
├─ openapi/v1.json # 构建生成并提交
|
||||
└─ MoShiro.Backend.slnx
|
||||
└─ (解决方案见 backend/MoShiro.slnx)
|
||||
```
|
||||
|
||||
节点机器上的发布物是两个独立进程,注册和采集分开:`fleet-enroll`(一次性运行)和 `moshiro-agent`(或 `moshiro-probe`,常驻)。更新:Quadlet 装的 Agent、Probe 由节点退出后 systemd 重新拉镜像,Backend 和一行脚本装的节点由宿主机上的 `moshiro-update` 完成,见 [deployment.md](../ops/deployment.md)。
|
||||
@@ -104,28 +104,30 @@ Web ──> openapi/v1.json
|
||||
|
||||
```text
|
||||
MoShiro.Protocol/
|
||||
├─ ProtocolLimits MoShiroErrors(在 Fleet 错误码基础上扩展)
|
||||
├─ Ids/ AgentId(= Fleet NodeId)、ProbeId、TaskId、TestId、ChunkId、StreamId
|
||||
├─ ProtocolLimits MoShiroErrors(在 Fleet 错误码基础上扩展) IpVersions PublicAddress Ipv6Diagnostic
|
||||
├─ Ids/ AgentId(= Fleet NodeId)、ProbeId、TaskId、TestId
|
||||
├─ Catalog/
|
||||
│ ├─ Kinds/ KindSpec 声明(积木组合 + ParamSpec + 记录列 + 预算)
|
||||
│ ├─ Kinds/ Kind 声明(积木组合 + ParamSpec + 记录列 + 预算)
|
||||
│ ├─ KindSpec Kind 与记录流(StreamSpec)的类型定义
|
||||
│ └─ ParamSpec 参数定义(类型、默认值、上下限),节点与 Backend 共用同一套校验
|
||||
├─ Tasks/ TaskSet(Fleet 期望状态的文档类型)、调和结果
|
||||
├─ Rpc/ moshiro.* 方法名、params/result、二进制通道号(从 16 开始)
|
||||
├─ Wire/ QUIC Datagram 测量包
|
||||
├─ Rpc/ moshiro.* 方法表与 params/result、二进制通道号(从 16 开始)
|
||||
├─ Wire/ QUIC Datagram 测量包、TCP 数据连接首帧
|
||||
└─ Raw/ 自描述 RawChunk:头部、列类型、列编解码、Brotli、crc32c
|
||||
```
|
||||
|
||||
累加器、直方图等统计类型**不在 Protocol 中**,只属于 `Backend.Analysis`。
|
||||
累加器、直方图等统计类型只属于 `Backend.Analysis`,不在 Protocol 中。测试方案(Plan)只存在于 Backend(`Application/Tests/Plans.cs`)。
|
||||
|
||||
### 4.3 MoShiro.Measurement(采集引擎)
|
||||
|
||||
包含:
|
||||
|
||||
- 积木:Transport、Pacer、Payload、Behavior、Sampler;
|
||||
- 根据列定义自动生成的 Recorder;
|
||||
- `KindAssembler`;
|
||||
- `TaskReconciler`(实现 Fleet 的 `IStateReconciler<TaskSet>`);
|
||||
- `BudgetGuard`。
|
||||
- 按 Kind 声明驱动的行表(`RowStore`)与列块合并(`FragmentMerger`、`ChunkFinalizer`);
|
||||
- `BlockCatalog`:Kind 到拨号方 / 监听方积木的映射;
|
||||
- `BudgetGuard`:参数校验与本地硬上限。
|
||||
|
||||
任务调和在 Agent 的 `TaskManager` 与 Probe 中完成。
|
||||
|
||||
详见 [measurement.md](../design/measurement.md) 第 6 节。
|
||||
|
||||
@@ -133,7 +135,7 @@ MoShiro.Protocol/
|
||||
|
||||
### 5.1 Agent 与 Probe:组装
|
||||
|
||||
节点的组装点是 `AgentApp` 和 `ProbeApp`:在构造函数里**显式组装**,不使用 DI 容器,也不做反射扫描;没有全局状态,测试可以在同一进程里启动多个。连接、认证、重连、发件箱、状态同步都由 Fleet 提供,MoShiro 只写业务:
|
||||
节点的组装点是 `AgentApp` 和 `ProbeApp`:在构造函数里显式组装,不使用 DI 容器,也不做反射扫描;没有全局状态,测试可以在同一进程里启动多个。连接、认证、重连、发件箱、状态同步都由 Fleet 提供,MoShiro 只写业务:
|
||||
|
||||
```text
|
||||
AgentApp Probe(ProbeApp)
|
||||
@@ -149,7 +151,7 @@ AgentApp Probe(ProbeApp)
|
||||
|
||||
模块之间通过构造函数传入的接口或 `Channel<T>` 通信,禁止通过静态全局状态共享数据。
|
||||
|
||||
**新增 RPC 方法**:在 `MoShiro.Protocol/Rpc` 中定义 params/result,然后在组装处加一行 `.On(Methods.X, HandleX)`。
|
||||
新增 RPC 方法:在 `MoShiro.Protocol/Rpc` 中定义 params/result,然后在组装处加一行 `.On(Methods.X, HandleX)`。
|
||||
|
||||
### 5.2 Backend:分层与 API 层
|
||||
|
||||
@@ -167,8 +169,8 @@ AgentApp Probe(ProbeApp)
|
||||
┌─────────────────────────────────────────────────────────┐ ┌───────────────────┴──┐
|
||||
│ Backend.Application │───>│ LiveHub(Application)│
|
||||
│ Agents · Probe · Tasks(有效任务集的计算与下发) │ │ 内存快照 + 主题订阅 │
|
||||
│ Tests · Ingest(chunk → 存储 → 分析队列)· SeriesQuery │ └──────────────────────┘
|
||||
│ AnalysisScheduler · Downsampler · Auth · Releases 视图 │ 调用 ─> Backend.Analysis
|
||||
│ Tests · Ingest(chunk → 存储 → 分析队列) │ └──────────────────────┘
|
||||
│ Analysis(AnalysisScheduler 等)· Query · Auth · Updates │ 调用 ─> Backend.Analysis
|
||||
└───────────────────────────▲─────────────────────────────┘ 纯计算:算子/指标/模型
|
||||
│ 实现端口
|
||||
┌───────────────────────────┴─────────────────────────────┐
|
||||
@@ -181,9 +183,9 @@ AgentApp Probe(ProbeApp)
|
||||
|
||||
规则:
|
||||
|
||||
- **Api 不能引用 Storage**(编译期保证);Api 和 Gateway 只调用 Application。
|
||||
- Application 返回 `Result<T>`。**错误码到 HTTP 状态的映射只在 Api 层做一次**(`ErrorCodeHttpMap`);到 JSON-RPC 错误的映射由 Fleet.Rpc 统一完成。
|
||||
- Api 层按调用方分目录:`Public/`、`Admin/`,公共部分放在 `Common/`(分页、ETag、认证过滤器、ProblemFactory、`EndpointConventions`)。每类资源一个端点文件,新增资源时在 `ApiModule.Map` 中加一行。
|
||||
- Api 不能引用 Storage(编译期保证);Api 和 Gateway 只调用 Application。
|
||||
- Application 返回 `Result<T>`。错误码到 HTTP 状态的映射只在 Api 层做一次(`ErrorCodeHttpMap`);到 JSON-RPC 错误的映射由 Fleet.Rpc 统一完成。
|
||||
- Api 层按调用方分目录:`Public/`、`Admin/`,公共部分放在 `Common/`(分页、ETag、认证过滤器、Problems、`EndpointConventions`)。每类资源一个端点文件,新增资源时在 `ApiModule.Map` 中加一行。
|
||||
- 注册端点、签名认证、连接注册表、状态推送、收件箱 ACK 都来自 Fleet(`MapFleetEnrollment`、`MapFleetLink`)。MoShiro 只提供:
|
||||
- `IFleetStore` 的实现;
|
||||
- `TaskSet` 的状态提供者;
|
||||
@@ -193,7 +195,7 @@ AgentApp Probe(ProbeApp)
|
||||
- 请求校验:简单字段约束使用 .NET 10 内置的 Minimal API 校验;任务参数统一用 `ParamSpec` 校验(与节点共用);跨字段规则放在 Application 层。
|
||||
- Backend 使用 ASP.NET Core 自带的 DI 容器,只在组合根显式注册。
|
||||
|
||||
Backend.Analysis 只依赖 MoShiro.Protocol 和 Fleet.Core,没有 I/O,可以单独做成离线 CLI 使用。
|
||||
Backend.Analysis 只依赖 MoShiro.Protocol 和 Fleet.Core,没有 I/O。
|
||||
|
||||
Backend 允许的包:ASP.NET Core 共享框架、`Microsoft.Data.Sqlite`、`Microsoft.AspNetCore.OpenApi`、`Microsoft.Extensions.ApiDescription.Server`(仅构建期使用)。
|
||||
|
||||
@@ -210,7 +212,7 @@ Backend 允许的包:ASP.NET Core 共享框架、`Microsoft.Data.Sqlite`、`Mi
|
||||
|
||||
## 7. 轻量预算
|
||||
|
||||
M0 阶段先测出基线,之后作为 CI 的回归门槛(超出 10% 即失败):
|
||||
体积和内存目标如下,表中「实测」为某次测量值:
|
||||
|
||||
| 程序 | 发布体积 | 空闲常驻内存 | 负载 |
|
||||
| --- | --- | --- | --- |
|
||||
@@ -234,14 +236,14 @@ M0 阶段先测出基线,之后作为 CI 的回归门槛(超出 10% 即失
|
||||
| --- | --- | --- |
|
||||
| Agent | `linux-x64`、`linux-arm64` | VPS |
|
||||
| Probe | `linux-x64`、`linux-arm64`、`win-x64` | 普通 PC 或服务器 |
|
||||
| Probe(OpenWrt) | `linux-musl-x64`、`linux-musl-arm64` | 正式支持;`linux-musl-arm`(armv7)视 M0 的工具链验证结果决定是否支持 |
|
||||
| Probe(OpenWrt) | `linux-musl-x64`、`linux-musl-arm64` | 正式支持;`linux-musl-arm`(armv7)视工具链验证结果决定是否支持 |
|
||||
| fleet-enroll | 与所在节点相同 | |
|
||||
| Backend | `linux-x64`、`linux-arm64`、`win-x64` | |
|
||||
|
||||
- **MIPS 不支持**(NativeAOT 没有 MIPS 目标)。使用 MIPS 路由器(例如 MT7621)时,把 Probe 运行在局域网内的其他设备上,比如 NAS、树莓派或 PC,测量结果同样代表这条家宽。
|
||||
- MIPS 不支持(NativeAOT 没有 MIPS 目标)。使用 MIPS 路由器(例如 MT7621)时,把 Probe 运行在局域网内的其他设备上,比如 NAS、树莓派或 PC,测量结果同样代表这条家宽。
|
||||
- NativeAOT 需要目标平台的原生工具链:musl 目标在 Alpine 容器中构建,arm64 使用交叉编译镜像。CI 矩阵为 Windows、Linux glibc、Linux musl。
|
||||
- `scripts/publish.sh <probe|agent|backend|fleet-enroll> <rid>` 输出到 `backend/artifacts/publish/<project>/<rid>/`。
|
||||
- 容器镜像由 CI 构建并对镜像 digest 签名,节点的宿主机更新器验签后更新,见 [deployment.md](../ops/deployment.md);纯二进制节点的更新见 [TODO.md](../../TODO.md)。
|
||||
- 容器镜像由 CI 构建并对镜像 digest 签名,节点的宿主机更新器验签后更新,见 [deployment.md](../ops/deployment.md);纯二进制节点的更新见 [路线图](../roadmap.md)。
|
||||
- Linux 上 TLS 依赖系统 OpenSSL(`libssl.so.3`)。
|
||||
|
||||
### 8.1 OpenWrt 上的 Probe
|
||||
@@ -256,7 +258,7 @@ M0 阶段先测出基线,之后作为 CI 的回归门槛(超出 10% 即失
|
||||
| 内存 | 预算 ≤ 32 MB,适合 ≥ 256 MB 内存的路由器;在本地配置中限制重负载测试的码率(`limits.max_test_mbps`),防止路由器 CPU 成为瓶颈,反过来影响测量结果 |
|
||||
| 测量偏差 | Probe 运行在网关上时,自己没有 NAT;一旦路由器 CPU 饱和,结果就会失真。因此 Probe 在 `moshiro.event` 中上报自身的 CPU 繁忙标记(仅进程级别),分析层据此标注置信说明 |
|
||||
| 打包 | 提供 `tar.gz` 和 procd 脚本;包格式(ipk 或 apk)按目标 OpenWrt 版本提供 |
|
||||
| 更新 | 纯二进制节点的更新器还没有实现([TODO.md](../../TODO.md));实现时 `keep_versions = 1`,下载前检查剩余空间,避免写满闪存 |
|
||||
| 更新 | 纯二进制节点的更新器还没有实现([路线图](../roadmap.md));实现时 `keep_versions = 1`,下载前检查剩余空间,避免写满闪存 |
|
||||
|
||||
## 9. Web
|
||||
|
||||
|
||||
Reference in new issue
Block a user