활동량이 많을 때 실시간 토픽 업데이트가 멈춤

@sam

이 설정을 적용했을 때 UX가 더 좋았습니다. 네, 몇 가지 “막힘” 현상이 있었고, Chrome 인스펙터에서 429 오류가 여러 건 기록되었습니다. CPU 부하는 낮았습니다. 하지만 다시 말하지만, 당시에는 비교적 한가한 홈 게임이었기 때문입니다(많은 활성 멤버가 현장에 있었고 채팅을 하지 않았습니다).

구체적으로 어떤 설정을 조정해야 하는지는 명확히 말하기 어렵지만, 제 다소 주관적인 경험에 따르면 다음과 같습니다:

  • 코드의 기능은 여전히 서버 부하에 대해 지나치게 방어적입니다. 서버 스트레스 수준을 약간 더 높게 허용할 수 있을지도 모릅니다.
  • 클라이언트가 백오프(백오프 전략)할 때, UX 관점에서 지연 시간이 너무 깁니다. 게임은 계속 진행되며 1분 동안 많은 일이 일어날 수 있습니다. 채팅이 동기화를 잃고, 사람들이 게임의 서로 다른 이벤트에 대해 언급하게 됩니다. (이것은 실시간 vs 케이블 TV vs IPTV vs 20초 Chromecast 버퍼 등 사이의 다양한 시간 지연 문제로 이어지는 문제를 악화시킵니다.)
  • 사용자는 채팅이 멈췄다는 것만 보고, 사이트가 여전히 온라인이고 활성 상태라는 어떤 표시도 받지 못합니다. 이로 인해 사용자는 페이지를 새로고침하거나 다른 작업을 수행할 가능성이 높아지며, 이는 높은 부하를 더 악화시킵니다.

문제를 좁혀 보기 위해 서버를 8 vCore, 32GB RAM으로 업그레이드했습니다. DB 버퍼를 16GB, 유니콘(프로세스) 수를 16으로 설정하고, 나머지 설정은 기본값으로 되돌렸습니다.

불행히도 업그레이드는 큰 효과를 보지 못했습니다. 중간 수준의 활동량에서도 Rapid discussions가 지속적으로 동결됩니다.

요즘 성능은 처참합니다. Prometheus 등을 살펴봐야 할 것 같습니다. v2.3 이후 소프트웨어 성능이 심각하게 퇴보했다고 95% 확신합니다.

형 @Iceman의 코멘트는 9월에 대부분 무시되었습니다. 그는 어떤 하드웨어를 투입하든 체킹(동결)이 일어난다고 보고했습니다.

Redis 병목 현상을 겪고 있을 가능성이 있다고 의심하지만, 여러 번 말씀드렸듯이 해당 통계를 수집해야만 확신을 가질 수 있습니다. 이를 제공하지 않으면 점성술을 쓰는 것과 다를 바 없습니다.

제 의심이 맞다면, 느린 코어와 RAM을 더 많이 추가해도 문제가 해결되지 않는 이유를 설명해 줄 것입니다. Redis는 단일 스레드이므로, 성능을 확장하려면 고성능 코어를 사용하는 것 외에는 방법이 없습니다.

이번 달 말까지 2.6 최종 버전과 함께 Redis 6 및 이를 효과적으로 활용할 수 있는 새로운 app.yml 변수가 포함된 새로운 이미지를 배포할 예정입니다. 미리 테스트해 보고 싶으시면 말씀해 주세요. 관련 지침을 안내해 드리겠습니다.

마감된 토픽에서 이 내용을 방금 발견했습니다. @codinghorror - 그 설명은 정확하지 않습니다. 높은 부하 상황에서 최종 사용자가 실제로 경험하는 내용은 다음과 같습니다:

  1. 로그아웃되었다는 알림을 받습니다.
  2. 사이트 인덱스 페이지로 이동합니다.
  3. 인덱스 페이지에 높은 부하 상태임을 알리는 배너 알림이 표시됩니다.

사용자는 실제로 로그아웃된 상태가 아닙니다. 일반적으로 사용자가 다시 해당 활성 토픽으로 돌아가면 사이트가 정상적으로 작동합니다.

다시 한번 말씀드리자면, 수천 개의 사이트 중에서도 여러분의 사이트보다 훨씬 더 많은 트래픽을 처리하는 사이트들이 있는데도 이 문제를 보고하는 고객이 없습니다. 따라서 이 시점에서 더 이상의 논의는 사실상 무의미합니다. 왜냐하면 여러분 측에서 발생할 수 있는 특이한 구성 환경이나 하드웨어 성능 관련 이상 현상에 대해 저희는 전혀 파악할 수 없기 때문입니다.

앞으로 상황이 개선되어 실제 문제에 대한 가시성이 높아지기를 희망합니다.

저는 고부하 상황이 발생했을 때 실제 UI/UX가 어떻게 되는지 보고했을 뿐입니다. 다른 의도는 없습니다.

해당 동작은 사용자가 주제 페이지에 머물러 있으며, 로그아웃된 뷰가 표시되어야 합니다. 홈 페이지로 이동해서는 안 됩니다.

아마도 맞으실 겁니다. Redis 문제입니다. 새로운 기본 이미지가 상황을 개선했지만, 이제 서버의 처리 능력을 초과하고 있습니다.

그럴 수도 있지만, 현실에서는 그렇게 작동하지 않습니다. 방금 1분 전에 재현해 보았습니다.

음, 적어도 그 문제에는 알려진 해결책이 있습니다: :moneybag:

해결책: 더 간결하고 날카로운 코드를 작성하는 것 :wink:

그래서 Redis가 병목 현상을 일으키고 있다면, 어떻게 수평 확장(horizontally scale)할 것인가요?

지난 시즌 이후로 무엇이 변했는지 여전히 의아합니다. 유기적 성장이나 게임 채팅 인기가 크게 늘어난 것으로 보이지 않거든요. 그럼에도 불구하고 우리의 서비스 제공 능력은 크게 감소했고, 가장 조용한 게임에서도 버티기 힘들어하고 있습니다.

현재 설치 환경에서 수집한 지표와 과거 인스턴스에서 수집한 지표를 동일한 하드웨어 환경에서 비교해 볼 때까지, 이는 미스터리로 남을 것입니다.

전체적인 차이는 VPS 제공업체가 물리 서버를 다른 것으로 변경했거나, 노이시 네이바(noisy neighbour) 문제가 발생했거나, 현재 VPS에서 각 물리 서버당 평균 13개였던 공동 호스팅 서비스가 17개로 증가했기 때문일 수도 있습니다.

VPS 제공업체에게 문제를 넘기는 것에 대해 추측하지 말아 주세요. UpCloud은 시장에서 가장 우수한 업체 중 하나이며, 자사 측에서 특별한 이상이 없는지 확인을 마쳤습니다. 해당 업체는 저희 사이트에 광고를 게재하고 있으며, 사이트가 버벅거리는 모습을 보여주는 것은 좋은 홍보가 되지 않습니다 :smiley:

하지만 과거 데이터가 없고, 솔직히 말해서 8월에 첫 전시 경기가 열리기 전까지는 모든 것이 정상적으로 작동했기 때문에 그렇게까지 주의를 기울이지 않았습니다. 물론 COVID 덕분에 인간의 행동 패턴이 변했고, 그 외에도 어떤 일이 벌어졌는지 알 수 없습니다. 다만, 저희 사이트나 서버의 메트릭에서는 그런 모습을 확인할 수 없습니다. :man_shrugging:

하지만 이것은 훌륭한 테스트 자료입니다. 서버 과부하가 발생했을 때 어떤 일이 일어나는지에 대한 스크린샷을 @riking에게 몇 장 전달해 주었습니다. 여러분은 이런 상황을 자주 보시지는 않을 것 같네요.

누구도 당신에게 반대하는 것이 아닙니다 – 우리는 단지 인터넷의 카메라를 통해 환자를 볼 수밖에 없는 제한된 상황에서는 의사가 진단을 내리는 데 한계가 있다는 점을 지적하고 있을 뿐입니다. :movie_camera:

저도 처음 사이트를 설정했을 때 정확히 이런 경험을 했다는 점을 말씀드리고 싶었습니다. (따라서 이는 특정 사이트에만 국한된 문제가 아닙니다.)

당시에 이 문제에 대해 제가 만든 스레드입니다:

이것이 제가 아래에 설명된 대로 더 높은 CPU/메모리 옵션으로 업그레이드하게 된 직접적인 이유였습니다.

불행히도, 제가 설명했던 대로 Digital Ocean에서 Hetzner로 제대로 전환할 기회가 없었습니다(새로운 직장에 입사했기 때문입니다). 하지만 이번 달에 기회가 되는 대로 진행할 것입니다.

유저가 스레드에서 강제로 나가는 경험, 또는 스레드에 머무는 경험(로그아웃 메시지와 함께). 이는 부하에 따라 상관관계가 있는 것처럼 보였습니다. (골이 들어간 직후에는 더 많은 사용자가 사이트 인덱스로 이동했습니다)

저는 도움을 드릴 만큼 기술적인 지식이 충분하지 않지만, 채팅과 유사한 행동의 피크가 있는 스포츠 사이트에서도 비슷한 문제가 발생한다는 점을 알아두는 데 도움이 될 것 같아 공유합니다. 하지만 제 사이트(더 작고, 운영 기간이 짧은)는 서버를 추가로 업그레이드하면서 해결되었습니다.

앞으로 문제를 진단하는 방법에 대한 의사결정을 위해 데이터를 확보하고 싶다면, Prometheus exporter plugin for Discourse를 설치할 수 있습니다.

간단한 업데이트입니다:

  • 2개의 VPS 서버(web_only, data)에 새로운 2컨테이너 환경을 설치했습니다.
  • 놀랍게도(제게는) web_only 서버가 포화 상태에 도달하는 반면, data 서버는 상대적으로 부하가 적습니다. 두 서버 모두 UpCloud.com의 4x vCore 8GB RAM 플랜을 사용 중입니다.
  • web_only 서버를 UpCloud.com의 6x vCore / 16GB RAM 플랜으로 업그레이드했습니다. Unicorn 프로세스 수를 18개로 늘렸습니다.

그래도 여전히 다양한 429 제한에 걸리고 있습니다. 하지만 시스템이 높은 부하 상태 모드(under high load)는 발동되지 않았습니다.

코로나19로 인해 하키 시즌이 망가졌고, 지금은 관중 없이 몇몇 경기를 무작위로 치르고 있습니다. UpCloud.com에 호스팅 크레딧이 남아 있어, 현재 보유한 자원을 활용하여 사용자 경험을 개선하기 위해 노력하고 있습니다. 현재 웹 전용으로 6x vCore 16GB, 데이터용으로 4x vCore 8GB를 사용하고 있으며, 유니콘(unicorns)은 18개입니다.

다시 한 번 레이트 리미터를 비활성화했습니다…

DISCOURSE_MAX_REQS_PER_IP_MODE : none

…이것이 도움이 되긴 하지만, POLL에서 여전히 429 에러가 발생하여 최종 사용자에게 긴 지연/동결 현상을 유발하고 있습니다. DISCOURSE_REJECT_MESSAGE_BUS_QUEUE_SECONDS 값을 증가시키며 계속 조정할 예정입니다.

하지만 그 전에 @sam / 스태프에게 질문이 있습니다:

극한 부하 - 읽기 전용 모드 제한기의 임계값을 높이는 환경 변수가 있거나, 완전히 비활성화할 수 있는 방법이 있을까요?

이것이 필요하지 않아야 합니다. 트래픽이 그렇게 낮은데도 불구하고 왜 계속 이 문제가 발생하는지 파악할 수 있도록 여러분을 저희가 호스팅하도록 도와드리고 싶습니다.

그럴 수도 있지만, 자연스러운 활동 급증은 매우 짧고 일반적으로 1분 이내에 안정화되므로 서버에 대한 보호 수준을 약간 낮추고 싶습니다. 따라서 이동을 기다리는 동안 임계값을 조금만 높이면 사용자 경험(UX)이 개선될 수 있습니다.

게임 수가 많지 않아서(코로나19 때문) 이 부분을 측정하고 조정해 볼 기회가 매우 적었습니다.

우리가 발견한 바에 따르면, 개선된 하드웨어 리소스(6+4 vCores 및 16+8GB RAM)를 사용하더라도, 비교적 활동적인 사용자 그룹만으로도 429 클라이언트 프리즈가 발생할 수 있었습니다. 이는 약 50%의 정기적인 게임 시청자들이 채팅에 참여한 U20 월드컵 경기에서 확인되었습니다.

측정과 시행착오를 통해 우리는 다음과 같은 조정 사항을 결정했습니다:

  DISCOURSE_REJECT_MESSAGE_BUS_QUEUE_SECONDS: 0.4
  DISCOURSE_MAX_REQS_PER_IP_PER_MINUTE: 400
  DISCOURSE_MAX_REQS_PER_IP_PER_10_SECONDS: 100

이것은 429 오류의 80%를 제거하여 대부분의 사용자에게 비교적 원활한 경험을 제공하는 것 같습니다.

다음 단계는 다른 종류의 하드웨어 리소스를 구매하는 것이었을 것입니다. 단일 스레드 속도를 위해 전용 서버를 사용하는 것이거나, 수많은 vCores를 제공하는 플랜을 가진 VPS 제공업체로 전환하는 것이죠. 하지만 우리에게는 @sam이 이전에 언급했듯이 Discourse 호스팅 팀과 협력하는 것이 다음 단계입니다.

이 조정 사항들이 @iceman, @alec 또는 다른 분들에게 도움이 되기를 바랍니다. CPU 사용량과 큐잉에 주의를 기울이시기 바랍니다. 또한 이 작업을 통해 배운 것은, 컨테이너 2개가 하나보다 훨씬 낫다는 것입니다. 조정 사항을 거의 제로 다운타임으로 적용할 수 있고, 하드웨어 리소스를 더 세밀하게 활용할 수 있기 때문입니다.

실제 사건에 의해 주도되는 빠른 속도의 토론에서 성능/UX를 개선할 수 있는 새로운 조정 사항이나 발견 사항에 대해 여전히 관심이 있습니다.