我怎样才能找出为什么我的应用程序很慢?

时间:2009-03-25 05:14:02

标签: ruby-on-rails performance hosting

我在500 MB Slicehost VPN上部署了一个简单的Rails应用程序。我是唯一一个使用该应用程序的人。当我在笔记本电脑上运行它时,它足够快。但部署的版本非常慢。加载登录屏幕需要6到10秒。

我想知道为什么它这么慢。这是我的代码吗? (不要这么认为,因为它在本地速度要快得多,但也许。)Slicehost的服务器是否过载?是互联网吗?

有人可以提出一种技巧或一系列步骤,以帮助缩小导致此问题的原因吗?


更新

抱歉忘了提及。我使用Phusion Passenger(AKA mod_railsmod_rack)在CentOS 5下运行。

10 个答案:

答案 0 :(得分:5)

如果第一次装载时速度很慢,可能是因为乘客因不活动而导致进程中断。我不记得所有的细节,但我记得读过那些使用过cron作业以保持至少一个进程存活的人,以避免乘客重新加载环境时可能出现的这种延迟。

修改:更多详情here

具体来说 - 池空闲时间默认为2分钟,这意味着在两分钟空转后,乘客必须重新加载环境以服务于下一个请求。

答案 1 :(得分:4)

首先,查看服务器的响应是否特别慢。使用Firefox和Firebug插件查看每个组件(包括JavaScript和图形)下载的时间。假设主页本身就是一直在进行的,您可以开始分析应用程序。你需要找一个好的分析器,因为我实际上并没有使用Ruby on Rails,我不能建议任何:google“profile ruby​​ on rails”的一些选项。

正如YenTheFirst指出的那样,你正在使用的服务器软件和配置可能会导致速度减慢,但A)slicehost不会选择那样,你这样做,因为Slicehost只提供你可以处理的非常原始的服务器“切片”作为专用机器。 B)你不太可能看到一个立即运行的脚本突然耗时6秒,因为它正在以CGI的形式运行。还有其他事情必须继续。检查你正在使用多少RAM:你有没有进行交换?登录是否只是第一次点击指示某些启动问题,或者它总是那么慢?静态内容服务缓慢吗?这往往意味着一些网络问题(无论是在Slicehost端,还是在您的本地网络上)都会减慢速度,假设您没有进行交换。

当你说“足够快”时你会模糊不清:笔记本电脑版本需要1秒才能进入Slicehost 6吗?如果笔记本电脑很不错,那就不足为奇了:毕竟,切片便宜的原因是因为它们只是整个服务器的一小部分。你正在使用Slicehost的8核心机器的1/32,而不是现代笔记本电脑的两个核心。 Slicehost核心很快,但你的笔记本电脑可能是一个尖叫者,相比之下,核心是1/4。 :)

答案 2 :(得分:3)

尝试点缓慢的地方

1 /应用程序很慢,或基础架构(网络+ Web服务器)

  • 在您的网络服务器上放置一个静态文件,并通过浏览器访问

2 /如果速度很快,则可能是应用程序+服务器配置出现问题。

  • 数据库访问速度很慢
  • 尝试使用simpel循环的页面:它是否很慢?

3 /如果它变慢,可能是你的基础设施。你可以查看:

  • 网络连接不良:执行数据包捕获(例如使用Wireshark)并查找重新传输,重复数据包等。
  • DNS解析速度很慢?
  • 服务器配置错误?

答案 3 :(得分:1)

Slicehost使用什么服务呢? 快速选项包括:Mongrel或apache的mod_rails(也称为乘客幻觉或 类似的东西) 这些是运行rails应用程序实例的专用服务器(或服务器插件)。

如果您的主机没有使用它,那么它可能默认为CGI。 Rails附带一个简单的CGI脚本,可以为页面提供服务,但它会为每个页面重新加载应用程序。

(编辑:我怀疑这是最可能的情况,你的应用程序正在运行/webapp_directory/public/dispatch.cgi中的CGI,这可以解释缓慢。这往往是许多人的默认部署主机,因为它不需要额外的配置,但它没有提供良好的性能)

如果你的主机支持“Fast CGI”,rails也支持它。快速CGI会打开一个CGI会话,并保持打开多个页面,这样你可以获得更好的性能,但它不如Mongrel或mod_rails好。

其次,它处于“生产”还是“发展”模式?告诉您的简单方法是转到应用中出错的页面。如果它显示堆栈跟踪,则它处于开发模式,这比生产模式慢。 Mongrel和mod_rails具有启动选项,用于确定是否在生产或开发模式下运行应用程序。

最后,如果您的数据库由于某种原因而变慢,那么这也将是一个很大的瓶颈。如果你在生产模式下有一个良好的部署(Mongrel / mod_rails / etc.),请尝试查看。

答案 4 :(得分:1)

您的数据库中有很多数据吗?我会仔细检查你是否已将所有相应的列编入索引 - 因为这会产生巨大的差异。在本地开发系统上,你的内存可能比500 mb的内存要多得多,如果你有大的非索引表,这会导致数据库运行速度慢很多。您还可以在MySql中运行慢查询记录器,以精确定位没有索引的列。

除此之外,是的 - 如果您最近没有使用过该网站,乘客将需要为您调整流程。如果是这种情况,您应该会看到第二次加载速度显着提高,特别是第三次和以后的页面加载。

答案 5 :(得分:1)

您可能希望运行500 MB的本地虚拟机。你在做很多客户端 - 服务器交互吗? WAN上的延迟很重要

答案 6 :(得分:1)

您可能需要查看RPM(还有免费的“精简”版本)和/或New Relic的Tune Up

答案 7 :(得分:0)

Slicehost使用Xen虚拟化系统保证您的CPU时间,所以不是这样。对不起你的其他答案,对不起!在您尝试访问该页面时,可以在控制台上尝试“顶部”。

答案 8 :(得分:0)

如果您正在使用FireFox并进行localhost测试(或者甚至可能在LAN上),您可能需要尝试编辑network.dns.disableIPv6设置。

在地址栏中键入about:config并过滤network.dns.disableIPv6并双击以设置为true。

此错误主要来自Vista OS,但其他一些也是如此。

答案 9 :(得分:0)

您可以尝试在SSH中运行'top'以查看哪个进程很重。如果您在登录时遇到问题,也许您可​​以尝试在Slicehost管理器中获取统计信息。

如果您发现它是MySQL的错误,请考虑减少它可以产生的服务器数量。

对于Rails应用程序来说,512似乎不错,您可能需要检查是否配置错误。