内存库伯内特斯java。lang.OutOfMemoryError:无法创建新的本机线程
我知道这是很常见的事情,有很多博客;创建有助于解决此问题的论坛。在浏览了所有这些文章之后,我在这里发布了这个问题。请告知
正在为工作节点上运行的所有POD执行OOM unable to create new native thread
我们有一些应用程序在Java 1.8.0_212
上运行,没有内存请求/限制,也没有-Xmx
设置
/ #java -XX:+PrintFlagsFinal -version | grep HeapSize
uintx ErgoHeapSizeLimit = 0 {product}
uintx HeapSizePerGCThread = 87241520 {product}
uintx InitialHeapSize := 528482304 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize := 8434745344 {product}
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (IcedTea 3.12.0) (Alpine 8.212.04-r0)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)
Kubernetes worker运行在32G
个RAM上,因为我们不让JVM知道容器世界,所以worker RAM的1/4用于JVM的堆大小
下面是根用户在Worker节点上的ulimit
输出(因为所有容器都作为根用户在节点上运行)
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 128613
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 128613
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
之前我们认为问题是由于主机上的PID耗尽,因此主机上运行的所有应用程序的线程都用完了,但我们错了
# cat /sys/fs/cgroup/pids/kubepods.slice/pids.max
131072
# cat /sys/fs/cgroup/pids/kubepods.slice/pids.current
2905
# cat /proc/sys/kernel/threads-max
257226
# cat /proc/loadavg
1.42 1.27 1.23 4/3426 18467
从上面的输出可以看出,主机上确实有足够的可用线程。我们有足够的空闲内存
# free -g
total used free shared buff/cache available
Mem: 31 1 22 1 7 27
Swap: 0 0 0
# grep Slab /proc/meminfo
Slab: 2830984 kB
# cat /sys/fs/cgroup/memory/memory.failcnt
0
由于它影响到主机上运行的所有JVM,我们知道主机上的某些错误导致了线程耗尽,无法找出这是什么。请分享您的意见,谢谢
# 1 楼答案
我也有同样的问题,经过长时间的调试和搜索,我们发现我们的一个应用程序在短时间内创建了超过30k个线程。它耗尽了主机上的所有PID。在我们限制了一个吊舱可以使用的PID总量后,一切都恢复了正常
参考资料:
https://github.com/SonarSource/docker-sonarqube/issues/265 https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/20190129-pid-limiting.md#summary