WebRick局域网慢的解决办法

经过跟踪和分析源码,发现在某些局域网环境中,套接字的peeraddr 方法会相当耗时 如同阻塞一样,大约15秒左右。WEBRick代码中调用 peeraddr的有两处,这样看来,30秒的时间基本就花在这两次调用上了。再进一步分析发现: peeraddr真正慢的地方是在内部获取 客户端名称(即域名)的时候。


WEBRick调用peeraddr方法的两处地方:
第一处:
文件:server.rb 文件
方法:GenericServer#start_thread
代码:addr = sock.peeraddr


第二处:
文件:httprequest.rb
方法:HTTPRequest#parse
代码:@peeraddr = socket.respond_to?(:peeraddr) ? socket.peeraddr : []

解决方案

知道了原因,修改方法就简单了。其实,peeraddr是可以带参数的,如果传入:numeric,则peeraddr方法就不会去获取客户端名称,而是直接用客户端IP字符串来代替客户端名称。在实际应用中,对服务器来说,客户端名称并不是十分重要,客户端IP才是重要的。具体修改如下:
第一处修改:
文件:server.rb 文件
方法:GenericServer#start_thread
修改:
addr = sock.peeraddr

改为:

addr = sock.peeraddr(:numeric)

第二处修改:
文件:httprequest.rb
方法:HTTPRequest#parse
修改:
@peeraddr = socket.respond_to?(:peeraddr) ? socket.peeraddr : []
改为:

@peeraddr = socket.respond_to?(:peeraddr) ? socket.peeraddr(:numeric) : []

结果

修改完之后,WEBrick在局域网内的响应速度立刻就提升上去了。

你可能感兴趣的:(Ruby,WebRick)