背景
Presto master出现jvm coredump情况,排查问题,这里记录下排查过程。
排查过程
先看下JVM Coredump日志:
1 | # |
可以看到报错是显示资源不足而导致JVM Coredump了。我们需要先看下是否是内存导致的问题:
所以先看下JVM日志,如下:
1 | 2020-09-09T16:20:57.056+0800: 501342.858: [GC pause (G1 Evacuation Pause) (young), 0.1361232 secs] |
可以看到GC日志是正常的,young gc后,内存占用8G左右。
之前写脚本统计下内存占用,查看了/proc/meminfo信息:
1 | MemTotal: 131779324 kB |
可以看到 MemAvailable 还有50+G内存,说明当时内存是充足的。不是内存不足导致的问题。那再需要确认下是否是线程数太多导致的问题?
1 | [presto@prestomaster00 cluster-data]$ grep "JavaThread" hs_err_pid22120.log | wc -l |
线程数接近3.1W,有些多,去server.log里查找是否有线程创建失败的Log,命令:
grep -C 70 “unable to create new native thread” server.log.1 | less
1 | java.io.IOException: Failed on local exception: java.io.IOException: Couldn't set up IO streams; Host Details : local host is: "prestomaster00/xx.xx.xx.xx"; destination host is: "datanode":8020; |
发现确实是无法创建线程,因为内存是充足的,说明是线程数太多导致的,那我们看下系统允许创建的线程数是多少?
1 | [presto log]$ ulimit -a |
可以看到max user processes 是10W个,但是这个是系统限制某用户下最多可以运行多少进程或线程,这个值是表象,这个值是受全局的kernel.pid_max的值限制,那我们需要看下pid_max值:
1 | [presto@prestomaster00 log]$ cat /proc/sys/kernel/pid_max |
猜测超过了40960个进程,修改此值到10W,依然复现。
猜测线程数超过了JVM最大线程数,需要设置下JVM运行创建的线程数:
1 | echo "200000" > /proc/sys/vm/max_map_count |
默认65530,永久修改在/etc/sysctl.conf。在其他资源可用的前提下,单个JVM能开启的最大线程数是/proc/sys/vm/max_map_count的设置数的一半。
修改后,发现JVM不再Coredump。
但是这个只是临时解决,帮助避免节点频发JVM Coredump,核心还是看下为啥会创建3W+线程。