我刚安装了 Discourse,但由于外部数据库速度慢,页面加载非常缓慢

主页响应需要 2-4 秒

Started GET "/" for 219.144.218.209 at 2025-03-17 18:22:55 +0000

Processing by ListController#latest as HTML

Rendered layout layouts/application.html.erb (Duration: 1932.6ms | GC: 10.6ms)

Completed 200 OK in 2521ms (Views: 1933.4ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 14.9ms)

我的服务器有 2 个 CPU 核心和 8GB 内存。

日志显示 layouts/application.html.erb 渲染速度很慢。

我删除了 layouts/application.html.erb 中的一些内容,响应时间缩短到 300-500 毫秒。


<discourse-assets>
    <discourse-assets-stylesheets>
      <%= render partial: "common/discourse_stylesheet" %>
    </discourse-assets-stylesheets>
    <discourse-assets-json>
      <div class="hidden" id="data-preloaded" data-preloaded="<%= preloaded_json %>"></div>
    </discourse-assets-json>
    <discourse-assets-icons></discourse-assets-icons>
  </discourse-assets>

每个用户请求都会消耗大量 CPU。
请帮帮我。

您是否执行了标准安装?

2 个赞

是的,我做到了。

而且我昨天发现了问题。

我使用了一个远程数据库,Discourse 的布局组件会获取 60 多个 SQL 查询,每个 SQL 查询需要 ±30 毫秒传输,因此第一次渲染需要 2-4 秒。

当我切换到本地数据库时,问题就消失了。

1 个赞

Yes, it does:

我遇到了类似的问题。
我认为 Docker 可能会对内部数据库进行某种神奇的索引,这不太好,因为它严重限制了我们的扩展能力。

嗯……这听起来不对。无论数据库在哪里,都应该应用相同的迁移……这包括添加索引。

如果你能为同一个查询在两个实例上都获取查询计划,并且该查询在外部实例上花费的时间长得多,那么能够展示这种差异将是很好的。

(我们明白这对你来说可能很麻烦)

如果查询计划相同,那么问题肯定出在外部数据库的延迟或性能上?

我有一个很久以前为长时间运行的查询制定的计划:

这个计划曾经是在本地托管的数据库上运行的,当时的问题是磁盘 IO,这就是为什么我迁移到外部数据库。

我现在正尝试使用内部数据库进行重建。

1 个赞

这相对来说是 非常长 的时间。你的 SQL 设置肯定有问题。

数据库有多远?

Meta(托管在 AWS 上)上登录请求的 SQL 时间的 99 百分位数大约是 54 毫秒,而在我们自己的服务器上托管的类似站点的总 SQL 时间大约是 25 毫秒。

匿名用户的 SQL 时间大约是 40 毫秒和 10 毫秒。

这看起来你是在开发模式下运行,而不是标准安装。

1 个赞