docker - 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节点上会出现这样的线程泄漏?
解决方案
这个问题很有趣。我们决定为 Redis 创建一个健康检查。如果 Redis 不可用,我们只需击落 pod。但是,为每个 /health 调用执行此健康检查时,它创建了单独的连接多路复用器,而没有处理旧的连接多路复用器。因此,一段时间后,达到了可用线程的限制。
因此,在实施健康检查时要小心。
推荐阅读
- odata - 搜索字段名称以
- amazon-web-services - 在 AWS 上重新部署 NodeJS API 的最佳方式
- apollo - Apollo 离线优先支持:Service Worker 还是 Persisted Cache?
- c# - C# PKCS7 智能卡数字签名 - 自签名以来文档已被更改或损坏
- sql - SQL Server 帮助如何检索非 NULL/Blank 记录
- javascript - 如何从属性创建文件路径
- sql - ODBC 连接需要很长时间才能执行
- c# - Listview 项目清除问题
- c# - 在剃须刀页面应用程序中路由到 ApiController?
- unix - 在 OpenBSD 中调整分区大小