`
skandhas
  • 浏览: 34959 次
  • 性别: 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 rails 外部电脑 访问慢

    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安装

    该安装文件为redmine服务所需的组件,redmine使用 webrick 方式登录时,会导致服务器响应速度慢,安装mongrel后可以替换 webrick 登录方式,解决登录慢的问题

    battles-flora-jack:第三周下午挑战-星期一

    -WEBrick / 1.3.1(Ruby / 2.0.0 / 2015-04-13) 在浏览器中重复相同的过程。 -看起来更漂亮2.超文本传输​​协议 使用HTTPie的“ -v”标志并向“ ”发出请求。 -“ -v”标志输出'verbose'选项,即更多信息,特别是...

    grape-on-rack:安装在RACK上的演示Grape API

    机架上的Grape API 安装在机架上的 API。 :一个返回JSON文档的世界示例 :一个简单的POST和PUT示例 :...跑$ bundle install$ rackupLoading NewRelic in developer mode ...[2013-06-20 08:57:58] INFO WEBrick 1.3

    mini-rails:仅有600行代码的精简版Rails,可作为学习Rails原始码的向导-代

    但二进制文件太多,核心代码都没没在大量细节实现中,全部看完不现实,走马观花又很难领会精髓;纸上得来终觉浅,眼过千遍,不如手过一遍,干脆重新造个轮子;于是就有了mini-rails,参照Rails原始码,省略细节,...

    webmachine-ruby:Webmachine,HTTP工具包(在Ruby中)

    webmachine-Ruby的端口 ,信息被写入在二郎。 这两个项目的目标都是以声明的方式向您的应用程序公开HTTP协议的有趣部分。 这意味着您不必担心直接处理请求所涉及的过程,而可以描述与组成应用程序的资源有关的事实...

    evanknapke.github.io

    如果收到此错误: /jekyll/commands/serve/servlet.rb:3:in 'require': cannot load such file -- webrick (LoadError) :3: /jekyll/commands/serve/servlet.rb:3:in 'require': cannot load such file -- webrick...

    大卫:具有Rack界面的CoAP服务器

    大卫 David是具有Rack界面的CoAP服务器,可将与Rack兼容的出色Web框架家族带入物联网。... 例如,如果要启动WEBrick,可以通过执行rails s webrick来启动。 现在,如果您仅在CoAP模式下使用Rails / Davi

    blockchain-ruby:Ruby中的简单区块链

    版本号Ruby 2.5.0跑步安装宝石$ bundle install 跑步$ bundle exec ruby blockchain.rb[2018-01-09 21:49:25] INFO WEBrick 1.4.2[2018-01-09 21:49:25] INFO ruby 2.5.0 (2017-12-25) [x86_64-darwin16]== Sinatra ...

    iesdp:导入历史记录的IESDP的Jekyllized版本

    在macOS上,您可能还需要gem webrick 。 这个怎么运作 由于Github页面不允许使用插件,因此我们必须在部署中使用额外的步骤。 Travis在检查语法错误时,还会将生成的Jekyll构建推回到gh-pages分支。 如果您访问顶部...

    spectre:一个用于浏览和检查差异的简单UI,以及用于运行脚本的API,用于将屏幕截图提交到实时屏幕并接收通过或失败。 (与幽灵,逆止器,Selenium等一起使用)

    幽灵 ...当您看到WEBrick::HTTPServer#start: pid=2 port=3000 ,该应用程序将在 在macOS上本机运行 先决条件 Ruby(当前不适用于v2.4.0) Postgres 影像魔术师 在Mac上,最简单的安装方法是使用ho

    sinatra_realtime_chat:使用 sinatra 流的实时聊天

    Sinatra 实时聊天 一个使用 sinatra 流的小聊天应用程序! 您可以在线试用 你能从这个回购中得到什么 ...瘦(似乎 Webrick 只是无法处理连接) pg(Postgress 数据库访问) 测试: 水豚 恶作剧者 耙 路径 作者

    rack_dav:机架的WEBDAV处理程序

    这将在端口3000上启动WEBrick服务器,您无需身份验证即可连接到该服务器。 机架处理器 在机架应用程序内部使用RackDAV非常容易。 一个简单的机架脚本如下所示: require 'rubygems' require 'rack_dav' use Rack::...

    dumper:Dumper.io Rails代理

    特工在,,,或内部运行(也支持webrick进行开发) 安装 将以下行添加到您的Rails项目Gemfile中: gem 'dumper' 如果您的数据库大于300MB,建议还包括aws-sdk-v1 gem,以实现最大的稳定性。 gem 'aws-sdk-v1' ...

    Shotgun:重新加载机架开发服务器的Rackup版本

    结果是在每个请求上干净,在应用程序范围内重新加载所有源文件和模板。 用法 安装: gem install shotgun 使用机架文件启动服务器: shotgun config.ru 使用Thin并从端口6000而不是9393(默认)启动: shotgun...

    parkyourcar:停放我的车

    停车 这个想法很简单:我们将寻找停车位的...>bundle install 创建数据库,将架构加载到当前环境的数据库中,然后填充数据库->rake db:setup 启动一个名为WEBrick的Web服务器,该服务器与ruby捆绑在一起->rails server

    puppet-module-redmine:在远程节点上安装 redmine 和所有依赖项

    没有安装网络服务器,因为在 ruby​​ 世界中我们有 WEBrick。 但是如果你有你的服务器,以 puppet 风格作为服务添加,你可以将它作为 service_to_restart 参数传递进去。 需要安装数据库。 允许将 redmine 主题、...

    rails-lite:轻巧的Rails-带有示例应用

    欢迎使用Rails Lite! 这是Rails的功能轻量级版本。 在根目录中,可以使用ruby new_rails_lite_project.rb后跟项目名称来创建新项目。 这将在projects文件夹中建立一个新...flash.now 默认情况下CSRF保护与Webrick集成

Global site tag (gtag.js) - Google Analytics