こんにちは、皆さん。
Discourse の Docker ベースのインストーラーを使用してサーバーをインストールしているのですが、ある問題が発生しており、お手伝いいただきたいです。毎日正午頃、理由が不明なままサーバーが混雑し、I/O 負荷が上昇して、フォーラムでエラー 500 が表示されるようになります。
iotop を見ると、常に PostgreSQL の UPDATE クエリがすべての I/O を消費していることがわかります。
そこで今日、再び問題が発生した際に、以下のコマンドで実行中のすべての 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 時頃などに移動させるなどです。
さらに深く調査するためのご提案があれば、ぜひ共有してください!ご支援を心よりお待ちしております ![]()
ニンジャ編集:追加情報を思い出しました。既存の cronjob(ホスト OS 内または Docker アプリ内からのもの)とは関連付けられませんでした。
サーバーの背景情報:
- サーバー OS: Ubuntu 18.04LTS
- VM 仕様:ディスク 100GB、RAM 4GB、コア数 4
- ディスク:6 台の 15K ディスクによる RAID10
- Discourse バージョン:v2.1.0.beta2 +107
- プラグイン:babble, whos-online, voting, cakeday, anonymous-categories, league
- 1 日のページビュー:約 75,000
- ユーザー数:1,350(1 日のアクティブユーザー約 700)
- ポスト数:73,600、トピック数:351、最も活発なトピックのポスト数:13,500
ここまでお読みいただき、ありがとうございます! ![]()


