Ubuntu服务器反复出现“资源不可用”问题的原因排查求助
核心问题分析
你遇到的fork: retry: Resource temporarily unavailable和runtime/cgo: pthread_create failed错误,本质是进程/线程资源耗尽——虽然服务器内存、CPU使用率看起来很低,但系统内核或服务层面的进程数、线程数、文件句柄等资源已经达到上限,导致无法创建新进程/线程。
具体排查步骤
1. 检查系统级PID与线程数限制
Linux系统对PID(进程/线程标识符)总数有内核限制,当总线程数接近该上限时,会触发fork失败。
- 查看系统最大PID数:
cat /proc/sys/kernel/pid_max - 查看当前系统总线程数(每个线程对应一个PID):
ps -eLf | wc -l - 如果总线程数接近
pid_max值,说明PID资源耗尽,可临时调整上限(需重启生效):
持久化修改需编辑echo 4194304 > /proc/sys/kernel/pid_max/etc/sysctl.conf,添加kernel.pid_max = 4194304后执行sysctl -p。
2. 验证containerd服务的资源限制
Docker依赖containerd作为运行时,而systemd管理的服务默认不会继承/etc/security/limits.conf的配置,可能导致containerd自身的进程数、文件句柄限制不足。
- 查看containerd进程的实际资源限制:
cat /proc/$(pidof containerd)/limits - 若
Max processes或Max open files数值过低,需修改containerd的systemd配置:- 编辑
/etc/systemd/system/containerd.service.d/override.conf(无则创建):[Service] LimitNOFILE=1048576 LimitNPROC=65536 - 重载systemd并重启containerd:
systemctl daemon-reload systemctl restart containerd
- 编辑
3. 检查内核线程与内存映射资源
除了PID,内核的线程总数、内存映射数也可能触发资源耗尽:
- 查看系统最大线程数:
cat /proc/sys/kernel/threads-max - 查看内存映射数上限:
cat /proc/sys/vm/max_map_count - 查看内核日志,确认是否有资源耗尽的详细报错:
dmesg | grep -E "out of memory|pid_max|pthread_create|fork"
4. 排查容器线程泄漏
现有24个容器可能存在线程泄漏,导致总线程数周期性增长至上限,随后因某个进程退出释放资源,问题暂时消失。
- 查看Docker相关进程的线程数:
ps -eLf | grep -E "containerd-shim|docker" | wc -l - 结合cAdvisor监控,筛选出线程数持续增长的容器,针对性排查容器内应用的线程泄漏问题。
临时缓解方案
若当前需紧急恢复服务,可重启containerd或Docker释放资源:
systemctl restart containerd docker
但此方法仅为临时解决,需完成上述排查找到根源。
内容的提问来源于stack exchange,提问作者Henrique Marques
相关产品推荐
相关产品推荐

