解决ftp大文件上传超时

        现网最近出了一个问题,有个定时任务专门处理视频文件的上传下载、在任务表发现有个任务已经执行了一天了,一直都没有结束。

        特意观察了下,发现任务状态一直都是卡在处理中。试着把状态改成待处理,重点观察,发现一个小时左右基本上下载全了视频文件,这个文件有3.6g左右,但是下载完后按理说任务状态应该变成已完成,结果没有。看了下debug日志,发现ftp read timed out了。


解决ftp大文件上传超时_第1张图片

         一般ftp超时可能跟代码里设置的connectTimeout、dataTimeout有关但是我看代码设置的这两个没有任何影响。

心里在想为什么就这个文件一直超时,想想该怎么排查这个问题:

            第一步:比对了下这个视频文件跟其他文件大小的区别。只有该文件达到了3.6g,其他都不超过2g。

            第二步:手动下载视频文件,发现视频下载速度达到了100m/s,而应用里的定时任务下载却只有1M/s。这一点完全可以作为切入点。

            第三步:排除会不会还有其他超时时间,比如ftp服务器那边是否会设置超时。

我们的服务器到FTP服务器网络路径:

        我们的服务器--->交换机--->H3C防火墙--->交换机--->华为E8000E防火墙--->交换机--->FTP服务器

交换机:不存在连接超时问题

H3C防火墙 : 默认FTP超时时间3600秒

华为E8000E : 默认FTP超时600秒(指数据通道的超时时间)     

那现在结果就很明显了,是在H3C防火墙上面超时了,需要解决的是下载速度。

        我们用的是ftpClient,查看了下资料,发现ftpClient上有这么一个方法:setBufferSize(int size)。该方法是设置每次读取文件流时缓存数组的大小。上传或者下载都是先将文件流拿到,然后将文件流一点一点的读到缓存,然后程序在从缓存将所需的内容读取出来放进要导入的文件中。一般情况下基本都是1024或者是1024的倍数。对于小文件上传下载的话没有必要管,直接1024就没有问题。

        而ftpClient默认就是1024,对于我们当前大文件的上传下载,又刚好拥有大带宽的人来说,1024实在太小,马上把缓冲区的大小改大了,改成了ftpClient.setBufferSize(1024 * 1024 * 10)。测试环境一试,效率提升了好几倍,但是因为测试环境带宽原因,还是得到现网才看出效果。补丁上线后一观察,3.6g的文件之前下载需要1小时,现在只需要不到1分钟。效率提升了N倍。至此,问题解决。

           

你可能感兴趣的:(解决ftp大文件上传超时)