'768 worker_connections are not enough' 오류

안녕하세요!

오늘 재구축 이후 서버 오류가 많이 발생하고 있습니다. nginx 연결 문제인 것 같습니다. nginx/error.log에서 다음과 같은 768 worker_connections are not enough 메시지가 한꺼번에 쏟아지는 경우가 종종 보입니다:

2021/06/02 10:42:21 [alert] 1143#1143: *28468 1768 worker_connections are not enough while connecting to upstream, client: (IP removed), server: _, request: "POST /message-bus/8fc08436f86f47479cf0dad3deb5c4dc/poll?dlp=t HTTP/1.1", upstream: "http://127.0.0.1:3000/message-bus/8fc08436f86f47479cf0dad3deb5c4dc/poll?dlp=t", host: "blenderartists.org", referrer: "https://blenderartists.org/t/convert-multiple-objects-to-single-mesh-with-vertex-grouping/489173/2"

이 문제를 해결할 수 있는 방법이 있을까요? CPU/메모리 자원은 충분합니다 - ‘worker connections’ 수를 늘릴 수 있을까요?

업데이트를 해보았습니다. 당분간 워커 연결 수를 늘렸지만, 여전히 이러한 오류가 발생하고 있습니다(빈도는 줄었지만, 워커 수가 많을 때 더 자주 발생합니다). 최근 이 문제를 일으킬 만한 변경 사항이 있었는지, 아니면 어떻게 하면 더 잘 추적할 수 있을지 정말 궁금합니다.

## 빌드 후 실행할 사용자 지정 명령
run:
  - exec: echo "Beginning of custom commands"

  - replace:
      filename: "/etc/nginx/letsencrypt.conf"
      from: "worker_connections 768" 
      to: "worker_connections 1768"

재빌드 이후에 이런 일이 발생했다는 점이 흥미롭네요. 최근 일괄 작업을 수행해 보셨나요? Sidekiq 로그를 확인해 보시고, 거기에도 대량의 작업이 있는지 살펴보는 것이 좋습니다.

최근에 썸네일 미리보기 TC로 전환하면서 일괄 작업을 몇 번 수행하긴 했지만, sidekiq 큐에는 아무것도 없으니 그쪽은 확실히 제외할 수 있습니다.

2일 전에 nginx 버전을 업데이트했으니, 상황을 주시해 두는 것이 좋겠습니다. 웹사이트에 동시 접속자가 500명 이상 있나요?

또한 사이트 전체가 Cloudflare 뒤에 위치해 있으므로, 이로 인해 상황이 다를 수 있습니다.

잘 모르겠습니다. 그럴 수도 있겠죠? 어떻게 확인할 수 있는지 아이디어가 있을까요?

맞습니다. 하지만 가속 기능을 비활성화했으며, 기본적으로 이미지와 아바타 캐싱에만 사용하고 있습니다. 오늘까지 문제없었는데..

하하, 보통 사람들은 Google Analytics나 유사한 도구를 사용하여 이러한 정보를 파악합니다. Discourse 대시보드에는 일일 페이지뷰와 사용자 방문 수가 포함되어 있어 이를 참고할 수도 있습니다.

사실이 아닙니다. 여러분의 사이트 전체가 Cloudflare를 통해 제공되고 있습니다:

curl -I https://blenderartists.org/                                                                                                                                         
HTTP/2 200 
cf-cache-status: DYNAMIC
cf-request-id: 0a6ef945b3000002fe272b2000000001
server: cloudflare
cf-ray: 6591c4b5ec5902fe-MIA
alt-svc: h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400, h3=":443"; ma=86400

그러나 여러분의 nginx가 다운스트림 연결이 아닌 업스트림 연결에 대해 경고하고 있으므로, 이는 완전히 무관할 수 있습니다. 이는 nginx와 unicorn 사이의 연결이 고갈되고 있음을 의미합니다.

메시지 버스(실시간 업데이트 서비스)로 인해 각 방문자를 위해 연결을 유지하기 때문에, 사이트가 어느 정도 인기가 있다면 이는 다소 예상되는 일입니다.

worker_processes와 worker_connections를 높이는 것은 안전하며, 여러분의 경우 합리적인 조치로 보입니다. 기본적으로 worker_processes는 CPU 코어 수로 설정되어 있습니다. CPU 코어가 몇 개인가요?

맞아요 :slight_smile: 우리는 오래전에 그걸 중단했거든요. 하루 페이지뷰가 약 25만 건(봇 포함)이므로 500건은 비정상적이지 않아 보입니다. 사용자 방문 수는 로그인한 방문만 추적하는 거죠?

맞아요 - 우리는 요청을 CF를 통해 전달해야 하지만, CF가 우리의 JavaScript 등을 건드리게 하지는 않습니다.

우리는 12코어, 64GB RAM을 보유하고 있습니다. 일반적인 부하(load)는 약 2이며, RAM의 50%를 사용 중입니다.

정말 이상하네요!

커넥션 수 공식은 worker_processes * worker_connections이며, 12 * 768이 되어야 하므로 (셈해 보면) 9216이 됩니다. 그런데 로그에는 1768이라고 나와 있네요…

app.yml 파일에 다음을 시도해 보세요:

## 빌드 후 실행할 사용자 지정 명령
run:
  - exec: echo "Beginning of custom commands"

  - replace:
      filename: "/etc/nginx/nginx.conf"
      from: "worker_connections 768" 
      to: "worker_connections 2000"
  - replace:
      filename: "/etc/nginx/nginx.conf"
      from: "worker_processes auto" 
      to: "worker_processes 10"

2번 게시물에 있는 블록이 잘못된 파일에 적용되고 있다는 점에 유의하세요.

:facepalm: 실수로 잘못된 코드를 붙여넣었습니다. 처음에는 letsencrypt 템플릿을 시도했지만, 결국 nginx.conf를 1768개의 워커 연결로 변경했습니다.

제시해 주신 값들을 시도해 보겠습니다. 결과를 알려드리기 위해 돌아올게요.

아직도 발생하고 있습니다:

2021/06/02 17:40:03 [alert] 2102#2102: *262491 2000 worker_connections are not enough while connecting to upstream, client: <ip removed>, server: _, request: "POST /message-bus/0e453fae0c604c29a876e6ede05b7341/poll?dlp=t HTTP/1.1", upstream: "http://127.0.0.1:3000/message-bus/0e453fae0c604c29a876e6ede05b7341/poll?dlp=t", host: "blenderartists.org", referrer: "https://blenderartists.org/t/weight-paint-not-painting/551282"

worker_connections를 4000으로 올렸는데, 지금까지는 잘 되고 있습니다 :crossed_fingers:

이제 오버라이드를 더 쉽게 만들었습니다:

좋아요! 그러면 다음과 같이 하는 거죠?

params:
  nginx_worker_connections: 4000

app.yml/web_only.yml 파일에요?

맞습니다. 같은 패치에서 기본값도 4k로 올렸기 때문에, 관리자분들은 더 이상 값을 올릴 필요가 없는지 신중하게 검토해 보시는 것이 좋습니다.

다른 사이트에서는 워커 프로세스 수를 CPU 코어의 2배로 설정하고 있었습니다. 이 부분도 제거해야 할까요?