异常高的 CPU 使用率

这在我看来不像是一个内存问题——应用程序只占用了大约 6GB。有很多读取操作正在发生,我猜测(以及 sidekiq 很忙)这可能是 postgres 正在从磁盘读取大量旧数据,可能是为了执行一些统计作业。如果数据库无法完全装入 RAM,那么在访问旧数据时,它可能会进行大量的读取操作。这闻起来像是这种情况。

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——我敢打赌它正在忙于运行更新。以管理员身份登录后,查看 /sidekiq URL,看看它在做什么。这很可能会显示一些长时间运行的更新任务。

你也可以在 SQL 服务器上执行:

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

以查看正在运行的查询以及调用它们的程序。这将提示导致负载的原因是什么。

你是否启用了性能标头?你可以在日志中打开它们并捕获它们,以告诉你 Discourse 在每个部分花费了多少时间。

3 个赞