浏览 968 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2007-07-17
我写了一个FTP程序,用来下载服务器上的文件,在本地测试,三台机器上的表现都很正常,但是移到服务器上以后(投入使用),下载暴慢,百思不得其解。
使用场景: 主服务器提供WEB服务,装FTP SERVER,备份服务器装我的程序,每天定时通过FTP下载更新的文件。 单独测试ruby的执行速度,执行: 5000.times do | i | print i, ' ' end 在本本上是1.08秒,在备份服务器上是0.8秒。说明服务器本身执行ruby程序并没有问题。 在: ftp.getbinaryfile(remote_filename, local_filename, 1024) 这条语句前后加: puts Time.now 发现执行这条指令,下个30、50K的文件也要14秒! 开始还怀疑是FTP SERVER的问题,但是用FTP命令上去试了一下,速度还是很快的(0.0xxx秒),把IIS的FTP换成SERVU情况也一样。所以应该可以排除是FTP SERVER的问题。 如果这个FTP库有问题,那为什么只在这个服务器上才暴露出来? 如果不是FTP库的问题,那是什么问题呢? 费解。 注:备份服务器没有装防火墙和杀毒软件。 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2007-07-17
贴一下你的FTP程序大家看看吧
|
|
| 返回顶楼 | |
|
时间:2007-07-17
贴主要的部分吧:
require 'net/ftp'
require 'ftools'
......
def download_files(ftp, mdir, ldir, full_mode, list_mode)
files = ftp.ls(mdir + '*')
files.map {| file |
begin
if (!is_dir(file, list_mode))
remote_filename = mdir + get_filename(file, list_mode)
local_filename = ldir + remote_filename
local_dir = ldir + mdir
if (full_mode)
puts "#{remote_filename} -> #{local_filename}"
create_dir(local_dir)
ftp.getbinaryfile(remote_filename, local_filename, 1024)
else
mt = ftp.mtime(remote_filename, true)
lt = get_filetime(local_filename)
(
(!lt)?(puts "#{remote_filename} -> #{local_filename}"):(puts "#{remote_filename} (#{mt}) -> #{local_filename} (#{lt})")
create_dir(local_dir)
ftp.getbinaryfile(remote_filename, local_filename, 1024)
) if (!lt || (mt > lt))
end
else
remote_dirname = get_filename(file, list_mode)
download_files(ftp, (mdir + remote_dirname + '/'), ldir, full_mode, list_mode) if (!['.', '..'].include?(remote_dirname))
end
end
}
end
......
ftp = Net::FTP.new()
ftp.connect(ftp_host, ftp_port)
ftp.login(ftp_user, ftp_pass)
ftp.passive = passive_mode
download_files(ftp, ftp_root, local_root, full_mode, list_mode)
ftp.close
|
|
| 返回顶楼 | |
|
时间:2007-07-19
google ftp ruby slow:
似乎是做了太多的reverse DNS lookup 需要: BasicSocket.do_not_reverse_lookup = true |
|
| 返回顶楼 | |





