服务器一直以来请求数几乎没啥变化,但是 ES 的 java cpu 使用率突然飙升,top 命令一查,CPU 几乎 100%,怎么排查是哪方面造成的?以及如何找出恶意的批量暴力请求?
![]() | 1 zhangxudong 2020-08-21 10:15:09 +08:00 可以看下 hot threads |
2 gabon 2020-08-21 10:22:24 +08:00 via Android threaddump |
3 Jooooooooo 2020-08-21 10:57:16 +08:00 top -H -p <pid> 找到对应进程里占用高的线程 然后 jstack grep 这些线程, 注意进制转换, 上面看见的进程号是十进制的, jstack 里的进程号是十六进制的 |
4 lff0305 2020-08-21 11:14:01 +08:00 jmap 看下是不是 heap 满了,100%是在不停的做 GC (按三楼的方法,会看到是 GC Thread 在占 cpu) |
![]() | 5 Morriaty 2020-08-21 11:30:12 +08:00 官方推荐的 debug 方式也是 _cat/hot_threads,但这玩意的输出不是资深 es 专家真的很难看懂 建议还是观察 kibana 的 monitor 信息,以及观察 gc log 、slow log 之类的 |
6 Navee 2020-08-21 13:21:41 +08:00 先看 GC,GC 没问题看系统 IO (磁盘、网络) |
这个原因有很多,我前段时间也排查过一起这种问题,可以参考我的博客 https://my.oschina.net/110NotFound/blog/4311256 |
![]() | 8 TuGai 2020-08-21 16:06:26 +08:00 https://github.com/jvm-profiling-tools/async-profiler `/profiler.sh -d 10 -e cpu -f ./flamegraph.svg <PID>` 一行命令直接生成热点方法的火焰图 |
![]() | 9 lavvrence 2020-08-21 16:22:49 +08:00 elastic 官网的权威指南: https://www.elastic.co/guide/cn/elasticsearch/guide/current/heap-sizing.html 机器至少要分配一半内存给 Lucene 、禁用 swap 。 |
10 artifact 2020-08-21 17:58:23 +08:00 我们这边最近也遇到了这个问题,发现是上容器之后,es 没办法正确获取容器核心数, 设置了过大的线程池,创建过多线程导致 |
![]() | 11 brewin 2020-09-18 17:21:01 +08:00 导出线程快照、内存快照、火焰图看看 |
12 guguji 2022-10-11 19:42:55 +08:00 |