Ruby Net/HTTP 打开连接非常缓慢

6

当我在开发中使用net/http时,它非常缓慢。我安装了net-http-spy gem来获取有关每个请求的一些信息,并发现“打开连接”部分需要最长时间(超过10秒)。此外,它不保持连接活动状态,因此需要在每个请求上重新打开连接。

opening connection to maps.google.com...
# ~10 seconds
opened

有没有什么方法可以通过设置一些默认值来改善net/http库的性能?我不想修改请求本身,而是希望全局修复问题。我在当前项目中使用geokit gem,并且无法更改其内部处理请求的方式,除了知道它正在使用net/http之外,在生产环境(Heroku)中运行良好,但在开发环境中极其缓慢。
我在Mac OS X Lion上使用ruby 1.9.2-p290。 Ruby已使用rbenv安装和管理。
以下是示例代码:
require 'net/http'
require 'uri'

time = Time.now.to_i
uri = URI.parse("http://maps.google.com/maps/geo?q=Chicago&output=xml&oe=utf-8")

Net::HTTP.get(uri)
puts (Time.now.to_i - time)

Net::HTTP.get(uri)
puts (Time.now.to_i - time)

无论我放入什么URL,每个请求总是需要精确的10秒钟。


如果没有代码可供查看,我们无法帮助诊断代码问题。Net::HTTP通常不需要十秒钟才能打开连接,除非机器负载过高,或者您要连接的主机响应速度非常慢。 - the Tin Man
我已经添加了示例代码。无论我请求什么远程URL或者机器是否过载,每个请求总是需要确切的10秒钟。这真的很奇怪。 - Milovan Zogovic
2
尝试使用IP地址而不是名称。如果问题消失,则可能存在DNS服务器问题。 - Ineu
谢谢 @Ineu!就是这个问题。我切换到了Google公共DNS,现在它运行得像魅力一样! - Milovan Zogovic
3个回答

34

虽然这个问题旧,但我最近也遇到了同样的问题。

似乎是由于某些版本的libc解析DNS路由时出现了问题。经过几个小时的搜索,你只需在代码开头添加require 'resolv-replace'即可解决。

更多信息: https://github.com/ruby/ruby/pull/597#issuecomment-40507119

希望这能帮助未来的某个人。


2

这是一个与DNS服务器有关的问题。我们将其切换到谷歌公共DNS(8.8.8.8、8.8.4.4)。感谢@Ineu。


-1

最终解决我的问题的方法是禁用防病毒软件。我使用的是诺顿安全软件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接