翻旧工作笔记本,看到2020年画的浮动许可配置草稿,上面全是涂改痕迹,当年为了调通熬了三个通宵。
那会儿我刚从单机许可转到浮动池子,厂商给的文档全英文,厚厚一本PDF,我打印出来翻了两天愣是没找到"怎么配置自动回收"这一章。后来发现这功能根本不是默认开启的,得自己在options文件里手写一行配置才能激活。但问题是我不知道语法啊,网上搜到的全是老版本,跟我用的新版本对不上,照着写进去服务直接崩了。第一个通宵我就在反复重启服务器,每次改一行配置重启一次,崩了就回滚,然后重来。那台服务器被我来回折腾了十几次,到天亮的时候我已经记不清最后一次到底改了什么才让服务正常起来。反正起来之后能用了,但配置得对不对我心里完全没底。现在翻开那页草稿,上面全是划掉的命令、问号、箭头、还有几个骂人的话,字迹潦草得我自己都快认不出来了。
后来这四年我反复打磨这套配置,从以前那种"瞎试凑合能用就行"进化到了"零故障滚了三年没崩过"。核心就是三件事。
第一件事是把配置模板化了,别再每次从头写。我以前每个Feature单独写一行TIMEOUT配置,不同的Feature阈值还不一样,整篇option文件像一锅粥。后来我把所有共性配置抽到文件开头,用通配符匹配一组Feature名称统一设,个性化配置单独放在后面覆写。模板化之后新加一个Feature只需要复制一行改名字就行,不会再出现漏写或者笔误的情况。当年踩过最傻的一个坑是我在options文件里写TIMEOUT的时候把单位弄混了,我以为后面跟的是秒数,结果实际语法里TIMEOUT跟的是分钟数。我写了300,心想5分钟回收,结果服务解析成了300分钟才回收,整整五天无人回收。这个问题我花了三天才排查出来,因为日志里根本不会告诉你你单位写错了,它就是乖乖按300分钟去跑的。
第二件事是把所有配置改动先在测试环境用语法检查工具过一遍再上生产。FlexNet自带了一个叫lmutil的命令,后面跟lmgrd的语法检查参数,你改完配置文件之后先用这个工具测一下,它会把语法错误和未知参数全列出来,不用等到重启服务才知道崩了。以前我根本不知道有这个工具,每次改完直接往生产服务器上丢,重启崩了再改回来,来回折腾好几趟。那段时间我基本上就是靠着"重启-崩-回滚-再改"这个流程活下来的,服务器被我弄崩的次数我现在想起来都替当年的自己脸红。

第三件事是把不同Feature的回收策略拆开单独设,不再一刀切。画图工具跟仿真工具的用法完全不一样,前者是短时高频交互,后者是长时后台计算。以前我全设成一样的超时,要么画图的人觉得太久了回收不掉,要么仿真的人觉得太短了老被踢。现在我每个Feature组单独配置TIMEOUT和RESERVE策略,画图类15-20分钟,仿真类45-60分钟,后处理类30-40分钟,各走各的。当年踩过的一个坑是,我把一个冷门Feature的阈值设得特别短,想着没人用就早点回收,结果那玩意儿启动特别慢,用户点开之后等了几分钟才开始操作,我的回收阈值比人家启动时间还短,用户还没开始用就被我踢了,被投诉了好几次才反应过来。
最后说两个调浮动许可配置时不用瞎试的懒人技巧。第一个是去厂商官网下载最新的配置示例文件,每个版本都附带一个示例options文件,里面包含了所有可用参数的格式和注释,直接拿那个示例照着改就行,别自己凭空编。第二个是每次修改配置文件之前,把当前能正常工作的版本另存一份带日期的备份,改了之后如果崩了,三秒钟替换回去就能恢复,不需要在崩溃的状态下慢慢改。这两个技巧能省掉你百分之八十的试错时间。
2020年那页草稿我拍了个照存手机里了,偶尔翻出来看看当年有多笨。亲测好使,这周已经帮3个同事解决了同款问题。