极端负载错误

“由于负载过高,此内容暂时以未登录用户的视角向所有人展示”

我运营一个在篮球比赛期间提供实时讨论线程的网站,但在比赛期间(活动高峰期)服务器经常过载并显示此消息。

有什么方法可以确定解决该问题的最佳方案吗?是存储速度、内存还是 CPU 的问题?除了升级服务器之外,我还能做些什么?如果确实在这些时段需要升级,我应该重点提升哪部分?

2 个赞

减少使用论坛的人数?更好的办法是让他们分散使用,而不是都在游戏期间集中使用。

但这些建议并无太大帮助。既然你知道游戏的时间安排,你可以在游戏期间临时升级服务器,或者在游戏期间通过负载均衡器运行多个服务器。

您需要更多、更快的 CPU 核心以及更大的内存,以便增加 Web 进程(Unicorn Workers)的数量,从而应对流量高峰。

4 个赞

这是 @sam 正在积极投入的一个领域。看起来 Discourse 的新版本在这一方面的性能确实有所退步。

话虽如此,真正的解决方案是:如果你需要为数百人同时提供实时互动,请使用实时聊天工具——尽管我始终怀疑,当聊天内容滚动得如此之快,以至于没人能真正看清任何内容时(就像 Twitch 和 YouTube 直播那样),聊天究竟“有用”在哪里。:man_shrugging:

2 个赞

本线程对此问题描述得非常清楚。

以下是我在一个足球比赛论坛遇到问题之前的实际体验:

Digital Ocean
1 核 CPU + 1 GB 内存 = 支持 30–40 名用户(类似聊天场景)
2 核 CPU + 2 GB 内存 = 支持 70–80 名用户(类似聊天场景)
4 核 CPU + 8 GB 内存 = 可轻松应对 120 名用户,并在 2 小时内处理 1000 篇帖子,未达到上限。

使用 Hetzner(镜像站点)的体验如下:

我的实际测试情况:
3 核 CPU(CPX 21,AMD 芯片)+ 4 GB 内存 = 20 名用户时已显吃力
2 核 CPU(Intel)+ 8 GB 内存 = 20 名用户时运行正常。

我尚未有机会测试更多用户的情况。

关键在于提升 CPU 和内存性能。此外,还需编辑 app.yml 文件。
在此处增加更多 unicorns,并调整 db_shared_buffers 参数。

5 个赞

对于体育论坛而言,它更接近于赛事的实时文字更新。人们并不主要是为了聊天(尽管确实存在这种情况,尤其是在中场休息时),而是为了获取来自其他球迷的实时文字解说。

许多人登录论坛,只是为了阅读实时文字解说,看看关键人物对关键比赛事件的看法和观点。内容从有趣的反应到严肃的分析,应有尽有。

如果你错过了比赛,人们登录论坛,只是为了逐条阅读赛事解说。这对在工作的人特别方便 :wink: 相比报纸或电视台的文字解说,它更具个人色彩,也更有偏向性。

6 个赞

没错。如果在升级后的服务器上运行 discourse-setup,它会自动完成这些操作。

2 个赞

我明白你的意思,@sam@eviltrout 和我最近一直在密切关注这个问题……随着 Discourse 越来越受欢迎,“数百名用户同时登录并浏览同一主题”的情况最近频繁出现。

当这种情况发生时,我们或许需要引入一种新的行为模式,在主题界面中以某种形式开始显示“快速通道”提示……:warning:

4 个赞

这里需要牢记的一点是,“聊天”实现通常会将实际内容广播给订阅者。

在 Discourse 中,我们拥有一套相当复杂的处理流程,这使得简单的实现变得复杂,从而导致大量的流量。

  1. 用户发布回复
  2. 所有正在查看该主题的用户通过广播发现有新内容
  3. 所有用户向服务器请求帖子内容(100 名观众 = 100 次请求)
  4. 我们拉取图片并优化图片
  5. 所有正在查看该主题的用户再次通过广播发现有新内容
  6. 所有用户再次向服务器请求帖子内容(100 名观众 = 100 次请求)

(我们实施了各种优化、速率限制、重试机制等,但大体流程如此)

所有这些请求都必须经过我们的安全管道,以确保用户有权查看该帖子等。

如果内容较短,且我们能以某种方式找到一种更轻量级的安全验证方法来处理“快速通道”,那么我们就可以通过广播分发聊天消息。这将带来显著的性能提升,采用这种设计,我们或许能在单台低配 2GB DigitalOcean Droplet 上支持 10000 名用户。

安全机制非常复杂。缓存也同样复杂,因为存在缓存失效问题。

因此,是的,我们绝对正在思考这个问题。但就目前而言……

同一主题下大量已登录的观众 + 同一主题下大量新内容 = 昂贵的服务器账单。

7 个赞

太棒了!

老实说,我的知识储备还只够“制造麻烦”。我是那种通过实践(和搞砸)来学习的人。我非常感激你们为打造这个平台所付出的巨大努力。12 个月前,当我创建第一个论坛时,我折腾了 12 个不同的版本::laughing: Vanilla、MyBB、SMF、Flarum 等等。Discourse 无疑是最好的。

最大的优点之一是持续活跃的开发。很高兴看到你们认真倾听社区的声音,并不断改进。

6 个赞

您有推荐的设置吗?

1 个赞

各位,我的网站似乎倒退了,使用相同的 DO 套餐(8gb,4CPUs),我的网站在 60-70 位用户发布 1000 篇帖子时开始运行困难。

我只想问两件事。

  • 是否可以移除极端负载消息?它似乎比提供帮助更能引起用户的恐慌。

  • 在处理大量用户方面有进展吗?

与此同时,我将探索修改 unicorn,并禁用插件等以帮助释放资源。

如果您在安装后调整了大小,是再次运行了 discourse-setup 还是手动更改了设置?

我刚刚手动完成了,我应该运行 discourse setup 吗?

如果你进行了编辑,你需要重新构建(不确定 destroy/start 是否可以)。

1 个赞

所以只是为了确保我没有误解,在编辑了 yml 之后,我只是运行了 ./launcher rebuild app

我是否应该尝试运行 ./discourse-setup

(如前所述,我的知识刚好够用,但又不够精通 :sweat_smile:

应该没问题。Discourse-setup 会为您更改内存设置。如果您已完成此操作,则应该没问题。

1 个赞

只是为了确保并出于兴趣:您是否配置了交换空间?

我有一个 2gb 的交换文件,你们会推荐一个 8gb 的交换文件吗?(与内存量匹配?)

如果磁盘空间足够,更多的交换空间不会造成损害。free 命令会告诉你内存使用情况以及交换空间的使用量。

1 个赞