如何找出我的应用程序运行缓慢的原因?
Posted
技术标签:
【中文标题】如何找出我的应用程序运行缓慢的原因?【英文标题】:How can I find out why my app is slow? 【发布时间】:2010-10-15 09:12:28 【问题描述】:我有一个简单的 Rails 应用程序部署在 500 MB Slicehost *** 上。我是唯一一个使用该应用程序的人。当我在笔记本电脑上运行它时,它已经足够快了。但是部署的版本非常慢。加载登录屏幕需要 6 到 10 秒。
我想知道它为什么这么慢。是我的代码吗? (不要这么认为,因为它在本地要快得多,但也许。)是 Slicehost 的服务器过载了吗?是互联网吗?
有人可以建议我可以采取的一种技术或一组步骤来帮助缩小此问题的原因吗?
更新:
抱歉忘了提。我正在使用 Phusion Passenger(AKA mod_rails
或 mod_rack
)在 CentOS 5 下运行它。
【问题讨论】:
贴上相关代码才有意义。例如。您的应用程序控制器、您正在谈论的需要 6 到 10 秒才能加载的控制器、您的 environment.rb 等等。 【参考方案1】:您可以尝试在 SSH 进入时运行“top”以查看哪个进程很重。如果您在登录时也遇到问题,也许您可以尝试在 Slicehost 管理器中获取统计信息。
如果您发现这是 mysql 的问题,请考虑减少它可以生成的服务器数量。
512 看起来很适合 Rails 应用程序,您可能还需要检查您是否也配置错误。
【讨论】:
【参考方案2】:如果您正在使用 FireFox 并进行 localhost 测试(或者甚至在 LAN 上),您可能需要尝试编辑 network.dns.disableIPv6 设置。
在地址栏中输入 about:config 并过滤 network.dns.disableIPv6 并双击设置为 true。
这个错误主要来自 Vista 操作系统,但也有一些其他的。
【讨论】:
【参考方案3】:您可能想查看RPM(也有免费的“精简版”版本)和/或New Relic 的Tune Up。
【讨论】:
【参考方案4】:试着找出慢的地方
1/ 应用程序很慢,或者基础设施(网络 + Web 服务器)
在您的网络服务器上放置一个静态文件,然后通过您的浏览器访问它2/如果很快,很可能是应用+服务器配置有问题。
数据库访问很慢 尝试使用简单循环的页面:速度慢吗?3/ 如果速度很慢,则可能是您的基础架构。您可以检查:
网络连接不良:进行数据包捕获(例如使用 Wireshark)并查找重传、重复数据包等。 DNS 解析很慢? 服务器配置错误? 等【讨论】:
【参考方案5】:您可能希望运行 500 MB 的本地虚拟机。您是否进行了大量的客户端-服务器交互? WAN 上的延迟很严重
【讨论】:
【参考方案6】:您的数据库中是否有大量数据?我会仔细检查您是否为所有适当的列编制了索引——因为这会产生巨大的影响。在您的本地开发系统上,您的内存可能比 500 mb 切片上的内存要多得多,如果您有大的、未编制索引的表,这将导致数据库运行速度变慢。您还可以在 MySql 中运行慢查询记录器来查明没有索引的列。
除此之外,是的,如果您最近没有使用该网站,乘客将需要为您准备一个流程。如果是这种情况,您应该会看到第二次页面加载速度显着提高,尤其是第三次及以后的页面加载速度。
【讨论】:
【参考方案7】:如果在您第一次加载时它只是很慢,可能是因为乘客由于不活动而杀死了该进程。我不记得所有细节,但我记得读过一些人使用 cron 作业来保持至少一个进程处于活动状态,以避免乘客需要重新加载环境时可能发生的这种滞后。
编辑:更多细节here
特别 - 池空闲时间默认为 2 分钟,这意味着在空闲两分钟后,乘客必须重新加载环境以服务下一个请求。
【讨论】:
【参考方案8】:首先,确定服务器的响应是否特别慢。使用 Firefox 和 Firebug 插件查看每个组件(包括 javascript 和图形)下载所需的时间。假设主页本身一直在占用,您可以开始分析应用程序。你需要找到一个好的分析器,因为我实际上并没有在 Ruby on Rails 中工作,所以我不能提出任何建议:google "profile ruby on rails" 以获得一些选项。
正如 YenTheFirst 指出的那样,您使用的服务器软件和配置可能会导致速度变慢,但是 A) slicehost 不会选择,您会这样做,因为 Slicehost 只提供您可以处理的非常原始的服务器“切片”作为专用机器。 B) 您不太可能仅仅因为它作为 CGI 运行而看到一个立即运行的脚本突然需要 6 秒。一定有别的事情发生。检查你使用了多少内存:你进入交换了吗?登录是不是只有在第一次被击中时才会出现启动问题,还是总是那么慢?静态内容服务慢吗?这往往意味着某些网络问题(在 Slicehost 端或您的本地网络上)正在减慢速度,假设您不在交换中。
当您说“足够快”时,您是在含糊其辞:笔记本电脑版本是否需要 1 秒才能到达 Slicehost 6?如果笔记本电脑不错,那也不足为奇:毕竟,切片便宜的原因是因为它们只是完整服务器的一小部分。您在 Slicehost 上使用的可能是 8 核机器的 1/32,而不是现代笔记本电脑的两个内核。 Slicehost 内核速度很快,但与 1/4 的内核相比,您的笔记本电脑可能会令人尖叫。 :)
【讨论】:
如果其他人都在最大限度地利用他们的 CPU 时间,那么您在 Slicehost 中只有特定的核心部分。 Slicehost 保证一定数量,但如果有的话会给你更多。我运行一个中等繁忙的服务器(每天点击 60-70k),我的 CPU 负载通常是 0.7%。 鸭子是正确的。也许这意味着他应该向我收费。 (是的,我知道,我会在余生中为这条评论付出代价。):)【参考方案9】:Slicehost 使用什么来提供服务? 快速选项如下:Mongrel,或 apache 的 mod_rails(也称为乘客 phusion 或 类似的东西) 这些是运行 Rails 应用实例的专用服务器(或服务器插件)。
如果您的主机没有使用它,那么它可能默认为 CGI。 Rails 附带了一个简单的 CGI 脚本,它将为页面提供服务,但它会为每个页面重新加载应用程序。
(编辑:我怀疑这是最有可能的情况,即您的应用程序正在运行 /webapp_directory/public/dispatch.cgi 中的 CGI,这可以解释速度缓慢。这往往是许多默认部署主机,因为它不需要额外的配置,但性能不佳)
如果您的主机支持“快速 CGI”,rails 也支持。 Fast CGI 将打开一个 CGI 会话,并保持它对多个页面打开,因此您可以获得更好的性能,但它不如 Mongrel 或 mod_rails 好。
其次,它是处于“生产”模式还是“开发”模式?简单的判断方法是转到您的应用程序中出现错误的页面。如果它向您显示堆栈跟踪,则它处于开发模式,比生产模式慢。 Mongrel 和 mod_rails 具有启动选项来确定是在生产模式还是开发模式下运行应用程序。
最后,如果您的数据库由于某种原因变慢,这也将是一个很大的瓶颈。如果您在生产模式下确实有良好的部署(Mongrel/mod_rails/等),请尝试查看。
【讨论】:
请注意,Slicehost 为您提供了自己的专用服务器等价物,因此您可以自行安装和配置操作系统。它不是托管或共享托管。【参考方案10】:Slicehost 使用 Xen 虚拟化系统保证您的 CPU 时间,所以不是这样。没有其他答案给你,对不起!当您尝试访问该页面时,可能会在控制台上尝试“顶部”。
【讨论】:
以上是关于如何找出我的应用程序运行缓慢的原因?的主要内容,如果未能解决你的问题,请参考以下文章
我的应用程序在设备上运行缓慢是因为我使用的图像以及如何删除硬编码的宽度和高度
Xcode Time Profiler 的详细信息面板显示“main”是应用程序运行缓慢的原因,但没有在其中显示单独的方法调用。