앱을 다시 빌드할 수 없음

로그:

[2025-03-31T05:52:21.927771 #1]  INFO -- : > cd /var/www/discourse && if [ -f yarn.lock ]; then
  if [ -d node_modules/.pnpm ]; then
    echo "This version of Discourse uses yarn, but pnpm node_modules are preset. Cleaning up..."
    find ./node_modules ./app/assets/javascripts/*/node_modules -mindepth 1 -maxdepth 1 -exec rm -rf {} +
  fi
  su discourse -c 'yarn install --frozen-lockfile && yarn cache clean'
else
  su discourse -c 'CI=1 pnpm install --frozen-lockfile && pnpm prune'
fi
bash: line 1:   302 Killed                  CI=1 pnpm install --frozen-lockfile
I, [2025-03-31T05:52:29.299652 #1]  INFO -- : Scope: all 17 workspace projects
Lockfile is up to date, resolution step is skipped
Progress: resolved 1, reused 0, downloaded 0, added 0
Packages: +455 -114
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------
Progress: resolved 455, reused 170, downloaded 50, added 119
Progress: resolved 455, reused 170, downloaded 187, added 257
Progress: resolved 455, reused 170, downloaded 281, added 349
Progress: resolved 455, reused 170, downloaded 285, added 357, done
.../core-js@3.33.0/node_modules/core-js postinstall$ node -e "try{require('./postinstall')}catch(e){}"
.../node_modules/@swc/core postinstall$ node postinstall.js
.../esbuild@0.24.2/node_modules/esbuild postinstall$ node install.js
.../core-js@3.33.0/node_modules/core-js postinstall: Done
.../node_modules/@swc/core postinstall: Failed



FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && if [ -f yarn.lock ]; then
  if [ -d node_modules/.pnpm ]; then
    echo "This version of Discourse uses yarn, but pnpm node_modules are preset. Cleaning up..."
    find ./node_modules ./app/assets/javascripts/*/node_modules -mindepth 1 -maxdepth 1 -exec rm -rf {} +
  fi
  su discourse -c 'yarn install --frozen-lockfile && yarn cache clean'
else
  su discourse -c 'CI=1 pnpm install --frozen-lockfile && pnpm prune'
fi failed with return #<Process::Status: pid 299 exit 137>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"yarn", "cmd"=>["if [ -f yarn.lock ]; then\n  if [ -d node_modules/.pnpm ]; then\n    echo \"This version of Discourse uses yarn, but pnpm node_modules are preset. Cleaning up...\"\n    find ./node_modules ./app/assets/javascripts/*/node_modules -mindepth 1 -maxdepth 1 -exec rm -rf {} +\n  fi\n  su discourse -c 'yarn install --frozen-lockfile && yarn cache clean'\nelse\n  su discourse -c 'CI=1 pnpm install --frozen-lockfile && pnpm prune'\nfi"]}
bootstrap failed with exit code 137
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.

기억이 맞다면, Exit 137은 메모리 부족을 의미합니다.

RAM을 추가하고/또는 스왑 공간을 늘리세요. 아마도 스왑+RAM 합계로 최소 5GB가 필요할 것입니다.


               total        used        free      shared  buff/cache   available
Mem:            31Gi       4.1Gi        17Gi       3.5Mi       9.9Gi        27Gi
Swap:          8.0Gi          0B       8.0Gi

하지만 제 서버 메모리는 충분합니다.. @pfaffman

정말 이상하네요. 137은 작업이 SIGKILL을 받았다는 것을 의미하며, 보통 이는 메모리 부족(OOM)을 뜻합니다.

하지만 메모리가 그렇게나 많은 상황에서 그런 일이 일어나는 것은 말이 되지 않아요.

이상합니다.

아마도 다음 출력을 확인해 보시는 것이 좋을 것 같습니다.
sysctl vm.overcommit_memory

그리고:

cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=24.04
DISTRIB_CODENAME=noble
DISTRIB_DESCRIPTION="Ubuntu 24.04.2 LTS"

$ uptime
 02:12:36 up 21 days,  5:25,  2 users,  load average: 0.02, 0.18, 0.26

$ df -h /
Filesystem                             Size  Used Avail Use% Mounted on
/dev/mapper/vg0--root-root--partition  492G   29G  463G   6% /

$ free
               total        used        free      shared  buff/cache   available
Mem:        32819356     4093776    19016296        3576    10185012    28725580
Swap:        8388604           0     8388604

$ swapon
NAME      TYPE SIZE USED PRIO
/swap.img file   8G   0B   -2

$ vmstat 5 5
procs -----------memory---------- ---swap-- -----io---- -system-- -------cpu-------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st gu
 2  0      0 18944824   3620 10211784    0    0     2    81 1057    1  1  0 99  0  0  0
 0  0      0 18965764   3620 10195160    0    0     0   123 8661 10955  3  6 91  0  0  0
 2  0      0 18953904   3620 10203228    0    0     0     9 3388 3559  1  1 98  0  0  0
 1  0      0 18864336   3620 10292272    0    0     3  3408 8327 10272  6  4 90  0  0  0
 9  3      0 17795380   3620 10561284    0    0  1666 33519 29310 41403 27 27 44  1  0  0

dmesg|egrep -i "memory|oom|kill"
none

$ ps auxrc
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
td20      347732  200  0.0  21408  5588 pts/1    R+   02:16   0:00 ps

$ sysctl vm.overcommit_memory
vm.overcommit_memory = 0


@Ed_S

메모리 사용량이 1GB를 초과하면 프로세스가 빠르게 종료되는 것을 확인했습니다.

감사합니다… 제게는 여전히 조금 미스터리한 부분이네요. 하지만 overcommit을 실행하는 것을 강력히 추천합니다. 지금은 다음과 같이 설정할 수 있습니다.

sudo sysctl vm.overcommit_memory=1

다만 재부팅 후에도 설정이 유지되도록 하려면 조금 더 노력이 필요합니다. 이렇게 하면 모든 것이 정상 작동할 수 있으며, 그렇다면 설정을 영구적으로 만드는 것이 올바른 선택이 될 것입니다. 제가 했던 방식은 한 줄짜리 파일을 만들어서 설정한 것이었는데, 다음과 같습니다:

# cat /etc/sysctl.d/90-vm_overcommit_memory.conf 
vm.overcommit_memory=1

이것이 도움이 되지 않는다면, 어떤 워치독(watchdog)이나 쿼타(quota)가 리소스 과용을 감시하다가 프로세스를 종료시키는 것처럼 보입니다. 최근에 실패가 있었다면 전체 dmesg 출력을 살펴보는 것이 도움이 될 수 있습니다 - 아마도 마지막 100줄 정도를 보면 단서를 찾을 수 있을 것입니다.