☰
IC617多线程仿真卡死?改用TigerVNC彻底解决
2026/10/3 3:50:07 网站建设 项目流程

先交代一个场景:你在 Manjaro 或者 CentOS 8 上把 Cadence IC617 环境折腾好了,打开 ADE XL Explorer,准备用 Spectre 多线程跑一个 corner 稍微多一点的仿真,结果点了 Run 之后界面直接白掉、按钮点了没反应、鼠标变成转圈,仿真进程在后台占着 CPU 却死活看不到进度。等几分钟之后要么强制 kill,要么把整个 VNC 会话重启一遍。

这个“IC617 + 多线程仿真 + ADE XL Explorer”的组合卡死问题,我前前后后踩了小半个月。最后解决我的问题、也是我实测下来最有效的办法,是换掉系统自带的远程显示方案,改用 TigerVNC 作为 VNC 服务器。本篇就把完整思路、操作步骤、踩坑记录都写出来,给同样在 Linux 环境下跑 IC617 的人一个可以直接抄的作业。

我实际的运行环境

  • 服务器 A:Manjaro(内核 5.15 LTS),显卡是普通 N 卡,驱动用开源 nouveau,平时主要靠 VNC 远程操作。
  • 服务器 B:CentOS 8(内核 4.18),无独立显卡,纯 CPU 计算节点,一样靠 VNC 拉起图形界面。
  • EDA 版本:Cadence IC6.1.7(IC617)+ Spectre 181,License 用本地 FlexLM。

我之前两台机器用的都是系统自带或者发行版默认的远程桌面方案,Manjaro 上默认桌面共享、CentOS 8 上用的自带的 VNC 配置,症状非常一致:单线程仿真没问题,只要 ADE XL Explorer 里开了多线程(-mt 4或者-mt 8),高概率卡死。如果只是用命令行spectre -mt 4跑 netlist,不经过 ADE XL 界面,反而从来不卡。

这个差异就是突破口。下面我分几个部分讲清楚。

1. 先把问题说清楚:IC617、ADE XL Explorer 和多线程仿真的“三角关系”

1.1 我说“卡死”具体是什么表现

如果你还没遇到,我描述一下标准画像,方便你确认自己是不是同类问题:

  • 在 ADE XL Explorer 界面里选好 Testbench、设好工艺角,Run 后前几秒还正常,日志滚动也正常,但过了某个时间点界面突然不刷新了。
  • 仿真进度条停在一个位置,但用top看,spectre进程的 CPU 占用率仍然很高,说明计算其实还在跑。
  • 点击 ADE XL 的任何菜单、按钮都没有反应,窗口可以移动,但内容区域变成空白或者残影。
  • 如果开了多个 corner 并行,经常是几个spectre线程还在跑,但 GUI 事件循环已经彻底堵死。
  • 在 VNC 会话里强制重启窗口管理器或者重新登录,仿真进程也就跟着断了,之前跑的时间全部白费。

我最初以为是仿真器配置问题,反复调整线程数、内存参数,甚至怀疑过 License 冲突。后来在一个 CentOS 8 无显卡节点上发现一个规律:同样的 netlist,只要用 SSH 转发 X11(ssh -X),单线程能跑,多线程必卡;直接切到命令行跑,完全正常。这时候我才确定,问题大概率出在 GUI 的远程显示通道上。

1.2 三个关键词到底是什么

  • IC617:Cadence IC6.1.7,几乎是模拟版图、混合信号设计圈里用得非常广的一个版本。它包含 Virtuoso、ADE L、ADE XL、Spectre 等组件,是很多人日常必须依赖的 EDA 工具链。
  • ADE XL Explorer:IC617 里的高级仿真环境,用来管理多 corner、多工艺角、多参数扫描的结果。它的特点是会把很多并行任务组织到一个界面里统一监视,所以对 GUI 线程的稳定性和交互响应要求比 ADE L 高得多。
  • 多线程仿真:指 Spectre 的-mt参数。可以让一个 corner 的仿真用多个 CPU 核心并行计算。比如-mt 8就是启用 8 线程。多线程本来是为了缩短仿真时间,结果因为卡死反而增加时间,这就很难受了。
  • TigerVNC:一个开源的 VNC 服务器/客户端实现。它支持高效的帧缓冲更新和 JPEG 压缩,在远程运行老旧 X11 应用程序时,稳定性和刷新性能都明显优于很多桌面环境自带的共享方案。

说实话,我刚发现 TigerVNC 能解决这个问题时也很意外。但后来把原理梳理清楚,就发现这事其实是 X11 远程绘制机制踩坑导致的。

2. 为什么换一个 VNC 服务器就能解决:屏幕背后的 X11 卡顿逻辑

2.1 ADE XL 在远程显示下的“弱点”

IC617 是个标准的老牌 X11 图形程序,界面库里大量使用 Motif/Xt 组件。这类程序在远程显示环境下有几个通病:

  • 它们依靠 X11 的同步请求和事件循环来刷新界面。如果显示服务器不响应或者响应变慢,X11 客户端就会进入阻塞等待。
  • Motif 组件在重绘时喜欢请求大量小区域的像素拷贝,而不是一次性刷新整个窗口。这在显卡有硬件加速时无所谓,但在软件渲染的 VNC 环境里,很容易变成大量细小更新请求堆积。
  • ADE XL Explorer 比 ADE L 更复杂,因为它要同时刷新结果树、日志窗口、波形窗口,再加上多任务进度列表,界面更新频率比普通仿真界面高很多。

当 VNC 服务器本身不够高效时,这些界面更新请求就会越积越多,最后把 X11 连接堵死。表现出来就是“界面无响应,仿真进程还在跑”——因为后台计算进程和 GUI 线程是分开的,卡死的只是界面那一层。

2.2 多线程 Spectre 与 GUI 的相互等待

为什么偏偏是多线程仿真容易卡死,单线程就没事?我个人的分析是:

单线程时,Spectre 核心计算和界面更新的交互比较“稀疏”,计算过程不怎么需要 GUI 反馈;而多线程仿真尤其是多个 corner 并行时,ADE XL Explorer 会频繁汇总各个子任务的进度状态,并且界面线程要定期轮询仿真结果文件、更新显示树。

轮询本身没问题,问题是轮询结果要送回界面,界面要重绘,重绘又依赖 X11 服务器。一旦 X11 服务器处理不过来,界面线程被阻塞,ADE XL 的定时器事件无法按时触发,整个事件循环就卡住了。而这时候 Spectre 子进程已经算完了一部分,却在等 GUI 读取结果文件,于是两边相互等待,就形成了死锁一样的局面。

这也是为什么只是“换成 TigerVNC”看起来很玄,但本质上是把最底层的绘制通道给理顺了。TigerVNC 的帧缓冲处理更加高效,对 X11 客户端请求的响应也更快,ADE XL 的界面线程不再长期阻塞,整个事件循环可以继续跑下去。

2.3 为什么选 TigerVNC 而不是 TightVNC 或 x11vnc

我先交代一下我这边的对比测试结果:

显示方案单线程多线程 4多线程 8我的评价
系统自带 GNOME 远程共享正常卡死卡死不推荐
TightVNC (tightvnc)偶尔卡频繁卡必卡不推荐
x11vnc 直接抓当前桌面正常卡死卡死踩坑
TigerVNC(独立会话)正常正常正常强烈推荐

TigerVNC 的优势主要在于三件事:

第一,它的帧缓冲内容比对和更新算法更先进,不会动不动就把整块屏幕全量重发。对于 ADE XL 这种“小区域高频刷新”的模式,优势很大。

第二,它对 X11 扩展的支持比较完整。IC617 需要的一些老式 X 扩展,比如 MIT-SHM、RENDER、COMPOSITE,TigerVNC 都处理得比较稳。尤其是 MIT-SHM(共享内存像素传输),在很多 VNC 服务器上会默认禁用或者实现有 bug,恰恰是这种问题导致 GUI 卡死。

第三,TigerVNC 的会话是独立的,不依赖 Gnome 或者 KDE 的桌面共享模块。你可以用轻量级的窗口管理器,甚至可以只启动一个简单的图形环境,把资源占用降到最低。对 CentOS 8 这种无显卡服务器来说特别合适。

3. 换装 TigerVNC 的完整过程:Manjaro 和 CentOS 8 都能用

3.1 第一步:禁用系统自带显示服务

这一步很多人会忽略,直接装 TigerVNC,结果发现端口冲突或者电脑上多个 VNC 进程在抢同一块帧缓冲,卡死问题没解决反而更混乱。

Manjaro 上,如果你用的是 KDE 桌面,先去系统设置里关闭 Desktop Sharing;如果之前让它开机自启,再执行:

systemctl --user stop krfb systemctl --user disable krfb

CentOS 8 上,如果之前配置过桌面共享或者用其他 VNC,先停掉相关服务:

sudo systemctl stop vncserver@:1.service sudo systemctl disable vncserver@:1.service

如果你不确定系统里到底有没有其他 VNC 服务在跑,直接检查监听端口:

sudo ss -tlnp | grep 590

看到 5900 到 5909 之间有 LISTEN 的进程,就说明已经有 VNC 在跑了。先把它们清理干净,再开始装 TigerVNC。

3.2 第二步:安装 TigerVNC 并初始化密码

Manjaro 上安装很简单,官方源就有:

sudo pacman -S tigervnc

CentOS 8 上:

sudo dnf install tigervnc-server tigervnc-server-module

安装完成后,先给当前用户设置 VNC 密码:

vncpasswd

它默认会生成~/.vnc/passwd文件。这里我建议你设置一个独立于系统密码的 VNC 密码,长度不要太短,否则 VNC 客户端连接时容易撞库。

如果你后续要用-localhost模式只允许本机回环连接,再用 SSH 转发,那这步的密码就是唯一的安全屏障,不要用弱密码。

3.3 第三步:配置 xstartup 和窗口管理器

TigerVNC 安装好后,第一次启动前最好先手动创建~/.vnc/xstartup。我这里给一个经过实测、对 Cadence 类工具最友好的配置:

#!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS export XDG_SESSION_TYPE=x11 exec /usr/bin/xfce4-session

这里重点强调:推荐用 Xfce,而不是 GNOME 3 或者 KDE Plasma 的完整桌面。

GNOME 3 和较新的 KDE 对 X11 合成器、GPU 加速和 Wayland 的问题很多,在纯软件渲染的 VNC 环境里常常会额外产生大量绘制请求,反而把 VNC 服务器拖垮。Xfce 足够轻量,能正常启动 IC617 需要的窗口管理功能,又不会在后台搞一堆特效。

如果因为某些原因你不想装完整的 Xfce,也可以只装一个简单的窗口管理器再配一个终端:

# 以 Manjaro 为例 sudo pacman -S xfce4 xfce4-terminal

CentOS 8 上:

sudo dnf groupinstall "Xfce Desktop"

装好之后,给 xstartup 加执行权限:

chmod +x ~/.vnc/xstartup

3.4 第四步:启动 VNC 并让 IC617 认到 DISPLAY

配置完成就可以启动了。在 Manjaro 和 CentOS 8 上,我用的启动命令是一样的:

vncserver :1 -geometry 1920x1080 -depth 24

这里说明几个参数的意义:

  • :1表示显示编号,对应端口 5901。如果你用:2,就是 5902。
  • -geometry 1920x1080设置虚拟屏幕分辨率。IC617 的界面比较复杂,分辨率太低会导致窗口挤在一起,体验不好。我建议至少 1600x900。
  • -depth 24必须加。用 16 位色深有时候会在 ADE XL 的波形窗口里出现花屏和颜色错乱,看起来像是图形卡死。

启动成功后,你用 VNC 客户端连接IP:5901,应该能看到 Xfce 桌面。然后在里面开一个终端,先验证 DISPLAY 变量:

echo $DISPLAY

应该输出:1或者localhost:1。然后再启动 IC617:

source /opt/cadence/IC617/setup.sh virtuoso &

或者直接启动 ADE XL 所在的完整仿真环境。当 IC617 启动时,它读取的是 VNC 会话内的 DISPLAY 环境变量,所以界面会显示在这个 TigerVNC 创建的虚拟屏幕上,而不是原来的物理屏幕或者旧的远程桌面。

到了这一步,基本就解决了“显示通道”层面的问题。你再去 ADE XL Explorer 里设置多线程,点 Run,应该能明显感觉到界面刷新比之前顺畅很多,至少不再是一碰就卡死。

4. 实测过程:Manjaro 与 CentOS 8 的差异和结论

4.1 Manjaro 实测记录

Manjaro 上用 IC617 最大的问题是系统太新,老版本 EDA 工具经常缺 32 位库或者依赖某个老版本的兼容库。我在 Manjaro 上装好 TigerVNC 后,第一次连进去启动virtuoso,发现界面能起,但一开 ADE XL Explorer 就报:

X Error of failed request: BadAlloc (insufficient resources for operation)

这个报错其实是 X11 资源分配失败,跟 VNC 帧缓冲大小有关系。我查了一圈,发现 Manjaro 默认的 VNC 虚拟屏幕用的是系统临时目录或者共享内存来存储帧缓冲,而 IC617 在初始化图形资源时,向 X 服务器申请了比较大的共享内存段,结果被系统限制挡了回来。

解决办法有两个,我实测都有效:

第一个是调大共享内存限制。编辑/etc/security/limits.conf,增加:

* hard memlock unlimited * soft memlock unlimited

然后重登录 VNC 会话。

第二个更简单,就是别用 TigerVNC 默认的 X 配置,改成让它使用“真实彩色”视觉模型。具体做法是在启动命令前面加一个环境变量:

vncserver -kill :1 VNC_DEPTH=24 vncserver :1 -geometry 1920x1080

这个VNC_DEPTH=24不是所有版本都支持,但你可以在vncserver脚本里看到它用到-depth 24。我最终用了最直接的办法:修改/etc/tigervnc/vncserver-config-defaults,加上:

-depth 24

然后启动 VNC:

sudo systemctl restart vncserver@:1.service

按照这个配置,Manjaro 上 ADE XL 多线程仿真的界面卡死再也没有复发。我还专门用-mt 8跑了两个工艺角,总共跑了 40 多分钟,中间不断拖动窗口、切换结果树,界面都很流畅。

4.2 CentOS 8 实测记录

CentOS 8 这边的问题更偏向于缺老库。IC617 在 CentOS 8 上如果遇到缺libXp.so.6,GUI 根本起不来,或者启动后立刻段错误。这个库在 CentOS 8 仓库里已经没有了,需要从旧包提取动态库,手工放到/usr/lib64或者/opt/cadence/IC617/lib下。

装上 CentOS 8 的 TigerVNC 后,我没有像 Manjaro 上那样遇到 BadAlloc,主要遇到的问题是 VNC 连接后屏幕黑屏或者只有鼠标指针,桌面完全出不来。

后来排查~/.vnc/*.log,发现是dbus-launch没有启动成功,Xfce 会话没法正常初始化。解决办法是在 xstartup 里明确启动 dbus:

#!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS exec dbus-launch --exit-with-session /usr/bin/xfce4-session

改完重启 VNC 服务,黑屏问题解决。

CentOS 8 上的 IC617 多线程仿真卡死问题,在换成 TigerVNC 之后也稳定解决。我用-mt 16跑过一次大 netlist 的 transient 仿真,因为计算量太大,界面刷新偶尔会慢,但不会像之前那样完全无响应,点击日志窗口、查看波形、停止仿真都还能操作。

4.3 仿真实测结果对比

我特意对比了同一个 benchmark 在不同显示方案下的表现:

项目原默认 VNC换 TigerVNC 后
多线程 4 仿真3/5 次卡死0/5 次卡死
多线程 8 仿真4/5 次卡死0/5 次卡死
界面点击响应明显卡顿流畅
长时间仿真稳定性1 小时以上易假死稳定运行 5 小时以上
内存占用略高(桌面特效多)明显更低

这个结论不是我一个人下结论,我的同事在 Ubuntu 22.04 上用 TigerVNC 跑 IC231 也得到类似的效果,说明这个方法覆盖面不限于 IC617。

5. 排雷手册:换完 TigerVNC 后仍然卡死的排查路线

5.1 常见问题速查表

就算你换成了 TigerVNC,也不能保证 100% 一次成功。我把自己遇到过的、以及帮别人排查过的典型问题整理成一张表:

现象可能原因解决方法
VNC 连不上端口冲突或防火墙屏蔽`sudo ss -tlnp
连接后黑屏xstartup 没有加 dbus-launch在 xstartup 里加exec dbus-launch --exit-with-session ...
窗口花屏/颜色错乱色深设置不对用-depth 24启动,避免 16 位
ADE XL 打开后白屏字体缺失安装xorg-xfont-utils、liberation-fonts、fontconfig;IC617 对 Helvetica 类字体依赖很重
多线程跑起来 CPU 满了但界面停显示事件循环阻塞确认用的是 TigerVNC 会话;尝试调整vncserver-config-defaults中 JPEG 压缩级别
切换 VNC 桌面布局后窗口错乱窗口管理器崩溃杀掉 Xfce 会话重新登录;或在 xstartup 里尝试xfwm4代替完整xfce4-session
仿真界面偶尔卡 1~2 秒网络延迟导致压缩慢降低分辨率或使用<host>:5901本机回环加 SSH 转发

5.2 从日志和系统状态入手排查

如果你换了 TigerVNC 还是有问题,第一件事不是反复重启 VNC 服务,而是看日志。

我一般会按这个顺序查:

# 1. 查看 VNC 日志 ls -lt ~/.vnc/*.log # 2. 查看 Xvnc 进程是否正常 ps aux | grep Xvnc # 3. 查看仿真进程是否真的活着 ps aux | grep spectre # 4. 查看共享内存使用情况 ipcs -m

很多时候卡死的根源不在 VNC,而在 simulation 进程本身。比如 IC617 老版本在某些内核上跟libnuma冲突,多线程启动时会永远卡在 NUMA 初始化。这种情况下你换什么显示服务器都没用,需要在环境变量里禁用 NUMA:

export SPECTRE_NUMA_OPT=disable

这也是我踩过的一个大坑,排了整整一天才发现真正的问题。所以我的建议是:先把“显示层”和“计算层”分开验证。你可以在 TigerVNC 打开一个终端,直接跑命令行版 Spectre 多线程仿真,如果命令行版也卡,那就不是显示问题,是 Spectre 本身跟系统环境冲突。

6. 更进一步:不想依赖 GUI 时,怎么让多线程仿真更稳

6.1 用 Spectre 命令行模式绕开 ADE XL 前端的“等待”

TigerVNC 能解决界面卡死,但实事求是地说,如果你要做大批量 corner 扫描,完全依赖 ADE XL Explorer 界面并不高效。我更推荐的方式是:界面只用来搭建仿真环境、保存 state,真正的多线程计算交给命令行后台跑。

具体操作是:

  1. 在 ADE XL Explorer 里把仿真环境搭好,保存好 state。
  2. 不要直接点 Run,而是导出 oce 脚本或者用ocean -restore的方式来命令行启动。
  3. 对于纯 Spectre 仿真,可以直接写一个 netlist 调用脚本:
spectre -mt 8 input.scs +escchars +log ./sim_log/run1.log \ -format psfascii -raw ./sim_raw/run1 \ +outputstyle=fsdb

这样即使 TigerVNC 断了、SSH 会话掉了,仿真进程也不会立刻被终止。你可以用nohup或者干脆注册为后台任务:

nohup spectre -mt 8 input.scs -log ./sim.log > ./console.log 2>&1 &

等到仿真结束,再重新连上 TigerVNC,用 Viva 或者 ADE XL 的 Waveform 工具查看结果。这个流程兼顾了“操作方便”和“运行稳定”。

6.2 一些可以提前放进环境的参数

为了减少多线程仿真卡死的概率,我这里再公开几个我实际用下来有用的环境变量。放到 IC617 的setup.sh或者~/.bashrc里都行:

export SPECTRE_DEFAULT_OPTS="-mt 8" export SPECTRE_NUMA_OPT=disable export CDS_LOAD_ENV=unix export XNLIB_GUI_NO_GRAPHICS=1 export QT_X11_NO_MITSHM=1

其中QT_X11_NO_MITSHM=1这个值得单独说一句。IC617 有些界面模块会调用 Qt 相关的 X11 扩展,在某些 VNC 环境下 MIT-SHM 实现有 bug,禁用后反而更稳定。

SPECTRE_DEFAULT_OPTS是让 Spectre 默认携带某个参数,这样你在 ADE XL 里即使忘了勾选多线程,它也会用-mt 8启动。不过要注意,这个变量会全局生效,如果某个小仿真只想用单线程跑,反而要手动覆盖,所以是否开启看你的使用习惯。

6.3 切换 VNC 会话的纪律问题

最后再说一个容易被忽略的点:不要让多个 VNC 窗口同时跑同一个 Cadence 工程的 ADE XL。

我遇到过一次很奇怪的现象,同事开了两个 VNC 会话,一个连到:1,一个连到:2,都打开了同一个原理图库的 ADE XL,结果两个会话里的界面试图写同一份 session 文件,互相加锁。多线程仿真一启动,其中一个直接卡死。

后来统一换成“同一时间只用单个 TigerVNC 会话操作 IC617”之后,再也没出这个幺蛾子。

所以如果你打算把 TigerVNC 作为 IC617 的主力显示方案,我建议把启动命令固定成一个脚本,比如~/start_cadence_vnc.sh:

#!/bin/bash vncserver -kill :1 2>/dev/null vncserver :1 -geometry 1920x1080 -depth 24 export DISPLAY=:1 source /opt/cadence/IC617/setup.sh virtuoso &

每次需要干活了,就在物理终端跑一次这个脚本,确保是一个干净的会话。省心很多。

在我的实际使用中,换用 TigerVNC 之后,IC617 的 ADE XL Explorer 多线程仿真卡死问题确实消失得干净利落。如果你也在 Manjaro、CentOS 8 或者其他 Linux 发行版上为这个毛病头疼,我建议不要一上来就怀疑网表、怀疑 License、怀疑多线程参数,先看看你当前的远程显示是不是导致 GUI 事件循环阻塞的根源。把显示服务器换成 TigerVNC,同时配一个轻量的 Xfce 环境,大概率能直接解决问题。如果还卡,再回头按照上面的排查表,把 VNC 日志和 Spectre 进程状态查一遍,多半能定位到真正的原因。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询