Сбой инициализации из-за убийства процесса по нехватке памяти

Всем привет,

Я хочу обновить свой Discourse командой ./launcher rebuild app. Она работала нормально около года. Я обновляю его, если это необходимо, каждые 2–4 недели.

У меня 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

Сегодня процесс остановился с этой ошибкой:

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 ** пожалуйста, прокрутите вверх и поищите более ранние сообщения об ошибках, их может быть несколько.
./discourse-doctor может помочь в диагностике проблемы.

Первая ошибка выше этого сообщения была:

<--- 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 не работает после этого. Он запускается только после перезагрузки сервера. Но после этого я не могу снова запустить rebuild app — та же ошибка.

Можете помочь мне разобраться?

С наилучшими пожеланиями

На вашем сервере заканчивается память во время запуска. Можете ли вы предоставить вывод команды free -m?

1 лайк
**@**:~# free -m
              total        used        free      shared  buff/cache   available
Mem:            985         777          70          49         136          44
Swap:          2047         228        1819

Хм, меня беспокоит, что память заканчивается даже после перезагрузки. После последнего обновления я ничего дополнительно не устанавливал.

У меня та же проблема. Недостаточно памяти для nodejs.
Я использовал “export NODE_OPTIONS=”–max_old_space_size=4096 --some_other_option"", но это не дало результата.

Также получил тот же стек трассировки при попытке пересборки. Установка относительно новая, я использую её только для разработки и тестирования, так что, думаю, места должно быть ещё достаточно?

ОС: Ubuntu 20.04.1 LTS
вывод команды 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 лайк

Это немного ниже минимального значения в 1 ГБ. Можно попробовать немного увеличить файл подкачки, но я бы рекомендовал добавить больше оперативной памяти.

Если вы получаете эту ошибку, вам нужно больше оперативной памяти (или, возможно, файла подкачки, но оперативная память предпочтительнее).

3 лайка

Хорошо, но можете ли вы объяснить причину этого нового поведения? Такая конфигурация работала уже более года. Чем сейчас Discourse отличается от того, каким он был раньше?

1 лайк

Спасибо за рекомендацию. Да, немного странно — обычно мне удавалось обойтись файлом подкачки по умолчанию размером 2 ГБ на droplet за $5 от Digital Ocean. Буду следить, станет ли это более распространённым явлением с последними обновлениями или из-за чего-то ещё.

В любом случае, я добавил ещё больше места подкачки (4 ГБ) в отдельный файл.

Но обновление всё равно не прошло. Возможно, больше оперативной памяти — это обязательное требование. Это неожиданно, ведь на данный момент на инстансе работает всего одна тема и один пользователь. Также интересно, нужно ли мне что-то делать, чтобы Discourse знал, что нужно использовать подкачку, или она доступна по умолчанию?

Вот мой новый вывод команды free -m:

              total        used        free      shared  buff/cache   available
Mem:            981         138         576           0         266         703
Swap:          6143         109        6034
1 лайк

Да, я тоже на Droplet от Digital Ocean с 1 vCPU и 1 ГБ vRAM :slight_smile:

1 лайк

Я увеличил файл подкачки до 3 ГБ. Проблема не решена, ошибка осталась прежней.

1 лайк

Я могу пересобрать свой тестовый экземпляр, имея всего 2,5 ГиБ оперативной памяти и свопинга. Однако возможно, что вашему экземпляру требуется больше ресурсов.

У вас установлены какие-либо плагины? Я подозреваю, что один из них вызывает огромный расход памяти во время компиляции.

Можете ли вы пересобрать проект без плагинов и проверить, решит ли это проблему?

Спасибо за ваш комментарий-

Из любопытства: как именно распределены объёмы оперативной памяти и swap? И учитываете ли вы только «свободное» место в обоих, или общий размер файла swap плюс общий объём оперативной памяти экземпляра?

Ах, конечно — я забыл упомянуть, что планирую установить плагин Discourse OpenID Connect Authentication.

Также у меня уже установлен плагин Data Explorer.


  • Попытался снова, установив только Data Explorer и Docker Manager, но безрезультатно: тот же стектрейс, что и раньше.
  • Попытался снова без плагинов (только Docker Manager), но пересборка всё равно не удалась.

Буду продолжать поиск, так как, кроме попытки добавить плагин ConnectID, я ничего не менял с момента первоначальной установки.

У меня возникла проблема, которая, возможно, связана с этим: Trouble with `tests/test_helper`? - #2.

Я попытался пересобрать приложение без каких-либо плагинов. Изменений нет. Та же ошибка.

Я не понимаю, что происходит, но похоже на ошибку. Я пытаюсь выполнить сборку (bootstrap) этого сайта. Никаких нестандартных плагинов. Я просто переместил файлы из одного бакета в другой, и всё работало. Я делал ещё одну пересборку, чтобы добавить DISCOURSE_S3_UPLOAD_BUCKET в ENV, чтобы он не отображался в интерфейсе. Когда это не сработало в первый раз, я закомментировал эту строку и попытался снова с той же конфигурацией, которая работала 3 дня назад.


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

Я подумал, не проблема ли это в URL CDN, но все строки выше включали его и работали нормально.

Означает ли это, что в их теме есть ошибка в CSS? Если да, то ой. В их мастер-теме есть только немного CSS. Также есть эти компоненты: https://github.com/discourse/DiscoTOC.git и https://github.com/davidtaylorhq/discourse-loading-slider.git

Это Droplet минимального размера? Похоже, этот файл довольно сложен для сжатия через Terser, так как создает значительную нагрузку на память.

О. Это удивительно мало. Это сайт, который, как я полагаю, вы настроили несколько лет назад (когда вы ещё запускали сайты не на своей инфраструктуре).

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

А, понятно. Это дроплет DO на 2 ГБ, и у меня есть доступ к их панели управления. Я скажу им, что нам нужно обновить его до 4 ГБ и перенести на AMD.

РЕДАКТИРОВАНО: Но если речь идёт только о сжатии одного файла, разве дроплет на 2 ГБ не должен быть достаточным?

Этот файл-помощник для тестирования сильно нагружает компрессор.

  • UglifyJS использует 1,5 ГБ ОЗУ для его сжатия.

  • Terser использует чуть более 1 ГБ. Занимает 40 секунд. Для сравнения: тот же сервер тратит 8 секунд на сборку с Ember+jQuery :scream:

@eviltrout, нужно ли вообще включать этот файл в продакшн?

О, похоже, это результат изменений от @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 лайков

Хочу добавить ещё один факт — после удаления двух компонентов темы сбои при перестроении всё ещё продолжаются. То есть используется только стандартная тема Light.

Также, откуда этот вывод? Хочу немного проверить и отладить это на своей стороне. Это похоже на опцию подробного вывода для ./launcher rebuild app?

Чтобы исправить это должным образом, потребуется немного времени, поэтому пока я отменю это изменение.

9 лайков