0

Heroku で Rails 4.2 アプリケーションを実行しています。Ruby のバージョンは 2.2.4 です。

Heroku の log-runtime-metrics を使用してアプリケーションを再起動すると、アプリは次のログを記録します。

sample#memory_total=102.07MB 
sample#memory_rss=102.06MB 
sample#memory_cache=0.00MB 
sample#memory_swap=0.00MB 
sample#memory_pgpgin=29936pages 
sample#memory_pgpgout=3807pages 
sample#memory_quota=512.00MB

アプリのランディングで別のページをクリックするだけで、次の詳細が報告されます。

sample#memory_total=267.07MB 
sample#memory_rss=265.63MB 
sample#memory_cache=1.43MB 
sample#memory_swap=0.00MB 
sample#memory_pgpgin=109878pages 
sample#memory_pgpgout=41509pages 
sample#memory_quota=512.00MB

Oink レポート: メモリ使用量: 435416

アプリに入ると、ページネーションのあるデータテーブルがいくつかあります。ページを移動すると、メモリが増え続けます。

sample#memory_total=349.68MB 
sample#memory_rss=348.18MB 
sample#memory_cache=1.50MB 
sample#memory_swap=0.00MB 
sample#memory_pgpgin=159122pages 
sample#memory_pgpgout=69604pages 
sample#memory_quota=512.00MB

現時点での報告: メモリ使用量: 602352

Heroku がレポートするアプリのよりシンプルなページに移動すると、次のようになります。

sample#memory_total=353.05MB 
sample#memory_rss=351.51MB 
sample#memory_cache=1.54MB 
sample#memory_swap=0.00MB 
sample#memory_pgpgin=169306pages 
sample#memory_pgpgout=78924pages 
sample#memory_quota=512.00MB

Oink レポート メモリ使用量: 604744

Heroku を 5 分移動した後、メモリの合計が 360 から 400+ MB と報告されました。メモリ クォータ エラーにはなりませんが、新しい Web ワーカーが解雇される場合は、そうなるに違いありません。


また、ObjectSpace からいくつかのデータを取得しました。サイト内を (今回はローカルで) ナビゲートします。最初は最も単純なページを使用し、次にページネーションを使用してパーツに入り、より多くのデータをフェッチし、外に出ます。以下は、ObjectSpace.count_objects からのログの一部です。

{:TOTAL=>556379、:FREE=>1142、:T_OBJECT=>27740、:T_CLASS=>7356、:T_MODULE=>1563、:T_FLOAT=>9、:T_STRING=>241807、:T_REGEXP=>2481、: T_ARRAY=>92685、:T_HASH=>16081、:T_STRUCT=>1118、:T_BIGNUM=>13、:T_FILE=>117、:T_DATA=>81408、:T_MATCH=>6132、:T_COMPLEX=>1、:T_RATIONAL= >909、:T_SYMBOL=>1691、:T_NODE=>62347、:T_ICLASS=>11779}

{:TOTAL=>556379、:FREE=>1211、:T_OBJECT=>27540、:T_CLASS=>7354、:T_MODULE=>1565、:T_FLOAT=>9、:T_STRING=>241100、:T_REGEXP=>2478、: T_ARRAY=>93344, :T_HASH=>16763, :T_STRUCT=>1078, :T_BIGNUM=>13, :T_FILE=>122, :T_DATA=>81422, :T_MATCH=>6031, :T_COMPLEX=>1, :T_RATIONAL= >911、:T_SYMBOL=>1690、:T_NODE=>61968、:T_ICLASS=>11779}

{:TOTAL=>556379、:FREE=>946、:T_OBJECT=>24257、:T_CLASS=>7523、:T_MODULE=>1565、:T_FLOAT=>9、:T_STRING=>251448、:T_REGEXP=>2362、: T_ARRAY=>83078, :T_HASH=>15272, :T_STRUCT=>1175, :T_BIGNUM=>63, :T_FILE=>128, :T_DATA=>89152, :T_MATCH=>5952, :T_COMPLEX=>1, :T_RATIONAL= >963、:T_SYMBOL=>2028、:T_NODE=>58656、:T_ICLASS=>11801}

ページネーションを使用したデータ テーブルの入力、ページあたり 25 レコード、取得されたデータには一意の文字列 (実際のアドレス) が含まれます。

{:TOTAL=>556379、:FREE=>906、:T_OBJECT=>26280、:T_CLASS=>7363、:T_MODULE=>1563、:T_FLOAT=>9、:T_STRING=>252024、:T_REGEXP=>2474、: T_ARRAY=>87445, :T_HASH=>15347, :T_STRUCT=>1144, :T_BIGNUM=>16, :T_FILE=>133, :T_DATA=>80601, :T_MATCH=>6686, :T_COMPLEX=>1, :T_RATIONAL= >985、:T_SYMBOL=>1690、:T_NODE=>59906、:T_ICLASS=>11806}

{:TOTAL=>556379、:FREE=>146、:T_OBJECT=>18752、:T_CLASS=>7359、:T_MODULE=>1563、:T_FLOAT=>9、:T_STRING=>295002、:T_REGEXP=>2304、: T_ARRAY=>81885、:T_HASH=>13791、:T_STRUCT=>867、:T_BIGNUM=>15、:T_FILE=>11、:T_DATA=>77634、:T_MATCH=>847、:T_COMPLEX=>1、:T_RATIONAL= >1251、:T_SYMBOL=>1679、:T_NODE=>41463、:T_ICLASS=>11800}

{:TOTAL=>571870、:FREE=>433、:T_OBJECT=>19352、:T_CLASS=>7369、:T_MODULE=>1565、:T_FLOAT=>9、:T_STRING=>294098、:T_REGEXP=>2358、: T_ARRAY=>91079、:T_HASH=>14983、:T_STRUCT=>879、:T_BIGNUM=>15、:T_FILE=>16、:T_DATA=>77945、:T_MATCH=>1128、:T_COMPLEX=>1、:T_RATIONAL= >1591、:T_SYMBOL=>2028、:T_NODE=>45197、:T_ICLASS=>11824}

{:TOTAL=>628109、:FREE=>343、:T_OBJECT=>20647、:T_CLASS=>7360、:T_MODULE=>1563、:T_FLOAT=>9、:T_STRING=>318169、:T_REGEXP=>2346、: T_ARRAY=>115854、:T_HASH=>17767、:T_STRUCT=>949、:T_BIGNUM=>15、:T_FILE=>10、:T_DATA=>79152、:T_MATCH=>1243、:T_COMPLEX=>1、:T_RATIONAL= >1789、:T_SYMBOL=>1685、:T_NODE=>47405、:T_ICLASS=>11802}

{:TOTAL=>727564、:FREE=>470、:T_OBJECT=>22820、:T_CLASS=>7361、:T_MODULE=>1563、:T_FLOAT=>9、:T_STRING=>362350、:T_REGEXP=>2390、: T_ARRAY=>152959、:T_HASH=>22342、:T_STRUCT=>1035、:T_BIGNUM=>33、:T_FILE=>11、:T_DATA=>81286、:T_MATCH=>2167、:T_COMPLEX=>1、:T_RATIONAL= >2497、:T_SYMBOL=>1686、:T_NODE=>54779、:T_ICLASS=>11805}

{:TOTAL=>811122、:FREE=>392、:T_OBJECT=>24361、:T_CLASS=>7362、:T_MODULE=>1563、:T_FLOAT=>9、:T_STRING=>409740、:T_REGEXP=>2434、: T_ARRAY=>176571、:T_HASH=>25118、:T_STRUCT=>1076、:T_BIGNUM=>51、:T_FILE=>13、:T_DATA=>82701、:T_MATCH=>2858、:T_COMPLEX=>1、:T_RATIONAL= >3093、:T_SYMBOL=>1686、:T_NODE=>60285、:T_ICLASS=>11808}

今すぐデータテーブルとページネーションを残して、アプリのよりシンプルなページに

{:TOTAL=>819681、:FREE=>494、:T_OBJECT=>24601、:T_CLASS=>7374、:T_MODULE=>1563、:T_FLOAT=>9、:T_STRING=>413540、:T_REGEXP=>2437、: T_ARRAY=>178899、:T_HASH=>25953、:T_STRUCT=>1118、:T_BIGNUM=>93、:T_FILE=>14、:T_DATA=>83043、:T_MATCH=>2924、:T_COMPLEX=>1、:T_RATIONAL= >3121、:T_SYMBOL=>1688、:T_NODE=>60999、:T_ICLASS=>11810}


gc プロファイラー データも取得できます。しかし、私が心配しているのは、報告されたデータと割り当てられたもののほとんどが必要であり、とにかく必要な宝石からのものであるということです。


そう...

メモリリーク、またはメモリフットプリントが非常に高い理由を検出し、できる限り削減しようとしています。ここから先に進むためのアドバイスは大歓迎です。

最初のクリック後 (再起動後)、Heroku によって報告されたメモリが 2 倍になる理由を理解しておくとよいでしょう。

しかし、Oink が報告するものと Heroku が報告するものとの違いは非常に大きいので、Oink はバイト単位で報告していると思います。繰り返しになりますが、彼らはさまざまなことを報告していると思います。少なくとも、Heroku はもっと多くのことを報告しています。

このすべてのデータを解釈するための良いヒントはありますか? Heroku アプリにとって 300 ~ 400 MB のメモリ使用量は大きすぎませんか?

ありがとう。

4

1 に答える 1

0

Heroku サポートからいくつかのコメントを受け取りました。

Unicorn ベースの Rails アプリが約 400MB の RAM を使用することは珍しくありません。実際、これはおそらく、プリロードと 2 つの Unicorn リクエスト ワーカーを備えた Unicorn マスターの平均です。これは dyno で実行されている 3 つの Ruby プロセスであるため、測定に使用するツールには注意が必要です。log-runtime-metrics は、dyno 全体 (3 つの Ruby プロセスすべてなど) のものになります。

したがって、私の場合はそれほど奇妙ではないようです。とにかく、私は今、メモリの割り当てに特別な注意を払っており、自分の側からどこを改善できるかを確認しています.

于 2016-06-16T07:18:09.410 に答える