该问题不仅影响 Docker,有时还会影响整个系统。
有时,当访问远程服务器时,我无法在终端上执行命令,并且对于简单的命令(例如
-bash: fork: retry: Resource temporarily unavailable
、cd
等)多次收到错误ls
。一段时间后问题消失了,然后又回来了。
我认为也是更大问题的一部分的另一个问题是,有时我无法正确管理 Docker,当我执行诸如
docker ps
、docker images
等命令时,我会收到错误 runtime/cgo: pthread_create failed: Resource temporarily unavailable
。
有时,当我尝试构建 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
运行
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 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/
目录为空。
在远程服务器上设置运行 cAdvisor 的容器,以便监控容器对系统资源的使用情况。
当问题 1 在服务器中发生并突然停止时,我打开 cAdvisor 查看发生了什么,并可以检查容器的系统内存使用情况:
在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 何时会再次发生。
正如您在第 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
然后你就可以处理它了
采取行动终止进程时要小心。
确保您彻底了解该过程的目的和重要性,以避免中断基本服务或导致数据丢失。