• df卡死和fork:cannot allocate memory报错


    早上到了公司,发现docker资源池的某一台主机根文件系统写满。

    检查后发现该主机/data目录未挂载文件系统,直接放在了根目录下。于是联系业务方将应用迁移,联系主机工程师为/data挂载80G的存储空间。

    接着顺便检查了其它资源池主机的磁盘分区上可使用的磁盘空间。使用df -h命令查询,结果直接hang死。

    去其它主机执行df命令,同样全部hang死。

    随后主机上Docker容器内跑的业务开始报错。

    尝试检查/var/log/message系统日志,发现全部被业务的报错日志充斥,可读性很差。

    最后服务器开始开始出现故障,ssh连接不上去。即使偶尔有人登录成功,执行任何命令都会提示:

    -bash: fork: Cannot allocate memory 

    主机工程师只能前往机房将主机重启,结果重启后发现这台主机居然没有在/etc/fstab中配置/data目录自动挂载,重启后/data目录丢失,应用再次开始大规模报错。于是顺便检查了资源池的其它几台主机,发现有些主机/data目录未挂载、有些主机挂载后未配置开机自动挂载、有些主机/data目录挂载了但是自动挂载配的另一个文件系统、还有些主机密码不知道被谁改了只能重新刷密码,总之是问题多多。

    首先联系业务方将日志输入级别改了,把输出到/var/log/message的日志全部停下。

    然后检查日志;

    查看内存发现主机内存仍然很充裕,不可能是内存耗尽引起的故障;

    查看进程表,发现主机上有大量同PID、同PPID进程,而且还在疯狂增加,很快增加到十几万之多,很快意识到这些都是疯狂增加的线程,因为进程数和线程数疯狂增加,达到pid_max。经过验证确实pid_max用尽会导致fork问题。

    于是查询出错时的操作记录,发现中午有人发布的新版本镜像,即问题所在。

    虽然修改pid_max可以解决这个问题,但这只是治标不治本的方法。其实正常情况下pid_max完全够用,应该合理规划pid_max和thread_max的值.

    df卡死其实是另一个故障了:使用strace df -h追踪出错原因,发现每次都在/proc/sys/fs/binfmt_misc处hang死。在/etc/mtab中可以查询到这个目录,但主机上实际不存在这个目录。

    Windows 10 x64-2018-06-25-18-28-41

    进入/proc/sys/fs执行ls命令,同样出现hang死。

    Windows 10 x64-2018-06-25-18-28-55

    于是重新配置好所有开机自动挂载信息,将所有出现故障的主机全部重启,该问题暂时解决。

    最后提出的处理方法:

    Image(64)

  • 相关阅读:
    The difference of the line-height:2 and line-height:2em
    Damao眼中的新媒体
    Damao教你如何使用MacDown
    SF Pro 项目中的css hack
    刷新一次,图片更换一次
    Markdown 初体验
    docker 部署gitlab 构建CI/CD流水线
    c#面向对象问题 WPF简单数据驱动
    WebApi的创建和调试(简单步骤)
    C语言实现的贪吃蛇小游戏
  • 原文地址:https://www.cnblogs.com/yangyuliufeng/p/9228525.html
Copyright © 2020-2023  润新知