本文主要介绍专有云V3环境SSHTunnelClient进程打开文件句柄过多的处理方法。
专有云V3,容器服务
说明:适用于专有云V3.0~V3.7,包含V3.7.X。
清理SSHTunnelClient进程打开的文件句柄,正常执行操作无风险。
本方案只能暂时解决问题,后期仍会复发。若需彻底解决,请将专有云升级到V3.8.0或以上版本。
在专有云V3环境部分项目中,Docker宿主机执行docker命令无响应。在日志文件/var/log/docker
中存在大量too many open file
错误,影响容器中业务的正常运行。
使用root用户登录问题宿主机。
执行以下命令,根据打开文件句柄的数量排序,获得排名前10的进程。
cd /proc; for i in *; do test -d $i/fd && echo $i `ls $i/fd|wc -l`; done | sort -rnk2 | head -10
系统返回类似如下,输出结果左边为进程号,右边为打开的文件句柄数。
执行以下命令,查看打开文件的描述符列表。
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
执行以下命令,查看该进程的具体信息。本文以进程ID“24988”为例,具体进程以现场环境为准。
ps -ef | grep 24988
系统返回类似如下。
执行以下命令,查看系统open files
的数量限制。
ulimit -a
系统返回类似如下。
通过查看句柄文件发现SSHTunnelClient进程打开的FD过高,超过系统的限制,影响Docker服务正常运行。
执行以下命令,确认在/tmp
目录存在大量id_rsa_pub_XXXXXX
文件。这些文件就是SSHTunnelClient进程打开的文件。
ls -l /tmp
系统返回类似如下。
下载以下压缩包,解压后上传到问题机器的/opt/clear_tunnel_fd/
目录。
说明:如该目录不存在,则请手动创建。
使用root用户登录问题机器,执行以下下命令,切换到clear_tunnel_fd目录。
cd /opt/clear_tunnel_fd
执行如下命令,运行clear_fd_linux脚本文件。该脚本文件会修复SSHTunnelClient进程打开文件句柄过多的问题,代码的主要实现逻辑请参见补充说明。
./clear_fd_linux
系统返回类似如下。
执行以下命令,确认SSHTunnelClient进程占有的文件句柄已下降。
cd /proc; for i in *; do test -d $i/fd && echo $i `ls $i/fd|wc -l`; done | sort -rnk2 | head -10
执行corntab -e
命令,添加以下定时任务,保存并退出。该任务每隔7天进行一次清理操作。
0 16 */7 * * root /opt/clear_tunnel_fd/clear_fd_linux
执行如下命令,确认文件句柄数量已下降,且后续没有明显升高。
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天。
删除定时任务 ,后续观察SSHTunnelClient进程号没有变动,则回滚成功。
代码的主要实现逻辑如下:
通过命令获取当前物理机上所有的SSHTunnelClient进程。
2000
,则会清理/tmp/
目录下的id_rsa_pub_XXXXXX
文件,并使用kill
命令终止出现问题的进程。
在文档使用中是否遇到以下问题
更多建议
匿名提交