经常出现“资源不可用”的问题是什么原因?

问题描述 投票:0回答:1

该问题不仅影响 Docker,有时还会影响整个系统。

第 1 期

有时,当访问远程服务器时,我无法在终端上执行命令,并且对于简单的命令(例如

-bash: fork: retry: Resource temporarily unavailable
cd
等)多次收到错误
ls
。一段时间后问题消失了,然后又回来了。

第2期

我认为也是更大问题的一部分的另一个问题是,有时我无法正确管理 Docker,当我执行诸如

docker ps
docker images
等命令时,我会收到错误
runtime/cgo: pthread_create failed: Resource temporarily unavailable

第3期

有时,当我尝试构建 Docker 映像时,在开始时或构建过程中的某个步骤中,构建也会失败并出现错误

runtime/cgo: pthread_create failed: Resource temporarily unavailable

远程服务器在 Ubuntu 18.04.6 LTS上运行。

内存

运行

free -m
我得到了MB的RAM信息:

                total        used        free      shared  buff/cache   available
Mem:            32768        3333       24768         133        4665       29300
Swap:               0           0           0

CPU

运行

lscpu
我获取有关 CPU 的信息:

Architektur:             x86_64
CPU Operationsmodus:     32-bit, 64-bit
Byte-Reihenfolge:        Little Endian
CPU(s):                  8
Liste der Online-CPU(s): 0-7
Thread(s) pro Kern:      1
Kern(e) pro Socket:      8
Sockel:                  1
Anbieterkennung:         AuthenticAMD
Prozessorfamilie:        25
Modell:                  1
Modellname:              AMD EPYC 7453 28-Core Processor
Stepping:                1
CPU MHz:                 1999.725
BogoMIPS:                5489.89
Virtualisierung:         AMD-V
Hypervisor-Anbieter:     Parallels
Virtualisierungstyp:     Container

Docker

Docker 版本:

Docker version 24.0.2, build cb74dfc

Docker 撰写版本:

Docker Compose version v2.21.0

限制

运行

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) 4124817
max locked memory       (kbytes, -l) 262144
max memory size         (kbytes, -m) unlimited
open files                      (-n) 32768
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) 62987
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

打开文件数从1024增加到32768,最大锁定内存从65536增加到262144。增加后问题仍然存在。

我通过编辑

/etc/security/limits.conf
文件增加了这些数字,该文件现在包含:

x_project       soft nofile   32768
x_project       -    memlock  262144
root            soft nofile   32768
root            -    memlock  262144

我必须编辑此文件,因为使用

ulimit
命令设置限制不会保留更改。

/etc/security/limits.d/
目录为空。

c顾问观察

在远程服务器上设置运行 cAdvisor 的容器,以便监控容器对系统资源的使用情况。

当问题 1 在服务器中发生并突然停止时,我打开 cAdvisor 查看发生了什么,并可以检查容器的系统内存使用情况:

Memory usage

在2:07:45和2:08:00之间可以看到青色线减少。那是问题 1 停止的那一刻。

现状

服务器中运行着24个容器。它们是用 docker compose 构建的。 docker compose 文件不会为容器设置任何内存/CPU 限制。他们似乎都工作得很好。但我无法启动/构建新容器。

为了演示这一点,这些是尝试运行的结果

docker run hello-world

root@h2877818:~# docker run hello-world
docker: Error response from daemon: failed to create task for container: failed to create shim task: ttrpc: closed: unknown.
ERRO[0001] error waiting for container:

root@h2877818:~# docker run hello-world
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: unable to retrieve OCI runtime error (open /run/containerd/io.containerd.runtime.v2.task/moby/724798e971a7ba8d31d6f3f1b900d01152efee06a64adedad7c589afe9054bfd/log.json: no such file or directory): fork/exec /usr/bin/runc: resource temporarily unavailable: unknown.
ERRO[0000] error waiting for container:

root@h2877818:~# docker run hello-world
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: unable to retrieve OCI runtime error (open /run/containerd/io.containerd.runtime.v2.task/moby/04d0e67f08bac10bed19c650868af6bfbc27757584bb096846ed1d8c8602bad8/log.json: no such file or directory): runc did not terminate successfully: exit status 2: unknown.
ERRO[0000] error waiting for container:

我不知道为什么会出现这个问题。它很复杂,因为我认为这可能与某些限制配置有关,因为服务器有足够的资源来运行当前的服务,而且我也一直在使用

htop
监控资源的使用情况,并且使用情况总是很低。

现在,当我输入此内容时,服务器中发生了问题 3。不确定这个问题何时会停止以及问题 1-3 何时会再次发生。

docker ubuntu docker-compose containers limit
1个回答
0
投票

正如您在第 1 期中提到的:

fork: retry: Resource temporarily unavailable
和第 2,3 期
runtime/cgo: pthread_create
.

它通常表明您的系统已达到其线程限制。

要统计系统当前的线程总数,可以使用以下命令:

--

ps -eLf | wc -l 

要检查系统的最大线程限制,可以使用以下命令查看“最大用户进程”限制:

--

ulimit -n

如果任务创建了太多线程而没有正确终止它们(某些 Java 进程或其他工作线程可能会发生这种情况),则可能会达到此限制。

要识别哪个进程创建了最多线程,可以执行以下命令:

--

ps -eLf | awk 'NR>1 {print $10}' | sort | uniq -c | sort -n

然后你就可以处理它了

采取行动终止进程时要小心。

确保您彻底了解该过程的目的和重要性,以避免中断基本服务或导致数据丢失。

© www.soinside.com 2019 - 2024. All rights reserved.