在Heroku上的瘦与独angular兽
只是想获得人们对使用Unicorn vs Thin作为Rails服务器的意见。 我在网上find的大多数文章/基准看起来都不完整,所以最好有一个集中的地方来讨论它。
Unicron是一个多进程的服务器,而thin是一个基于事件的/非阻塞的服务器。 基于事件的服务器是伟大的…如果你的代码是asynchronous/非阻塞的 – 香草栏是阻塞的。 所以除非你使用非阻塞的rails库,否则我真的没有看到使用Thin的好处。 更糟糕的是,在一个非阻塞的服务器中,如果你的I / O循环被阻塞了,你将会阻塞整个循环,直到阻塞调用返回之前,不能处理更多的请求。 阻止图书馆将减速减速!
为什么HerokuselectThin作为他们的默认服务器(雪松)? 他们是聪明的人,所以我相信他们有一个理由。
贝娄是一个链接,build议用4个独angular兽的工人代替瘦 – 这对我来说是完全有意义的。 Heroku上的4名Unicron工人
Thin很容易configuration – 不是最优的,但它只能在Heroku环境中工作。
独angular兽可以更高效,但需要configuration:多less工人? 预加载应用程序? 你选什么?
我已经发布了Unicorn Heroku应用程序,其工作人员设置为3,5和8 – 只是基于每个应用程序的大小 – 多less代码,使用了多less内存以及多lessstream量都会用到这个数字,而且您需要随着时间的推移来监控,以确保你的号码是正确的,而你的应用程序没有用完内存。
预装错误 – 这会让你的应用程序启动速度变慢,但是当Unicorn重启一个工作者时,这对networking连接(memcache,postgres,mongo等)
预加载正确 – 这是更好的,但是你需要在前后叉代码中正确处理服务器重新连接。
Thin没有这些问题,但是你只能得到执行的过程。
总结:configurationUnicorn非常适合每个人使用(或根本不需要),而Thin可以使用less量的支持请求来运行。
最近(仅在几个月前), Phusion Passenger背后的人们join了对Heroku的支持。 当然,这是一个select,你应该尝试看看是否符合你的需求。
即使使用1台dynamic测速仪,速度也很快,而响应时间的下降是明显的。 在github上托pipe一个简单的Passenger Ruby Heroku演示 。
Heroku乘客的主要好处是:
-
通过Nginx实现静态资产加速 – 不要让Ruby应用程序提供静态资产,让Nginx为您做,并为您的应用程序卸载真正重要的任务。 Nginx会做得更好。
-
多个工作stream程 – Phusion Passenger不是只在一台测功机上运行一名工人,而是在一台测功机上运行多名工人,从而最大限度地利用其资源,并为您提供更多的便利。 这种方法类似于独angular兽的。 但是与Unicorn不同的是,Phusion Passenger可以根据当前stream量dynamic调整工作进程的数量,从而在不需要时释放资源。
-
内存优化 – Phusion Passenger比Thin和Unicorn使用更less的内存。 它还支持写入时复制(copy-on-write)虚拟内存和代码预加载,从而使您的应用在Ruby 2.0上运行时使用更less的内存。
-
请求/响应缓冲 – 包含的Nginx缓冲请求和响应,从而保护您的应用免受慢速客户端(例如移动networking上的移动设备)的攻击,并提高性能。
-
带外垃圾收集 – Ruby的垃圾收集器速度很慢,但是为什么您的访问者需要很长的响应时间呢? 通过在正常的请求 – 响应循环之外运行垃圾回收来解决这个问题! 这个由Unicorn首先推出的概念已经得到了改进:Phusion Passenger确保只有一个请求同时运行带外垃圾收集,从而消除了Unicorn的带外垃圾收集带来的所有问题。
-
JRuby支持 – Unicorn比Thin更好,但不支持JRuby。 Phusion Passenger呢。
希望这可以帮助。
Heroku不使用智能路由 – 无论dyno是否繁忙,它都会随机分配任务给dynos。 因此,如果您的dyno无法同时处理多个作业,即使您正在为大量免费的其他dynos付费,也会得到延迟(可能是大量延迟)。 “没错 – 如果你的应用程序需要一个智能路由器的80个dynos,它需要4000个随机路由器。” http://news.rapgenius.com/James-somers-herokus-ugly-secret-lyrics
Heroku说他们正在研究这个,他们的计划是让Unicorn更容易使用。 他们基本上说:“哎呀,我们没有注意到这是一个几年的问题…现在我们看,这绝对是一个薄的问题…所以我想你需要使用一个不同的程序比我们一直在推动这一切。“ http://news.rapgenius.com/Jesper-joergensen-routing-performance-update-lyrics
从官方的Heroku解释(上面的第二个链接):“实际上,Rails还不能可靠地支持并发请求处理,这使得Rails开发人员无法利用Cedar栈提供的附加并发能力,除非他们转移到并发Web像彪马或独angular兽服务器。
部署到Cedar with Thin的Rails应用程序可以相当快地结束请求排队问题。 由于Cedar路由器不再代表应用程序进行任何排队,因此在dyno排队的请求必须等到单个Rails进程在队列中完成。 许多客户已经遇到这个问题,我们没有采取行动,并提供了一个更好的方法来部署雪松的Rails应用程序。“
同样令人感兴趣的是,他们的表演工具,包括New Relic,还没有报道在测功机队列中花费的时间。 http://news.rapgenius.com/Lemon-money-trees-rap-genius-response-to-heroku-lyrics
哎呀。