web-dev-qa-db-ja.com

HerokuのThin vs Unicorn

RailsサーバーとしてUnicorn vs Thinを使用することについて人々の意見を得たかったのです。オンラインで見つけた記事/ベンチマークのほとんどは非常に不完全に見えますので、それを議論するための集中化された場所があればいいでしょう。

Unicronはマルチプロセスサーバーですが、thinはイベントベースのノンブロッキングサーバーです。イベントベースのサーバーは優れています...コードが非同期/非ブロッキングの場合-Vanilla Rails is blocked。Non-blocking Railsライブラリ、Thinを使用する利点は本当にわかりません。さらに悪いことに、非ブロッキングサーバーでは、I/Oループがブロックしていると、ループ全体がブロックされ、それ以上の要求を処理できなくなります。ブロッキングの呼び出しが戻るまで、ブロッキングライブラリの処理速度が低下します。

Herokuがデフォルトのサーバー(杉用)としてThinを選択したのはなぜですか?彼らは頭がいいので、きっと理由があると思います。

ベローは、シンを4人のユニコーンワーカーに置き換えることを示唆するリンクです-これは私には完全に理にかなっています。 Herokuの4つのUnicronワーカー

34
EugeneMi

Thinは設定が簡単です-最適ではありませんが、Heroku環境でのみ機能します。

Unicornの方が効率的ですが、構成する必要があります。アプリをプリロードしますか?何を選びますか?

ワーカーが3、5、8に設定されたUnicorn Herokuアプリをリリースしました。これは、各アプリの大きさに基づいています-コードの量、使用されているメモリの量、すべてのトラフィックがこの数を選択するために必要な量であり、必要です。時間をかけて監視し、数値が正しいこと、およびアプリのメモリが不足していないことを確認します。

プリロードfalse-これにより、アプリの起動が遅くなりますが、ユニコーンがワーカーを再起動すると、ネットワーク接続(memcache、postgres、mongoなど)で「安全」になります。

プリロードtrue-これは優れていますが、フォーク前後のコードでサーバーの再接続を正しく処理する必要があります。

Thinには、これらの問題は最初からありませんが、実行のプロセスしか得られません。

概要:Unicornをそのままの状態で全員に(またはまったく)機能させるように構成するのは非常に困難ですが、Thinはより少ないサポートリクエストで人々を稼働させることができます。

24
Tom Fakes

最近(ほんの数ヶ月前) Phusion Passenger の背後にいる人々がHerokuにサポートを追加します。間違いなく、これはあなたが試してみてあなたのニーズに合っているかどうかを確かめるべき代替手段です。

1 dynoでも非常に高速で、応答時間の低下は明白です。簡単な Passenger Ruby Heroku Demo がgithubでホストされています。

Herokuの乗客が主張する主な利点は次のとおりです。

  • Nginxによる静的アセットアクセラレーション-Rubyアプリに静的アセットを提供させないで、Nginxに任せますそして、本当に重要なタスクのためにアプリをオフロードします。

  • 複数のワーカープロセス-dynoで1つのワーカーのみを実行する代わりに、Phusion Passengerは単一のdynoで複数のワーカーを実行し、そのリソースを最大限に活用しますお金をもうけてくれます。このアプローチは、ユニコーンのアプローチに似ています。ただし、Unicornとは異なり、Phusion Passengerは現在のトラフィックに基づいてワーカープロセスの数を動的にスケーリングするため、不要なリソースを解放できます。

  • メモリの最適化-Phusion PassengerはThinやUnicornよりも少ないメモリを使用します。また、コードのプリロードと組み合わせてコピーオンライトの仮想メモリをサポートするため、Ruby 2.0。

  • リクエスト/レスポンスのバッファリング-含まれているNginxはリクエストとレスポンスをバッファリングするので、遅いクライアント(モバイルネットワーク上のモバイルデバイスなど)からアプリを保護し、パフォーマンスを向上させます。

  • アウトオブバンドガベージコレクション-Rubyのガベージコレクターは遅いですが、長い応答時間でビジターを悩ますのはなぜですか?これを修正するには、通常の要求応答サイクルの外でガベージコレクションを実行します。ユニコーンによって最初に導入されたこの概念は改善されました。PhusionPassengerは、一度に1つの要求のみがアウトオブバンドガベージコレクションを実行することを保証し、ユニコーンのアウトオブバンドガベージコレクションが抱えるすべての問題を排除します。

  • JRubyサポート-UnicornはThinよりも優れていますが、JRubyをサポートしていません。 Phusion Passengerにはあります。

お役に立てれば。

13
Javier Cadiz

Herokuはインテリジェントルーティングを使用しません。dynoがビジーかどうかに関係なく、ジョブをdynoにランダムに割り当てます。したがって、dynoが一度に複数のジョブを処理できない場合は、他の多くの無料のdynoに料金を支払っている場合でも、レイテンシ(おそらく大きなレイテンシ)が発生します。 「そうです。もしあなたのアプリがインテリジェントなルーターで80のdynoを必要とするなら、それはランダムなルーターで4,000を必要とします。」 http://news.rapgenius.com/James-somers-herokus-ugly-secret-lyrics

Herokuはこれに取り組んでいると言っており、彼らの計画はユニコーンを使いやすくすることです。彼らは基本的に「おっと、数年前からこれが問題であることに気づかなかった...そして今、見たところ、それは間違いなくThinの問題だ...だから、私はあなたが私たちがずっと押し続けてきたものです。」 http://news.rapgenius.com/Jesper-joergensen-routing-performance-update-lyrics

Herokuの公式説明(上記の2番目のリンク)から:「実際、Railsはまだ並行リクエスト処理を確実にサポートしていません。これにより、Rails開発者はCedarが提供する追加の同時実行機能を活用できなくなりますスタック。ただし、PumaやUnicornなどの同時Webサーバーに移動しない限り。

Thinを使用してCedarにデプロイされたRailsアプリは、リクエストのキューイングの問題にかなり迅速に終わる可能性があります。 Cedarルーターはアプリに代わってキューイングを行わないため、dynoでキューに入れられた要求は、単一のRailsプロセスがキューを介して機能するまで待機する必要があります。多くのお客様がこの問題に遭遇していますそして私たちは行動を起こせず、RailsアプリをCedarにデプロイするためのより良いアプローチを彼らに提供しました。」

また、New Relicなどのパフォーマンスツールがdynoキューで費やされた時間を報告していないことも興味深い点です。 http://news.rapgenius.com/Lemon-money-trees-rap-genius-response-to-heroku-lyrics

おっとっと。

9
ChrisPhoenix