由于近期不断收到告警邮件,提示某服务器的内存使用率已经超过90%,便去查看zabbix监控,通过监控图,发现内存使用率是呈上涨趋势的,如此下去,内存枯竭是必然的事。并且,这种持续上涨的问题,增加内存并不是根本的解决方法,于是,就有了下面的探索之旅。 监控如图所示:
首先,登录服务器,使用 “top” 命令查看当前较为占用内存的进程,发现排在前十的进程所占用的总内存也只有50%左右。于是,又通过 “ps aux” 命令查看所有进程,发现存在大量重复的进程,就是ftp进程,统计了一下,大约有3000多条,我想,这应该就是导致内存使用率持续升高的原因了。
ftp是由crontab定时运行的,每15分钟执行一次传输任务,所以会产生这么多进程也不奇怪。问题是,为什么传输完成后进程也不会结束呢?难道ftp会话一直没有关闭吗?于是,手动执行ftp传输脚本,使用调试模式进行观察,发现脚本运行过程中果然出现问题了 "passive mode refused" 。
问题截图如下:
先使用如下命令把有关ftp的进程全部杀掉,然后观察内存使用情况,发现内存使用率马上就降下来了:
for i in ps aux |grep "ftp -n" |grep -v grep |awk '{ print $2 }'; do kill -9 $i;done
现在要解决的问题就是怎么才能让ftp进程在传输完成后正常结束,再次模拟了一下,确认了问题点:
问题提示为"passive mode refused",ftp分为两种传输模式,主动模式和被动模式,ftp默认使用被动模式。联想到前段时间ftp服务端做了严格的端口访问限制,应该是只放通了21端口。因为ftp被动模式需要服务端也提供一个随机端口给客户端访问,用以数据传输,所以现在ftp可以建立连接,但是不能进行数据传输。既然如此,将被动模式改为主动模式试一下:
脚本执行过程中,提示ftp被动模式关闭,然后文件能正常传输,在整个脚本执行完后,再查看进程,没有发现残留的ftp进程。如此,也可以推断,ftp服务端是开启了20和21端口给客户端服务器访问。 至此,问题解决,后续将持续观察。