首页 > 解决方案 > Dockerized .Net 核心“设备上没有剩余空间”错误

问题描述

在项目中,我们遇到了与 docker agent 崩溃“设备上没有剩余空间”相关的问题。

在 K8S 集群的其中一个节点上,我们执行了命令:

# ps -eLf | grep './DotNetApp' | awk '{print $10}' | wc -l
13882

这意味着我所有的 .Net 进程都有 13882 个线程。在节点上,随着这个泄漏到最大线程数的限制。

要检查限制,您可以执行:

root@ip-172-20-104-47:~# cat /proc/sys/kernel/pid_max
32768

“线程”是数量,但 pid_max 是关于 id 的池。并且 pod 很容易达到这个限制并在节点上崩溃 docker。

我们使用 CentOS 作为 K8S worker。我们尝试了 Ubuntu 并得到了相同的结果。

你有什么想法,为什么我们在.net core 2.2下的Linux节点上会出现这样的线程泄漏?

标签: dockerkubernetes.net-core

解决方案


这个问题很有趣。我们决定为 Redis 创建一个健康检查。如果 Redis 不可用,我们只需击落 pod。但是,为每个 /health 调用执行此健康检查时,它创建了单独的连接多路复用器,而没有处理旧的连接多路复用器。因此,一段时间后,达到了可用线程的限制。

因此,在实施健康检查时要小心。


推荐阅读