上周三上午9点12分,我接到一家设计院运维同事的电话。SolidWorks 2024 SP2并发许可又满了,研发部三个新来的工程师卡在登录界面。后台显示,32个许可全被占用,但其中9个挂在已经下班关机的人名下。
这不是个例。过去三个月,我处理过7起类似的“许可荒”,涉及的软件包括:
从License Server的调度机制看,问题通常出在四个地方:
会话级占用而非进程级检测 多数CAx软件在启动主程序时向lmgrd申请许可,关闭程序才释放。如果用户直接合上笔记本、VPN掉线、远程桌面断连,lmgrd收不到lmremove信号,许可就一直挂着。 超时(TIMEOUT)参数未启用或被客户端拒绝 FlexNet支持TIMEOUT和TIMEOUTALL,但部分软件厂商在vendor daemon里写死了最低阈值,比如ANSYS默认不接受低于7200秒的超时,你不改配置,它根本不生效。 核心思路不是买更多许可,而是让许可在“真正需要的人”之间自动流转。我这套方案,已经在3家200人以上设计团队跑通,实测许可利用率从58%提到89%以上。
先别改配置,先拿数据。我用的是服务器自带工具+简单脚本。
# 查看当前FlexNet许可占用明细
lmutil lmstat -a -c 27000@lic-server
我习惯把输出重定向成日志,每小时跑一次,连续跑3天:lmutil lmstat -a -c 27000@lic-server >> /var/log/lic_stat_$(date +%F).log
【专家提示】
看两个字段就够了:Users of swstd(总池子)和start time。凡是start time早于当天8:00但用户IP不在办公网段的,基本都是“僵尸占用”。
在sw_d.lic(以SolidWorks为例)的FEATURE段里,我加了这行:
TIMEOUTALL 900
意思是:任意许可,若客户端无心跳超过900秒,尝试回收。
但光这样不够。有些软件不认TIMEOUTALL,需要单独指定feature:TIMEOUT swstd 1200
TIMEOUT swpro 1800
改完重启lmgrd:lmgrd -c /opt/flexnetserver/sw_d.lic -l /var/log/solidworks_lic.log
【避坑指南】
ANSYS用户注意,vendor daemon ansyslmd会忽略小于7200的TIMEOUT。如果你设成900,日志里不会报错,但也不会生效。我吃过这个亏。这是重点。传统borrow是“一次性占用”,我改成了“工作日循环借用”。
在license文件里,把borrow权限从“无限制天数”收缩到最长24小时:
BORROW 24 swstd
然后配合脚本,在每天凌晨1:00强制回收所有borrow:#!/bin/bash
# recycle_borrow.sh
lmutil lmremove -c 27000@lic-server -f swstd -u all
加入crontab:0 1 * * * /opt/scripts/recycle_borrow.sh >> /var/log/recycle.log 2>&1
效果很直接:前一天晚上借走的许可,第二天一早自动回池。工程师上班再重新申请,池子里始终有“活水”。不是所有人都需要“长占许可”。我把用户切成三类:
INCLUDE swstd USERGROUP core_users
INCLUDE swstd USERGROUP temp_users
【专家提示】
不要一上来就全员收紧。我第一次直接把TIMEOUT设成300,审图同事开着软件查图纸,接个电话就被踢,投诉到IT总监。稳妥做法是先设1200,观察一周再下调。
脚本能解决回收,但解决不了“谁在用、为什么用这么久”。
我现在用格发许可优化器做日常巡检。它不替代lmgrd,而是读lmstat数据,做三件事:
下面是同一团队(32个SolidWorks许可,186人设计部)连续两周的数据对比,时间:2026年5月:
| 指标 | 优化前(5.6–5.12) | 优化后(5.13–5.19) |
|---|---|---|
| 日均许可峰值占用 | 32/32 | 29/32 |
| 上午9–10点登录失败次数 | 17次 | 2次 |
| 平均单次占用时长 | 4.7小时 | 2.1小时 |
| 闲置许可(>1h无操作)占比 | 28% | 6% |
| 因许可问题产生的IT工单 | 23张 | 4张 注意,我没有增加任何许可数量。只是让许可在“需要的人”之间转起来了。 |
Q:强制回收会不会导致文件损坏?
不会。lmremove只收回license token,不杀进程。软件会弹“许可丢失,请保存为脱机模式”。我观察了三个月,SolidWorks和AutoCAD都能正常转本地缓存。
Q:ANSYS这种大计算,跑一半被回收怎么办?
所以我做了分级。求解用的ansys_para feature不启用短TIMEOUT,只给前处理模块收紧。计算节点走HPC调度,不走普通borrow池。
Q:用户会不会自己多开几个session占坑?
会。所以我限制了同一用户名最大并发数:
MAX 2 swstd USER许可不够用,很多时候不是钱的问题,是调度的问题。
循环借用机制,本质是把“静态分配”改成“动态流转”。你不需要跟老板申请明年再加10个许可,先花半小时把TIMEOUT、Borrow周期和分级策略调好,效果往往立竿见影。
如果你的团队也在为FlexNet系软件天天抢许可,可以先用lmstat拉一周日志看看——数据不会骗人,僵尸占用一目了然。