通用方案:专有云V3环境SSHTunnelClient进程打开文件句柄过多

通用方案:专有云V3环境SSHTunnelClient进程打开文件句柄过多

更新时间:2020-07-07 10:57:47

1. 概述

本文主要介绍专有云V3环境SSHTunnelClient进程打开文件句柄过多的处理方法。

1.1. 适用范围

  • 专有云V3,容器服务

    说明:适用于专有云V3.0~V3.7,包含V3.7.X。

1.2. 风险说明

清理SSHTunnelClient进程打开的文件句柄,正常执行操作无风险。

1.3. 用户告知

本方案只能暂时解决问题,后期仍会复发。若需彻底解决,请将专有云升级到V3.8.0或以上版本。

2. 问题描述

在专有云V3环境部分项目中,Docker宿主机执行docker命令无响应。在日志文件/var/log/docker中存在大量too many open file错误,影响容器中业务的正常运行。

3. 解决方案

3.1. 环境检查

检查文件句柄使用情况

  1. 使用root用户登录问题宿主机。

  1. 执行以下命令,根据打开文件句柄的数量排序,获得排名前10的进程。

    cd /proc; for i in *; do test -d $i/fd && echo $i `ls $i/fd|wc -l`; done | sort -rnk2 | head -10

    系统返回类似如下,输出结果左边为进程号,右边为打开的文件句柄数。

  1. 执行以下命令,查看打开文件的描述符列表。

    lsof 2> /dev/null | awk 'NR>1 {++S[$2]} END { for(a in S) {print a,"\t",S[a]}}'| sort -n -k 2| tail -30
  1. 执行以下命令,查看该进程的具体信息。本文以进程ID“24988”为例,具体进程以现场环境为准。

    ps -ef | grep 24988

    系统返回类似如下。

  1. 执行以下命令,查看系统open files的数量限制。

    ulimit -a

    系统返回类似如下。

  1. 通过查看句柄文件发现SSHTunnelClient进程打开的FD过高,超过系统的限制,影响Docker服务正常运行。

检查/tmp目录

执行以下命令,确认在/tmp目录存在大量id_rsa_pub_XXXXXX文件。这些文件就是SSHTunnelClient进程打开的文件。

ls -l /tmp

系统返回类似如下。

3.2. 实施步骤

  1. 下载以下压缩包,解压后上传到问题机器的/opt/clear_tunnel_fd/目录。

    说明:如该目录不存在,则请手动创建。

    clear_fd_linux.zip

  1. 使用root用户登录问题机器,执行以下下命令,切换到clear_tunnel_fd目录。

    cd /opt/clear_tunnel_fd
  1. 执行如下命令,运行clear_fd_linux脚本文件。该脚本文件会修复SSHTunnelClient进程打开文件句柄过多的问题,代码的主要实现逻辑请参见补充说明

    ./clear_fd_linux

    系统返回类似如下。

  1. 执行以下命令,确认SSHTunnelClient进程占有的文件句柄已下降。

    cd /proc; for i in *; do test -d $i/fd && echo $i `ls $i/fd|wc -l`; done | sort -rnk2 | head -10
  1. 执行corntab -e命令,添加以下定时任务,保存并退出。该任务每隔7天进行一次清理操作。

    0 16 */7 * * root /opt/clear_tunnel_fd/clear_fd_linux

3.3. 结果验证

执行如下命令,确认文件句柄数量已下降,且后续没有明显升高。

lsof 2> /dev/null | awk 'NR>1 {++S[$2]} END { for(a in S) {print a,"\t",S[a]}}'| sort -n -k 2| tail -20

说明:建议继续观察2至3天。

4. 回滚方案

删除定时任务 ,后续观察SSHTunnelClient进程号没有变动,则回滚成功。

5. 补充说明

代码的主要实现逻辑如下:

  1. 通过命令获取当前物理机上所有的SSHTunnelClient进程。

  2. 通过命令查找这些进程打开的句柄个数。当句柄个数超过阈值,默认为2000,则会清理/tmp/目录下的id_rsa_pub_XXXXXX文件,并使用kill命令终止出现问题的进程。
  3. 等待五分钟,天基会重新拉起SSHTunnelClient进程。