Sidekiq 웹 UI를 통해 모니터링할 때 작업 처리 속도가 놀라울 정도로 빠릅니다. 하지만 가끔씩 과부하가 걸린 것처럼 보이며 속도가 극도로 느려집니다. 평소 속도의 1~5% 수준으로만 작동하며, 서버 리소스 사용량이 정상적이거나 낮은 상태임에도 불구하고 Redis를 flush하지 않는 한 회복되지 않습니다.
큐가 특정 크기에 도달하면 시스템이 멈추고 속도가 급격히 떨어지는 것처럼 보입니다. 이로 인해 큐가 더 커지는 악순환이 발생합니다. 다만 이것은 제 추측일 뿐이며, 다른 이유로 인해 속도가 느려져 큐가 커진 것일 수도 있습니다.
아래 GIF는 제가 보고 있는 상황을 잘 설명해 줍니다.
서버 리소스는 충분히 여유가 있으며, 현재 CPU 사용률은 10% 미만으로 매우 낮습니다. RAM과 SSD도 여유가 있습니다. 서버 사양은 16개 CPU 코어, 32스레드입니다. 8~14개의 unicorn_sidekiq 프로세스를 실행해 보았으며, 20개로 늘려 보았지만 이는 많은 수의 5xx 에러를 유발했습니다.
그래서 우선순위 낮은 큐를 한 번 더 비우고 며칠간 그대로 두었습니다(마지막 업데이트 이후 변경 사항 없음). 바로 빨라지지는 않았고 큐에 쌓인 작업이 빠르게 증가했지만, 시간이 좀 지나자 스스로 해결된 것 같습니다. 지금은 작업 처리 속도가 매우 빠릅니다. 20초 폴링 간격을 사용했는데, 지난 몇 분 동안 초당 55~140개의 작업이 처리되고 있습니다. 일일 기준으로도 정상적으로 보이며 큐가 쌓이는 현상도 없습니다.
이 redis 경고가 문제와 관련이 있을 수 있다고 생각하시나요? 앱 재빌드 중에 표시됩니다:
# WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
# WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
docker 설치 환경에서 이 오류를 해결해 보신 분 계신가요?
이미 overcommit memory 경고를 해결하기 위해 /etc/sysctl.conf에 vm.overcommit_memory = 1을 추가해 두었습니다.
그래서 루트 권한으로 echo never > /sys/kernel/mm/transparent_hugepage/enabled 명령을 실행하여 Transparent Huge Pages (THP) 경고를 해결했습니다. 아직 영구 적용을 위해 rc.local에 추가하지는 않았고, 테스트 목적으로만 실행했습니다. Discourse를 다시 빌드해 보니 성능은 이전과 비슷하거나 약간 향상된 것 같습니다.
하지만 이 경고는 어떻게 수정해야 할지 잘 모르겠습니다: # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
UNICORN_SIDEKIQS를 일부만 저우선순위 큐에 특별히 할당하는 것이 좋은 방법일 수 있다고 생각합니다.
‘default’ 우선순위 작업, 즉 PostAlert이 상당히 느리게 처리되고 있으며, 이러한 느린 기본 우선순위 작업이 쌓이면, 훨씬 더 빠르게 완료될 수 있는 작업들이 포함된 저우선순위 큐가 거의 처리되지 않아 부풀어 오릅니다. 이 부풀어 오름이 전체 작업 처리 속도를 더 느리게 만드는 원인일 수 있다고 의심하고 있습니다. 이는 초당 작업 수의 큰 변동도 설명할 수 있을 것입니다.
app.yml 파일(또는 다른 방법)을 통해 UNICORN_SIDEKIQS를 특정 우선순위 작업에 할당할 수 있는지 아는 분이 계신가요?