一、一个IC验证团队里常见的追问
某芯片设计公司的CAD管理员收到一封投诉邮件。验证工程师反映VCS许可不够用,回归测试高峰期要排队等。管理员执行lmutil lmstat -c $LM_LICENSE_FILE -a | grep -A 10 "vcs"查看,发现有的VCS许可被签出后已经超过24小时没有新的操作记录,有的工程师的仿真进程早已结束,但许可仍然显示"in use"。
许可池显示"已满",但真正在跑仿真的验证任务并没有那么多。
二、VCS的许可归还,为什么和lmstat的签出状态不在同一个时间维度上
VCS的许可由Synopsys Common Licensing(SCL)管理,SCL基于FlexNet Publisher运行,通过snpslmd vendor daemon分发许可。理解这个问题的关键,在于VCS的许可归还机制。
交互式仿真:许可靠进程正常终止来释放。验证工程师在图形界面下启动VCS仿真,许可在整个仿真期间被持续持有。许可的释放依赖于simv进程的正常终止,进程退出,许可归还;进程没有退出,许可继续被持有。一个复杂的SoC回归测试可能跑数小时甚至过夜,这是正常的。但如果simv进程因异常而"僵死",许可可能被占用数小时甚至过夜,而lmstat看到的仍然是"in use"。
批处理/回归测试:许可队列中的任务不显示为"被拒绝"。VCS支持通过+vcs+lic+wait选项启用许可队列,当许可不可用时,VCS不会立即报错退出,而是进入等待状态,持续尝试获取许可。在回归高峰期,大量仿真任务可能处于"等待许可"状态。但从lmstat的视角看,这些任务并不显示为"被拒绝",它们只是还没有签出许可,所以lmstat显示的"已签出"数字,只反映"此刻谁持有许可",不反映"有多少仿真在排队等许可"。
仿真抢占:许可的归还依赖"安全点"被触发。VCS支持仿真抢占,simv进程使用VCSRuntime_Net资源,当进程暂停时,VCS会在安全的内存点暂停作业并归还许可;当仿真恢复时,VCS重新签出许可并从暂停点继续。这个机制的前提是"暂停"被正确触发。如果仿真进程异常退出而没有走到安全点,许可可能被"挂住"不释放。SIGTSTP方式在实际环境中"似乎并不总是有效",LMREMOVE是更可靠的备选方案。
这三条机制指向同一个结论:VCS的许可归还,依赖的是"simv进程的生命周期"和"抢占机制的触发";而lmstat显示的,是"许可服务器层面的签出状态"。这两个状态之间,没有必然的同步关系。
三、这个时间差的本质:两个不同维度的状态
lmstat告诉管理员的是:某个feature在某台主机上被某个用户签出了,签出时间是什么时候。它是一个许可服务器层面的状态快照。
但仿真是否在运行,是一个进程层面的状态。simv进程可能已经退出,但许可服务器还没有收到归还信号;simv进程可能还在运行,但仿真可能因为等待I/O或处于抢占暂停状态而没有持续占用计算资源。
lmstat的"in use"和"仿真正在运行"之间,隔着一个进程生命周期的维度。当这两个维度不同步时,就会出现"许可被签出但仿真早已结束"的现象。
这不是"有人故意占着不用",也不是"许可管理出了问题"。它是许可归还机制和状态统计机制之间天然存在的时间差。
四、莱曼特的Lic Report模块提供查看这层差异的功能
莱曼特的Lic Report模块提供了按用户、按时间维度查看VCS许可实际占用情况的功能。它只是把许可服务器层面的签出状态和进程层面的运行状态放在同一个视图里,让那层天然存在的时间差变得可见。
五、结论
VCS的许可管理,核心难点不在于"许可够不够用",而在于VCS的许可归还依赖于simv进程的正常终止或抢占机制的触发,而lmstat显示的"签出状态"是许可服务器层面的快照------这两个状态之间没有必然的同步关系。
回归测试可能持续数小时,仿真抢占可能在安全点归还许可,异常退出的进程可能"挂住"许可直到被手动清理。这些时间差累积起来,就是"lmstat显示许可被占用但仿真早就结束了"的现象。
这不是"有人占着不用",而是许可归还机制与状态统计机制之间的节奏不同步。
注:本文技术描述依据Synopsys官方文档及莱曼特公开资料。