第152章 工作日常(2/3)
确认无误后他在审批流程里点了通过。
第二份是自动化监控脚本迭代后的运行数据汇总。
新版本上线之后告警误报率从百分之十二降到了百分之三,动态阈值调整算法在逐步收敛——前两周的阈值波动幅度还比较大,每天上下浮动百分之八左右,到了第三周波动幅度收窄到了百分之三以内。
算法正在学习这套系统的正常行为基线,再给它两周时间,波动应该能进一步收窄。
他在汇总表里加了一行批注:“动态阈值自学习周期约为四周,建议四周后做一次正式评估,确认是否已达到稳定状态。”然后发给了项目经理。
两份报表处理完已经快十点半了。
他去茶水间续了杯热水,回来时看到小赵正对着屏幕皱眉。
小赵面前的代码编辑器里打开着一个数据清洗脚本,屏幕上密密麻麻的循环嵌套和条件判断,光标停在中间某一行上闪个不停。
小赵说这个脚本处理到第九万条数据时又卡住了,上周你把内存溢出的问题改了,这次没溢出,但跑到九万条时速度突然变慢,cpU倒是没跑满,不知道是不是数据源的问题。
林泠把椅子拖到小赵工位旁边,弯腰看他的屏幕。
脚本在终端窗口里还在缓慢滚动着处理日志,每处理一千条数据打印一行时间戳。
他看了一分钟,注意到时间戳的间隔在第八万五千条之后开始逐渐拉长——从每千条约零点三秒慢慢增加到零点五秒,到第九万条时已经变成了一秒多。
不是突然变慢,是逐步降速。
他说不是数据源的问题,数据源的响应时间是稳定的,问题大概率出在数据累积之后的处理逻辑上。
你把第九万条到第九万一千条之间的临时表大小打印出来看看。
小赵加了几行调试日志,重新跑脚本。
几分钟后日志输出显示,临时表在这个区间已经累积到了将近两百万行,而且每处理一条新数据就在临时表上做一次全表关联查询。
全表关联的复杂度是随着表大小线性增长的——表越大,每次查询的时间越长,处理速度就越慢。
林泠说你每次循环都在一个不断膨胀的临时表上做关联查询,这个逻辑本身就是指数级退化,跟硬件性能没关系。
解法有两个:一个是把临时表按时间窗口分片,每处理完一万条就归档清空一次;另一个是直接用流式处理,不做全量暂存,边读边算。
第一种改起来快,半小时能搞定;第二种性能更好但改动量大,建议先用第一种解燃眉之急,后面迭代再重构。
小赵听了之后靠在椅背上沉默了几秒。
他说这东西从第一版就是这个逻辑,之前数据量小跑得飞快,他从来没往这个方向想过。
林泠说这不怪你,很多性能问题在数据量小的时候根本暴露不出来,数据量一上来才会现原形。
他自己上周处理那个连接池耗尽问题之前,也是从来没想到过半关闭连接会累积到两千条以上。
小赵点了点头,开始在代码编辑器里改临时表的分片逻辑。
林泠回到自己工位上,把之前的运维脚本打开,在代码注释里补了一段说明,把半关闭连接累积效应的触发条件、识别方法和处理流程写得更详细。
上次老周跟他讨论过一个类似的问题,当时没有现成的排查方案,全靠临时写SqL查会话表。
这次既然已经把排查流程标准化了,不如把对应的预防措施也标准化。
中午的食堂菜单是红烧鸡块、清炒小白菜和紫菜蛋花汤。
本章未完,请翻下一页继续阅读.........