二零二三年二月第四周技术周报

本周我发现有些服务框架写得并不是很好,特别是某些Java框架。当CPU占用达到40%左右的时候,就会出现大量的超时现象。这些服务,CPU核心和内存容量不是不多,工作线程数目也不是不够。但是,就是跑不满CPU。用Java性能工具分析发现,其实发现大部分工作线程处于Idel或者Waiting状态。目前综合所有情况分析,还是百思不得其解。NIO也用上了,还用的是Netty框架,但是吞吐量就是上不去。通过对于线程的分析,发现并没有特别繁忙的业务线程。推断应该是IO或者某种等待机制导致了这种低处理效率。

这次我是准备通过削减节点数量来降本,在执行前并没有考虑特别多的因素。所以我在削减节点容量的时候,只是通过查看CPU的负载来判断节点是否能够承受。当我将北京地域的workload平均CPU占用率提升到35%-40%的时候,整个服务出现了大量的超时现象。当时把我吓了一跳。后面从监控上分析,几乎是整个背景地域的节点都超时了,也就是处于一种”休克“状态。

本周也继续重构某一个老的PHP网关服务,新的网关用Java写成。但是我其实不是很赞成网关用Java,毕竟Java这种语言的执行特性很大程度上决定了它不适合特别高的并发。并且,我们目前所用的都是JDK 8,并没有引入轻量级的线程,每个4c8g容器内线程最多也就800个,多了线程切换开销就会特别大。所以单个容器的吞吐量有限,承载同样的流量需要更多的容器。刚开始我是用Go重写的,这个框架很不错而且也有专门的团队维护,但是leader还是让我用部门自研的那个Java框架。可能人事上的考虑居多吧,无奈,我还是先写吧。