通用方案:pai集群容器产生僵尸进程的修复方法

通用方案:pai集群容器产生僵尸进程的修复方法

更新时间:2020-07-06 16:01:07

1. 概述

本文主要介绍专有云环境中,pai集群容器产生僵尸进程的修复方法。

1.1. 适用范围

  • 专有云V3,云监控
    说明
    • 仅适用于专有云V3.8以下版本,不包含专有云V2版本。
    • 专有云V3.8.0的Hotfix已经彻底修复此问题。

1.2. 风险说明

重启容器时,需要灰度重启,每个容器重启后都要确认到达终态,再重启下一个容器,这样操作风险低。

1.3. 用户告知

参见本文内容时,请注意以下两点:

  • 超过或包含200个僵尸进程则是大量僵尸进程的情况,少于200个僵尸进程则是没有大量僵尸进程的情况。
  • 本方案为临时解决方法,最终解决方法需要等待Hotfix。

2. 问题描述

pai集群PaiJcs#服务角色的pai_jcs容器和PaiCap#服务角色的pai_cap容器产生大量僵尸进程,导致宿主机无法创建新的进程,影响宿主机上其他容器。如果发现有pai_jcs和pai_cap容器,则按照以下临时解决方法,修复并预防问题,具体方法请参见实施步骤

  • 宿主机有大量僵尸进程的情况:先重启容器,然后修改容器内计划任务。
  • 宿主机没有大量僵尸进程的情况:修改容器内计划任务。

 

3. 解决方案

3.1. 环境检查

注意:如果不存在大量僵尸进程,则从备份计划任务开始执行。

  1. 登录问题宿主机,执行top命令,确认存在较多僵尸进程。
  2. 执行以下命令,通过进程树找到僵尸进程所属容器,记录容器ID的前12位。
    ps -ef --forest
    系统显示类似如下。
  3. 执行以下命令,确认是pai_jcs和pai_cap容器。
    docker ps | grep [$Docker_ID]
    说明:[$Docker_ID]为上一步记录的容器ID。

3.2. 实施步骤

释放僵尸进程

如果存在大量僵尸进程,需要灰度重启容器。

  1. 执行以下命令,查看容器ID。
    docker ps |grep -iE "paijcs|paicap"
    系统显示类似如下。
  2. 执行以下命令,重启容器。
    docker restart [$Container_ID]
    说明
    • 需要逐个重启容器,每个容器重启后都要确认到终态,再重启下一个,一共2个服务角色,即4个容器。
    • [$Container_ID]为上一步查看的容器ID。

备份计划任务

2个服务角色,即4个容器都要执行以下操作:

  1. 执行以下命令,登录容器。
    docker exec -it [$Container_ID] bash
  2. 依次执行以下命令,备份计划任务,然后确认备份成功。
    cp /var/spool/cron/tianjimon /root
    ls /root |grep tianjimon
    系统显示类似如下。

修改计划任务

执行以下命令,进入编辑器,修改计划任务,然后保存退出。

crontab -e -u tianjimon

修改前类似如下。

*/1 * * * * source /etc/profile;/usr/alisys/tianjimon/system/monitor/tjm_container_monitor.py tianji-A-54c2 c43a11204.cloud.a13.amtest1221 >/dev/null 2>&1

修改后类似如下。

*/1 * * * * source /etc/profile >/dev/null 2>&1;/usr/alisys/tianjimon/system/monitor/tjm_container_monitor.py tianji-A-54c2 c43a11204.cloud.a13.amtest1221 >/dev/null 2>&1

注意:有些容器中没有终端,不能使用crontab -e命令编辑,请使用echo命令,重定向添加计划任务。使用同样方法操作其他容器,一共2个服务角色,即4个容器。

3.3. 结果验证

执行以下命令,确认计划任务修改成功。

crontab -u tianjimon -l 

4. 回滚方案

登录问题宿主机,执行以下命令,恢复备份的配置文件。

mv /root/tianjimon /var/spool/cron/