早上一开邮箱,四十七条“License server busy”。点开一看,全是同一个feature,同一批用户,时间戳集中在八点四十到九点十分。你第一反应是池子不够,该加买了。停。 FlexNet那个TIMEOUT机制,你以为是“人不在就回收”,它实际上只管一件事:TCP连接断没断。客户端软件只要还在发心跳,服务器就认为这个会话是活的,哪怕那个人早上开了NX就去开晨会、去抽烟、去车间转了一圈,feature照样被锁着,心跳照发,TIMEOUT连触发都不触发。你看到的报警不是“容量不够”,是“有人在替不干活的人排队”。告警多和资源少之间,隔着僵尸会话和阈值误报两层东西,不拆开看,加多少都是往漏水的桶里倒。
僵尸会话的技术本质不是“用户忘了关软件”,是许可管理器的心跳判定和业务场景的“人在不在用”根本就不是一回事。FlexNet原生能做的只有软回收:在license.dat的VENDOR行后面加TIMEOUT Feature_Name Seconds,客户端在设定秒数内没有任何通信,服务器把许可收回池子。注意,是没有任何通信。NX用户最小化窗口去想方案,鼠标键盘停了,但ugslmd进程和服务器之间的TCP没断,TIMEOUT不认。反过来,VPN抖一下,一个正在跑Fluent求解的会话可能因为短暂断连被直接踢掉,解算进度挂在那儿没人管。这就是原生机制的死角:它判断“网络通不通”,不判断“人在不在算”。所以软回收的TIMEOUT值在工业场景下不能拍脑袋。普通交互绘图,设个1800秒到3600秒还能凑合;仿真类feature,尤其是Ansys那种求解器后台跑几个小时不产生键鼠事件的,TIMEOUT必须拉到7200秒以上甚至直接排除,不然第一个误杀的就是你们CAE组最贵的那个计算任务。硬回收lmutil lmremove更得克制,它是强制切断TCP连接、释放许可,用在已经确认僵死的会话上可以,但命令行里-h和-c两个参数写错一个,踢掉的可能就是一个正在出图的总工。
告警那边的问题比僵尸会话还脏,因为无效告警会把有效告警淹掉。同一个feature,五台机器同时报“cannot obtain license”,根因只有一个——池子被占满了。但这五条告警如果每条都触发邮件、每条都进工单,值班的人第三天就开始全部标记已读,真正的“vendor daemon down”漏过去也没人发现。去重和聚合是两件事,别混着用。去重是按指纹把同一件事的重复上报合并,同一feature同一错误码五分钟内只留一条,通知里带“重复N次”就行;聚合是把窗口内的同类告警压成一条摘要,比如“过去十分钟内NX设计token不足告警,影响用户7人”。抑制和静默更得分开:抑制用于因果压制,比如ugslmd守护进程挂了,所有依赖它的feature报错都不用发,根因一条就够了;静默只给已知窗口用,比如你计划在周六上午做lmreread重读许可文件,那之前先挂静默规则,别让配置重载的瞬时报错把整个值班群刷一遍。但静默规则写宽了比不写还危险,匹配条件不带feature名、不带服务器名、不给到期时间,等于把真实故障也静音了。还有一个很多人没意识到的事:所有收敛参数必须可复核。为什么某条告警没通知出去,事后得能翻到当时命中了哪条去重指纹、哪条抑制规则。翻不到,你这个告警体系在审计面前就是黑箱。

指标不用多,四个够了,但每一个都得能往下钻。有效告警率——总告警里真正对应了用户报障或者denial日志的占比,低于三成就说明你的规则在制造噪声而不是在发现问题。重复告警数——同一个feature、同一个根因,在一周内反复触发了多少次,这个数字不降,你收得再干净也是白收。僵尸会话关闭量——按feature和部门拆开,关掉的是“确认闲置”还是“被误判”,误判率单独记。平均响应时长——从告警发出到有人认领,按级别分开算,P0的守护进程宕机和P2的阈值提醒混在一起算平均没有任何意义。单个指标好看不说明问题,你得看关键业务有没有因为回收动作排队、异常样本有没有被误杀、每一条关闭的会话有没有回读lmstat确认释放。效率、体验、风险三个东西同时在一个你能接受的范围内,才算数。
最后说一个模具厂的NX事。四十八个浮动许可,早高峰设计部天天喊不够,采购已经在走加买流程了。IT留了个心眼,先挂了两周只读监控,不配任何回收策略。数据出来之后两件事很清楚:高峰期实际并发只到三十一个,但lmstat显示池子里被拿走的稳定在四十以上;午休十二点到一点之间,至少十五个会话的start time是早上八点多,中间没有任何check-in记录。典型的“开了NX去食堂,心跳替人排队”。他们做的第一版回收策略很粗暴:定时任务每小时扫一次闲置超过三十分钟的NX会话,直接lmremove。第二天就出事了——一个设计师开了个五百多零件的装配体,在等Regenerate,手没动,三十分钟到了,许可被硬切,上下文丢了,重连之后NX以为首次启动,半天的轻量化白做。后来改了两条:闲置判定加应用层状态,检测到当前session有活跃的装配体或求解进程,阈值自动拉到六十分钟,只发轻量提醒不冻结;回收走分级,先弹窗提醒,再挂起保存状态,最后才lmremove,而且lmremove只对确认TCP已死或者超过四小时无状态变化的会话执行。调整之后,高峰期可用并发从三十一提到四十七,一个许可没加。这件事的关键不是他们用了什么高级工具,是他们终于把 “TCP活着”和“人在算着”分开了——分不开,告警永远在报,池子永远不够,你永远在买License的路上。