论坛首页 Ruby版 ruby

ruby Ftp库的奇怪效率问题

浏览 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库的问题,那是什么问题呢?

费解。

注:备份服务器没有装防火墙和杀毒软件。
   
时间:2007-07-17
贴一下你的FTP程序大家看看吧
   
0 请登录后投票
时间: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

   
0 请登录后投票
时间:2007-07-19
google ftp ruby slow:
似乎是做了太多的reverse DNS lookup

需要:
BasicSocket.do_not_reverse_lookup = true
   
0 请登录后投票
论坛首页 Ruby版 ruby

跳转论坛: