Fehlgeschlagen beim Bootstrapping wegen Out-of-Memory Killer

Hallo zusammen,

ich möchte mein Discourse mit ./launcher rebuild app aktualisieren. Das hat etwa ein Jahr lang problemlos funktioniert. Ich aktualisiere es, falls nötig, alle 2–4 Wochen.

Ich verwende Ubuntu 18.04.5 LTS:

***@***:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.5 LTS
Release:        18.04
Codename:       bionic

Heute bricht der Vorgang mit folgendem Fehler ab:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake themes:update assets:precompile' failed with return #<Process::Status: pid 726 exit 1>
Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"assets_precompile", "cmd"=>["su discourse -c 'bundle exec rake themes:update assets:precompile'"]}
db6d1b1dd685de69942a3df05c9cbd622860faaa286b042635878519d5b69b7b
** FAILED TO BOOTSTRAP ** bitte scrollen Sie nach oben und suchen Sie nach früheren Fehlermeldungen; es kann mehr als einen geben.
./discourse-doctor kann helfen, das Problem zu diagnostizieren.

Der erste Fehler vor dieser Meldung war:

<--- JS stacktrace --->

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
 1: 0xa04200 node::Abort() [node]
 2: 0x94e4e9 node::FatalError(char const*, char const*) [node]
 3: 0xb7978e v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node]
 4: 0xb79b07 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node]
 5: 0xd34395  [node]
 6: 0xd46c01 v8::internal::Heap::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [node]
 7: 0xd0c472 v8::internal::Factory::AllocateRaw(int, v8::internal::AllocationType, v8::internal::AllocationAlignment) [node]
 8: 0xd086c2 v8::internal::FactoryBase<v8::internal::Factory>::AllocateRawArray(int, v8::internal::AllocationType) [node]
 9: 0xd08774 v8::internal::FactoryBase<v8::internal::Factory>::NewFixedArrayWithFiller(v8::internal::Handle<v8::internal::Map>, int, v8::internal::Handle<v8::internal::Oddball>, v8::internal::AllocationType) [node]
10: 0xf4ef4b v8::internal::OrderedHashTable<v8::internal::OrderedHashSet, 1>::Allocate(v8::internal::Isolate*, int, v8::internal::AllocationType) [node]
11: 0xf4f0df v8::internal::OrderedHashTable<v8::internal::OrderedHashSet, 1>::Rehash(v8::internal::Isolate*, v8::internal::Handle<v8::internal::OrderedHashSet>, int) [node]
12: 0x103eb98 v8::internal::Runtime_SetGrow(int, unsigned long*, v8::internal::Isolate*) [node]
13: 0x1401219  [node]
Aborted (core dumped)
rake aborted!
Errno::ENOENT: No such file or directory @ rb_file_s_size - /var/www/discourse/public/assets/discourse/tests/test_helper-a9cbc4e1abdd1f2e9afced86d051cbd63c2e224dafe782533646a01592cc1f42.js
/var/www/discourse/lib/tasks/assets.rake:290:in `size'
/var/www/discourse/lib/tasks/assets.rake:290:in `block (4 levels) in <main>'
/var/www/discourse/lib/tasks/assets.rake:181:in `block in concurrent?'
/var/www/discourse/lib/tasks/assets.rake:281:in `block (3 levels) in <main>'
/var/www/discourse/lib/tasks/assets.rake:272:in `each'
/var/www/discourse/lib/tasks/assets.rake:272:in `block (2 levels) in <main>'
/var/www/discourse/lib/tasks/assets.rake:181:in `concurrent?'
/var/www/discourse/lib/tasks/assets.rake:269:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.3/exe/rake:27:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => assets:precompile
(See full trace by running task with --trace)
I, [2021-04-26T13:10:13.996101 #1]  INFO -- : Downloading MaxMindDB...
Compressing Javascript and Generating Source Maps

I, [2021-04-26T13:10:14.018697 #1]  INFO -- : Terminating async processes
I, [2021-04-26T13:10:14.020721 #1]  INFO -- : Sending INT to HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/13/bin/postmaster -D /etc/postgresql/13/main pid: 55
I, [2021-04-26T13:10:14.022854 #1]  INFO -- : Sending TERM to exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 172
172:signal-handler (1619442614) Received SIGTERM scheduling shutdown...
2021-04-26 13:10:14.023 UTC [55] LOG:  received fast shutdown request
2021-04-26 13:10:14.030 UTC [55] LOG:  aborting any active transactions
2021-04-26 13:10:14.043 UTC [55] LOG:  background worker "logical replication launcher" (PID 64) exited with exit code 1
2021-04-26 13:10:14.045 UTC [59] LOG:  shutting down
2021-04-26 13:10:14.073 UTC [55] LOG:  database system is shut down
172:M 26 Apr 2021 13:10:14.122 # User requested shutdown...
172:M 26 Apr 2021 13:10:14.123 * Saving the final RDB snapshot before exiting.
172:M 26 Apr 2021 13:10:14.270 * DB saved on disk
172:M 26 Apr 2021 13:10:14.271 # Redis is now ready to exit, bye bye...

Discourse läuft danach nicht mehr. Es funktioniert nur, wenn ich den Server neu starte. Aber dann kann ich rebuild app erneut nicht ausführen – derselbe Fehler tritt auf.

Können Sie mir dabei helfen, das Problem zu lösen?

Beste Grüße

Ihr Server läuft beim Booten aus dem Speicher. Können Sie die Ausgabe von free -m teilen?

1 „Gefällt mir“
**@**:~# free -m
              total        used        free      shared  buff/cache   available
Mem:            985         777          70          49         136          44
Swap:          2047         228        1819

Hm, ich frage mich, warum der Arbeitsspeicher auch nach einem Neustart ausgeht. Seit dem letzten Update habe ich auch nichts zusätzlich installiert.

Ich habe das gleiche Problem. Nicht genug Speicher für Node.js. Ich habe “export NODE_OPTIONS=”–max_old_space_size=4096 --some_other_option"" verwendet, aber das bringt keine Ergebnisse.

Habe beim Versuch, neu zu bauen, ebenfalls denselben Stacktrace erhalten. Die Installation ist relativ neu und wird nur für Entwicklung und Tests verwendet, also sollte meiner Meinung nach noch ausreichend Speicherplatz vorhanden sein?

OS: Ubuntu 20.04.1 LTS
Ausgabe von free -m:

root@discourse-test-environment:/var/discourse# free -m
              total        used        free      shared  buff/cache   available
Mem:            981         136         581           0         263         698
Swap:          2047         113        1934
1 „Gefällt mir“

Das liegt etwas unter dem Minimum von 1 GB. Sie können versuchen, den Swap-Speicher etwas zu erhöhen, aber ich empfehle mehr RAM.

Wenn Sie diesen Fehler erhalten, benötigen Sie mehr RAM (oder vielleicht Swap, aber RAM ist besser).

3 „Gefällt mir“

Okay, aber kannst du uns sagen, was der Grund für dieses neue Verhalten ist? Es funktioniert seit über einem Jahr mit dieser Konfiguration. Was macht Discourse jetzt anders als in der Vergangenheit?

1 „Gefällt mir“

Danke für die Empfehlung. Ja, etwas seltsam. Normalerweise habe ich mit der standardmäßigen 2-GB-Swap-Datei auf einem 5-Dollar-Droplet von Digital Ocean gut zurechtgekommen. Ich werde beobachten, ob dies mit den neuesten Updates oder sonst etwas häufiger vorkommt.

Jedenfalls habe ich in einer separaten Datei viel mehr Swap hinzugefügt (4 GB).

Aber das Upgrade ist trotzdem fehlgeschlagen. Vielleicht ist mehr RAM unverzichtbar. Das ist unerwartet, da die Instanz derzeit nur ein Topic und einen Benutzer hat. Ich frage mich auch, ob ich etwas tun muss, damit Discourse die Swap-Datei erkennt, oder ob sie standardmäßig verfügbar ist?

Meine neue Ausgabe von free -m:

              total        used        free      shared  buff/cache   available
Mem:            981         138         576           0         266         703
Swap:          6143         109        6034
1 „Gefällt mir“

Ja, ich bin ebenfalls auf einem Digital Ocean Droplet mit 1 vCPU und 1 GB vRAM :slight_smile:

1 „Gefällt mir“

Ich habe den Swap-Speicher auf 3 GB erhöht. Es funktioniert immer noch nicht und zeigt denselben Fehler.

1 „Gefällt mir“

Ich kann meine Testinstanz nur mit 2,5 GiB RAM + Swap neu aufbauen. Es ist jedoch möglich, dass deine Instanz mehr davon benötigt.

Hast du Plugins installiert? Ich vermute, dass eines von ihnen während der Kompilierung einen massiven Speicherverbrauch verursacht.

Kannst du ohne Plugins neu aufbauen und prüfen, ob das Problem damit behoben ist?

Danke für deinen Beitrag –

Aus reiner Neugier: Wie setzt sich das Verhältnis von RAM zu Swap zusammen? Zählst du dabei nur den verfügbaren (freien) Speicher auf beiden oder die gesamte Swap-Dateigröße plus den gesamten RAM der Instanz?

Ach ja, natürlich – ich hatte vergessen zu erwähnen, dass ich das Discourse OpenID Connect Authentication Plugin installieren möchte.

Zusätzlich ist bereits das Data Explorer Plugin installiert.


  • Erneuter Versuch nur mit Data Explorer + Docker Manager, aber leider ohne Erfolg; derselbe Stacktrace wie zuvor geteilt.
  • Erneuter Versuch ohne Plugins (nur Docker Manager), aber der Neuaufbau funktionierte immer noch nicht.

Ich werde weiter suchen, da ich außer dem Versuch, das ConnectID-Plugin hinzuzufügen, seit der ursprünglichen Installation nichts geändert habe.

Ich habe ein Problem, das möglicherweise mit folgendem Thread zusammenhängt: Trouble with `tests/test_helper`? - #2.

Ich habe versucht, die App ohne Plugins neu zu erstellen. Keine Änderung. Derselbe Fehler.

Ich verstehe das nicht, aber es sieht nach einem Fehler aus. Ich versuche, diese Seite zu bootstrappen. Keine nicht-standardmäßigen Plugins. Ich habe Assets einfach von einem Bucket in einen anderen verschoben, und alles funktioniert. Ich habe einen weiteren Neuaufbau durchgeführt, um DISCOURSE_S3_UPLOAD_BUCKET zur ENV hinzuzufügen, damit es nicht in der UX angezeigt wird. Als dies beim ersten Mal fehlgeschlagen ist, habe ich diese Zeile auskommentiert und es erneut mit derselben Konfiguration versucht, die vor drei Tagen funktioniert hat.


Done compressing embed-application-9cef8308c816fc1d83137e63d6c556c6cc2b68fe2b6e5ce16cca6766ba2c0ae4.js : 0.17 secs

844614.350963717 Compressing: discourse/tests/test_helper-8590b31b8e73c4172aeea4a4a6bd1930ccbce2547a20d831a30d457ba092a631.js
terser '/var/www/discourse/public/assets/discourse/tests/_test_helper-8590b31b8e73c4172aeea4a4a6bd1930ccbce2547a20d831a30d457ba092a631.js' -m -c -o '/var/www/discourse/public/assets/discourse/tests/test_helper-8590b31b8e73c4172aeea4a4a6bd1930ccbce2547a20d831a30d457ba092a631.js' --source-map "base='/var/www/discourse/public/assets/discourse/tests',root='/assets/discourse/tests',url='https://CORRECT_CDN_ADDRESS.b-cdn.net/assets/discourse/tests/test_helper-8590b31b8e73c4172aeea4a4a6bd1930ccbce2547a20d831a30d457ba092a631.js.map'"
Killed
rake aborted!
Errno::ENOENT: No such file or directory @ rb_file_s_size - /var/www/discourse/public/assets/discourse/tests/test_helper-8590b31b8e73c4172aeea4a4a6bd1930ccbce2547a20d831a30d457ba092a631.js
/var/www/discourse/lib/tasks/assets.rake:290:in `size'
/var/www/discourse/lib/tasks/assets.rake:290:in `block (4 levels) in <main>'
/var/www/discourse/lib/tasks/assets.rake:181:in `block in concurrent?'
/var/www/discourse/lib/tasks/assets.rake:281:in `block (3 levels) in <main>'
/var/www/discourse/lib/tasks/assets.rake:272:in `each'
/var/www/discourse/lib/tasks/assets.rake:272:in `block (2 levels) in <main>'
/var/www/discourse/lib/tasks/assets.rake:181:in `concurrent?'
/var/www/discourse/lib/tasks/assets.rake:269:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.3/exe/rake:27:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => assets:precompile
(See full trace by running task with --trace)
I, [2021-04-26T18:38:36.072881 #1]  INFO -- : Updating Discourse Loading Slider...
Downloading MaxMindDB...
Compressing Javascript and Generating Source Maps

Ich habe mich gefragt, ob es ein Problem mit der CDN-URL geben könnte, aber alle Zeilen oben enthielten sie und funktionierten einwandfrei.

Bedeutet das, dass es fehlerhaftes CSS in ihrem Theme gibt? Wenn ja, oje. Es gibt nur etwas CSS in ihrem Master-Theme. Außerdem diese Komponenten: https://github.com/discourse/DiscoTOC.git und https://github.com/davidtaylorhq/discourse-loading-slider.git

Ist dies eine Droplet der Mindestgröße? Es sieht so aus, als wäre diese Datei für Terser schwer zu komprimieren, da sie zu einem hohen Speicherdruck führt.

Oh. Es ist überraschend klein. Es ist eine Seite, von der ich denke, dass ihr sie vor einigen Jahren eingerichtet habt (als ihr noch eine Seite außerhalb eurer Infrastruktur betrieben habt).

root@community:/var/discourse# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        1.2G        101M        259M        655M        354M
Swap:          2.0G        1.2G        773M

Ah. OK. Es ist ein 2 GB DO-Droplet, und ich habe Zugriff auf deren Kontrollpanel. Ich werde ihnen sagen, dass wir ein Upgrade auf 4 GB benötigen und sie auf einen AMD-Migration verlegen müssen.

EDIT: Aber wenn es nur darum geht, diese eine Datei zu komprimieren, sollte ein 2 GB-Droplet dann nicht ausreichen?

Diese Test-Helfer-Datei belastet die Komprimierung stark.

  • UglifyJS benötigt 1,5 GB RAM, um sie zu komprimieren.

  • Terser benötigt etwas mehr als 1 GB. Die Dauer beträgt 40 Sekunden. Zum Vergleich: Derselbe Server benötigt für Ember+jQuery nur 8 Sekunden :scream:

@eviltrout Sollen wir diese Datei überhaupt in der Produktion haben?

Ah, sieht so aus, als käme sie von dieser Änderung von @Osama:

-rw-r--r-- 1 discourse discourse  14M Apr 26 19:13 _test_helper-f4c4b5bf0657eab910d85b9a65b4bddbbbe2ce2ba603b17fe11b3d633d324e34.js
-rw-r--r-- 1 discourse discourse 6.6M Apr 26 19:14 test_helper-f4c4b5bf0657eab910d85b9a65b4bddbbbe2ce2ba603b17fe11b3d633d324e34.js
-rw-r--r-- 1 discourse discourse 1.1M Apr 26 19:14 test_helper-f4c4b5bf0657eab910d85b9a65b4bddbbbe2ce2ba603b17fe11b3d633d324e34.js.br
-rw-r--r-- 1 discourse discourse 1.5M Apr 26 19:14 test_helper-f4c4b5bf0657eab910d85b9a65b4bddbbbe2ce2ba603b17fe11b3d633d324e34.js.gz
-rw-r--r-- 1 discourse discourse 5.7M Apr 26 19:14 test_helper-f4c4b5bf0657eab910d85b9a65b4bddbbbe2ce2ba603b17fe11b3d633d324e34.js.map
8 „Gefällt mir“

Nur als weiterer Datenpunkt: Ich erlebe die Fehler beim Neuaufbau weiterhin, auch nachdem ich die beiden Theme-Komponenten entfernt habe. Ich verwende also nur das Standard-Theme „Light".

Außerdem: Woher stammt diese Ausgabe? Ich möchte das auf meiner Seite ebenfalls überprüfen/debuggen. Ist das eine Art ausführliche Option für ./launcher rebuild app?

Um das ordnungsgemäß zu beheben, wird es etwas dauern, also werde ich diese Änderung vorerst rückgängig machen.

9 „Gefällt mir“