Calibre 磁盘空间不足速查:No space left on device 与结果库写满怎么办
更新时间:2026-10-22。FAQ 速查页,属于 EDA 工具排错系列。Calibre(Siemens EDA 的物理验证工具,DRC/LVS/PEX 三件套)是个典型的「磁盘吞吐型」作业:大芯片 flat 跑一趟,SWDB 结果库、resolved results、PEX 网表、临时分区文件加起来可达数十至上百 GB(具体体量以工程与版本为准)。盘满的现场也分两种:一种直白,日志尾行就是
No space left on device;一种阴损,报错停在导出阶段,PEX 网表写了一半,报告看着像跑完了。本篇只讲磁盘这一类资源;内存与文件句柄触顶的分诊见 Calibre 资源不足速查,写坏产物的辨认见 Calibre 输入文件损坏或截断速查,正常流程背景见 Calibre 物理验证实操,全簇索引在 开源 EDA 报错排错中心。
本文要回答的问题
- calibre 报
No space left on device,满的到底是工作目录还是/tmp? df -h明明还有空间,为什么结果文件就是写不进去?- PEX 网表导出阶段死掉,文件已经在盘上了,能不能直接续跑?
- 一个 hierarchical run 散出几十个空子目录,怎么快速找到头号占盘者?
- 不换机器,怎样把一次验证的磁盘峰值压下来?
一、报错原文与现象
工程名、主机名与用户名以下均为占位。
1. 结果库写入直接失败:
***** ERROR: No space left on device writing to file
"/proj/demo/run_drc/drc_results/results.db".
***** ERROR: Unable to write SVDB database; run results may be incomplete.SWDB(Calibre 的结果数据库)由大量数据文件组成,写穿时当前 run 的结果库即不可信。
2. 临时文件创建失败,满的是另一个卷:
ERROR: Could not create temporary file "/tmp/cal_8f3a21.tmp":
No space left on device
Fatal: Calibre terminated during geometry processing.这种最迷惑:df -h . 看工作目录还空着一大截,实际满的是 /tmp 所在的小分区或 tmpfs。
3. 导出阶段静默截断:
***** ERROR: Write failed on PEX netlist "/proj/demo/run_pex/pex.net":
Disk quota exceeded
Warning: Output netlist may be incomplete.PEX 网表或 GDS 结果写到一半断掉,文件存在但内容残缺——下游 LVS/后仿真读它会报语法错或网表不全,那是二次故障,根子在这次写穿。
4. 空间还有但写不了:
No space left on device
$ df -h /proj/demo # Avail 还有 200G
$ df -i /proj/demo # IUse% 100%容量与 inode 是两条独立的线,海量小文件把 inode 吃光时,df -h 的剩余空间毫无意义。
二、可能原因总览
| 占盘来源 | 典型位置 | 体量与特征 | 处置 |
|---|---|---|---|
| SWDB/results.db 结果库 | runset 指定工作目录 | 大芯片 flat 可达数十至上百 GB | 跑完只归档报告,旧 run 定期清 |
| DRC RESOLVED RESULTS | 工作目录下 results 子目录 | 随违例数与版图规模涨 | 只保留需复核的 run |
| PEX 提取网表与中间文件 | 工作目录 | 网表加 RCC 数据库,单 run 数十 GB 不少见 | 分层提取、分块输出 |
| 运行期临时文件 | /tmp 或 TMPDIR 指向处 | 运行时突发占用,退出后残留 | TMPDIR 改指大卷 |
| hier run 各子目录 | 工作目录下分层子树 | 几十上百个子目录散落占盘 | 作业收尾统一清理 |
| verbose/turbo 日志 | transcript 与日志目录 | 长 run 日志可涨到数 GB | 降日志级别,跑完压缩 |
| 并发作业互抢同一卷 | 共享工作卷/NFS | 单作业够,叠加写穿 | 调度层做容量准入 |
| inode 耗尽 | 小文件密集的结果库 | df -h 有余量、df -i 100% | 清旧 run 的小文件目录 |
| 用户配额 quota | 家目录或共享盘 | 报 Disk quota exceeded | quota -s 查限,归档或申请扩容 |
表中体量都是典型形态,具体数字一律以本工程、本单位存储策略与所用 Calibre 版本为准。
三、分诊决策图
先分清「容量满还是 inode 满」「满的是 work 还是 tmp」,再动手清理,顺序反了会白删东西。
读这张图抓住两次分叉:红色入口先经蓝色的 df 双判,切成容量与 inode 两条互不相干的通道;两条通道再汇入蓝色的 du 定位,回答「满的是工作目录还是临时目录」。橙色是这一次的救火动作,紫色是把救火沉淀成流程。红色只标现象与命中的根因,蓝色全是排查动作,不要跳过双判直接进工作目录翻找——inode 问题删几个大文件毫无作用。
四、逐条排查展开
第一刀:容量与 inode 两条线一起看,别只敲 df -h。
df -h /proj/demo/run_drc # 工作目录所在卷的容量水位
df -i /proj/demo/run_drc # 同一卷的 inode 水位
df -h /tmp # 临时目录可能是另一个卷Calibre 的 SWDB 结果库是「大文件 + 海量小文件」的混合体:几何数据库吃容量,分层结果与分区索引吃 inode。IUse% 打到 100% 时,写文件报的同样是 No space left on device,但清几个 GB 的大网表救不了场,得整目录清旧 run 的小文件树。顺手敲一下 quota -s(具体命令随存储系统不同,以本机手册为准),报 Disk quota exceeded 时满的不是卷而是个人配额,删东西要删自己账下的,看卷水位没有意义。
第二刀:分清两个占盘位置——工作目录与 /tmp。 工作目录由 runset 控制,常见的有 DRC RESOLVED RESULTS、SVDB 数据库(results.db 一类)、PEX 输出网表,以及 hierarchical run 按层次散出的大批子目录;临时目录则由 TMPDIR(以及部分版本的 Calibre 专用临时变量,变量名以本机 calibre -help 与发行说明为准)决定,默认落 /tmp。作业异常退出后,/tmp 下的残留临时目录不会自己消失,攒几轮就把小分区顶满。看报错信息里的路径落在哪边,是最快的判据:路径在 run 目录下就是 work,在 /tmp 下就是临时卷。
定位头号占盘者,用 du 排序下钻,不要凭感觉删。
du -h --max-depth=2 /proj/demo 2>/dev/null | sort -rh | head -20
du -sh /tmp/cal_* 2>/dev/null | sort -rh | head
ls -lt /proj/demo | head # 看 mtime,识别历史 run常客排序通常是:历代 run 的 SWDB 结果库、PEX 的 RCC 中间数据库、hier run 各子目录、verbose 开足的 transcript 日志、崩溃作业留下的临时目录。删之前看 mtime 与属主——正在跑的作业目录误清,比盘满本身更难收拾;别人的产物先打招呼。
写穿过的 run 不能「腾地方续跑」。 盘满那一刻正在写的 results.db、PEX 网表已经处于不完整状态,工具未必自查得出,「导出成功」的提示也可能照打。正确动作:① 腾出空间;② 删净本次 run 的全部中间产物与半截输出;③ 从输入端重跑该 run。半截 PEX 网表流入后仿真,报的是语法错或器件对不上,排查方向会被带偏到网表格式上——这与 Calibre 输入文件损坏或截断速查 里「写出端静默截断」是同一类病根。
临时目录改指大卷,工作目录跟着 runset 走。
export TMPDIR=/data/tmp/$USER
mkdir -p "$TMPDIR"
# runset 侧把结果与数据库路径放到容量充足的专用卷(具体变量名以版本手册为准)这条专治「大卷还空几百 GB 却报盘满」:满的是 /tmp 那个几个 GB 到几十 GB 的小分区。长期跑批的机器把这两行写进提交脚本与组内环境模板,比每轮救火便宜得多。
降占盘:分层、分块与归档,三招都是流程换空间。 flat(展平)模式把整颗芯片展开后写一个巨型结果库,是单趟占盘的上限;大芯片改 hierarchical 流程,顶层只处理边界交互,结果按层次分散,单库体量随最大块而非全芯片走。再不够就按窗口或指定单元分块(window / selected cell 验证),把一次全芯片 DRC/PEX 切成多块提交,代价是边界区域要补验证、结果要合并。跑完之后只把报告与必要结论归档到项目存储,SWDB 与临时结果按保留期清掉——复盘需要数据库时可以重跑,让上百 GB 的中间库长期压在工作卷上不划算。
并发作业要做容量准入,别让乘法在半夜算账。 同卷并行几个大 run 时,占盘是叠加的:单作业预算 30 GB,四个并发就是 120 GB 的突发,任一作业在导出高峰撞上卷水位就全盘写穿。提交脚本里加一段前置检查,按「并发数 × 单作业历史峰值 × 安全系数」估算需求,剩余空间不足直接拒绝排队;NFS 共享卷还要考虑同组其他人的作业,容量准入比自觉可靠。
五、预防与纪律
- 提交脚本固定双查:提交前同时看工作卷、
/tmp卷的df -h与df -i,水位超阈值(如 80%)拒绝启动。 - TMPDIR 统一指大卷,并在作业收尾段清理本作业产生的临时目录,崩溃重跑前先扫残留。
- 旧 run 定期收尾:SWDB/中间结果设保留期,报告与结论先归档再删库,删除前落一份路径与大小清单。
- 大芯片默认分层/分块模板:规模超过单卷预算的设计直接走 hierarchical 或 window 流程,不等 flat 写穿再返工。
- 日志按级别开:日常回归不开最细的 verbose/turbo 诊断日志,长 run 日志跑完即压缩。
- 并发受容量准入管控:按卷剩余空间与单作业峰值限制同卷并发数,配额给签核冲刺留缓冲。
这一篇在知识体系里的位置
本篇是 EDA 排错速查簇中「资源与容量」节点的 FAQ 页,专管磁盘一条线;资源触顶的另外三类死法(OOM、文件句柄、线程叠加内存)在 Calibre 资源不足速查 分诊,写穿之后产物残缺的辨认与重跑原则见 Calibre 输入文件损坏或截断速查。物理验证的正常 runset 与流程见 Calibre 物理验证实操,更多 EDA 报错主题从 开源 EDA 报错排错中心 进入。
一句话总结
Calibre 磁盘空间不足先 df -h 与 df -i 双判容量与 inode,再按报错路径分清满的是 runset 工作目录还是 /tmp,用 du 排序锁定头号占盘者:清旧 run 与崩溃残留、TMPDIR 与结果路径改指大卷、大芯片上分层与分块降单趟占盘、跑完只归档报告并给并发做容量准入;已经写穿的 results.db 与 PEX 网表不可信,腾空间后删净本次产物从输入端重跑,不续跑。