성능 병목 현상을 어떻게 파악하나요?

이 내용에 대해 검색을 시도해 보았지만 최근에 게시된 내용을 찾지 못해서, 무엇이 정상적이고 기대할 수 있는 것인지 확인하기 위해 질문을 남깁니다.

최근 다른 포럼에서 넘어왔는데, 첫 번째 페이지 로딩은 비교적 빠른 편입니다. 하지만 Discourse에서는 페이지가 로드된 후에도 페이지가 렌더링될 때까지 회전하는 원형 로딩 인디케이터가 표시되는데, 이것이 서버 지연인지, 아니면 서버에서 반환된 결과를 기반으로 클라이언트/JS가 페이지를 구성하는 데 걸리는 지연인지 확실하지 않습니다.

지연 시간은 약 5~10초 정도이며, 그 이후에는 일반적으로 성능이 좋은 편입니다.

이 문제가 서버/호스팅 쪽에 있을 가능성이 크다면, 일반적인 원인은 무엇일까요? 모든 지표(CPU, 디스크, 메모리)가 낮게 나타나고 최대치에 도달하지 않은 것 같아서, 결과가 서버와 실제로 관련이 없다면 어디에 예산을 투자해야 할지 모르겠습니다. Discourse가 무엇에 시간을 소비하고 있는지 보여줄 수 있는 모니터링하거나 관찰할 수 있는 지표에 대한 팁이 있을까요?

여기서 첫 페이지가 얼마나 멀리 렌더링되는지 확인할 수 있습니다. cdn night이 도움이 될 수 있습니다.

얼마나 멀리요? 여기서 어디로요?

사용 중인 Discourse 버전은 무엇인가요?

확인/테스트 중인 주제에 있는 게시글은 몇 개인가요?

Fast와 Meta 때문인 것 같습니다 :wink:

최신 2.8.x 버전이며 사용자 수는 약 30명뿐입니다. 듀얼 코어 vCPU, 2GB RAM, SSD 디스크 환경에서 실행 중입니다.

앞서 언급했듯이 서버의 모든 메트릭에서 부하가 전혀 나타나지 않아, 페이지가 완전히 렌더링되기 전에 5초 동안 로딩 스피너가 표시되는 이유를 이해할 수 없습니다.

즉, 점검하거나 모니터링할 항목이 전혀 없고, 설치만 하면 모든 것이 잘 작동할 것이라고 기도하기만 하면 되는 건가요?

사실 서버가 콜드 상태가 되고, 꽤 오랜 시간 동안 새로고침이 이루어지지 않은 페이지를 요청하는 것과 더 비슷합니다. 백엔드 부분이 휴면 상태로 전환되거나 하는 건가요? 즉, 사용 빈도가 낮으면 첫 번째 사용자가 보통보다 조금 더 오래 기다려야 할 가능성이 있는 건가요?

30명이라고 하셨을 때, 동시 접속자를 의미하시나요, 아니면 전체 사용자 수를 말씀하시는 건가요?

만약 동시 접속자가 30명이라면, 현재 사양이 다소 낮을 수 있습니다.

평균 메모리 사용률은 어떻게 되나요? 30-50-80% 정도인가요?

우연히 GA(구글 애널리틱스)의 속도 및 성능 차트를 보고 있었는데, 2.2에서 2.9로 업그레이드한 이후로 변화가 있는 것 같아 보입니다. 성능이 오히려 떨어졌는데, 좀 더 자세히 살펴봐야 할 것 같습니다. 개인적으로는 체감할 만한 속도 저하가 없었고, 오히려 더 빨라진 느낌입니다. 그래서 저는 무엇을 아는 건가요, 아니면 GA가 더 잘 아는 건가요, 헷!

또한 토픽당 10,000개의 게시물 제한에 대해서도 읽었습니다. 게시물이 많으면 화면에 표시하기 전에 전체를 메모리에 로드해야 한다고 생각하는데, 이 과정 때문에 처음 볼 때 느리게 느껴지는 것 같습니다.

한 번 로딩이 끝나면 그 뒤로는 전부 빠르다고 느낍니다. 저는 전문가가 아니지만, 브라우저 문제일 수도 있고, 디스코urs(Discourse) 경험을 전달하기 위해 사용된 다양한 기술적 요인 때문일 수도 있다고 생각합니다.

이것은 호스트의 VPS인가요, 아니면 다른 것인가요? 어떻게 설치했나요? 어떤 2vcpu인지 아는 것이 도움이 됩니다. 모든 프로세서가 동일한 성능을 갖지는 않으므로요.

인스턴스와 클라이언트 사이에 무언가가 있나요? 리버스 프록시나 CloudFlare 같은 것 말이에요?

드디어 개발자 도구를 열어 몇 가지 오류 메시지를 확인했습니다… a) 폰트가 없거나 찾지 못하는 것 같고, b) 올바른 FQDN 대신 IP를 사용하고 있는데, 이 IP가 정확한지 확실하지 않습니다.

The FetchEvent for "https://35.212.139.150/fonts/Roboto-Regular.ttf?v=0.0.9" resulted in a network error response: the promise was rejected.
Promise.then (async)
(anonymous) @ Router.mjs:60
The FetchEvent for "https://35.212.139.150/fonts/Roboto-Bold.ttf?v=0.0.9" resulted in a network error response: the promise was rejected.
Promise.then (async)
(anonymous) @ Router.mjs:60
NetworkFirst.mjs:167 Uncaught (in promise) no-response: no-response :: [{"url":"https://35.212.139.150/fonts/Roboto-Regular.ttf?v=0.0.9"}]
    at a.makeRequest (https://community.hubivue.com/javascripts/workbox/workbox-strategies.prod.js:1:2145)
makeRequest @ NetworkFirst.mjs:167
color_definitions_light_4_1_530ebcc4a553d42866a6f343d784841cf5c0b816.css:1          GET https://35.212.139.150/fonts/Roboto-Regular.ttf?v=0.0.9 net::ERR_FAILED
NetworkFirst.mjs:167 Uncaught (in promise) no-response: no-response :: [{"url":"https://35.212.139.150/fonts/Roboto-Bold.ttf?v=0.0.9"}]
    at a.makeRequest (https://community.hubivue.com/javascripts/workbox/workbox-strategies.prod.js:1:2145)
makeRequest @ NetworkFirst.mjs:167
color_definitions_light_4_1_530ebcc4a553d42866a6f343d784841cf5c0b816.css:1          GET https://35.212.139.150/fonts/Roboto-Bold.ttf?v=0.0.9 net::ERR_FAILED

Google Cloud VM이며, 호스트와 웹 사이에 아무것도 없습니다 / CDN 없음

좋아요, 이 인스턴스를 Google에서 호스팅하고 있는 것 같습니다.

DNS 이름보다 먼저 IP 주소로 설치하려고 시도한 사람이 있었나요?

놀랍네요… 폰트 선택을 기본값(예: Arial)으로 되돌렸더니 모든 것이 정상적으로 작동합니다. 설정에서 폰트를 선택할 때 버그가 있거나 뭔가 문제가 있는 것 같습니다. 일단 해결했고, 당분간 Arial을 사용하겠습니다.

아마도 그럴 것입니다. 확실하지는 않습니다. 그게 문제라면 원래대로 되돌리는 방법이 있을까요?

IP 주소를 사용해 본 후 호스트네임으로 전환한 방식에 따라 다릅니다.

표준 설치(Standard Install) 단계에 따라 설치되었나요? 인스턴스를 설정한 담당자에게 연락하여 어떤 작업이 수행되었는지 확인해 보시는 것이 좋습니다. IP 주소가 다른 곳에 여전히 참조되고 있을 수 있습니다.

설치를 되돌리거나 이 문제를 해결할 수 있는 명령어가 있나요? 호스트 이름을 한 번도 변경할 수 없다는 것이 좀 황당합니다. 의도적인 제한인가요?

기본 글꼴이 사용되면서 현재 성능은 문제가 없는 것으로 보입니다. 문제는 Google Roboto 글꼴 사용과 관련이 있는 것 같습니다.

이 가이드를 대략 따라가면 되는 것 같네요…

한번 시도해 보는 것은 해롭지 않지만, 인스턴스의 이력을 전혀 모른다면 공식적으로 지원되는 설치인지 확인조차 할 수 없습니다.