Palladium 仿真器监控教程:test_server 解析与 LD 逻辑板可视化
Palladium 仿真器上的逻辑板(LD 板)谁在用、用了多久、还剩多少空闲,平时只能在终端里跑 test_server -short 看一屏密密麻麻的字符输出。palladium-monitor 就是把这个输出解析成可视化仪表板的工具:Rack / Cluster / Board 三级结构、每块 LD 板的 8 个逻辑板用色块展示,作业、T-Pod 可用性、利用率趋势和每日邮件报告一应俱全。这篇教程讲清它监控什么、数据怎么来、以及怎么部署。
一、项目简介
palladium-monitor 是 git.cnbugs.com 上 AI-Agent 组织的一个开源项目(仓库地址 https://git.cnbugs.com/AI-Agent/palladium-monitor),定位是 Palladium 仿真器的 LD 逻辑板使用监控系统。它不直接连仿真器硬件,而是解析 Cadence Palladium 自带的 test_server -short 命令输出,把文本里的逻辑板状态、作业信息和 T-Pod 状态结构化后存进 SQLite,再用 Web 仪表板展示出来。
技术栈很轻:后端 Flask 3.0 + Flask-SQLAlchemy + SQLite,前端 Jinja2 模板 + 原生 CSS(暗色主题)+ Chart.js 趋势图,解析靠 Python 正则表达式。整个服务一个 app.py 就包含了应用、解析器、数据模型、路由和 API,部署就是起一个 Python 进程。
二、它监控什么:LD 逻辑板状态
test_server -short 的输出里,每块 LD 板有 8 个逻辑板(Domain,编号 D0-D7),每个逻辑板有 4 种状态。监控系统的核心就是把这些状态翻译成一眼能看懂的色块:
| 输出里的符号 | 含义 | 仪表板颜色 | 说明 |
|---|---|---|---|
- | 可用(Domain is available) | 🟢 绿色 | 空闲,可以被新作业使用 |
<数字> | 已加载/预留(Domain is downloaded or reserved) | 🔵 蓝色 | 正被某个作业占用,数字是作业编号 |
D | 已禁用(Domain is disabled) | 🔴 红色 | 硬件或配置原因禁用,不可用 |
X | 不存在(Domain does not exist) | ⬜ 灰色 | 这块板上没有这个逻辑板 |
仪表板按 Rack → Cluster → Board 三级组织,每块 LD 板的 D0-D7 排成一行色块。除了状态本身,页面还实时展示四个指标:逻辑板总数、在线/离线数、逻辑板利用率、活跃作业数。作业信息包括用户、PID、T-Pod、设计名和已运行时间;T-Pod 可用性按 Rack 展示 HDSB / T-Pod 的可用、锁定、预留、不可用状态。
# 解析器支持的 test_server -short 输出长这样(节选)
Emulator: sc01_emu Hardware: Palladium Z1 Configmgr: V21.02.102.s002
System Status: PARTIAL
Rack 0 has 2 clusters
Cluster 0 has 6 boards CCD: ONLINE
LD Status D0 D1 D2 D3 D4 D5 D6 D7
0 ONLINE - - - - - - - -
三、功能特性
- 逻辑板状态可视化:Rack / Cluster / Board 三级结构,D0-D7 色块展示,一眼看出哪块板空闲。
- 实时指标:逻辑板总数、在线/离线、利用率、活跃作业数。
- 作业信息:用户、PID、T-Pod、设计名、已运行时间,排障时直接找得到是谁在占用。
- T-Pod 可用性:按 Rack 展示 HDSB / T-Pod 的可用、锁定、预留、不可用状态。
- 历史趋势:利用率折线图(Chart.js),支持历史快照查看和清理。
- 自动刷新:仪表板可选 15 秒 / 30 秒 / 1 分钟 / 5 分钟自动刷新。
- 多数据来源:手动粘贴、API 推送、远程采集脚本三种方式进数据。
- 历史导出:CSV(Excel 友好,带 UTF-8 BOM)和 JSON 两种格式,支持按时间范围、来源过滤,快照级和用户级两种粒度。
- 每日邮件报告:每天定时把利用率、离线板、活跃作业汇总成邮件发出来。
四、适用场景
- 仿真器资源调度:跑 Palladium 的团队每天都要回答“现在还有没有空板”,仪表板比挨个问、挨个跑命令快得多。
- 作业排障:某块板一直被占着不知道是谁,仪表板直接显示用户、PID、设计名和已运行时间。
- 容量规划:利用率历史趋势攒几个月,就能看出高峰期和增长,决定要不要加板子。
- 值班与汇报:每日邮件报告自动发给团队负责人,不用每天手动截图。
- 多台仿真器:每台 Z1 各推各的数据,用
--host标签区分来源,一个仪表板看多台。
五、部署监控服务器
监控服务器就是一个 Flask 应用,默认监听 5100 端口,数据存在 SQLite 里(instance/ 目录)。开发调试直接跑,生产用 gunicorn。
git clone https://git.cnbugs.com/AI-Agent/palladium-monitor.git
cd palladium-monitor
pip install -r requirements.txt --break-system-packages
python3 app.py
# 浏览器访问 http://localhost:5100
生产部署用 gunicorn 起 2 个 worker,绑定 0.0.0.0:5100。注意:邮件的定时调度器在进程内启动,每个 gunicorn worker 都会尝试启动,但项目里用 _scheduler_started 锁保证实际只有一个线程在跑,其余的只是 sleep 等下一天,不影响使用。
# 生产启动
gunicorn --workers 2 --bind 0.0.0.0:5100 app:app
# 建议写成 systemd 服务(示例)
cat > /etc/systemd/system/palladium-monitor.service << 'EOF'
[Unit]
Description=Palladium Monitor
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/palladium-monitor
ExecStart=/usr/bin/gunicorn --workers 2 --bind 0.0.0.0:5100 app:app
Restart=always
EnvironmentFile=/etc/palladium-monitor/mail.env
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now palladium-monitor
systemctl status palladium-monitor --no-pager
六、数据采集方式一:手动粘贴
最简单的办法,适合偶尔看一眼、不想部署采集脚本的场景:
- 在 Palladium 主机上执行
test_server -short,复制完整输出。 - 在 Web 界面点「📥 粘贴数据」按钮,把输出粘贴到文本框。
- 点「解析并存储」,仪表板立即刷新。
注意:第一次打开仪表板如果没有任何数据,页面会显示示例数据。判断有没有真实数据的方法是调 /api/latest 看最新快照的 source 字段——真实采集的来源是 collect.py@<host>,示例数据的来源是 sample。
七、数据采集方式二:API 推送(推荐)
长期监控用采集 agent:在 Palladium 主机(Z1)上部署 collect.py,定时跑 test_server -short 并把输出 POST 到监控服务器的 /api/collect。推荐用项目自带的一键安装脚本,它会处理环境加载、crontab 和依赖安装:
# 把 palladium-monitor/ 整个目录 scp 到 Z1 主机,然后:
sudo ./install_z1_agent.sh \
--url http://<监控服务器IP>:5100/api/collect \
--host scmp03 \
--env /edatools/vxe/VXE23.03.001/bin/env.csh \
--interval 30
安装脚本会做这几件事:建 /opt/palladium-monitor/、装 requests、备份原 crontab、写入每 30 分钟跑一次的 cron 任务、跑一次 dry-run 验证。卸载用 sudo ./install_z1_agent.sh --uninstall(保留日志)。
不想跑安装器也可以手动部署:
# 安装 requests
pip install requests
# 手动推送一次
python3 collect.py --url http://<监控服务器IP>:5100/api/collect --host scmp03
# 配合 crontab 定时推送(每 30 分钟)
*/30 * * * * /opt/palladium-monitor/collect.py --url http://<监控服务器IP>:5100/api/collect --host scmp03 --env /edatools/vxe/VXE23.03.001/bin/env.csh --log /var/log/palladium-collect.log >> /var/log/palladium-collect.cron.log 2>&1
collect.py 的关键是 --env 参数:test_server 是 Palladium 工具链里的命令,不加载 VXE 环境是找不到这个命令的。脚本会先 source 指定的 env.csh/env.sh,再执行采集命令。
| 参数 | 默认值 | 说明 |
|---|---|---|
--url | http://127.0.0.1:5000/api/collect | 监控服务器 API 地址 |
--cmd | test_server -short | 采集命令 |
--host | 本机 hostname | 本机标签,写入 source 字段(如 collect.py@scmp03) |
--env | 无 | VXE env.csh/env.sh 路径,脚本自动 source 后再执行采集命令 |
--timeout | 300 | 采集命令超时秒数 |
--retries | 3 | 推送失败重试次数 |
--retry-delay | 5 | 重试间隔秒数 |
--log | 无 | 追加写日志文件路径 |
--dry-run | 无 | 只采集不推送,打印输出 |
退出码也有讲究,cron 收到非 0 会通过 MAILTO 触发告警:
| 退出码 | 含义 |
|---|---|
| 0 | 成功 |
| 1 | 采集命令无输出 / 失败 |
| 2 | 推送失败(已重试) |
| 130 | 用户中断(Ctrl-C) |
八、数据采集方式三:直接 API 调用
# 把 test_server -short 的完整输出当 JSON 推过去
curl -s -X POST http://<服务器>:5100/api/collect \
-H "Content-Type: application/json" \
-d '{"raw_output": "<test_server -short 完整输出>"}'
# 查最新快照(验证数据到了没)
curl -s http://<服务器>:5100/api/latest | python3 -m json.tool
# 查历史趋势
curl -s http://<服务器>:5100/api/history | python3 -m json.tool
九、API 端点总览
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | / | 仪表板页面 |
| GET | /history | 历史快照列表 |
| GET | /snapshot/<id> | 快照详情 |
| POST | /paste | 手动粘贴数据(表单提交) |
| POST | /api/collect | 接收原始输出(JSON) |
| GET | /api/latest | 最新快照 JSON |
| GET | /api/history | 历史趋势 JSON |
| GET | /api/export | 导出历史(CSV/JSON,支持时间范围 + 来源过滤) |
| POST | /api/cleanup?days=N | 清理 N 天前数据 |
| POST | /api/snapshot/<id>/delete | 删除指定快照 |
十、历史数据导出:快照级与用户级
/api/export 支持 CSV(Excel 友好,带 UTF-8 BOM)和 JSON 两种格式,支持两种导出粒度。Web 界面入口在历史记录页右上角「📤 导出」按钮,弹窗里选粒度。
GET /api/export?format=csv # 默认:快照级 CSV 全部
GET /api/export?format=json # 快照级 JSON 全部
GET /api/export?group=users # 用户级:每条快照 × 每个用户一行
GET /api/export?group=users&format=json # 用户级 JSON
GET /api/export?days=7 # 最近 7 天
GET /api/export?since=2026-07-01&until=2026-07-31 # 自定义范围
GET /api/export?source=collect.py # 按来源模糊匹配
GET /api/export?format=json&days=30&source=scmp03 # 组合
参数说明:format 是 csv(默认)或 json;group 是 snapshots(默认)或 users;days 限制最近 N 天(0/缺省 = 全部);since / until 是 YYYY-MM-DD 或 ISO 时间戳;source 模糊匹配来源字段;limit 最多返回条数(默认 10000,上限 100000)。
快照级导出每条快照一行,CSV 文件名 palladium_snapshots_YYYYMMDD_HHMMSS.csv,21 列(时间本地+UTC、仿真器/硬件/ConfigMgr、系统状态、来源、板/域计数、利用率、作业数等),末尾追加“用户名”(该快照下占用 LD 板的所有用户,逗号分隔)和“用户LD板数”。用户级导出是每条快照 × 每个占用 LD 板的用户一行,12 列,含用户名、用户LD板数、LD 板号、Rack、占用域数、设计名、T-Pod、运行时间。注意:用户名和 LD 板数来自详细版 test_server 输出的逐域归属数据,短格式(test_server -short)快照没有逐域归属,快照级导出用户列显示 -,用户级导出里不出现该快照。
十一、每日邮件报告配置
邮件功能全靠环境变量配置,监控服务启动时自动读取,不用 Web UI。所有变量都是可选的,不配就相当于关闭邮件功能。每天定时发送,报告包含系统信息、当前指标卡片、近 24 小时趋势统计 + 样本柱状图、离线板列表、活跃作业列表,邮件主题是 [Palladium] 每日报告 YYYY-MM-DD — 利用率 X.X%,正文同时发 HTML 和纯文本,客户端自动选合适的渲染。
# 方式一:直接 export 后启动
export MAIL_ENABLED=true
export SMTP_HOST=smtp.exmail.qq.com
export SMTP_PORT=587
export SMTP_USER=monitor@company.com
export SMTP_PASSWORD='你的邮箱密码或授权码'
export MAIL_FROM=monitor@company.com
export MAIL_TO=team-lead@company.com,ops@company.com
export MAIL_SEND_HOUR=8
export MAIL_SEND_MINUTE=30
gunicorn --workers 2 --bind 0.0.0.0:5100 app:app
生产推荐用 systemd 的 EnvironmentFile,把变量写进 /etc/palladium-monitor/mail.env,service 文件里加一行 EnvironmentFile=/etc/palladium-monitor/mail.env,改完 systemctl daemon-reload && systemctl restart palladium-monitor。关键变量说明:MAIL_ENABLED 设为 true/1/yes 开启;SMTP_PORT 默认 587(STARTTLS),465 用隐式 SSL(SMTP_USE_SSL=true),25 是明文;Gmail 的密码要用 16 位 App Password,不能用登录密码;MAIL_TO 是英文逗号分隔的收件人列表;MONITOR_BASE_URL 是监控页 URL,用于邮件里“查看完整仪表板”链接。
邮件还有三个 API 端点:GET /api/email/status 查看当前邮件配置(不泄露密码)、GET /api/email/preview 渲染报告内容(不发送,浏览器内联展示)、POST /api/email/send 手动触发一次(需要 ALLOW_EMAIL_TRIGGER=true,默认禁止)。
十二、常见问题
| 症状 | 检查 |
|---|---|
| 仪表板一直显示示例数据 | curl http://<monitor>:5100/api/latest 看最新快照的 source 字段,应为 collect.py@<host> 而不是 sample |
| Z1 端推送失败(exit=2) | tail -50 /var/log/palladium-collect.log;若 test_server 命令找不到,加 --env /edatools/vxe/VXE23.03.001/bin/env.csh |
| cron 没跑 | crontab -l | grep palladium;grep CRON /var/log/syslog(Linux) |
| 推送成功但数据没更新 | 监控服务器 SQLite 写入是同步的,先看 /api/latest 的 timestamp,再看 gunicorn 日志 |
| 想清理老数据 | curl -X POST 'http://<monitor>:5100/api/cleanup?days=30' |
| 多台 Z1 一起推 | 给每台用不同的 --host 标签,仪表板即可区分来源 |
十三、运维建议
- 采集间隔:默认 30 分钟推一次够用了,板子紧张的时候可以改成 10 分钟,但别太密——
test_server本身要跑一阵子,太密会给仿真器添负担。 - 备份 SQLite:历史快照都在
instance/的 SQLite 文件里,定期 cp 一份出来,丢了就没法看趋势了。 - 定期清理:快照攒多了表会变大,用
/api/cleanup?days=90之类的定期清理,或者在 crontab 里加一条。 - 多仿真器:每台 Z1 的采集 agent 用不同的
--host,再配不同的--env(各台的 VXE 版本可能不一样)。 - 邮件收件人:收件人列表尽量用团队邮箱组,别写个人邮箱,人员流动了不用改配置。
总结一下:palladium-monitor 的思路很直接——不碰硬件,只解析 test_server -short 的输出,把 LD 逻辑板状态变成色块仪表板。部署分两头:监控服务器一个 Flask 进程(gunicorn + 5100 端口),Z1 主机上一个 collect.py 定时推送。搭起来之后,板子谁在用、还剩多少、利用率趋势,全在浏览器里一眼看清,排障和容量规划都有了依据。







