前言
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在局域网内的响应速度立刻就提升上去了。
分享到:
相关推荐
Webrick rails 外部电脑 访问慢
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服务器工具包,可以...安装将此行添加到应用程序的Gemfile中: gem 'webrick' 然后执行: $ bundle或将其自己安装为: $ gem install webrick用法要创建一个新的WEBrick :: HTTPServer,它
该安装文件为redmine服务所需的组件,redmine使用 webrick 方式登录时,会导致服务器响应速度慢,安装mongrel后可以替换 webrick 登录方式,解决登录慢的问题
-WEBrick / 1.3.1(Ruby / 2.0.0 / 2015-04-13) 在浏览器中重复相同的过程。 -看起来更漂亮2.超文本传输协议 使用HTTPie的“ -v”标志并向“ ”发出请求。 -“ -v”标志输出'verbose'选项,即更多信息,特别是...
机架上的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,参照Rails原始码,省略细节,...
webmachine-Ruby的端口 ,信息被写入在二郎。 这两个项目的目标都是以声明的方式向您的应用程序公开HTTP协议的有趣部分。 这意味着您不必担心直接处理请求所涉及的过程,而可以描述与组成应用程序的资源有关的事实...
如果收到此错误: /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...
大卫 David是具有Rack界面的CoAP服务器,可将与Rack兼容的出色Web框架家族带入物联网。... 例如,如果要启动WEBrick,可以通过执行rails s webrick来启动。 现在,如果您仅在CoAP模式下使用Rails / Davi
版本号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 ...
在macOS上,您可能还需要gem webrick 。 这个怎么运作 由于Github页面不允许使用插件,因此我们必须在部署中使用额外的步骤。 Travis在检查语法错误时,还会将生成的Jekyll构建推回到gh-pages分支。 如果您访问顶部...
幽灵 ...当您看到WEBrick::HTTPServer#start: pid=2 port=3000 ,该应用程序将在 在macOS上本机运行 先决条件 Ruby(当前不适用于v2.4.0) Postgres 影像魔术师 在Mac上,最简单的安装方法是使用ho
Sinatra 实时聊天 一个使用 sinatra 流的小聊天应用程序! 您可以在线试用 你能从这个回购中得到什么 ...瘦(似乎 Webrick 只是无法处理连接) pg(Postgress 数据库访问) 测试: 水豚 恶作剧者 耙 路径 作者
这将在端口3000上启动WEBrick服务器,您无需身份验证即可连接到该服务器。 机架处理器 在机架应用程序内部使用RackDAV非常容易。 一个简单的机架脚本如下所示: require 'rubygems' require 'rack_dav' use Rack::...
特工在,,,或内部运行(也支持webrick进行开发) 安装 将以下行添加到您的Rails项目Gemfile中: gem 'dumper' 如果您的数据库大于300MB,建议还包括aws-sdk-v1 gem,以实现最大的稳定性。 gem 'aws-sdk-v1' ...
结果是在每个请求上干净,在应用程序范围内重新加载所有源文件和模板。 用法 安装: gem install shotgun 使用机架文件启动服务器: shotgun config.ru 使用Thin并从端口6000而不是9393(默认)启动: shotgun...
停车 这个想法很简单:我们将寻找停车位的...>bundle install 创建数据库,将架构加载到当前环境的数据库中,然后填充数据库->rake db:setup 启动一个名为WEBrick的Web服务器,该服务器与ruby捆绑在一起->rails server
没有安装网络服务器,因为在 ruby 世界中我们有 WEBrick。 但是如果你有你的服务器,以 puppet 风格作为服务添加,你可以将它作为 service_to_restart 参数传递进去。 需要安装数据库。 允许将 redmine 主题、...
欢迎使用Rails Lite! 这是Rails的功能轻量级版本。 在根目录中,可以使用ruby new_rails_lite_project.rb后跟项目名称来创建新项目。 这将在projects文件夹中建立一个新...flash.now 默认情况下CSRF保护与Webrick集成