引入 SkyWalking 后对 ES 运行机器的影响

在 dev 环境引入 SkyWalking 之后,ES CPU 长期飙到 200%。我们需要定位一下到底是内存不足导致的疯狂 GC 引致 CPU飙高,还是因为 CPU 不足运算性能太低导致的。

性能问题分析

具体情况如下图,可见 ES 的 CPU 消耗极高


image.png

首先我们判断是否是因为GC原因导致CPU飙高

jstat -gcutil {processID} 1000 30 #间隔1s执行20次
image.png

年轻代的内存分分钟就满了,每秒差不多都要执行 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使用情况

这里我们执行三次此命令,多次采样取平均值。


![image.png](https://upload-images.jianshu.io/upload_images/625996-da52e57ba5983249.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

图中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%
image.png
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%
image.png
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 的性能情况

image.png

CPU 基本都在 100% 以下

image.png

可以看到 Young GC 和 FULL GC 大大降低,不过看这个情况内存还是不太够。

总结

目前 dev 环境仅接入了 1/3 的节点,但是对 ES 的影响就已经如此巨大。为了测试和开发的完整性,目前的方案是降低 SkyWalking 应用端的采样率,ES 服务单独部署在高配机器上。

SkyWalking 对于应用端的性能影响及其的低,但是针对存储端的影响是非常大的。在上线之前除了针对 SkyWalking 本身对应用端性能的测试外,还要根据测试环境 ES 的运行情况评估线上 ES 是否要增加集群节点。

你可能感兴趣的:(引入 SkyWalking 后对 ES 运行机器的影响)