2016-06-02 1 views
1

私はthisの記事を読んでいます。私の懸念はautoloadrequireの利点です。記事を読んで、私が集めているのは、マルチスレッドサーバーにautoloadを使用すると、1つのスレッドがまだメモリにないオブジェクトをロードしようとする可能性があるためです。マルチプロセスフォークサーバーでRuby 2で '自動ロード'するのが望ましいですか?

この記事では、マルチプロセスサーバーはどうですか?それらのオートロードは良いですか?そしてそれはそれが依存していると言います。サーバーがPhusion Passengedのようなfork(リクエストごとに新しいプロセスを生成する)を使用していて、Ruby 2を使用している場合、自動ロードは有益ではありません。

理由は、Ruby 2がコピーオンライトのセマンティクスを使用しているからです。つまり、requireautoloadよりも使用する方が良いことを意味します。コピーオンライトのセマンティクスでは、起動時にFoo::Barをロードすると、すべてのプロセス間で1つのコピーがFoo::Barになります。したがって、大きなメモリフットプリントはありません。

しかし、Ruby 2を使用せず、forkを使用するマルチプロセスサーバーを使用していない場合、各プロセスはFoo::Barという独自のコピーをロードし、メモリ使用量が増加する可能性があります。従って、その場合にはautoloadrequireであることが好ましい。

私の記事の解釈は正しいですか?

答えて

1

私はあなたがそれを持っていると思いますが、明確にすることがポイントのカップルを修正再表示することが良いでしょう:

  1. 重要な区別は非常にrequireautoloadの間が、熱心と怠惰の間ではありません読み込み中。熱心な読み込みは、スレッドセーフであり、フォーク時にメモリ効率が良いですが、サーバーの起動が遅くなります。レイジーローディングは、スレッドセーフでもフォーク時のメモリ効率でもありませんが、サーバの高速起動が可能です。 requireまたはautoloadとRails eager_autoload eager load; autoloadそれ自体が遅延ロードします。

  2. 念頭において上記で

    、異なるサーバとRubyのバージョンは怠惰と積極的なロードのためのさまざまな問題を提起:スレッドサーバで

    • 、遅延ロードは安全ではないので、積極的なロードは、(エヘン)である必要。
    • イベントが発生したサーバーでは遅延読み込みが正常に行われるため、サーバーの高速起動のために遅延ロードする可能性があります。
    • フォークサーバーでは、遅延読み込みは安全ですがメモリ非効率です。
      • Ruby < 2は、コピーオンライトをサポートしていないため、熱狂的な読み込みもメモリが不十分です。だから、あなたは遅れてロードするかもしれません。 (実際には、現在のRubyにアップグレードする必要があります)
      • Ruby> = 2では、書き込み時にコピーを利用するため、熱心な読み込みはメモリ効率が良いため、優先されます。
関連する問題