前一段用ruby on rails完成了一个应用,放在一台教育网内的服务器上。在校内测试感觉速度还可以,但是从网通(学校的部分宿舍是网通的网络)访问就一直速度奇慢,于是开始了调试速度的征程。最开始的时候应用跑在WebBrick服务器上,我也知道,WebBrick是一个开发测试用的服务器,ruby写的,在一个时刻只能响应一个请求,其他请求都要靠边站,但是想想应用的使用人员也不多,不会达到高并发的情况,于是就一直用它。从校内访问速度基本没感觉,但是从网通访问速度就巨慢无比,但是同一台机器上tomcat上的应用访问就比较快。感觉可能是ruby解释执行的速度确实比较慢[不是说多页面的问题,而是访问一个页面用的时间更长一些的问题,但是也可能是页面体积较大的问题,存疑]。
于是开始折腾,翻遍了cnrails上关于服务器性能的帖子,开始对各个服务器的性能有了一个大概的了解。总的来说,如下图所示:
很faint的是,lighttpd、nginx根本就不是为windows平台设计的,所以配置起来很麻烦,而且据说跑起来比较容易崩溃,而服务器是装的windows 2003 server,而且据说Apache+fastcgi也容易崩掉,所以就选择用mongrel了。比较庆幸的是,InstantRails1.4里面自带了mongrel,而且配置相当简单。主要就是把Apache 2.2.3里面的一些模块加上,然后在httpd.conf里面写下这么一段(具体配置可能不同,反正在我的机器上ProxyPreserveHost不好用):
<VirtualHost *:80>
ServerName myapp.com
ServerAlias www.myapp.com
ProxyPass / http://www.myapp.com:8000/
ProxyPassReverse / http://www.myapp.com:8000
ProxyPreserveHost on
</VirtualHost>
也就是把访问apache 80端口的访问都转发到8000的mongrel上去,至于端口想怎么映射就看自己了。
接下来用jmeter进行测试,果然是很棒的工具,虽然俺还用的不熟。
不用Apache转发,只用mongrel响应的时候,吞吐量也就300/sec左右,达不到上面那张图的速度。
上面这张图设的是10个并发(不知道这么测对不对:P),可以看到,平均的连接时间在2000左右。
配置为apache转发之后,性能并没有什么太大的提升,吞吐量还是那个样子,看来在一个mongrel的时候,用apache转发也不是什么银弹,但是从网通访问的速度好像快一些了。
当我把并发调成20个,平均的响应时间就翻了一倍,到50的时候性能就不可忍受了。看来mongrel他本身和WebBrick也差不太远。但是如果用集群可能就要好一些。
而在同一台服务器上面的tomcat,在200并发的时候才达到2000左右,吞吐量在3000左右,性能不可相提并论。。。。。。