免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4412 | 回复: 5
打印 上一主题 下一主题

WEBrick在局域网内响应慢的解决方案 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-04 15:02 |只看该作者 |倒序浏览
本帖最后由 中关村村草 于 2011-01-06 11:15 编辑

转:skandhas

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



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

运行环境
Ruby1.9.2-p0,WinXP(SP3)

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

Ruby代码
  1. require 'webrick'  
  2.   
  3. server = WEBrick::HTTPServer.new(   
  4. {:Port => 3000, :DocumentRoot => 'C:/webroot'}   
  5. )   
  6. 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在局域网内的响应速度立刻就提升上去了。

论坛徽章:
0
2 [报告]
发表于 2011-01-05 08:37 |只看该作者

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
3 [报告]
发表于 2011-01-05 10:21 |只看该作者
被抓了

论坛徽章:
0
4 [报告]
发表于 2011-01-10 10:35 |只看该作者
回复 3# zhlong8


    卧底?

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
5 [报告]
发表于 2011-01-10 11:05 |只看该作者
回复  zhlong8


    卧底?
中关村村草 发表于 2011-01-10 10:35



    ……你转贴没注明出处,被人发现啦

论坛徽章:
0
6 [报告]
发表于 2011-01-10 14:22 |只看该作者
……你转贴没注明出处,被人发现啦
zhlong8 发表于 2011-01-10 11:05



    不好意思,回复错了!呵呵,我左上角注明转了啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP