OpenLane exit code 137 (SIGKILL) 速查:Docker 内存配额与 OOM killer 判读
更新时间:2026-10-24。FAQ 速查页,属于开源 EDA 排错系列,总入口见 开源 EDA 报错排错中心。按 OpenLane Docker 安装实录 装完环境,
make test跑 spm 能过,换上自己的设计跑到布线或 DRC 段,日志突然戛然而止、进程消失——退出码 137。这是 Docker 内存配额不足的第一指纹:137 = 128 + 9,进程收到 SIGKILL 被强制终止,而在 OpenLane 场景里发出这颗子弹的几乎总是 OOM killer。Docker Desktop(Mac/Windows)默认只给容器 2 GB 内存,spm 这种小设计勉强够,真实设计必爆——所以 make test 能过不代表环境没问题,内存坑常在第二个设计才暴露。
本文要回答的问题
- exit code 137 和普通的工具报错(exit 1/2)本质区别是什么?
- 怎么用
dmesg确认杀死进程的是 OOM killer 而不是别的信号? - Docker Desktop 的 2 GB 默认配额调到多少合适?
- 内存已经给到 8 GB 还是被杀,下一步往哪查?
一、报错原文与典型现象
137 的现场有三种典型形态:
# 形态一:流程日志戛然而止,make 层兜底报错
[INFO]: Running global routing...
...
make: *** [Makefile:104: test] Error 137# 形态二:docker 侧直接报退出码
docker: Error response from daemon:
container <id> exited (137).# 形态三:内核日志里的实锤
$ dmesg | tail -n 5
Out of memory: Killed process 8234 (openroad)
total-vm:3145728kB, anon-rss:1890304kB关键判读点:报错行落在哪个工具段、有没有 killed 字样。安装文的判别口诀里写得明白——布线或 DRC 段坏且伴随 killed/exit 137 字样,几乎就是内存被 OOM 杀掉。形态三是直接证据:Out of memory: Killed process ... (openroad) 说明内核的 OOM killer 选中了 OpenROAD 进程,anon-rss 接近 2 GB 正是容器内存上限被打满的样子。形态一最迷惑:日志停在某一步、没有任何错误解释,新手容易去怀疑设计本身,其实设计语言从头到尾没有机会说话。
二、病因处置速查表
| 报错现象 / 场景 | 可能原因 | 快速验证 | 处置 |
|---|---|---|---|
| Error 137 伴随日志戛然而止 | 容器内存打满被 OOM killer 杀 | dmesg 查 Killed process 字样 | Docker 内存配额调到 8 GB 以上 |
| 只在布线段(OpenROAD)被杀 | 布线是内存峰值段,配额临界 | 对照失败步所属工具段 | 同上;或降低设计规模先试 |
| make test 过、自己设计被杀 | spm 太小没触到配额,真设计触到 | 对比两次设计的规模 | 配额按真实设计峰值预留 |
| dmesg 无 OOM 字样但 exit 137 | 人为 docker kill / 宿主机整体 OOM | 查宿主机 free -h 与操作记录 | 宿主机加内存或错峰跑 |
| 8 GB 配额仍被杀 | 设计过大或某步内存泄漏式增长 | 换更小的设计验证流程完整性 | 拆层次跑、或上更大内存机器 |
| Mac/Windows 上调了配额无效 | Docker Desktop 改完没重启 VM | 设置页确认 Applied 并重启 | 重启 Docker Desktop 后重跑 |
| 云主机裸 docker 被杀 | 无配额概念,是物理内存耗尽 | free -h 看总量与可用 | 换大内存机型或拆设计 |
三、排查决策图
这张图按「先拿实锤、再分配额与物理内存、后扩容验证」组织:红是报错入口与命中的根因,蓝是排查动作,绿是通过分支,橙是修复动作,紫是防复发沉淀。
读这张图抓一个分叉:dmesg 有没有 Killed process 字样是分水岭——有,根因就是内存配额/物理内存,直接进修复;没有,才去想人为 kill、Docker 守护进程重启等其他来源。不要在没拿 dmesg 实锤之前改设计代码,137 从来不是设计语言的问题。
四、逐条排查展开
先理解 137 的语义,再动手。 退出码 137 = 128 + 9,表示进程被 9 号信号 SIGKILL 终止。SIGKILL 不可捕获、不可忽略,进程连写一行遗言的机会都没有——这就是为什么日志是「戛然而止」而不是「报错退出」。OpenLane 场景里发 SIGKILL 的两个主要来源:内核 OOM killer(内存耗尽时内核挑一个进程杀掉保系统)和人为 docker kill。EDA 流程跑到内存峰值段(全局布线、详细布线、DRC)被杀,前者占绝大多数。
dmesg 判读是实锤动作。 被杀后立刻 dmesg | tail 或 dmesg | grep -i "killed process":看到 Out of memory: Killed process <pid> (openroad) 这行,根因就钉死了;行里的 anon-rss 是进程被杀时的实际内存占用,拿它对照容器配额就知道差多少。注意 dmesg 是环形缓冲,隔太久再查可能已被冲掉,被杀后第一时间取证。
Docker Desktop 的 2 GB 默认是最大单坑。 Mac/Windows 上 Docker 跑在虚拟机里,内存上限在 Docker Desktop 设置页调(Resources → Memory),默认 2 GB。OpenLane 官方建议与安装文的口径一致:调到 8 GB 以上。两个细节:一是改完要重启 Docker Desktop 才生效(设置页 Applied 不等于 VM 已重载);二是 spm 这种教学设计 2 GB 勉强够,make test 通过不代表配额够,拿自己的真实设计复测才算数。
Linux 裸 docker 没有配额概念,被杀就是物理内存见底。 云主机/裸机上容器默认能用宿主机全部内存,exit 137 说明整机的内存加 swap 都撑不住峰值。处置两条路:换大内存机型(OpenLane 跑中等规模设计建议 16 GB 起,大设计 32–64 GB);或拆设计——按层次分块跑、关掉并行选项降峰值。反过来说,这也正是云端大内存机器跑 OpenLane 体验完全不同的原因:64 GB 机型上同样的设计一次走完,OOM 这个词根本不会出现。
docker stats 是提前看见 OOM 的窗口。 OOM killer 杀人是瞬时的,但内存爬升是渐进的。长跑流程另开一个终端跑 docker stats,能看到容器内存的实时曲线:全局布线开始前如果在 1 GB 上下徘徊、布线段稳步逼近配额上限,就是典型的「快要被杀」形态——这时主动停掉、扩容后重跑,比等它被杀再排查省一轮。曲线还有鉴别价值:内存平滑爬升到顶被杀是配额不足;某一瞬间垂直拉升数倍被杀,更像该步骤对设计某个结构(超大 fanout 网、异常层次)的病态处理,这种值得把日志贴去 issue 搜,可能是已知 bug 而不是单纯的内存不够。
swap 与 OOM 的微妙关系。 Linux 裸机上 swap 充足时 OOM killer 的触发会明显推迟(系统先用 swap 换页),但 EDA 工具在 swap 上的性能会塌方式下降——流程不报错但跑得比正常慢几十倍,本质上也是「内存不够」的另一种表现。所以裸机上 free -h 要同时看内存和 swap:available 见底而 swap 用量很大,结论与 OOM 相同——加内存或降设计规模,不要庆幸「至少没被杀」。
8 GB 还不够时的排查顺序。 配额已给足仍被杀:先换更小的设计验证流程完整性(排除镜像/PDK 问题叠加干扰),再确认失败步的内存增长形态——如果日志显示同一迭代内单调膨胀,多半是设计规模超配;如果是某一步突然爆炸,把该步的日志与报错原句贴去 OpenLane 仓库 issue 搜索,同类问题高度集中。最终手段才是继续加内存。
五、规范做法与预防
- 内存档位写进装机清单:Docker Desktop 装完第一件事调内存到 8 GB 以上并重启,与加 docker 组同一步完成。
- 设计规模与配额对照:团队环境笔记里记一张对照表——教学设计 2–4 GB、中等设计 8–16 GB、大设计 32 GB 起,新设计开跑前先对照。
- 被杀先取证再重试:137 之后先
dmesg截图/留存,再重跑;没有实锤的「重跑试试」会把偶发 OOM 养成玄学问题。 - 峰值段重点盯:全局布线、详细布线、DRC 是内存峰值段,长跑流程在这些步骤前后留意
docker stats的内存曲线。 - 云端大设计直接上大内存机型:本地折腾降峰值不如云端 32–64 GB 机型一次走完,时间成本通常更低。
这一篇在知识体系里的位置
本篇是开源 EDA 排错簇中「内存资源」节点的 FAQ 页:安装阶段的完整链路与磁盘/网络/权限三类坑见 OpenLane Docker 安装实录,其中的判别口诀把 exit 137 列为内存被杀的第一指纹;更多工具侧报错从 开源 EDA 报错排错中心 按入口分流。
一句话总结
OpenLane 报 exit code 137 是 SIGKILL(128+9),实锤判读靠 dmesg 里的 Out of memory: Killed process:Docker Desktop 默认 2 GB 配额是首因,调到 8 GB 以上并重启即修复,spm 能过不代表真实设计够跑;Linux 裸机被杀是物理内存见底,换大内存机型或拆层次降峰值。被杀先取证再重试、内存档位写进装机清单,137 就不再是玄学。