今天发现了一个超大文件传输,会引起ftp不响应的问题。
软件的工作场景是这样的。目标机上有大约几十个文件,并且启动了ftp服务,客户端软件通过ftp协议,将目标机上的文件拷贝到本地。
为了提高软件下载文件的效率,客户端软件采用了多线程并发机制,针对目标机上每个文件,都建立一个ftp连接。文件下载完成后,即关闭连接。
最近在测试的过程中发现,在文件下载过程中,经常会出现ftp连接响应超时的问题。这个问题十多秒,又会恢复正常。过一会儿又出现这个问题。
今天经过排查,找到了问题的原因。如果目标机上的各个文件都不大,通过ftp传输能在很短的时间内完成的话,那么整个下载过程就会比较顺畅。
但如果其中某个文件很大,例如几百M到上G,就会出现整个下载过程时断时续的问题。他的原因在于,下载那个非常大的文件的时候,会占用目标机很多的CPU时间,让CPU无法响应别的ftp连接,从而导致别的ftp连接出现超时的问题。
从对这个问题的排查过程中,我得到两个收获。
第一,超大文件的对外传输,会占用本机过多的CPU时间,从而导致本机无法响应外界的其他请求。当然这个问题更可能在处理器性能极低,和核数极少的情况下出现,比如龙芯处理器。
第二,排查问题的过程,要关注变化。从刚开始的运行良好,到现在的运行总是出问题,之间肯定发生了某些技术状态变化。要特别关注技术状态变化是不是会引起问题的发生。
拿这次问题排查的过程来看,从去年上一个状态,软件能够运行良好,到今年的时候,软件运行很容易就出现问题,排查问题的时候,也对这其中的变化作了梳理,但是就是没有能够识别出,目标机上某个文件变大这个情况。就更不会意识到,文件变大,会引起这个问题的发生。
所以仅仅知道在排查问题的时候要关注前后的变化,其实是不够的。在碰到具体问题的时候,想要做到这一点还是比较困难。所以除了有理论指导之外,在问题排查的时候,要有具体问题具体分析的能力,而这个能力,可能需要在长期实践中锻炼提高。