EDA License 运维实战:FlexNet 许可证监控与故障排查

EDA 工具是按许可证(license)卖的,一套 Cadence、Synopsys 全家桶的 license 费用一年几百万起步。许可证服务一挂,整个设计团队立刻停摆,连工具都打不开。这篇文章讲 EDA license 运维的日常做法:FlexNet 架构、巡检命令、常见故障和用量监控。

一、FlexNet 许可证服务长什么样

绝大多数 EDA 厂商都用 FlexNet(FlexLM)发 license。服务由两部分组成:lmgrd 是主 daemon,负责监听端口和接受请求;vendor daemon(比如 Cadence 的 cdslmd、Synopsys 的 snpslmd)负责具体某个厂商的 feature 发放。license 文件里三类行最关键:SERVER 行写主机名、hostid 和端口,VENDOR 行指定 vendor daemon,INCREMENT 行写每个 feature 的版本、数量和过期时间。

端口方面,lmgrd 默认从 27000 起,vendor daemon 的端口写在 license 文件里或者自动分配,防火墙要把这两个都放行。生产上常见三台冗余(triad)部署:三台里两台活着就能发 license,单台挂了不影响业务,这是 license 服务最值得做的投入。

二、每天巡检的四条命令

# 看所有 daemon 状态和 license 占用
lmstat -a -c 27000@lic-server

# 只看某个 feature 谁在用
lmstat -f "VCS-MX" -c 27000@lic-server

# 看 license 文件里各 feature 的过期时间
grep ^INCREMENT /eda/license/license.dat | awk '{print $2, $4, $5}'
  • lmstat -a:每天跑一遍,确认 lmgrd 和 vendor daemon 都在,license 总量和已用量对得上。
  • lmstat -f:用户报“没 license”时,先查这个 feature 被谁占了,再决定是等、是借还是加。
  • 过期检查:提前 30 天告警,license 续费走采购流程要时间,别等到过期当天才发现。
  • license 文件千万别手改:改了 INCREMENT 行会破坏签名,整个文件直接失效。

三、最常见的五种故障

1. 工具报 Cannot connect to license server。先 ping 再 telnet 端口,确认网络通;然后看 lmgrd 进程在不在。多数时候是 license 服务器重启后 lmgrd 没起来,或者防火墙规则被重置了。

2. License server system does not support this feature。feature 名不对,或者 license 文件版本太老不含这个 feature。对照 INCREMENT 行,看 feature 名和版本号能不能对上。

3. All licenses in use。license 被占满了。先用 lmstat -f 查是谁占着,再决定是加 license、排队,还是回收 idle。注意 lmremove 会把人正在跑的任务踢掉,回收前务必先跟用户确认。

4. 时间不同步。license 对时间很敏感,服务器和客户端时间差超过阈值会拒绝发证。NTP 必须配好,虚拟机尤其注意,宿主机时间漂了虚拟机跟着漂。

5. hostid 变了。换网卡、换主板、虚拟机迁移都会改 hostid,license 文件随之失效。重新生成 license 文件,换之前先确认新 hostid,生成后立刻验证。

四、用量监控:别等用户投诉才知道 license 不够

license 够不够,不能凭感觉。每小时跑一次 lmstat -a,把各 feature 的已用和总量写进日志或者时序库,超过 85% 就告警。看趋势比看瞬时值有用:哪个 feature 长期在 90% 以上,就是要加 license 的证据;哪个常年闲置,就是能砍的预算。

# 解析 lmstat 输出,统计各 feature 的占用率(示意)
import re
import subprocess

out = subprocess.check_output(
    ["lmstat", "-a", "-c", "27000@lic-server"], text=True)
for line in out.splitlines():
    m = re.match(r"Users of (\S+):.*Total of (\d+) licenses issued;"
                 r"  Total of (\d+) licenses in use", line)
    if m:
        feature, total, used = m.group(1), int(m.group(2)), int(m.group(3))
        print(f"{feature}: {used}/{total} = {used / total:.0%}")
        if total and used / total > 0.85:
            print(f"  ALERT: {feature} 占用率超过 85%")

还要注意区分 checkout 和实际使用:有人开着工具占着 license 下班,占用率虚高。要结合 idle 回收策略和用户习惯一起看,别一看到 90% 就急着买。

五、检查清单(贴在值班表上)

  • lmgrd 和 vendor daemon 进程都在
  • 端口通(27000 和 vendor 端口)
  • license 文件未过期、未被手改
  • 时间同步正常
  • 磁盘空间够(license log 会一直涨)
  • 备份:license 文件和启动脚本异地各一份

license 运维的核心就两句:别让它挂,挂了要能立刻知道。巡检脚本化、用量可视化,出了问题先看 lmstat 再看 log,九成故障都在这俩里。

发表回复

后才能评论