在 dev 环境引入 SkyWalking 之后,ES CPU 长期飙到 200%。我们需要定位一下到底是内存不足导致的疯狂 GC 引致 CPU飙高,还是因为 CPU 不足运算性能太低导致的。
性能问题分析
具体情况如下图,可见 ES 的 CPU 消耗极高
首先我们判断是否是因为GC原因导致CPU飙高
jstat -gcutil {processID} 1000 30 #间隔1s执行20次
年轻代的内存分分钟就满了,每秒差不多都要执行 3 次 Young GC。老年代内存每次到 70+% 的时候就要执行 FULL GC 了,差不多每10s执行一次 FULL GC 可以说太频繁了。
这个时候我们大概能确定是 GC 导致 CPU 太高,但是我们还需要更多的证据。
sudo -u elasticsearch jstack {processID} > /tmp/es-thread-stack.txt #导出线程堆栈信息
top -n 1 -H {processID} #查看指定进程的线程CPU使用情况
这里我们执行三次此命令,多次采样取平均值。
图中PID即为线程ID,将其转换为16进制在 es-thread-stack.txt 文件中进行查询。
cat es-thread-stack.txt | grep $(printf %x {threadId})
21375-20.0%: "elasticsearch[C92gS_3][refresh][T#1]"
21385-20.0%: "elasticsearch[C92gS_3][http_server_worker][T#2]"
21096-13.3%: "Gang worker#2 (Parallel GC Threads)"
21098-13.3%: "Gang worker#3 (Parallel GC Threads)"
21376-13.3%: "elasticsearch[C92gS_3][refresh][T#2]"
21495-13.3%: "elasticsearch[C92gS_3][write][T#2]"
21560-13.3%: "elasticsearch[C92gS_3][write][T#4]"
21094-6.70%: "Gang worker#0 (Parallel GC Threads)"
21095-6.70%: "Gang worker#1 (Parallel GC Threads)"
21494-6.70%: "elasticsearch[C92gS_3][write][T#1]"
21559-6.70%: "elasticsearch[C92gS_3][write][T#3]"
22420-6.70%: "elasticsearch[C92gS_3][search][T#2]"
22423-6.70%: "elasticsearch[C92gS_3][search][T#1]"
22424-6.70%: "elasticsearch[C92gS_3][search][T#4]"
22446-6.70%: "elasticsearch[C92gS_3][search][T#6]"
22458-6.70%: "elasticsearch[C92gS_3][search][T#7]"
total CPU: 166.8% , elasticsearch CPU: 126.8% , GC CPU: 40.0%
21375-46.7%: "elasticsearch[C92gS_3][refresh][T#1]"
21376-40.0%: "elasticsearch[C92gS_3][refresh][T#2]"
21397-26.7%: "elasticsearch[C92gS_3][http_server_worker][T#5]"
21396-13.3%: "elasticsearch[C92gS_3][http_server_worker][T#4]"
21495-13.3%: "elasticsearch[C92gS_3][write][T#2]"
21494-6.7%: "elasticsearch[C92gS_3][write][T#1]"
21559-6.7%: "elasticsearch[C92gS_3][write][T#3]"
21560-6.7%: "elasticsearch[C92gS_3][write][T#4]"
22420-6.7%: "elasticsearch[C92gS_3][search][T#2]"
22422-6.7%: "elasticsearch[C92gS_3][search][T#3]"
22423-6.7%: "elasticsearch[C92gS_3][search][T#1]"
22436-6.7%: "elasticsearch[C92gS_3][search][T#5]"
22446-6.7%: "elasticsearch[C92gS_3][search][T#6]"
22458-6.7%: "elasticsearch[C92gS_3][search][T#7]"
total CPU: 200.3% , elasticsearch CPU: 200.3% , GC CPU: 0.0%
21376-25.0%: "elasticsearch[C92gS_3][refresh][T#2]"
21094-18.8%: "Gang worker#0 (Parallel GC Threads)"
21095-18.8%: "Gang worker#1 (Parallel GC Threads)"
21098-18.8%: "Gang worker#3 (Parallel GC Threads)"
21375-18.8%: "elasticsearch[C92gS_3][refresh][T#1]"
21096-12.5%: "Gang worker#2 (Parallel GC Threads)"
21494-12.5%: "elasticsearch[C92gS_3][write][T#1]"
22458-12.5%: "elasticsearch[C92gS_3][search][T#7]"
21116-6.2%: "VM Thread"
21446-6.2%: "elasticsearch[C92gS_3][http_server_worker][T#7]"
21495-6.2%: "elasticsearch[C92gS_3][write][T#2]"
21560-6.2%: "elasticsearch[C92gS_3][write][T#4]"
22370-6.2%: "elasticsearch[C92gS_3][http_server_worker][T#8]"
22424-6.2%: "elasticsearch[C92gS_3][search][T#4]"
22446-6.2%: "elasticsearch[C92gS_3][search][T#6]"
total CPU: 181.1% , elasticsearch CPU: 106.0% , GC CPU: 75.1%
取三次的平均值
total CPU: 182.7 , elasticsearch CPU: 144.4% , GC CPU: 38.3%
根据该部分数据分析,ES 当前运行的机器不仅内存不足,CPU性能也不够。
关闭 SkyWalking 的性能情况
CPU 基本都在 100% 以下
可以看到 Young GC 和 FULL GC 大大降低,不过看这个情况内存还是不太够。
总结
目前 dev 环境仅接入了 1/3 的节点,但是对 ES 的影响就已经如此巨大。为了测试和开发的完整性,目前的方案是降低 SkyWalking 应用端的采样率,ES 服务单独部署在高配机器上。
SkyWalking 对于应用端的性能影响及其的低,但是针对存储端的影响是非常大的。在上线之前除了针对 SkyWalking 本身对应用端性能的测试外,还要根据测试环境 ES 的运行情况评估线上 ES 是否要增加集群节点。