1.背景
敏感词服务拆分后,在staging 环境压测。发现cpu 和 内存监控都飙高。在单机qps 200左右的情况下,cpu 使用率平均80+,young gc 次数平均200+ ,平均一次gc 耗时 20ms 左右 。
注:YGC是JVM GC 最为频繁的一种GC,一个高并发的服务在运行期间,会进行大量的YGC,发生YGC时,会进行STW,一般时间都很短。 不过如果次数太多,势必会影响服务所能承担的理论qps上限。同时如果再未来引入更高的业务复杂度时,很有可能会影响old 区,进而影响整个服务的可用性。
2. 过程
首先cpu 问题定位热点代码
通过工具定位到热点代码,containsSensitiveWord 。定位到代码中发现,这个方法一共做了两件事 1. 全表contains (index of )2. 正则表达式匹配。
初步怀疑是正则表达式比较消耗cpu 资源。
定位: 注释掉正则表达式的代码,观察压测报告,发现cpu load 和 young gc 基本没有变化。 再注释掉contains 的代码之后发现cpu 明显降低。
<