カスタムプラグインでメモリ不足エラーが発生

メモリ割り当ての設定手順をご教示いただけますでしょうか?

断続的にカーネルから「メモリ不足」やダンプメッセージが表示され、スワップ使用量が3倍に増加し、アプリケーションの応答性が低下していることから、アプリがメモリ不足に陥っているようです。現在のシステム構成は、メモリ8GB、スワップ2GBです。詳細は以下をご覧ください。

物理メモリとスワップの追加に関する手順は ("Cannot allocate memory" when upgrading) で確認しましたが、具体的な割り当て方法についての記載は見つかりませんでした。

メモリ設定については、すべてデフォルト値を使用しています。システムは数分後に回復しますが、利用量が増加しているため、パフォーマンス向上のための知識を身につける必要があると考えています。ただし、どこでどのように設定を変更すればよいか不明です。Docker インスタンスに割り当てるメモリを増やすのか、Ruby の Unicorn ワーカー数を増やすのか、それとも両方でしょうか?

私はシステム管理者ですが、Ruby の経験は乏しく、Docker の知識も限られています。そのため、設定ファイルの場所と使用する構文を具体的に示していただければ、非常に助かります。

Discourse 2.6.0 beta2
Ruby 2.3.1-2~ubuntu16.04.14
Ubuntu 16.04

いくつのユニコーンを稼働させていますか?これは /var/discourse/containers/app.yml ファイルで設定されています。

こんにちは、ラファエルさん。
app.yml の “env” セクションでは、4 が使用されるように設定されているようです。

「いいね!」 1

メモリを増設した後に discourse-setup を再実行しましたか?それによってメモリ設定が自動的に調整されます。また、app.yml のコメントを読み、必要に応じて調整することもできます。

「いいね!」 1

ユニコーンが4つだけでメモリ不足(OoM)になるのは本当に奇妙です。これでは約2GBしか使用せず、PostgreSQLとRedisには6GBが残るはずです。

メモリ不足が発生している際に、どのプロセスがメモリを大量に消費しているのかを調査する必要があります。これは正常ではありません。

「いいね!」 3

ラファエルさん、チームの皆様、こんにちは。私はセルジと申します。長らく待ち望んでいた休暇のため、mr. Happy Lee が去ったため、この件については私が担当させていただきます。

説明への追記:サーバーは当初、8GB の RAM と 2GB のスワップ領域で構築されました。それ以来、アップグレードは行っておりません。

システムログを確認したところ、Ruby プロセスがすべてのメモリを消費し、カーネルの OoM(Out of Memory)を引き起こしている証拠が見つかりました。

Killed process 2960 (ruby) total-vm:10031472kB, anon-rss:7438148kB, file-rss:0kB

Ruby の専門家ではないため、Ruby のどのプロセスがこれほど多くのメモリを消費しているのかを確認する方法がわかりません。

ご提案いただければ幸いです。

よろしくお願いいたします。

-セルジ

この Discourse インストールでプラグインを実行していますか?

Scheduled Digest カスタムプラグインを実行していますが、このプラグインは他の 2 つのインストール環境でも動作しており、それらの環境では問題が発生していません。

そのプラグインのソースコードリポジトリへのリンクをここに貼っていただけますか?

「いいね!」 1

こんにちは、ラファエルさん。

このプラグインは当組織が開発費を負担したため、残念ながらここでソースコードを公開することはできません。また、このプラグインは他のインスタンスでは問題なく動作しているため、この特定のサーバーのメモリリソースを増やすことを検討しています。マシンは仮想マシン(VM)ですので、メモリ量を簡単に倍増させて、これで問題が解決するかどうかを確認できます。

わかりました、頑張ってください!

こちらから見えないコードのデバッグは、できることがほとんどありません。インスタンスのメトリクスを追跡するには、Discourse 用 Prometheus エクスポートプラグインを設定することをお勧めします。

「いいね!」 1

他のインスタンスも Ruby 2.3.1-2~ubuntu16.04.14 を実行していますか?

おそらく関係ないかもしれませんが:

これは明らかに Ruby のバグでした。複数の Ruby バージョンでテストした結果、Ruby 2.3.x および 2.4.x のみでメモリリークが発生していることが判明しました(これは Ruby 2.5.0**** で修正されたようです)。

Discourse の readme には Ruby 2.6 以上が求められています::roll_eyes:

「いいね!」 1

ありがとうございます!落ち着き次第、更新を投稿します。

こんにちは、ベンジャミン。他のインスタンスも Ruby 2.3.1-2~ubuntu16.04.14 で動作しています。Docker 環境に影響がないか確認するために、アップデートをテストします。

Ruby のバージョンはここでは関係ありません。

公式の Docker イメージを使用している限り、Discourse の正しいサポート対象バージョンが使用されます。

「いいね!」 2

このトピックは 26 時間後に自動的に閉鎖されました。新しい返信は受け付けられていません。