업데이트 후 503 오류 여러 건 발생

3.0.6에서 3.1.2로 업데이트한 직후, 주로 다음 세 가지 지점에서 503 에러가 많이 발생하고 있습니다:

  • 많은 아바타가 로드되지 않음
  • 이미지 업로드가 간헐적으로만 작동함
  • topics/timings 관련 에러도 많이 발생함

서버 로그를 확인해 보니, 대부분의 503 에러는 production.log에 기록되지조차 않고 nginx 로그에만 가득 차 있었습니다. nginx의 레이트 리미팅(rate limiting) 때문일 수 있다고 생각해 templates/web.ratelimited.template.yml을 사용하지 않도록 변경해 봤지만, 별다른 도움이 되지 않았습니다. 여전히 503으로 응답되는 요청이 많으며, 대부분 user_avatars/show 관련 요청인 것으로 보입니다. 또한 production.log에는 이러한 요청이 전혀 기록되지 않는 것으로 보입니다.

Sidekiq에서는 이상한 점을 발견하지 못했습니다. 다만 /logs에는 다음과 같은 에러가 있었지만,

'hijack user_avatars show ' is still running after 90 seconds on db default, this process may need to be restarted!

이것은 몇 시간 전의 기록이며, 이후 인스턴스를 여러 번 재빌드했는데 다시는 나타나지 않았습니다.

이 인스턴스는 SSO를 사용하고 있으며, 아바타(URL)는 SSO에서 제공됩니다. 이미지는 S3를 사용하고 있습니다.

이러한 현상의 원인이 무엇인지 조금 혼란스럽고, 더 이상 아이디어가 떠오르지 않습니다.

어디서부터, 무엇을 살펴봐야 할지 단서가 있을까요?

RAM 용량이 얼마나 되나요? 최근에 서버를 재부팅해 보셨나요?

서버는 16GB의 RAM을 갖추고 있으며, 업데이트 전까지 몇 달간 정상적으로 작동해 왔습니다.

이 서버는 AWS 인스턴스이며, 업데이트를 직전(오늘)에 일부 무관한 파라미터를 변경하기 위해 시작되었습니다. (Discourse 데이터는 EBS 볼륨에 저장되어 있습니다.)

업데이트 이후 네트워크 트래픽(입력 및 출력)이 크게 증가했습니다. 아바타는 초기 503 오류 발생 후 몇 초 후에 정상적으로 작동하는 것으로 보아, 아바타가 처음 요청될 때 특정 프로세스가 실행되는 것으로 추정됩니다.

그러나 이미지 업로드가 무작위로 실패하는 이유와 topics/timings 엔드포인트의 오류 원인은 파악하지 못하고 있습니다.

이와 관련이 있을 수 있는지 확실하지 않습니다:

아바타 배경 업데이트 프로세스가 AWS의 초당 3,500회 PUT 요청 속도 제한에 도달하여, 아바타 업데이트 중에 일반 업로드가 실패하는 것은 아닐까요? /cc @sam

아마도 … 곧 해소될 것 같긴 해요. 지금쯤은 해소됐나요?

네, 부분적으로는 그렇습니다.

업데이트는 21일 아침에 수행되었습니다. 수신 네트워크 트래픽은 이제 정상으로 돌아오는 것으로 보입니다. 송신 트래픽은 여전히 평소보다 높지만, 아바타가 캐시되는 과정이라 가정하고 있습니다. user_avatars/show에 대한 503 에러 발생량은 훨씬 줄었습니다. 더 많은 아바타가 처리됨에 따라 시간이 지남에 따라 서서히 해결될 것으로 예상합니다.

그러나 여전히 두 개의 다른 엔드포인트에서 많은 503 에러가 로그에 나타나고 있습니다:

POST /topics/timings

이 엔드포인트에 여전히 많은 503 에러가 발생하고 있으며, 일부 사용자는 방문한 토픽이 읽음 처리되지 않는다고 보고하고 있습니다. 요청이 production.log에 전혀 기록되지 않는 것으로 보아 이에 대한 정보를 찾지 못했습니다. /logs에도 관련 내용이 표시되지 않습니다.

이러한 503 에러를 디버깅하려면 어디에서부터 시작해야 할까요? 제가 모르는 다른 로그가 있거나, (프로덕션 시스템에서) 로그를 더 상세하게 만들 수 있는 방법이 있을까요?

POST /uploads.json?client_id=....

이 503 에러에 대해 production.log에서 찾은 것은 다음과 같은 내용뿐입니다:

production.log 발췌

Started POST “/uploads.json?client_id=X” for x.x.x.x at 2023-10-24 10:24:55 +0000
Processing by UploadsController#create as JSON
Parameters: {“upload_type”=>“composer”, “relativePath”=>“null”, “name”=>“Screenshot 2023-10-24 at 11.22.32.png”, “type”=>“image/png”, “sha1_checksum”=>“d1f11731320437724003c3840c5dcc5f934ba25a”, “file”=>#<ActionDispatch::Http::UploadedFile:0x00007f3c5e3c9898 @tempfile=#Tempfile:/tmp/RackMultipart20231024-1991-b30vit.png, @content_type=“image/png”, @original_filename=“Screenshot 2023-10-24 at 11.22.32.png”, @headers=“Content-Disposition: form-data; name="file"; filename="Screenshot 2023-10-24 at 11.22.32.png"\r\nContent-Type: image/png\r\n”>, “client_id”=>“X”}
Rendered text template (Duration: 0.0ms | Allocations: 1)
Completed 503 Service Unavailable in 10ms (Views: 0.4ms | ActiveRecord: 0.0ms | Allocations: 5007)

사용자들은 몇 번 다시 시도하면 성공한다고 보고합니다… 저는 이미 업로드 중인 파일이 있을 때 (다른) 파일을 업로드하려고 하면 에러를 비교적 일관되게 재현할 수 있습니다. 어떤 이유에서인지 하나씩 업로드할 때는 이런 현상이 덜 발생하는 것 같습니다.

# free -h
               total        used        free      shared  buff/cache   available
Mem:            15Gi       3.8Gi       621Mi       1.1Gi        10Gi        10Gi

# lscpu --parse=core | egrep -v ^# | sort -u | wc -l
2
UNICORN_WORKERS: 4

db_shared_buffers: "1024MB"