Webrick和Thin在Windows下提供静态文件服务非常缓慢。我该如何加快它们的速度?

8

我正在开发一个Web应用程序,而我在Windows和Mac的两台开发机之间进行切换。

我的问题是页面在Windows上渲染得非常慢,但并不是因为我的Ruby代码运行缓慢,而是由于静态文件被慢速提供服务。

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

这些50个文件在Mac上需要大约1.5秒来提供服务,但在Windows上需要 10秒钟。 这使测试变得很痛苦...

我已经尝试了Webrick和Thin,它们差不多。

有人遇到过这个问题并知道如何改善吗?

我尝试更改Webrick conf为“:DoNotReverseLookup => true”,如此答案中建议的那样,但是没有帮助。

任何帮助将不胜感激
谢谢!
Daniel


1
你可以尝试在Linux虚拟机中设置它,往往情况下这样做实际上会更快。 - prusswan
@AlexanderKosubek,如果实现这个功能的话会非常过度和困难,因为这个问题发生在开发环境中。此外,CSS文件最初是SCSS格式的,需要在更改时进行神奇的预处理,因此我不确定是否可以使用单独的Web服务器来处理静态文件。(而且,预处理不是问题,它仅在文件更改时发生,延迟在每个网页访问中都会发生) - Daniel Magliola
@Oleg 谢谢你的回答。这些基本上是 CSS 文件、JS 文件和 PNG 文件。它们从 Web 服务器加载,因为它们会发生变化,所以在开发环境中它们没有过期头文件(在生产环境中有,但问题只出现在开发环境中)。问题不是我正在加载不应该加载的文件(尽管这可能是解决问题的一种复杂方式),而是 Webrick 在 Windows 上提供静态文件服务的速度比在 MacOsX 上慢得离谱,我正在努力查看是否有什么愚蠢的东西可以加快速度。 - Daniel Magliola
你使用什么浏览器?Windows的哪个版本? - chue x
2
我认为你需要在这里提供更多的信息。我在一个干净的 Windows 7 64 位机器上安装了 Rails(rails v3.2.13,ruby 1.9.3p392)。我设置了 webrick 指向本地静态网站。然后我从另一台机器访问该网站,遇到了你所看到的性能问题。然后我按照你链接的答案更新了我的 webrick 配置。我的性能问题消失了。我还使用我的静态网站创建了一个 Rails 应用程序。我得到了与 webrick 网站相同的结果。 - chue x
显示剩余4条评论
3个回答

2
您正在遇到两个困扰Ruby开发者已久的根本性问题:
  • Webrick很慢。总是如此。不要费心了。
  • Ruby在Windows上总是比较慢。有时您会发现速度差异非常大。
因此,如果您坚持在Windows上进行开发(而不是仅在Linux上开发或在Windows上运行Linux虚拟机上进行开发),那么我们需要想出一些方法来美化这只猪。
一些想法:
  • 确保您运行的是最新版本的Ruby。
  • 尝试使用Thin和nginx进行部署,就像这篇有帮助但有点过时的教程中所示。这将帮助您充分利用Thin的多线程和异步性。
  • 使用Capistrano通过这个也有点过时的GitHub 项目在Windows上进行部署。
如果您决定已经受够了在不适合它的环境中开发Rails,可以按照此处所述的方式设置虚拟机。作者报告了显著的加速。

1
在VirtualBox中使用Ubuntu虚拟机,这比Mac和Windows更接近您的部署环境,这意味着在生产中会少遇到“但在开发中它可以工作”的问题。此外,您将节省大量时间来处理不同的ruby/gems实现和由于本地扩展而引起的各种头疼问题。您可以:
1.设置内部网络,以便在Windows下使用浏览器浏览运行在VM内部的应用程序 2.使用类似于putty的工具打开VM的控制台会话 3.与您的Ubuntu VM共享Dropbox/Sparkleshare文件夹,这样您就可以在Windows和Mac OS X上始终拥有相同的代码,并且可以使用您喜欢的编辑器在Windows/macOS下编辑VM内的文件 4.您还可以在Mac OS X下使用相同的VM 在VirtualBox下安装Ubuntu快速、简单且文档完善,基本上只需按照向导操作即可。或者,您可以尝试寻找一个好的vagrant配方(请参见http://www.vagrantup.com/),或者询问一下您的同事是否愿意分享他/她的vbox。

0

我在处理大量资源的项目时遇到了性能下降的问题(由于实时编译),但我没有使用Windows系统。

我认为这种性能差异可能是由于Windows下一些低效的资源编译引起的。

我没有任何Windows开发经验,已经很长时间没有使用Windows机器了。然而,当我切换到多线程服务器,特别是Puma时,我在并行资源处理(开发中)方面注册了明显的性能提升。请记住,在任何情况下,默认的Rails Web服务器(Webrick)都非常低效。

正如Konstantine 在这个答案中解释的那样,目前有几种选择可用。您可以按处理模式对它们进行分组。

跳过有关Ruby线程、多进程等所有背景历史,我邀请您在自己的计算机上尝试Puma,并查看它是否改善了负载。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接