Könnte die maximal zulässige Speichernutzung als Site-Konfigurationsoption festgelegt werden? Derzeit ist die Einstellung auf 2 GB gesetzt (Edit: Oops, ich liege falsch, siehe unten) – zuvor waren es 4 GB – und doch wird für die empfohlene Hardwarekonfiguration 1 GB + Swap angegeben. Es scheint mir, dass ein 1-GB-Knoten bei einer tatsächlichen Ruby-Speichernutzung von bis zu 2 GB leicht in eine Art Paging-Frenzy geraten könnte.
Aus einem Upgrade-Log:
Migrating default
Seeding default
*** Bundling assets. This will take a while ***
$ RUBY_GC_MALLOC_LIMIT_MAX=20971520 RUBY_GC_OLDMALLOC_LIMIT_MAX=20971520 RUBY_GC_HEAP_GROWTH_MAX_SLOTS=50000 RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=0.9 bundle exec rake assets:precompile
Purging temp files
Bundling assets
Ähm, Entschuldigung, das ist kein 2G, das sind 20M. Also gar nicht so wie die Situation, von der ich dachte, dass sie wäre. (Edit: Es ist schlimmer! Siehe unten)
Ja, während der Updates setzen wir diese Variablen, damit das Upgrade auf sehr schwach ausgestatteten Maschinen nicht aufgrund von Speicherdruck fehlschlägt.
Richtig, und meine Beobachtung ist, dass die Limits in einigen Fällen möglicherweise zu hoch eingestellt sind. Ich frage mich daher, ob man sie konfigurierbar machen könnte.
Wir haben dieses Verfahren über die Jahre intensiv getestet und können versichern, dass es für kleine Communities auf einem 1-GB-VPS problemlos funktioniert. Während des Upgrades werden sogar zusätzliche Unicorn-Worker beendet, um Speicher freizugeben und so zu helfen.
Sie können den Code aus diesem Commit einsehen:
Wenn Sie das Problem auf einem Digital Ocean Droplet reproduzieren können, schauen wir uns das gerne an.
Falls dies zwingend erforderlich ist, können Sie das Plugin forken und an Ihre Bedürfnisse anpassen.
Danke, ich habe jetzt ein Bild. (Zwei sehr wichtige Punkte: Diese GC-Einstellungen sind speziell für Upgrades angepasst, und die Einheiten sind Bytes, sodass das Limit derzeit auf 20 MB festgelegt ist. In diesem früheren Thread finden Sie nützliche und interessante Details [Archivlink, da er mir derzeit nicht zur Verfügung steht].)
Es ist zweifellos veraltet; die neueste Ruby-Version verfügt über mehrere malloc-Grenzen. Es ist ein interessantes Thema mit historischem Wert, sollte jedoch mit einem großen Schild „Veraltet