当前位置: 首页 > news >正文

僵尸进程问题排查

鲲鹏容器发现有大量僵尸进程 ,僵尸进程自容器创建以来, 一直存在。

僵尸进程的累积会导致fd耗尽, 新进程无法启动


通过分析bash的改动点发现,bash 从4.4 版本开始做了优化。
在4.4版本之前,若执行
“/bin/bash -c /usr/sbin/ssh & /usr/sbin/crond && bash /home/admin/start_container.sh jmg.jd.com 1 jdos_imagedownload 1014993 && sleep 9999999d”, 通过fork + exec执行每个指令,父进程还是bash。 
在4.4版本之后, 在执行最后一条指令时, 不会进行fork, 直接exec , 进程主体变为sleep。

已知的,如果基础镜像是centos8, euler 会有这个问题

x86的一号进程是

/bin/bash -c /usr/sbin/ssh & /usr/sbin/crond && bash /home/admin/start_container.sh jmg.jd.com 1 jdos_imagedownload 1014993 && sleep 9999999d

其中sleep 9999999d作为一号进程fork的子进程出现, 进程号是682。

基于此, 内部定位认为sleep作为1号进程时, sleep是个阻塞程序, 不具备init的职责, 因此无法回收子进程, 导致僵尸进程出现, 而x86不出现是因为1号进程不是sleep,而是

/bin/bash -c /usr/sbin/ssh & /usr/sbin/crond && bash /home/admin/start_container.sh jmg.jd.com 1 jdos_imagedownload 1014993 && sleep 9999999d

x86和鲲鹏实际上使用的都是同样的entrypoint,但是一号进程却不一样, 经定位是由于bash版本导致的差异。 x86上Centos7使用的bash版本是4.2, 鲲鹏上openEuler使用的bash版本是5.1。 通过分析bash的改动点发现, bash 从4.4 版本开始做了优化。

在4.4版本之前,若执行“/bin/bash -c /usr/sbin/ssh & /usr/sbin/crond && bash /home/admin/start_container.sh jmg.jd.com 1 jdos_imagedownload 1014993 && sleep 9999999d”, 则通过fork + exec执行每个指令, 父进程还是bash。 

解决方案

微调现有的entrypoint

# 在sleep 前加这一个 `time` 命令
/bin/bash -c /usr/sbin/ssh & /usr/sbin/crond && bash /home/admin/start_container.sh jmg.jd.com 1 jdos_imagedownload 1014993 && time sleep 9999999d

【推荐】引入社区的tini作为容器镜像的1号进程

参见:  https://github.com/krallin/tini

tini -- /bin/bash -c "/usr/sbin/ssh & /usr/sbin/crond && bash /home/admin/start_container.sh jmg.jd.com 1 jdos_imagedownload 1014993 && sleep 9999999d"

注: tini 需要在基础镜像里填加,linux发行版默认不带。

 

http://www.lryc.cn/news/612679.html

相关文章:

  • Mac+Chrome滚动截图
  • localforage的数据仓库、实例、storeName和name的概念和区别
  • OpenAI 开源模型 gpt-oss 正式上线微软 Foundry 平台
  • [Oracle] CEIL()函数
  • 利用微软SQL Server数据库管理员(SA)口令为空的攻击活动猖獗
  • MySQL中的DDL(一)
  • 直连微软,下载速度达18M/S
  • [2402MT-A] Redbag
  • 从周末去哪儿玩到决策树:机器学习算法的生活启示
  • 《深入解析缓存三大难题:穿透、雪崩、击穿及应对之道》
  • Mysql数据仓库备份脚本
  • 突破距离桎梏:5G 高清视频终端如何延伸无人机图传边界
  • 【完整源码+数据集+部署教程】无人机自然场景分割系统源码和数据集:改进yolo11-RVB
  • 计算机网络1-4:计算机网络的定义和分类
  • 【网络编程】一请求一线程
  • 云原生安全挑战与治理策略:从架构思维到落地实践
  • PyTorch + PaddlePaddle 语音识别
  • 从BaseMapper到LambdaWrapper:MyBatis-Plus的封神之路
  • day44 力扣1143.最长公共子序列 力扣1035.不相交的线 力扣53. 最大子序和 力扣392.判断子序列
  • WEB开发-第二十七天(PHP篇)
  • 笔试——Day31
  • Linux(17)——Linux进程信号(下)
  • 【42】【OpenCV C++】 计算图像某一列像素方差 或 某一行像素的方差;
  • uniapp vue3中使用pinia 和 pinia持久化(没有使用ts)
  • SQLite 创建表
  • VUE+SPRINGBOOT从0-1打造前后端-前后台系统-文章列表
  • [失败记录] 使用HBuilderX创建的uniapp vue3项目添加tailwindcss3的完整过程
  • 《深入浅出 Django ORM:设计理念与惰性查询实现详解》
  • Django 表单:深度解析与最佳实践
  • 上门家教 app 用户端系统模块设计