2016-06-15 7 views
0

Ich habe eine Rails 4.2-Anwendung auf Heroku läuft, wird Ruby-Version 2.2.4Warum ist mein Heroku App Speicherbedarf so groß

Wenn ich die Anwendung neu starten, Heroku's log-Runtime-Metriken die App-Protokolle verwenden dies:

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 

ein einfacher Klick auf eine diferent Seite in der Landung der App meldet diese Details:

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 berichtet: Speichernutzung: 435.416

Eingabe der App ich einige Datentabellen mit Paginierung haben, wenn sie um die Seiten der Speicher bewegt wird immer größer:

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 

Oink in diesem Moment Berichterstattung: Speichernutzung: 602352

Wenn ich ein gehen einfachere Seite auf der App Heroku berichtet:

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 berichtet Nutzung Speicher: 604744

Nach 5 Minuten Heraku-Bewegung meldet sich der Speicher insgesamt zwischen 360 und 400+ MB. Es kommt nicht zu Speicherquotefehlern, aber wenn ein neuer Webarbeiter gefeuert würde, wette ich, dass es das tun würde.


Ich habe auch einige Daten aus ObjectSpace genommen. Navigieren Sie um die Website (dieses Mal in lokalen), zuerst mit den einfachsten Seiten, dann die Eingabe des Teils mit Seitenumbruch mit holt mehr Daten, ausgehen und so. Dies sind einige der Protokolle von ObjectSpace.count_objects:

{: TOTAL => 556379,: FREI => 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_MODUL => 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,: FREI => 946,: T_OBJECT => 24257,: T_CLASS => 7523,: T_MODUL => 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, MIT PAGINATION, 25 Datensätze pro Seite, abzurufenden Daten enthält einzigartige Strings (Adressen in FACT) T_ICLASS => 11801}

EINGEBEN DataTables-: T_RATIONAL => 963: T_SYMBOL => 2028: T_NODE => 58656,.

{: 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_STRUKT => 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,: FREI => 433,: T_OBJECT => 19352,: T_CLASS => 7369,: T_MODUL => 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,: FREI => 470,: T_OBJECT => 22820,: T_CLASS => 7361,: T_MODUL => 1563,: T_FLOAT => 9,: T_S TRING => 362350,: T_REGEXP => 2390,: T_ARRAY => 152959,: T_HASH => 22342,: T_STRUKT => 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,: FREI => 392, : T_OBJECT => 24361,: T_CLASS => 7362,: T_MODUL => 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}

VERLäßT JETZT Tables und Paginierung einer einfachere SEITE IM APP

{: TOTAL => 81968 1,: FREI => 494,: T_OBJECT => 24601,: T_CLASS => 7374,: T_MODUL => 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}


ich kann auch gc Profiler Daten. Aber was mich beunruhigt ist, dass die meisten der gemeldeten Daten und zugeteilten Sachen aus Edelsteinen stammen, die benötigt werden und ich sowieso brauche.


So ...

Ich bin auf dem Weg versuchen, Speicherlecks zu erkennen, oder den Grund, warum Speicherbedarf so hoch ist, und reduzieren so viel wie ich kann. Alle Hinweise, wie Sie von hier aus vorgehen, sind willkommen.

Es wäre nett zu verstehen, warum nach einem ersten Klick - nach dem Neustart - der gemeldete Speicher von Heroku verdoppelt, obwohl ich mir vorstelle, dass es danach ist, wenn die meisten Objekte konstruiert und Speicher zugewiesen werden.

Aber dann ist der Unterschied zwischen dem, was Oink berichtet und dem, was Heroku berichtet, riesig, denke ich Oink berichtet in Bytes. Und wieder stelle ich mir vor, dass sie verschiedene Dinge berichten, oder zumindest berichtet Heroku über viel mehr Zeug.

Haben Sie gute Tipps, wie Sie all diese Daten interpretieren können? Ist es nicht ein Speicherbedarf von 300-400 MB zu viel für eine Heroku App?

Danke.

Antwort

0

Ich habe einige Kommentare von Heroku Unterstützung:

Es ist nicht ungewöhnlich für ein Einhorn-basierte Rails-Anwendung über 400 MB RAM zu nehmen. In der Tat ist das wahrscheinlich ein Durchschnitt für einen Unicorn Master mit Preload und zwei Unicorn Request Worker. Das sind drei Ruby-Prozesse, die im Prüfstand laufen, also müssen Sie vorsichtig sein mit dem Werkzeug, das Sie verwenden, um es zu messen . Die Log-Laufzeit-Metriken werden für den gesamten Dyno, z.B. alle drei Ruby-Prozesse.

So sieht es nicht so seltsam für meinen Fall aus. Wie auch immer, ich achte jetzt besonders auf die Speicherzuweisung und sehe, wo ich mich von meiner Seite aus verbessern kann.