SpyGlass 磁盘写满速查:No space left on device 与截断日志处置
更新时间:2026-10-23。FAQ 速查页,面向在共享 Linux 服务器上跑 SpyGlass lint/CDC 回归的入门同学。SpyGlass 是典型的「磁盘吞吐型」EDA 工具:每跑一次 run,工作目录下就留一份编译缓存、中间数据库与成串 report;回归一夜攒出几十个 run 目录不清理,盘满只是时间问题。盘满直说时是一句
No space left on device,阴损时 run 中途断掉、报告和数据库写了半截,下一轮 SpyGlass 报的是数据库损坏或解析错误,排查方向很容易被带偏。事后读回半截文件的那条线由 SpyGlass 段错误崩溃速查 与本篇分工衔接:本篇管「写满那一刻」,崩溃与截断文件的善后管「写满之后」。同为静态时序阵营的 PrimeTime 同主题处置见 PrimeTime 磁盘写满速查。
本文要回答的问题
- SpyGlass run 中途报
No space left on device,先救场还是先重跑? df -h看着还有空间,SpyGlass 为什么还是写不进报告?- 工作目录里到底是谁在吃盘:run 目录、报告、core、临时文件各占多少?
- NFS 上磁盘没满却报写失败,quota 与个人配额怎么查?
- 回归批量跑时,run 目录轮转与清理纪律怎么定?
一、报错原文与典型现象
最常见的是 report 或数据库写出阶段失败,工作目录以 /proj/lint 占位:
Error: Cannot write file "/proj/lint/spyglass_reports/lint/lint.rpt":
No space left on device
[ERROR] Failed to write database "/proj/lint/spyglass.db" -- disk full第二种现场在编译缓存与中间文件阶段。work/ 或 spyglass.cache/ 写到一半失败,留下不完整的编译单元,下一轮 SpyGlass 报的是符号缺失或数据库版本不匹配:
Fatal: write failed on "/proj/lint/work/spyglass.cache/xxx.dat"
Error (internal): unexpected end of file reading design database还有三种容易误判的形态。一是 core dump:SpyGlass 进程崩溃时若 ulimit -c 不限大,单个 core 文件可达几十 GB,崩溃一次就把盘打穿;二是 /tmp 小分区:TMPDIR 没指到大分区,中间临时文件把 /tmp 撑爆,df -h /proj/lint 看着没事但 /tmp 已 100%;三是 tee 双份写:回归脚本里 spyglass ... | tee run.log,报告文件与管道日志写同一份内容两份,盘耗直接翻倍。要警惕「二次故障」:盘满当次没注意,下一轮读到写了半截的数据库,报的是损坏类新错误——看到这类报错先回头翻上一轮 run 日志尾部有没有 No space left。
二、占盘大户与病因处置表
| 占盘来源 | 典型位置 | 体量与特征 | 处置 |
|---|---|---|---|
| run 目录堆积 | 工作目录下每次 run 一套编译缓存与报告 | 回归一夜几十个 run,各数百 MB 至 GB | 只保留最近 N 轮,老 run 整目录轮转删除 |
| verbose 大报告 | spyglass_reports/ 各 goal 的 .rpt | verbose 模式单份报告可上 GB | 报告级别调回 normal,抓完结论即归档 |
| core dump | 工作目录或 core_pattern 指定路径 | 崩溃一次几十 GB | 日常 ulimit -c 0,排错时按需临时开 |
| 临时文件 | /tmp、TMPDIR 指向分区 | 大设计中间文件撑爆小分区 | TMPDIR 重指到大分区,跑完即清 |
| NFS 个人配额 | 家目录与共享卷 | 卷有空闲但个人 quota 满 | quota -s 查限,清理或申请提额 |
| tee 双份日志 | 回归脚本管道写两份 | 报告内容重复占盘 | 只留一份,日志走重定向不双写 |
| 编译缓存 | spyglass.cache/、work/ | 跨 run 复用但长期累积膨胀 | 版本升级或长期不用时整目录清 |
| inode 耗尽 | 小文件密集的缓存/报告目录 | df -h 有余量、df -i 100% | 整目录清小文件,不要逐个大文件删 |
表中体量均为典型量级,具体数字以设计规模与所用 SpyGlass 版本(如 2025.06)为准。
三、排查决策图
先判「容量满、inode 满还是配额满」,再用 du 定位大头,最后才动手清理——顺序反了会白删文件。
读这张图抓住一次分叉:红色入口先经蓝色三线同查,切成「容量满」与「inode/配额满」两条互不相干的通道,再汇入蓝色的 du 下钻定位。红色只标现象与命中的根因,蓝色全是排查动作,橙色是这一次的救火动作,紫色闭环是从失败 goal 重跑并沉淀防复发策略。不要跳过三线同查直接删大文件——inode 耗尽或配额触顶时删几个 GB 的报告毫无作用,得清小文件密集的整棵缓存目录或找存储管理员提配额。
四、逐条排查展开
第一刀:容量、inode、配额三条线一起看。 Linux 上在工作目录敲:
df -h /proj/lint # 工作卷容量水位
df -h /tmp # TMPDIR 所在分区水位
df -i /proj/lint # 同一卷 inode 水位
quota -s # NFS/共享卷个人配额
du -h --max-depth=2 /proj/lint 2>/dev/null | sort -rh | head -20Use% 打到 100% 是容量写穿,注意要单独看 /tmp——TMPDIR 没重指时 SpyGlass 把大中间文件全压在系统小分区上;df -h 还空着但 IUse% 100%,是缓存与报告目录里海量小文件吃光了 inode;quota -s 报超限则是卷没满、个人配额满了,这时 df 完全正常,最容易误判。
第二刀:run 目录轮转,回归场景的头号大户。 回归脚本每夜批量跑,每个 goal 留一套完整 run 目录(编译缓存 + 报告 + 日志),几十轮下来轻松吃掉数百 GB。处置口径:回归收尾脚本里加轮转,只保留最近 N 轮(常见取 5 至 10)与标记为里程碑的轮次,其余整目录删除;正在跑的 run 目录不能动,先确认 SpyGlass 进程已退出。手动清时按时间戳排序:ls -dt run_* | tail -n +11 | xargs rm -rf,删前先确认没有人在翻旧报告。
第三刀:报告、core 与 TMPDIR,三个隐形炸弹。 verbose 模式单份 lint/CDC 报告可上 GB,日常回归把报告级别调回 normal,只在定位具体违例时临时开 verbose,抓完结论归档后清原始大报告。core dump 默认会在崩溃时落盘,日常环境 ulimit -c 0 直接关掉,真要抓崩溃现场再临时打开并指到大盘;历史 core 文件用 find /proj/lint -name "core*" -size +1G 翻出来删掉。TMPDIR 在跑大设计前显式重指:export TMPDIR=/proj/lint/tmp,并在 run 脚本收尾清理该目录。
顺手交代一句救场顺序:盘满导致 run 中断时,先腾空间再重跑,不要在没腾空间的情况下反复 retry——每次 retry 都会再写一轮半截文件,把盘压得更死,也让后续定位哪份报告可信变得更难。
第四刀:缓存与双份日志,清不动就挪。 spyglass.cache/ 与 work/ 下的编译缓存跨 run 复用能提速,但版本升级(如换 2025.06)或长期不用时应整目录清掉重建,旧版本缓存留着既占盘又可能引发兼容误报。tee 双份写改单向重定向:spyglass -batch ... > run.log 2>&1,报告由 SpyGlass 自己落盘,管道不再复制一份。共享服务器上把 run 工作区从家目录挪到数据卷,家目录配额通常最紧。
五、预防与纪律
- run 目录轮转进脚本:回归收尾自动只留最近 N 轮,里程碑轮次打标签豁免。
- 报告级别默认 normal:verbose 只在定位问题时临时开,抓完即归档清理。
- core 默认关:日常
ulimit -c 0,抓崩溃现场再临时开并指大盘。 - TMPDIR 显式重指:跑前
export TMPDIR到大分区,收尾清理。 - 回归日志不双写:重定向单份落盘,tee 只用于交互调试。
- 定期巡检:
du与quota -s纳入例行检查,工作卷预留约 20% 空闲容纳单轮回归峰值。
这一篇在知识体系里的位置
本篇是 EDA 工具排错速查簇的 FAQ 页,专管 SpyGlass 磁盘容量、inode、配额一条线;run 中途无进展的挂起类问题在 SpyGlass 卡死超时速查,内存/句柄类资源耗尽(报的是 memory 而非 disk)在 SpyGlass 资源耗尽速查,写满导致进程崩溃的善后见 SpyGlass 段错误崩溃速查,同主题在 PrimeTime 阵营的对照处置见 PrimeTime 磁盘写满速查。
一句话总结
SpyGlass 磁盘写满先 df -h(含 /tmp)、df -i、quota -s 三线同查容量、inode 与配额,再用 du 下钻锁定 run 目录堆积、verbose 大报告、core dump、TMPDIR 小分区、编译缓存与 tee 双份写这几类大户:run 目录按只留最近 N 轮轮转删除、报告调回 normal、core 日常关闭、TMPDIR 重指大盘、日志改单份重定向,写穿当次的半截数据库与报告不可信、腾空间后从失败 goal 整链重跑,长期靠回归脚本内置轮转清理与定期 du 巡检两条纪律防复发。