有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

内存库伯内特斯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) 个答案