【问题标题】:Webrick and Thin are really slow serving static files in Windows. How can I speed them up?Webrick 和 Thin 在 Windows 中提供静态文件的速度确实很慢。我怎样才能加快他们的速度?
【发布时间】:2013-12-14 13:36:59
【问题描述】:

我目前正在开发一个网络应用程序,为此我在 Windows 和 Mac 开发机器之间交替使用。

我的问题是页面在 Windows 上的渲染速度非常很慢,但这不是我的 Ruby 代码运行缓慢,而是静态文件的服务速度很慢。

一个典型的页面需要大约 200 毫秒来呈现并在 dev 中提供服务(Mac 和 Windows 在这里都相似),但它包含大约 50 个静态文件(在生产中它只有 5 到 10 个,一旦它们被缩小和组合,但是在开发中它们仍然是分开的)。

这 50 个文件在 Mac 上大约需要 1.5 秒,但在 Windows 上大约需要 10 秒。这使得测试事情变得相当曲折......

Webrick 和 Thin 都试过了,差不多。

有没有人发现这个问题并知道如何改进?

按照this answer 中的建议,我已尝试将 Webrick conf 更改为“:DoNotReverseLookup => true”,但这没有帮助。

任何帮助将不胜感激
谢谢!
丹尼尔

【问题讨论】:

  • 您可以尝试在 Linux 虚拟机中设置它,通常这实际上会更快。
  • 你能写更多关于“那 50 个文件”的细节吗?文件是 CSS 文件、JavaScript 文件、JPG 文件、PNG 文件还是其他文件……从哪里加载文件?如果文件是从某个 Web 服务器加载的,那么是否在 HTTP 标头中设置任何缓存选项可能很重要。在 Windows 上使用 Fiddler 或其他一些工具在 10 秒内跟踪 HTTP 流量很有帮助。您可以将流量作为文件上传,并将 URL 包含到跟踪中。如果其他人可以分析它。
  • @AlexanderKosubek 实施起来会非常过分而且非常困难,因为问题在 dev.xml 中发生。此外,CSS 文件最初是 SCSS,当它们发生变化时需要进行神奇的预处理,所以我不确定我是否可以使用单独的 Web 服务器来处理静态文件。 (不,预处理不是问题,它只在文件更改时发生,并且延迟发生在每个网页点击中)
  • 我认为您需要在此处提供更多信息。我在干净的 Windows 7 64 位机器上安装了 Rails(rails v3.2.13,ruby 1.9.3p392)。我设置了webrick to point to a local static web site。然后我从另一台机器访问了该站点,并且性能很差。然后我根据answer you linked to 更新了我的 webrick 配置。我的性能问题消失了。我还使用我的静态网站创建了一个 rails 应用程序。我得到了与 webrick 网站相同的结果。

标签: windows ruby-on-rails-3 performance thin webrick


【解决方案1】:

您遇到了两个困扰 Ruby 开发人员很长时间的生存问题:

  • Webrick 很慢。总是。就别费心了。
  • Ruby 在 Windows 上总是较慢。有时按您发现的数量级。

因此,如果您坚持在 Windows 上进行开发(而不是仅在 Linux 上开发或在 Windows 上运行的 Linux VM 上开发),那么我们需要想出一些方法来给猪涂口红。

一些想法:

  • 确保您运行的是最新版本的 Ruby。
  • 尝试使用 Thin 部署 nginx,尽管日期为 tutorial 很有帮助。这将帮助您充分利用 Thin 的多线程和异步性。
  • 使用 Capistrano 通过这个同样日期为 GitHub project 的 Windows 部署。

如果您确定自己已经受够了在 Rails 设计之外的环境中开发 Rails,您可以按照here 所述的方式设置 VM。作者报告了显着的加速。

【讨论】:

    【解决方案2】:

    我在处理具有大量资产的项目时遇到了性能下降(由于实时编译),但我不在 Windows 上。

    我认为较大的性能差异可能是由于 Windows 下某些低效的资产编译造成的。

    我没有任何 Windows 开发经验,我已经很久没有使用 Windows 机器了,但是当我切换到多线程服务器时,我发现并行资产处理(开发中)的性能显着提高,特别是Puma。请记住,无论如何,默认的 Rails 网络服务器 (Webrick) 效率非常低。

    作为 Konstantine explained in this answer,目前有多种选择。您可以按处理模式对其进行分组。

    跳过所有关于 Ruby 线程、多进程等的背景历史,我会邀请您在您的机器上尝试 Puma,看看它是否可以改善负载。

    Puma 与提供真正多线程的 Ruby 实现配合得更好,但引用了官方自述文件

    在 MRI 上,有一个全局解释器锁 (GIL),可确保一次只能运行一个线程。但是,如果您正在执行大量阻塞 IO(例如对 Twitter 等外部 API 的 HTTP 调用),Puma 仍然通过允许阻塞 IO 并发运行来提高 MRI 的吞吐量(基于 EventMachine 的服务器,例如 Thin 关闭此功能,需要您可以使用特殊库)。 Puma 旨在为 Rack 应用程序提供简单且高性能的请求/响应管道。

    【讨论】:

      【解决方案3】:

      在 VirtualBox 中使用 Ubuntu VM,它可能更接近您的部署环境,然后是 mac 和 windows,这意味着生产中“但它在开发中工作”的麻烦更少。

      此外,您将节省大量时间来处理不同 ruby​​/gems 实现的怪癖以及由于本机扩展而引起的各种头痛。

      你可以:

      1. 设置内部网络,以便您可以使用 windows 下的浏览器浏览在 VM 中运行的应用程序
      2. 使用 putty 之类的工具打开与 VM 的控制台会话
      3. 与您的 Ubuntu 虚拟机共享一个 Dropbox/Sparkleshare 文件夹,这样您在 Windows 和 Mac 机器和 Ubuntu 虚拟机之间始终拥有相同的代码
      4. 这使您可以在 windows/macos 下使用您喜欢的编辑器来编辑 VM 内的文件
      5. 您也可以在 Mac 下使用相同的虚拟机

      在 VirtualBox 下安装 Ubuntu 快速、简单且文档齐全,它几乎只是一个向导。或者,您可以尝试寻找一个好的 vagrant recipee(请参阅 http://www.vagrantup.com/)或四处打听,看看您的同事是否愿意分享他/她的 vbox。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 2010-11-12
        • 1970-01-01
        • 2011-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多