大家好,
我遇到了一个问题,想请大家帮忙。我使用基于 Docker 的安装程序部署了 Discourse 服务器。每天中午左右,服务器会因某种未知原因变得繁忙,IO 负载飙升,导致论坛开始返回 500 错误。
iotop 总是显示是 PostgreSQL 的 UPDATE 操作占用了所有 IO。
所以今天当问题再次发生时,我使用以下命令获取了所有正在运行的 SQL 查询列表:
sudo -u postgres psql discourse -o /tmp/RunningQueries -c 'SELECT datname,pid,state,query FROM pg_stat_activity'
该命令的输出可以在此处查看 Pastebin 链接。
如您所见,在这些时段大约有 32 个 UPDATE 查询正在运行。当这种情况发生时,iotop 显示数据库的读写速度在 2.5MB/秒到 15MB/秒之间。
如果我将正在运行的 UPDATE 查询与日志中记录的查询(位于 /var/discourse/shared/standalone/log/var-log/postgresql)进行关联,我确实发现这些查询耗时非常非常长:
2018-07-03 12:51:27.052 UTC [17504] discourse@discourse LOG: duration: 2352061.872 ms statement: UPDATE drafts
SET data = '{"reply":"<redacted for debugging purposes>","action":"reply","categoryId":24,"postId":118034,"archetypeId":"regular","whisper":false,"metaData":null,"composerTime":65922,"typingTime":8400}',
这与以下内容对应:
discourse | 17504 | active | UPDATE drafts +
| | | SET data = '{"reply":"<redacted for debugging purposes>","action":"reply","categoryId":24,"postId":118034,"archetypeId":"regular","whisper":false,"metaData":null,"composerTime":65922,"typingTime":8400}', +
| | | sequence = 124, +
| | | revisions = revisions + 1 +
| | | WHERE id = 84548
如果我重启 Docker 应用,这些查询确实会结束,所以基本上我只能等待,这让我的用户很不高兴。
请告诉我有什么办法可以减轻这个问题——例如,将维护任务移至凌晨 5 点左右执行。
如果您有任何进一步深入排查的建议,请分享!任何帮助都非常感激 ![]()
Ninja 编辑:刚想起一些额外信息:我无法将其与现有的 cron 任务(无论是来自主机操作系统还是 Docker 应用内部)关联起来。
关于服务器的背景信息:
- 服务器操作系统:Ubuntu 18.04LTS
- 虚拟机配置:100GB 磁盘,4GB 内存,4 核
- 磁盘:6 块 15K 转速硬盘组成的 RAID10
- Discourse 版本:v2.1.0.beta2 +107
- 插件:babble, whos-online, voting, cakeday, anonymous-categories, league
- 日均页面浏览量:约 75,000
- 用户:1350 人,日均活跃用户约 700 人
- 帖子总数:73,600,主题数:351,最活跃的主题包含 13,500 篇帖子
感谢大家耐心阅读至此!![]()


