빌드 시간이 매우 오래 걸립니다

재구축에 약 10분 정도 걸립니다. 예전에는 5분 정도였던 것 같은데, 큰 문제는 아닙니다. 그런데 에러 메시지는 무슨 뜻인가요? 위에 원본 게시물에 있는 것과 비슷한 메시지가 나옵니다:

I, [2022-06-20T21:41:47.107238 #1]  INFO -- : > cd /var/www/discourse && [ ! -d 'node_modules' ] || su discourse -c 'yarn install --production && yarn cache clean'
warning "eslint-config-discourse > eslint-plugin-lodash@7.1.0" has unmet peer dependency "lodash@>=4".
warning " > @mixer/parallel-prettier@2.0.1" has unmet peer dependency "prettier@^2.0.0".

이 글에 추가할 내용도 있습니다. 저는 리소스가 매우 제한적인 시스템(1GB RAM)에서 작은 사이트를 운영하고 있습니다. 유니콘(unicorn) 워커가 2개였는데, 각각이 메모리의 30%를 차지하고 있어 상당한 메모리 스래싱이 발생했습니다. 그래서 워커 수를 2개에서 1개로 줄이기로 했습니다(1개당 약 10개의 동시 연결을 처리할 수 있다고 생각했습니다). 이 변경으로 인해 큰 차이가 생겼으며, 페이지 로딩이 거의 즉시 이루어지고 스와핑이 5~10배(로드되는 내용에 따라 다름) 감소했습니다.

현재 파악되는 단점은 브라우저 업그레이드를 통해 디스코르스를 업데이트할 수 없다는 점입니다. 브라우저를 통해 업데이트를 시도하면 다음과 같은 오류가 발생합니다.

ABORTING, you do not have enough unicorn workers running
Docker Manager: FAILED TO UPGRADE
#<RuntimeError: Not enough workers>

따라서 참고해 주실 점입니다. 유니콘 워커가 1개일 때 브라우저 업그레이드를 수행하는 문제에 대해 디스코르스 팀이 해결하거나 대응할 수 있는지에 대해서는 확실하지 않습니다.

이것은 버그인 것 같습니다. 특히 시스템이 잠시 후 곧바로 단일 유니콘으로 축소되기 때문입니다.

숫자 2는 하드코딩되어 있으며, 축소 시 사용되는 숫자 1도 마찬가지입니다.

수정: 이 변경 사항이 불일치를 도입한 것으로 보입니다.

저의 게시글(그리고 이 답글)은 버그 카테고리에 있는 새로운 스레드로 이동해야 한다고 생각합니다.

이것이 어떻게 작동하나요?

업그레이드 프로세스를 처리하는 유니콘(프로세스) 하나와, 나머지 유니콘이 기존 호출을 처리하는 방식인가요?

따라서 온라인 업그레이드를 수행하려면 최소 2개의 유니콘 워커가 필요하다는 말씀인가요…?

이것은 틀렸습니다. 단일 Unicorn 인스턴스는 한 번에 하나의 요청만 처리할 수 있으므로, 소규모 그룹에는 사용할 수 있지만 대부분의 웹사이트에는 권장하지 않습니다.

@Falco 다른 관리자분들의 데이터를 살펴봤습니다. 제 이해로는 각 Unicorn이 수신된 연결마다 새로운 프로세스를 포크(fork)하는 것 같습니다. 따라서 기술적으로는 한 번에 하나의 연결만 처리하지만, 각 Unicorn은 여러 동시 사용자를 처리할 수 있습니다.

아래에서 공유된 경험을 바탕으로, 약 8개의 Unicorn이 약 400명의 동시 사용자를 처리할 수 있는 것으로 보입니다.

이를 근거로 볼 때, 각 Unicorn은 약 50명의 동시 사용자를 처리할 수 있는 것으로 보입니다. 물론 RAM과 시스템 리소스는 포크할 수 있는 프로세스 수 등에 영향을 미치기 때문에, 저사양 시스템(1GB)의 경우 1개의 Unicorn 워커가 최소 10명의 동시 사용자를 처리할 수 있다고 가정했습니다.

제 가정과 결론이 완전히 틀린 것일까요? 만약 그렇다면, 시스템 리소스에 따라 각 Unicorn이 처리할 수 있는 동시 사용자 수는 어느 정도일까요? (하한은 1GB, 상한은 적절하다고 판단되는 수준으로 가정해 주세요)

동시 사용자 세션과 동시 연결에는 차이가 있습니다. 세션은 온라인 사용자를 의미하며, 각 사용자는 상호작용할 때마다 요청(연결)을 생성합니다.

그렇지 않습니다. Unicorn은 시작 시점에 고정된 수의 워커 프로세스로 포크됩니다.

그리고, 각 워커 프로세스가 10개의 스레드를 실행한다고 보았습니다.