You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu服务器反复出现“资源不可用”问题的原因排查求助

排查"Resource temporarily unavailable"异常的方案

核心问题分析

你遇到的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配置:
    1. 编辑/etc/systemd/system/containerd.service.d/override.conf(无则创建):
      [Service]
      LimitNOFILE=1048576
      LimitNPROC=65536
      
    2. 重载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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 10:17:38