안녕하세요,
Discourse를 v2.5.0.beta4-399-gbf8085e436 버전으로 업그레이드한 후(2.4.x 버전에서 discourse_docker git의 커맨드 라인 부트스트랩을 사용하여, Postgres 12 업그레이드 커밋 직전에 업그레이드함), 서버의 CPU 사용량이 눈에 띄게 증가했습니다(사용자가 연결되어 있지 않은 상태에서도 마찬가지입니다).
“top” 명령을 실행하면 여러 “ruby” 프로세스가 상당히 자주 활성 상태인 것을 확인할 수 있습니다. 이는 unicorn sidekiq 워커 프로세스임을 이해하고 있습니다. redis-cli monitor를 실행해 보니, 작업이 있는지 확인하기 위해 2초 타임아웃으로 차단형 BRPOP 요청을 보내고 있습니다. 즉, 이는 초당 약 10개의 redis 명령어에 해당합니다. 또한 통계가 5초마다 업데이트되고 있습니다. redis-cli info stats에 따르면 평균 초당 15~20개의 명령어가 처리되고 있습니다.
이러한 활동이 우리가 확인하는 2~4%의 CPU 사용률까지 증가할 수 있는지 모르겠습니다. 이전 버전에서는 0.5% 미만이었으며, 당시에는 동일한 redis-cli 통계를 확인하지 않았습니다.
도움이 되는지 확인해 보기 위해 더 긴 타임아웃을 설정해 보고 싶지만, 어떻게 해야 하는지 아직 파악하지 못했습니다.
좋은 팁이네요. 거기서 경보 수준으로 보이는 건 없었고, 실행 중인 작업도 없었으며 긴 실행 시간을 가진 작업도 없었습니다(100ms를 초과한 건 몇 개뿐이었죠). 대시보드에는 하루 약 1,000건 처리된다고 나와 있는데, 업그레이드 전과 동일합니다.
아마도 주제에서 벗어난 이야기일 수 있지만, 6개월간의 처리량(Processed) 그래프도 흥미롭습니다. 두 개의 평탄한 구간(하나는 다른 것보다 두 배 높음)이 주 단위로 교차하며 전환되는 것처럼 보입니다. 이는 재부팅과 상관관계가 없으며(그 기간 동안 해당 부분을 업데이트한 적도 없었으므로) 그렇습니다.
2초 BRPOP 타임아웃을 변경하는 간단한 방법이 있을까요? 코드에서 찾지 못했습니다. 최소한 작업 폴링 루프가 문제인지 여부를 가늠해 볼 수 있을 텐데 말입니다.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1024 discour+ 20 0 333584 202888 21660 S 1.3 2.5 3:35.81 ruby
1156 discour+ 20 0 715904 249416 24532 S 1.3 3.1 3:26.50 ruby
1178 discour+ 20 0 726664 251468 24564 S 1.3 3.1 3:26.11 ruby
1189 discour+ 20 0 714368 247912 24444 S 1.3 3.1 3:24.56 ruby
1200 discour+ 20 0 709760 249708 24632 S 1.3 3.1 3:22.96 ruby
1234 discour+ 20 0 713344 250288 24636 S 1.3 3.1 3:30.24 ruby
1167 discour+ 20 0 712832 247928 24436 S 1.0 3.1 3:24.75 ruby
188658 me 20 0 10424 4240 3576 R 0.7 0.1 0:00.36 top
448 root 20 0 1748444 84900 45884 S 0.3 1.1 6:09.98 dockerd
그런데 아무도 연결되어 있지 않은 상태입니다…
사용자 활동이 거의 없는데도 35시간 동안 가동된 후 프로세스당 3.5분씩 누적된 CPU 시간입니다.
rbtrace을 사용해 보았지만 다음과 같은 오류가 발생합니다: (pid is not listening for messages, did you require “rbtrace”)
이를 수정하려면 이미지를 다시 빌드해야 합니까? 아니면 컨테이너 내부에서 무언가를 조정하거나 다시 빌드하면 될까요?