面向 Linux 智算服务器的中文优先诊断、监控与证据导出工具。终端界面基于 Ratatui。
- 主机、NVIDIA GPU、燧原 Enflame GCU、PCIe 链路、IOMMU、ACS、驱动与 CUDA 状态。
若
nvidia-smi不可用,自动尝试其改名体querygpu,再尝试燧原efsmi(存在即使用,并在 GPU 快照smi_tool/vendor字段记录实际工具与厂商); 远程设备 GPU 摘要同样支持该回退链。Enflame 侧额外采集驱动版本、设备 SN、 ECC 开关、分类错误计数(SIP/Bus/FW/DTE/DRAM HBM/PCIE/GCU-LARE 等)与 累计复位次数,并兼容新旧两版 efsmi 输出格式。 - GPU 厂商画像接口(
src/vendors.rs):电源状态术语(P 态 / DPM)、GPU 表 备注列、「平台与健康」厂商段与厂商诊断规则全部收敛到VendorProfiletrait;NVIDIA / Enflame / Generic 已实现,接入新厂商只需实现该 trait 并注册。 - PCIe 加速器拓扑树:按 sysfs 父链合并共享分支,渲染 GPU/GCU 到根端口的 上行路径(Markdown 报告 + TUI 总览页),端点标注 NUMA 节点,厂商无关。
- PCIe Switch、RAID/HBA、SAS PHY、mdraid 采集。
- llama.cpp、vLLM、SGLang 的宿主机进程、Docker、Podman、nerdctl 与显式端点发现。
- 系统日志采集与异常检测:
dmesg、journalctl、/var/log常见文件尾部, 检测 Xid / NVRM / PCIe AER / ECC / NVLink 等异常模式(源自 llama-test-matrix blackbox)。 - 配置化扩展:
suanctl.toml(远程主机清单、自定义日志异常模式、插件采集)。 - 远程设备扫描:解析
~/.ssh/config免密主机,权限预检测后降级采集(TUI 远程页 /suanctl remote)。 - 本地数据存储:SurrealDB 嵌入式历史快照库(
suanctl save/suanctl history)。 - GPU P2P 驱动能力矩阵、拓扑路径与实测速率:内置 CUDA Samples 的
p2pBandwidthLatencyTest(构建时检测到 nvcc + libcudart 即编译进二进制,
无外部依赖);未内置时回退 NVBandwidth。Enflame GCU 回退
efsmi --topo -m拓扑路径矩阵(仅路径,能力字段为未知)。每条链路标注两端 GPU 在 PCIe 树上的 上行汇聚点(最近公共上游桥),并对跨 NUMA 的 P2P 链路给出诊断告警。 - 内置 NCCL all_reduce 基准(
suanctl nccl,构建时检测到 nccl.h + libnccl 才编译)。 - JSON、JSONL、Markdown 证据报告。
- 推理端点压测:
suanctl bench对 OpenAI 兼容端点(llama.cpp / vLLM / SGLang) 发并发 /v1/chat/completions 负载,报告吞吐(tok/s)与延迟分位数;端点支持 配置文件[[endpoints]]显式声明与自动发现(进程/容器 + 探活)。 - 出厂检测(TUI 出厂检测页):验收清单逐项打勾,覆盖操作系统 / 内核版本 / CPU / 内存(含内存条规格)/ 硬盘(数量、总容量、系统盘、数据盘干净度)/ RAID(硬 RAID 控制器与 mdraid 降级)/ 网络配置(IP 与 static/DHCP)/ GPU 数量与健康 / ECC / PCIe 链路宽度 / 驱动一致性 / P2P 能力与实测 / IOMMU / ACS / 系统日志 / 诊断发现。
默认采集路径使用 Linux sysfs、procfs、固定只读命令和 GET 探针。P2P/NCCL 实测由
显式操作触发(p2p --benchmark / nccl / TUI b 键)。
build.rs 构建时探测 CUDA 工具链,条件编译内置测速器,无 GPU/CUDA 环境构建
不受影响(相应能力运行时报告不可用):
- 检测到
nvcc+libcudart→ 编译third_party/p2p_test/(CUDA Samples 13.2p2pBandwidthLatencyTest改造)进二进制,p2p --benchmark直接执行内置 带宽/延迟矩阵测试,不再依赖外部 nvbandwidth。 - 检测到
nccl.h+libnccl→ 编译third_party/nccl_test/(最小 all_reduce 基准)进二进制,suanctl nccl执行。
make dist-full # 完整版:测速器强制嵌入二进制(构建机需 nvcc,缺失即报错)
make dist-lite # 轻量版:仅本体,不内置任何 CUDA 测速器
make cuda-testers # 单独编译 CUDA 测速器到 dist/cuda-testers/(需 nvcc)轻量版可在事后补齐 P2P 实测能力:把 make cuda-testers 的产物
suanctl-p2p-test 放到以下任一位置,运行时自动发现(优先级从高到低):
- 环境变量
SUANCTL_P2P_TEST_BIN=/path/to/suanctl-p2p-test suanctl主程序同目录~/.suanctl/bin/suanctl-p2p-test
测速器动态链接系统 libcudart,需与目标机的 CUDA runtime 匹配。
# 首次构建需联网拉取依赖(含 SurrealDB);之后可用 --offline
cargo build --release
./target/release/suanctl tui开发环境可使用 Makefile:
make demo
make doctor
make p2p
make verify| 快捷键 | 操作 |
|---|---|
1-8、方向键 |
页面导航(总览 / GPU / 服务 / 诊断 / 出厂检测 / 报告 / 日志 / 远程) |
↑/↓/PgUp/PgDn、Home/End、鼠标滚轮 |
页面滚动(每页独立) |
/ |
过滤(日志 / 诊断 / 出厂检测页,Esc 清除后退出) |
r |
采集更新(后台执行,Esc 可取消,UI 不冻结) |
b |
P2P 测速 |
s |
远程扫描:从候选列表选择设备后回车(远程页) |
m |
导出格式:JSON / JSONL / Markdown |
e |
报告导出 |
Enter/Esc |
关闭操作结果弹窗(5 秒后自动消失) |
? |
帮助 |
q |
退出 |
suanctl doctor
suanctl doctor --json
suanctl logs
suanctl logs --json
suanctl p2p
suanctl p2p --benchmark
suanctl report --format markdown --output suanctl-report.md
suanctl config
suanctl doctor --config suanctl.toml
suanctl save
suanctl history [--limit 10] [--show <id>] [--json]
suanctl net show # 网卡清单 + netplan 配置(只读)
suanctl net set # 交互式配置 IP(选网卡 → DHCP/静态 → 预览 → 确认)
suanctl net set eno1 --address 192.168.1.10/24 --gateway 192.168.1.1 --dns 114.114.114.114
suanctl bench --list # 列出可压测的推理端点(探活后)
suanctl bench # 自动发现第一个可达端点并压测
suanctl bench --endpoint http://127.0.0.1:8080 --prompts 32 --concurrency 8net set 生成 /etc/netplan/60-suanctl-<iface>.yaml 并执行 netplan apply(需 root);
写入前备份 /etc/netplan 到 ~/.suanctl/netplan-backup/<时间戳>/,apply 失败自动回滚。
--dry-run 只打印 YAML,--yes 跳过确认(脚本化用)。
p2p --benchmark、doctor --p2p-benchmark 和 report --p2p-benchmark 执行 NVBandwidth GPU 负载。
save 将一次完整采集快照持久化到本地 SurrealDB(嵌入式 surrealkv 引擎),
history 查询历史快照并支持按 id 回放——为趋势/基线对比打基础。
suanctl save # 采集并保存,输出记录 id(如 snapshots:xxx)
suanctl history # 最近 10 条(时间/状态/主机/GPU 数)
suanctl history --limit 50 # 最近 50 条
suanctl history --status warning # 按采集状态过滤(healthy/warning/critical/unavailable/unknown)
suanctl history --host <name> # 主机名子串匹配
suanctl history --pattern xid # 日志异常模式过滤(xid/nvrm/pcie_bus_error/…)
suanctl history --log-source dmesg # 日志来源过滤(dmesg/kern.log/syslog/…)
suanctl history --log-status critical # 日志异常级别过滤
suanctl history --search OOM # 日志尾部行内容关键字搜索(大小写不敏感)
suanctl history --gpus 8 # GPU 数量 ≥ 8
suanctl history --since 7d --until 2026-08-01 # 时间范围(7d/24h/30m、2026-08-01、RFC3339、毫秒)
suanctl history --offset 10 # 分页跳过前 N 条
suanctl history --show <id> # 查看指定快照元信息
suanctl history --show <id> --json # 导出完整快照 JSON
suanctl log-events # 跨快照日志异常事件(save 时展开)
suanctl log-events --pattern xid # 按异常模式过滤
suanctl log-events --stats # 异常模式统计(出现快照次数/命中合计)
suanctl remote # 仅列出 ~/.ssh/config 候选设备(不扫描、不连接)
suanctl remote --host k1 # 只扫描指定某台设备
suanctl remote --host k1 --json # 指定单台 + 机器可读输出所有过滤条件可组合(AND 语义),值经参数绑定防注入。日志异常匹配在每次 save 时展开为
log_events 事件表,支持跨快照检索与统计。
remote 不自动扫描全部设备:不带 --host 时仅列出 ~/.ssh/config 中的候选设备
(只读展示,不建立任何连接);用户用 --host <别名> 显式指定某台,才扫描该台。
指定单台后流程为:先做权限预检测(sudo -n true),再执行系统级只读采集:
主机/负载信息、nvidia-smi GPU 摘要、内核日志尾部。当前用户无 sudo 权限时提示并
降级(跳过 dmesg 等系统级采集项,结果标记 [已降级]),不会采集到一半才报错。
remote 只能执行固定白名单命令;需要完整本地能力(内置 CUDA P2P 测速、NCCL、
日志异常检测、本地存储等)时,用 suanctl agent 把 suanctl 自身部署到免密主机并
作为 worker 执行:
suanctl agent wfk8smaster3 # 部署自身(版本匹配则跳过上传)
suanctl agent wfk8smaster3 --check-sudo # 部署 + sudo 预检测
suanctl agent wfk8smaster3 doctor --json # 远程本地模式完整采集(JSON 管道干净)
suanctl agent wfk8smaster3 p2p --benchmark # 远程内置 CUDA Samples P2P 测速
suanctl agent wfk8smaster3 nccl # 远程 NCCL all_reduce 基准
suanctl agent wfk8smaster3 --redeploy doctor # 忽略版本,强制重新上传控制端与被控端角色显式指定(--role),不依赖 ssh 免密探测;被控端无决策权、
只执行命令:
suanctl agent wfk8smaster3 --role controller handshake # 本端声明控制端(默认)
suanctl agent wfk8smaster3 --role worker handshake # 本端声明被控端
suanctl identity [--json] # 本机身份(握手交换用)握手交换双方身份(hostname / 用户 / 版本 / 系统 / 内置能力)并输出协商结果:
本端为控制端时对端为 worker(无决策权);本端声明 worker 时提示对方机器如何反向控制。
--redeploy 可强制刷新远程 agent(版本号相同但代码更新时使用)。
安全约束:ssh 参数固定(BatchMode + ConnectTimeout + accept-new);传输优先走
rsync(-az --partial --inplace,增量/断点续传,大二进制更稳),rsync 不可用时
回退 ssh stdin 管道(均不经远端 shell 拼接);远程路径固定为
~/.suanctl/agent/suanctl;远程命令由本进程 argv 直传。构建时若静态链接 CUDA
runtime(build.rs 自动选择),agent 客户端在无 CUDA 机器上也能运行,远程 GPU
机器直接具备内置测速能力。
TUI 的「远程」页(7 或方向键进入)展示候选设备列表,按 s 进入选择模式
(↑/↓ 或数字 1-9 移动光标),回车后只扫描选中的那台(Esc 取消),异步执行,展示状态、
sudo 可用性、降级标记与采集摘要。
数据目录缺省 ~/.suanctl/data,可用全局参数 --data-dir <path> 覆盖。
--config <path>(全局参数)加载 suanctl.toml;不提供时行为与旧版一致。
# 追加自定义日志异常模式(与内置 Xid/NVRM/AER/ECC 等合并)
[logs]
extra_patterns = [
{ name = "my_app_error", regex = "my-app.*failed", severity = "critical" },
]
# 启用插件采集:扫描目录下 *.sh 只读脚本(输出 ≤50 行/行 ≤200 字符)
[plugins]
enabled = true
dir = "/etc/suanctl/plugins" # 缺省 ~/.suanctl/plugins
# 远程主机清单(为远程巡检预留)
[[hosts]]
name = "k1"
address = "172.18.5.123"
user = "root"
# 显式声明推理服务端点(服务发现与 suanctl bench 共用)
[[endpoints]]
name = "本地 llama.cpp"
engine = "llama_cpp" # llama_cpp / vllm / sglang
url = "http://127.0.0.1:8080"
model = "qwen" # 可选;缺省查 /v1/models示例插件见 examples/plugins/sensors.sh;suanctl config --config <path> 可校验并展示配置。
make verify