半夜1点多手机告警响了,许可服务器出问题,爬起来折腾了40分钟才搞定。
手机就搁床头柜上,振动加铃声一起炸,我直接从梦里弹起来的。眼睛都没完全睁开,摸到手机一看是Zabbix推的告警——License Server的可用许可数跌到0了,持续了快20分钟。但问题是这大半夜的,我们公司三班倒的就剩夜班仿真组还在干活,满打满算不超过15个人,怎么可能把85个EDA许可全占完。我第一反应是服务崩了或者网络断了,赶紧从被窝里爬出来,拖鞋都穿反了,一只脚踩着鞋后跟就冲到了书房。打开电脑远程连上服务器,lmstat敲下去,显示85个许可全部在用,会话列表里密密麻麻全是用户名。我心想这不对啊,十五个人怎么可能占了85个,挨个往下翻才发现同一个人的名字重复出现了三四次甚至五六次,同一个账号开了好几个session占着不同的Feature。夜班那帮人做参数扫描的时候图省事,每个任务开一个独立窗口,跑完没关直接挂在那儿,一个晚上下来能堆十几个僵尸会话,每个都占着一个许可不松手。
第一件事就是把所有闲置超过两小时的会话手工清了。我按着会话ID挨个敲lmremove,敲到第七个的时候发现有一个死活删不掉,报错说这个session正在执行中。我就纳闷了,大半夜的谁还在交互操作?后来查了IP发现是车间里那台老破测试机,系统时间跟服务器差了快四个小时,它的会话超时判断也跟着错位了。我只好把那个客户端的网络断开一下强制踢掉。半夜处理故障的时候有个特别搞笑的插曲,我正蹲在书房敲命令,我老婆迷迷糊糊从卧室探出个头来说"你大半夜打游戏能不能小点声敲键盘",我说我在修服务器,她回了句"那你修完把客厅灯关了我睡不着",然后就关门回去睡了,留我一个人在黑暗里盯着屏幕发光。
第二件事是查这批僵尸会话是怎么堆出来的。翻了一下FlexNet的日志,发现夜班用的那批提交脚本里没有加"任务结束后自动释放许可"的指令,每个仿真子任务跑完就卡在那儿,session不主动close。我连夜在他们的共享目录里找到那个脚本模板,加了三行后处理命令,强制跑完后杀掉对应的license句柄。改了之后顺手在群公告里发了条通知让他们早上来了把脚本更新一下。处理的时候还有个插曲,我改完脚本想测试一下,结果发现自己连不上那个共享目录了,权限过期了要重新认证,大半夜我硬是翻出了保存密码的旧文档才登进去,那文档密码还是三年前设的,试了三次才蒙对,差点就给锁了。
第三件事是把监控策略调了一下,别什么告警都半夜推给我。以前那个告警阈值设得太低了,只要可用数低于5就触发,但很多时候晚上就那几个人干活,池子本来是满的但实际没几个人在用,根本没故障。我把告警逻辑改成了"可用数低于3且持续超过30分钟"才推送,还加了个二次确认——先发条轻量级的提醒到我手机通知栏,不是铃声的那种,如果十分钟后还没恢复再响铃。半夜搞故障的时候旁边手机一直在弹其他同事的微信消息,他们那边夜班也有人开始反馈连不上了,好几个人在群里艾特我,我一边回"在处理了"一边续命令,手机震动得桌子都在抖。

说两个能避免半夜被吵醒的提前设置,我现在就要去加上。第一个是给所有夜班提交脚本统一封装一个"许可自清理"的模块,不管任务正常结束还是异常中断,最后一步必须释放授权,别依赖人工操作。这个我明天一早就去做,今天只是临时改了模板。第二个是监控告警设个"夜间静默时段",晚上11点到早上6点之间,只有服务彻底挂了或者可用数归零持续超过30分钟才真报警,其他的先记日志第二天再看,省得我今晚这种破事儿被折腾起来结果发现就是几个僵尸会话。
现在躺回床上,半天都睡不着。