在项目中,我们面临与Docker代理崩溃的问题“设备上没有剩余空间”。
在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工作者。我们尝试了Ubuntu,并获得了相同的结果。
您有什么想法,为什么在.net core 2.2下的Linux节点上会有这样的线程泄漏?
答案 0 :(得分:0)
这个问题很有趣。我们决定为 Redis 创建一个健康检查。如果 Redis 不可用,我们只是击落了 pod。但是,在为每个 /health 调用执行此健康检查时,它创建了单独的连接多路复用器,而没有处理旧的连接多路复用器。因此,经过一段时间后,达到了可用线程的限制。
因此,在实施健康检查时要小心。