SpyGlass 运行卡死/超时:sg_shell hang 住不动排查速查
更新时间:2026-10-23。FAQ 速查页,属于 EDA 工具排错系列。SpyGlass 的「卡死」有两种气质:一种是真在算(大设计的 CDC/RDC 规则在病态电路上组合爆炸,CPU 打满几十小时不稀奇),一种是真挂了(等 license、NFS 挂载点 hang 死、GUI 在等一个永远连不上的 X server)。第一步永远是分清这两种——杀错一个跑了九成的 CDC 任务,损失的是整晚的机器时间。同系列对照见 PrimeTime 运行卡死/超时,license 拉不上来的另一条线见 SpyGlass license 拉取失败。
本文要回答的问题
- sg_shell 起跑后几小时没结果,日志停在一行不动,是死了还是在算?
- 等 license 的 hang 为什么不报任何错?
- CDC/RDC 规则在什么设计上会组合爆炸?
- 怎么判断是 NFS hang、swap 颠簸还是管道堵死?
一、报错原文与现象
(无报错——日志最后一条停在三小时前)
Info: Analyzing design 'top' for goal 'cdc/cdc_verify_struct' ...
(进程还在,CPU 0%,时间戳不再更新)卡死类问题「没有报错」就是报错本身。先锚定三个现场:日志最后一条停在哪、进程还在不在、CPU 是 0% 还是 100%——这两个极端形态直接把病因分成「等外部事件」和「在病态电路上空转」两大阵营。
二、可能原因总览
| 现象特征 | 可能原因 | 处置 |
|---|---|---|
| 日志停在 license checkout 前一行、CPU 0% | FlexLM 令牌占满排队等待,不报错 | lmstat 查池子、错峰或加令牌 |
| 进程 D 态、kill -9 都杀不掉 | NFS 挂载点 hang 住,IO 不可中断 | 查挂载点、换本地盘、重挂 |
| CPU 100% 单核打满、日志缓涨或不动 | CDC/RDC 规则在病态电路上组合爆炸 | 拆 goal、加约束、分模块跑 |
| DISPLAY 设了但 X server 不通 | GUI 模式被脚本误拉起等 X 显示 | 批处理统一 -batch、unset DISPLAY |
| 直接跑正常、走管道就 hang | stdout 接到没读者的 pipe 缓冲写满 | 改分段写文件、下游排障 |
| CPU 低、负载高、内存吃满但未 OOM | 超大扁平设计 swap 颠簸 | 加内存、换大机器、分层跑 |
| 某个 goal 永远跑不完,其他正常 | 单 goal 病态展开 | 单独拆出该 goal 分跑 |
| RUNLIMIT 被杀 | 调度时限按小设计估的 | 按分段日志校准时限 |
三、逐条排查展开
第一刀:top + /proc 给 sg_shell 把脉。
top -b -n1 | grep -E "sg_shell|spyglass"
tail -3 spyglass.log
cat /proc/<pid>/status | grep -E "State|VmRSS"CPU 持续打满(通常单核 100%)是真在算阵营;CPU 近 0% 是等外部事件阵营;State 是 D(不可中断睡眠)则直接进入 NFS 线。别拿 top 单次采样下结论,连采三次。VmRSS 接近物理内存、系统整体变卡,则是 swap 颠簸的形态。
等 license 的 hang 最阴险:FlexLM 排队等待不报错。 SpyGlass 令牌被占满时,sg_shell 会安静地停在 checkout 那一行之前,没有 Waiting 字样、没有超时、没有重试——日志看起来就是「正常启动到一半停了」。判别:进程 S 态、CPU 0%、日志停在启动早期。用 lmstat 看池子:
lmstat -a -c <port>@<lic_server> | grep -i spyglass占着令牌的多半是挂了没退干净的会话。处置不是重启(重启只会重新排队),而是让管理员释放僵死会话或错峰调度。checkout 直接报错(而不是静默排队)的另一类问题见 SpyGlass license 拉取失败。
NFS hang 是「杀都杀不掉」的那一种。 设计库、cg_cells、wdir 目录躺在 NFS 上,服务端或网络抖一下,挂载点 hang 住,sg_shell 所有读写阻塞在内核态——进程 D 态、kill -9 无效(信号要等 IO 返回才投递)、连 ls 那个目录的别的进程也会一起卡。判别:D 态 + 同挂载点其他进程也卡。处置:确认 NFS 服务端健康后重挂(umount -f 不行就 umount -l 懒卸载),长期把 wdir 和中间产物挪本地盘,设计库只读挂载并加 soft,timeo 参数避免硬等。
CDC/RDC 组合爆炸是 SpyGlass 特有的「真在算但等于死了」。 cdc_verify_struct、rdc_verify_struct 这类规则要在跨时钟域路径上做结构分析,跨域扇出巨大、约束缺失(没设 set_clock_groups / quasi_static)的设计上,路径枚举指数级展开——CPU 100% 单核打满,跑几十小时不出结果,看起来和 hang 唯一的区别是 CPU 占用。判别:strace -c -p <pid> 看是不是在做密集计算而不是卡在 syscall;日志若开了 verbose 会看到 rule 进度在龟速推进。处置三板斧:补 SDC/约束把伪路径砍掉;把大 goal 拆成小 goal 分模块跑(spyglass -batch 里逐 goal 提交);用 set_option enable_cdc_analysis fast 之类的降精度选项先出粗结果。
GUI 等 X 显示专咬「脚本里抄了交互命令」的人。 启动命令带了 -gui,或 DISPLAY 变量被 shell 配置文件设上了但 X server 根本不通(batch 节点没有 X 转发),sg_shell 会阻塞在 X 连接上——CPU 0%、日志停在 GUI 初始化前。判别:echo $DISPLAY 在调度节点上非空但 xdpyinfo 连不上。根治:批处理统一 sg_shell -batch 并在提交脚本里 unset DISPLAY。
管道阻塞与 swap 颠簸是两类「像死了」的尾部病因。 sg_shell ... | tee log 下游没读者时缓冲写满,进程阻塞在 write,直接重定向到文件就正常——改分段写文件。超大扁平设计内存需求超过物理内存时不 OOM 但 swap 颠簸,系统负载飙高、CPU 利用率反而低、全程慢得像死了——free -g 看 swap 用量,处置是换大内存机器或改分层(hierarchical)流程。
颜色按语义分角色:红是卡死入口与三种确认的病态形态,蓝是排查动作,绿是「确诊 CDC 组合爆炸」这条「真在算但需干预」的分支,橙是修复动作,紫是收尾防复发。主线是「把脉三件套先按 CPU 与进程状态分阵营,再等外部事件阵营按日志最后一行分流」——license、X 显示、管道、swap、NFS 各占一条,互不串味。
四、预防与纪律
- 分段日志打时间戳:design read / elaborate / 每个 goal 的头尾各打一行,hang 了日志最后一行就是定位锚点。
- 批处理一律 -batch 且 unset DISPLAY:从提交脚本封装层消灭 X 等待,禁止交互参数混进回归脚本。
- wdir 与中间产物放本地盘:NFS 只挂只读设计库且加 soft/timeo 参数,硬挂载改软挂载。
- CDC/RDC 大设计先补约束再跑:quasi_static 与 set_clock_groups 不全的设计不进全芯片回归,先模块级验证。
- 时限按历史 p95 校准:每个 goal 单独建档耗时,RUNLIMIT 取 p95 的 1.5 倍,超时先收日志再杀。
- 令牌占用例行公示:谁占着 SpyGlass 令牌一目了然,排队纠纷当天解决。
这一篇在知识体系里的位置
本篇是 EDA 排错速查簇中「SpyGlass 运行态卡死」节点的 FAQ 页,与 PrimeTime 运行卡死/超时 同构互参;license 显式报错的那条线见 SpyGlass license 拉取失败;SpyGlass lint 流程背景见 RTL Lint 与 SpyGlass 流程。
一句话总结
SpyGlass 卡死先用「CPU + 进程状态 + 日志最后一行」三件套分阵营:CPU 打满查 CDC/RDC 组合爆炸(补约束、拆 goal、降精度),CPU 近零按日志分流——停在 checkout 前查 FlexLM 令牌池、停在 GUI 初始化前去 -gui 并 unset DISPLAY、走管道才复现改分段写文件、负载高内存满查 swap;D 态杀不掉一律查 NFS。长期靠分段日志、本地盘 wdir、约束先行与时限校准四件套,让每次 hang 都能当场定位。