李铭一愣:“老大,数据都在这里了。”
林溪轻轻摇头:
“……全量,最近一周的,访问日志,数据库慢SQL,GC日志,网络IO……所有。”
她的要求,意味着需要动用更底层的监控工具,拉取TB级别的原始数据。
李铭立刻意识到,老大这是要亲自进行尸检级别的深度剖析了!他精神一振,马上应道:“明白!我立刻让运维配合,把所有相关数据同步到您的分析环境!”
数据同步需要时间。在此期间,技术部只能焦急等待。
第二天下午,林溪让顾小雨通知技术部核心骨干开会。
众人怀着朝圣般的心情进入会议室,看到林溪已经坐在那里,面前的平板连接着大屏幕,屏幕上展示着一幅被她重新梳理和标注过极其复杂的系统调用链与资源关联图。
没有开场白,林溪直接开始了她的表演。
她用手指虚点着屏幕上的一个服务节点,语速比平时稍快,精准地划开问题的表象,露出内里腐烂的根源。
第一刀:挥向看似无辜的缓存
“……这里”她点着缓存服务,“……缓存策略,Cache-Aside,没问题。”
众人点头。
“……但,缓存失效时间,设置一致。”她语气转冷,“……高峰时,集体失效,雪崩,你们,在玩蹦极?”
负责缓存设计的工程师脸瞬间白了,他们只考虑了缓存命中率,却忽略了失效时间设置不合理带来的风险!
“……改成,随机过期时间,基础值加……随机浮动。”
轻描淡写一句话,解决了一个潜在的,毁灭性的问题。
第二刀:砍向伪装勤奋的数据库
她又指向数据库层的几个复杂查询。
“……这些,关联查询,像,八爪鱼。”
众人:“……”
“……触手太多,抓取数据,太慢。”
“……拆开,用,冗余字段,或者,物化视图。”
“……为了,所谓的,范式整洁,牺牲性能。”
“……蠢。”
负责数据库设计的架构师低下了头,脸上火辣辣的。
第三刀:刺向隐蔽角落的序列化
接着,她调出了一段GC监控的放大图,指着几个频繁出现的,短暂的尖峰。
“……这里,每次批量数据,处理前,GC次数,陡增。”她看向负责核心业务逻辑的组长:
“……你们,在代码里,养蛊?”
那位组长差点被自己的口水呛到。
“……检查,对象序列化方式,尤其是,那个自定义的,DataProcessor,大概率,是Java原生序列化,效率低,产生大量小对象。”
组长立刻回忆起来,为了图省事,某个工具类确实用了默认的序列化!
“……换成Kryo,或者,Protobuf,别再用,石器时代的,工具。”
第四刀:斩向自作聪明的线程池
最后,她点出了几个线程池的监控指标。
“……线程池配置,FixedThreadPool,核心线程数,占满CPU核数?”她语气里带着明显的不理解
“……不留余地,给系统线程?当操作系统,是后妈养的?”
负责基础设施调优的工程师汗都下来了。
“……改成,ThreadPoolExecutor,合理设置核心,最大线程数,使用有界队列,参数,参照……我文档里,那个公式计算。”
她甚至懒得再重复那个公式。
整个会议室,除了林溪那清冷软糯却刀刀见血的声音,只剩下其他人此起彼伏倒吸凉气的声音和羞愧难当的讪笑。
太狠了!太准了!也太……形象了!
八爪鱼,养蛊,蹦极,石器时代,后妈养的……这些极其生活化甚至带着点毒舌的比喻,从她那张没什么血色的小嘴里说出来,形成了一种极致反差,让原本严肃甚至压抑的技术复盘,变得,有点想笑,又无比深刻地记住了自己的错误。
他们终于真切地体会到,当老大身体状态稍好,且把你当成自己人时,她的技术批评会是一种怎样的精神洗礼。
尽管被毒舌得无地自容,但技术部所有人的内心是狂喜的。因为老大不仅指出了问题,更给出了清晰无比的解决方案方向!这比他们自己无头苍蝇般乱撞要高效一万倍!
会议一结束,整个技术部如同上了发条的机器,高速运转起来。
顾小雨作为技术助理,她不仅负责林溪的日常照料,更承担起部分技术协调工作,在林溪和技术团队之间搭建起更顺畅的沟通桥梁。
按照林溪划定的重点和给出的方案,各小组分头行动