대형 주제의 글을 북마크하면 부하 시간이 비정상적으로 길어짐

특히 이 스레드는 오랫동안 제게 신경 쓰이는 부분이었습니다. 왜 로딩에 1~3분이나 걸리는지, 심지어 로딩이 되기는 하는지 궁금했습니다.

이 게시물에서 누군가가 이 문제를 재확인하는 것을 보고 나서, 직접 조사해 보기로 했습니다: 4,500개 게시글이 있는 스레드에서 모든 북마크를 제거했습니다.

그 결과, 다른 게시물처럼 즉시 로딩되었습니다.

그렇다면 이 문제를 테스트할 다른 방법은 없을까 스스로에게 질문해 보았습니다.

  • 첫 번째 게시글이든 최신 게시글이든 북마크를 했는지 여부와 관계없이, 여전히 로딩에 시간이 걸렸습니다. 분 단위는 아니었지만 약 10초 정도 걸렸습니다.
  • 게시글 수가 많은 스레드에서 이 현상은 더욱 심해졌습니다. 약 4,000개 게시글이라는 특정 임계점이 존재하여 로딩 시간이 이렇게 느려지는 것 같습니다.
  • 4,000개 이상의 게시글이 있는 다른 스레드에서도 테스트해 보았습니다.
  • 주제(Topic)에 있는 북마크가 많을수록 로딩에 걸리는 시간이 길어집니다.

제가 추측하기로는, 게시글이 많은 주제에서 북마크가 많을수록 로딩에 걸리는 시간이 길어지는 것 같습니다.


재현 방법: 게시글이 아주 많은 주제를 열고 하나를 북마크하세요. 언급된 스레드에서 게시글을 북마크하려면 로그인해야 한다는 점이 안타깝습니다. 또한 이 웹사이트에서 답변이 가장 많은 스레드도 925개에 불과합니다.

추가로 제공해야 할 정보가 있다면 말씀해 주십시오.

4개의 좋아요

@martin 다른 토픽에서 전에 이 문제를 보고한 적이 거의 확실합니다.

2개의 좋아요

음, 맞아요. 이 글에서 그랬죠: Topics load slow or not at all when they have many replies and user has bookmark in them. 죄송합니다. 그 건을 놓치고 있었네요. 이 문제를 내 우선순위 목록 맨 위로 올리겠습니다.

2개의 좋아요

이것은 안정판에 존재한다면 백포트해야 할 정도로 심각한 문제입니다.

3개의 좋아요

Roblox 포럼에 계정을 만들어 What are you working on currently? (2020) - #5043 by FLYSLENDY04 - Creations Feedback - Developer Forum | Roblox 를 확인했고, 해당 위치에서 문제를 재현할 수 있습니다. 북마크가 없을 때 주제는 약 1.3초에 로드되지만, 북마크가 있을 때는 약 8초가 걸립니다. 심지어 502 bad gateway 오류까지 발생했습니다:

하지만 로컬에서 5,000개의 게시글이 있는 주제를 만들고 북마크를 추가해 본 결과, 주제에 북마크가 있든 없든 로드 시간은 동일했습니다 :man_shrugging:. 계속 찾아봐야 할 것 같습니다… 사용자의 주제 내 북마크를 로드하는 코드는 여기에 있습니다:

각 게시글의 북마크를 찾는 코드는 여기에 있습니다:

제 생각에는 이 코드가 비정상적이거나 성능에 큰 부담을 주는 것처럼 보이지 않습니다. user_post_bookmarks는 메모이제이션(memoized)되어 있어 데이터베이스를 단 한 번만 쿼리하므로, 여기서 N1 문제가 발생하지 않습니다. 또한 주제 레벨에서 북마크가 있는지 확인하는 주제 뷰(topic view) 코드도 여기에 있습니다:

여기서도 의심스러운 점은 아무것도 없습니다…

2개의 좋아요

이미 이전 버전에서 수정한 버그일까요? :thinking:

2개의 좋아요

그렇지 않다고 생각 합니다. Roblox 포럼은 Version bump to v2.6.0.beta3 · discourse/discourse@2a268bd · GitHub 버전입니다. 그 이후로 제가 만든 두 개의 북마크 관련 커밋만 있었고, 그 둘 다 토픽 북마크 로딩이나 직렬화와는 아무 관련이 없습니다.

아마 다른 어떤 우연한 일이 겹친 게 아닐까요?

1개의 좋아요

BBS에서 이 문제를 재현할 수 있습니다.

플래너를 혼란스럽게 만드는 쿼리에 뭔가 문제가 있는 것 같습니다. 실행 계획을 확인하고 조금 조정해 보세요.

제 추측으로는 아주 아주 작은 변경만으로도 실행 시간이 거의 4초에서 1밀리초로 줄어들 것입니다.

여러 독자들에게 드리는 말씀으로, 미니 프로파일러(Mini Profiler)를 활성화하는 것이 여기서 핵심입니다. 문제 있는 쿼리를 찾는 데 도움이 될 수 있습니다.

5개의 좋아요

@sam님의 조언 덕분에 이 문제가 이 줄에서 실행되는 부실한 쿼리 플랜 때문이라는 것을 알게 되었습니다:

topic.posts.with_deleted.where(post_number: 1).first

생성된 SQL에는 LIMIT 1이 포함되어 있어 index_posts_on_topic_id_and_post_number 인덱스가 전혀 사용되지 않으며, 이로 인해 상당한 지연이 발생합니다. 로컬 데이터베이스에 게시글이 거의 없어 로컬에서는 이를 재현할 수 없습니다. 기본적으로 Discourse 포럼 전체의 게시글 수가 많을수록 이 문제는 더 악화됩니다. 곧 수정 사항을 제공하겠습니다.

3개의 좋아요

다음 이슈와 중복으로 이 이슈를 닫습니다:

@martin 문제 해결 후 원본 주제에 게시해 주세요.

4개의 좋아요