Привет,
После обновления Discourse до версии v2.5.0.beta4-399-gbf8085e436 (с версии 2.4.x, используя загрузку через командную строку из репозитория discourse_docker, сразу перед коммитами, связанными с обновлением Postgres до версии 12), на сервере заметно возросла нагрузка на процессор (даже если никто не подключен).
Утилита “top” показывает, что несколько процессов “ruby” довольно часто находятся в активном состоянии. Я понял, что это воркеры unicorn и sidekiq. При запуске redis-cli monitor видно, что они выполняют блокирующие запросы BRPOP с таймаутом 2 секунды, чтобы проверить наличие задач для выполнения. Таким образом, это приводит к десяткам команд Redis в секунду. Кроме того, статистика обновляется каждые 5 секунд. Команда redis-cli info stats показывает, что в среднем обрабатывается 15–20 команд в секунду.
Неизвестно, может ли такая активность привести к наблюдаемому потреблению процессора на уровне 2–4%. В старой версии оно составляло менее 0,5%. Я не проверял статистику redis-cli в то время.
Мне было бы интересно попробовать увеличить таймаут, чтобы посмотреть, поможет ли это, но я пока не разобрался, как это сделать.
Крутая подсказка. Ничего тревожного я там не увидел: никаких запущенных задач, и ни одна не выполнялась долго (лишь несколько превысили 100 мс). На дашборде показано около 1000 обработанных элементов в день, как и до обновления.
Вероятно, это не по теме, но интересно также посмотреть на график «Processed» за последние 6 месяцев: похоже, есть два плато (одно в два раза выше другого), между которыми система переключается с интервалом в недели. Это не коррелирует с перезагрузками (и мы тоже ничего не обновляли в этот период).
Есть ли простой способ изменить таймаут 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
при этом никто не подключён…
Каждый процесс набрал 3,5 минуты процессорного времени за 35 часов работы при минимальной активности пользователей.
Я также пытался использовать rbtrace, но он выдаёт ошибку: (pid is not listening for messages, did you require “rbtrace”)
Нужно ли мне пересобрать образ, чтобы это исправить? Или можно просто что-то настроить или пересобрать внутри контейнера?