把许可服务器全年的访问日志分析完,导出的报表足足50页,很多访问记录看了都觉得离谱。
最让我惊掉下巴的一条记录是某个设计组的工程师,账号最后一次操作时间显示是凌晨2点47分,然后他的会话就一直挂到早上8点半才被系统自动踢掉。我顺着他那台机器的IP查了一下登录日志,发现那台电脑2点47分之后就没有任何键盘鼠标输入了。也就是说这位老兄半夜干完活直接关屏走人了,软件没关,许可没退,白白占着池子挂了快六个小时。更离谱的是这种"跨夜僵尸会话"全年发生了两百多次,涉及十几个不同的用户,有的人一周能干出两回。我翻了一下对应日期的项目排期,发现很多都是赶节点的时候加班到深夜,干完活太困忘了关。但不管什么原因,池子里那几十个许可被这些跨夜会话一占,第二天早上高峰期直接少了好几个坑位。
顺着日志往下挖,我把那些"占着许可但不干活"的行为分了三类,分别做了对应的处理。
第一类是跨夜僵尸会话。全年228次跨夜挂机记录,最长的连续挂了9个多小时,最短的也超过4小时。这些会话大多数发生在凌晨1点到5点之间,用户走的时候没主动释放。我改了一下回收策略,把夜间空闲阈值从30分钟降到了15分钟,同时加了条规则:晚上11点到早上6点之间,任何一个会话连续空闲超过15分钟就直接回收,不留情面。日志里藏着一个我之前没发现的细节,228次跨夜挂机里有73次是同一台物理机器干的,那台电脑是设计部角落里的公共备用机,谁加班临时用一下,用完直接合盖走人。我后来给那台机器单独装了个强制退出脚本,每次检测到用户断开远程桌面或者合盖就自动杀死所有许可相关的进程,从那以后那台机器再也没出过跨夜挂机的事。
第二类是白天的"假忙会话"。日志里能看到大量会话在工作时间保持着激活状态,但每小时的键盘敲击次数不到两位数,鼠标移动轨迹几乎是一条直线,明显人根本不在座位上或者在做别的事情。我把这类会话判定为"疑似闲置"并打了标签,统计了一下全年这类假忙会话的累计空闲时长加起来相当于白白损失了将近50个许可工作日的产能。我针对这类行为改了判定逻辑,把"键鼠不动但软件开着"和"键鼠偶尔动但软件窗口一直是最小化状态"都纳入了回收触发条件,只要软件窗口超过40分钟没有被切到前台激活一次,就判定为假忙。日志里有个细节我差点忽略过去,某个用户每天下午1点到2点之间的操作频率会陡降至近乎为零,我一开始以为是午休,后来一查发现人家每天这个时间段固定跑现场去巡线了,根本不是午休。我后来给他那个组单独加了个白名单,其他组的假忙判定不动,他那组延长到90分钟才回收。

第三类是"重复占坑"。日志里显示某些用户在同一时间点打开了多个同类型软件的窗口,每个窗口各占一个Feature,但真正在前台操作的只有一个,剩下的窗口全部最小化在后台挂着。这就相当于一个人占了两个甚至三个坑,但只干了一份活。全年这类重复占坑的记录有四百多条,最夸张的是一个人同时开了五个不同版本的CAD窗口,每个都占着一个许可,但当天他的操作记录只集中在其中一个版本上,另外四个挂了一整天。我后来在配置里限制了同一用户名同一种Feature同时只能占一个会话,超出就自动把老会话踢掉。日志里藏着的细节是,重复占坑最多的Feature往往是版本号最老的那个,因为老版本启动快所以大家习惯先开老版本再开新版本,开着开着就忘了关老的。
最后说两个自动踢掉闲置许可的低代码设置,不用写几百行脚本,十几分钟就能配好。第一个是在FlexNet的options文件里加一行TIMEOUT配置,语法是"TIMEOUT feature_name minutes",一行对应一个Feature,系统自己就会在指定分钟数后回收,不用额外写脚本。第二个是用Windows计划任务定时调用lmremove命令,把这个命令放在bat脚本里然后每小时跑一次,脚本内容就一行"lmremove -c license_file feature_name user_name",把变量替换成你日志里抓到的空闲会话用户名。两个加起来一个配置文件加一个计划任务,半小时之内配完,比从头写一套监控系统省事一百倍。
报表收起来,50页的数据存进共享盘了,明年续费前拿出来跟新数据对比一下效果。亲测好使,这周已经帮3个同事解决了同款问题。