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

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

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

有人可以建议我可以采取的一种技巧或一系列步骤来帮助缩小这个问题的原因吗?


更新:

对不起忘了提。 我使用Phusion Passenger(AKA mod_railsmod_rack )在CentOS 5下运行它。

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

编辑: 这里有更多细节

具体而言 – 池空闲时间默认为2分钟,这意味着在两分钟空闲后,乘客将不得不重新加载环境以服务于下一个请求。

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

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

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

尝试点缓慢的地方

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

  • 将静态文件放在Web服务器上,然后通过浏览器访问它

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

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

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

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

什么是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.),请尝试查看。

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

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

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

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

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

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

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

这个bug主要来自Vista OS,但其他一些也是如此。

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

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

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