"tuxedo服务在电信金融系统中广泛存在,但在马爸爸互联网飓风的席娟之下,曾经的辉煌已然不在。但作为重量级遗留资产,仍然在困扰着运维的同志们。莫名的异常,经常被搞得彻夜难眠!"
异常背景
最近5G需求上线,版本更新了个cpp,就加了一行代码,收到告警:生产环境某个tuxedo service挂死。当然此cpp在测试环境运行良好。版本回退服务恢复正常。
ulog报错日志:ERROR: Service TSVC not available in group GRP2
原因核查
1.起初摸不着头脑,后来找到异常请求在测试环境模拟了一把,服务竟然挂了但是查看日志,和修改的地方也不挨着,差了几十行呢
2. 没办法,在异常的地方加一行日志输出cout,看看是不是变量值有问题再测测试,竟然抛出异常了,但是服务没有挂死。这才应该是正常的节奏啊!
3. 那就更新生产环境吧,某个晚上我们开始更新版本了。
4. 跑了3-5天,服务又在同一cpp的另一个地方挂掉了
5. 这次是没辙了,三司会审吧,运维和开发,管理的领导都出动了
6. 方案一:把生产的so同步到测试环境,看看是否环境不同,导致编译出的动态库不一样,结果测试环境正常运行。此方案排除
7. 方案二:把同目录的所有cpp重新编译一把,结果还是服务挂死
8. 方案三:有人说可能cpp中有特殊字符,替换下文件格式。
9. 此处有个冷知识
windows的notepad只能区分unicode和ANSI,但实际上从服务器上拿下来的文本文件,可能是GB2312,utf-8,还有bom和无bom的区别。notepad++可以一目了然的看到文本文件的操作系统风格,字符集。
通过对比服务器上的其他cpp,发现其他cpp都是Unix style的,和Windows style的主要区别是换行符。字符集看起来都是gb2312。
在Unix服务器上Windows换行符会自动转换为^M,意为回车加换行\r\n,Unix的换行符只有\r
10. 现在只能试试了,通过ue,把cpp从Windows style转换为Unix style。文件确实变小了些。
11. 又是某个晚上,我们更新了生产版本,服务竟然好了。真是难得一见啊!
感慨世事弄人,来人躲开,最好无需来人搞tuxedo了,太重!
回溯版本,发现在历史的某个版本里,该cpp悄悄的有Unix格式变为了Windows格式,而且此后一年也有过更新,竟然没有报错。很不幸,我踩了这个雷,把它触发了。有点像武汉遇上新冠病毒的场景。病毒依然存在,只是和被我们逮住了!
这种问题简直了!希望相关人少走弯路!