`
skandhas
  • 浏览: 35793 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

WEBrick在局域网内响应慢的解决方案

    博客分类:
  • Ruby
阅读更多

前言

WEBrick是Ruby标准库带的一个HTTP服务器程序库。WEBrick用来支撑小型的网络应用还是能胜任的。最近遇到了WEBrick在局域网内响应慢的问题,经过调查并解决了此问题。下面是详细过程。

 

运行环境

Ruby1.9.2-p0,WinXP(SP3)

 

现象

公司的同事最近用Rails开发了一个日报系统,由于使用人数不多且并发量并不大,打算直接用WEBRick就可以了。结果发现一个现象:WEBrick响应特别慢,一个请求从开始处理到结束,需要差不多30秒的时间,我无语!@#$%^& 。为了将问题简单化,我写了个相当简单的脚本来测试WEBrick:

require 'webrick'

server = WEBrick::HTTPServer.new(
{:Port => 3000, :DocumentRoot => 'C:/webroot'}
)
server.start
 

运行脚本,然后用局域网的其他机器访问这个服务器,症状和上面是一样的。

 

分析

在分析过程中有2个现象:

1.Ruby进程的CPU占用率并不高,说明并不是Ruby在进行大量的运算。
2.客户端的请求到达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在局域网内的响应速度立刻就提升上去了。

 

2
1
分享到:
评论
5 楼 gfdice 2014-06-10  
ruby 1.9.0之后webrick有个选项:DoNotReverseLookup,设置成true就行了,没必要改库文件的代码
4 楼 dorayatou 2013-08-28  
你太厉害了。我按照你的方法已经把问题解决了。佩服啊
3 楼 dorayatou 2013-08-28  
我做的rails应用也是这样,我想问一下,您提到的server.rb文件和httprequest.rb文件在哪里呢?我找不到。非常感谢
2 楼 skandhas 2011-09-20  
乌龙饭 写道
LZ确定peeraddr这个方法可以带参数么?为何1.8.7的ruby会报错误,不接受参数?

文中开头提到过,运行环境是Ruby1.9.2-p0。
至于Ruby1.8.7则没有试过。:>
1 楼 乌龙饭 2011-09-16  
LZ确定peeraddr这个方法可以带参数么?为何1.8.7的ruby会报错误,不接受参数?

相关推荐

    Webrick rails外部电脑访问慢

    通过上述两处简单的代码修改,可以有效地解决Webrick服务器在外部电脑访问时速度过慢的问题。这些修改主要是通过禁用反向DNS查询来实现的,这不仅提高了服务器响应速度,还减少了不必要的网络延迟。对于使用Webrick...

    ruby example webrick

    ruby sample: @echo off cd D:\proj\demo rem previously drop tables call rake db:migrate VERSION=0 rem load test data (it depends on the db:environment and db:...call ruby script/server webrick @echo on

    webrick:HTTP服务器工具包

    韦伯里克WEBrick是一个HTTP服务器工具包,可以...安装将此行添加到应用程序的Gemfile中: gem 'webrick' 然后执行: $ bundle或将其自己安装为: $ gem install webrick用法要创建一个新的WEBrick :: HTTPServer,它

    mongel for linux安装

    本篇将详细介绍如何在Linux系统上安装MongoDB,以解决Redmine服务在使用Webrick方式登录时响应速度慢的问题。 首先,我们需要了解为什么Redmine登录慢。Redmine是一款开源项目管理工具,其内置的Webrick服务器在...

    rack教程(ruby)

    中间件是在Rack应用请求/响应链中的可选组件,它们可以在请求到达目标应用之前或响应离开应用之后添加额外的处理逻辑。一个简单的中间件示例如下: ```ruby class MyMiddleware def initialize(app) @app = app ...

    Ruby-Hobbit构建在Rack之上的一个简约微框架

    Rails提供了许多开箱即用的功能,如ORM(对象关系映射)、数据库迁移、强大的路由系统和丰富的社区支持,而Hobbit则鼓励开发者自己选择需要的组件,从而实现更加定制化的解决方案。 **总结** Ruby-Hobbit是一个...

    linux下redmine安装笔记

    通过运行`ruby script/server webrick -e production`启动内置的Webrick服务器,这将使Redmine在本地3000端口上可用。在浏览器中访问`http://localhost:3000`,如果一切配置正确,你应该能够正常访问Redmine界面。 ...

    simple_server:第三阶段-简单的HTTP服务器

    在Ruby中,我们可以利用其内置的`WEBrick`库或者其他第三方库如`Sinatra`或`Rack`来创建服务器。 首先,我们需要了解Ruby的基础语法和控制结构,这是编写任何程序的基石。Ruby是一种动态类型语言,语法简洁,易于...

    Ruby-rubyserver标准文件协议的生产就绪实现

    "Ruby-rubyserver标准文件协议的生产就绪实现" 提到的是一个专门针对Ruby实现的、遵循标准文件协议的服务器解决方案,适用于生产环境。这种实现确保了在高并发和稳定性的需求下,服务器依然能高效、可靠地运行。 1....

    WebServer_v19_HTTP_wevl3_web_server服务器源码_

    当服务器接收到新的客户端连接时,它会在后台启动一个新的线程来处理这个连接,从而避免阻塞其他客户端的请求。这种并发处理机制允许服务器高效地处理大量并发请求,提升服务的响应速度。 此外,聊天记录的共享功能...

    ROR 学习笔记系列一 Windows XP下环境安装配置(2)

    在这种情况下,查阅官方文档、社区论坛或Stack Overflow等资源,通常可以找到解决方案。 最后,记得定期更新Ruby、Rails和其他依赖,以保持最佳的稳定性和安全性。通过`gem update --system`更新Gem,`gem update ...

    ruby on rails 笔记(陈刚)

    在项目根目录(`D:\work\demo`)下,执行`ruby script/server`启动内置的WEBrick服务器。默认情况下,服务器将在本地3000端口运行,访问地址为`http://localhost:3000`。 ### Rails的MVC架构 Rails采用了经典的Model...

    http_server_implementations

    HTTP服务器是互联网上网站和应用程序的基础,它们负责接收客户端(如浏览器)的HTTP请求,并返回相应的HTTP响应。Ruby作为一种动态、面向对象的编程语言,提供了多种实现HTTP服务器的方式。 在Ruby中,你可以使用...

    redmine的安装文档

    Redmine是一个自由开放源码的解决方案,集成了项目管理、问题追踪,并且兼容多种版本控制系统。 在Windows环境下安装Redmine-0.9.x的过程如下: 1. 首先,你需要为DOS环境添加Ruby运行环境。可以从指定网址下载`...

    three.js中文文档学习之如何本地运行详解

    为了克服这个问题,有两种主要解决方案: 1. 修改浏览器的安全设置以允许本地文件访问。例如,在Safari中,可以通过“高级”设置启用开发者菜单,然后停用本地文件限制。然而,这可能会增加浏览器的安全风险,因此...

    Ruby编写Puma Web服务器 v6.4.2

    这种设计使得Puma在处理I/O密集型任务时,能够充分利用多核处理器的优势,提高服务响应速度。Puma的工作进程之间是相互独立的,可以有效避免单一进程崩溃导致整个服务器停机的风险。 Puma的启动和管理非常方便。你...

    RailsWithApacheAndMongrel.pdf

    此外,通过使用反向代理技术,可以灵活地调整应用的部署位置和结构,为大型项目的部署提供了一种可行的解决方案。 #### 致谢 文档最后提到了致谢部分,感谢所有为这个项目做出贡献的人。 #### 附录 文档还包括了...

    RailsLite:围绕Rack构建的基本的类似Rails的框架

    同时,你也可以实现自己的模型来处理数据操作,这可能会基于ActiveRecord,或者是一个更简单的ORM(对象关系映射)解决方案。视图部分则负责渲染输出,可以使用ERB(Embedded Ruby)模板或者其他模板引擎。 关于...

Global site tag (gtag.js) - Google Analytics