Аномально высокая загрузка процессора

Мне это не похоже на проблему с памятью — приложения занимают всего около 6 ГБ. Происходит много чтения, и, по моим предположениям, вместе с тем, что Sidekiq занят, возможно, PostgreSQL выполняет много операций чтения старых данных с диска, возможно, для выполнения статистических задач. Если база данных не помещается в оперативную память, при обращении к этим старым данным она, вероятно, будет выполнять много операций чтения. Именно на это это похоже.

USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
admin    2510013 15.8  1.6 7383364 514764 ?      SNl  12:55  56:45 sidekiq 7.3.9 discourse [3 of 5 busy]
systemd+ 2848301 26.9 25.3 8058104 7806820 ?     Rs   17:45  18:18 postgres: 13/main: discourse discourse [local] SELECT
systemd+ 2870880  4.3 22.9 8058516 7072000 ?     Ds   18:03   2:09 postgres: 13/main: discourse discourse [local] SELECT
systemd+ 2875058 21.0 25.4 8101952 7848140 ?     Rs   18:07   9:46 postgres: 13/main: discourse discourse [local] UPDATE
systemd+ 2924006 30.2 25.3 8112844 7824292 ?     Rs   18:44   2:44 postgres: 13/main: discourse discourse [local] UPDATE
jystemd+ 2929546 12.8 24.9 8049520 7694404 ?     Ss   18:48   0:39 postgres: 13/main: discourse discourse [local] SELECT
systemd+ 2931802 17.7 24.5 8045744 7559492 ?     Ss   18:50   0:36 postgres: 13/main: parallel worker for PID 946796
systemd+ 2931803 17.7 24.5 8045744 7557568 ?     Ds   18:50   0:36 postgres: 13/main: parallel worker for PID 946796

Сначала стоит обратить внимание на Sidekiq — я уверен, что он занят выполнением обновлений. Проверьте URL /sidekiq, войдя в систему как администратор, чтобы увидеть, что он делает. Скорее всего, там будут отображены длительные задачи обновления.

Также на сервере SQL можно выполнить:

SELECT pid, application_name, query
FROM pg_stat_activity
WHERE state IS NOT NULL
  AND state != 'idle';

чтобы увидеть, какие запросы выполняются и кто их вызывает. Это даст подсказку о том, что вызывает нагрузку.

Включены ли у вас заголовки производительности? Вы можете включить их и сохранять в логи, чтобы узнать, сколько времени Discourse тратит на каждую часть.