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,再执行采集命令。

参数默认值说明
--urlhttp://127.0.0.1:5000/api/collect监控服务器 API 地址
--cmdtest_server -short采集命令
--host本机 hostname本机标签,写入 source 字段(如 collect.py@scmp03)
--env无VXE env.csh/env.sh 路径,脚本自动 source 后再执行采集命令
--timeout300采集命令超时秒数
--retries3推送失败重试次数
--retry-delay5重试间隔秒数
--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 定时推送。搭起来之后,板子谁在用、还剩多少、利用率趋势,全在浏览器里一眼看清,排障和容量规划都有了依据。

发表回复

后才能评论