Difyに必要なメモリは何GBか|16コンテナを実測して分かったプランの選び方

PRこの記事にはアフィリエイト広告が含まれます。紹介したサービスに申し込まれると、運営者が報酬を受け取ることがあります。評価や順位は報酬で変えていません。広告表記について

Dify の公式ドキュメントが示す要件は「CPU 2コア以上、メモリ 4GiB 以上」です。ただ、「4GiB あれば足りるのか」「2GB のプランでは本当に動かないのか」は書かれていません。そこで、公式の Docker Compose で Dify 1.17.1 を起動し、コンテナごとのメモリ使用量を実際に測りました。

結論:4GB のプランを最低ラインにする

状態 合計 2GB のプラン 4GB のプラン
起動して何もしていないとき 約1.93GiB 余裕3%(実質的に不足) 余裕52%
再起動の直後(ピーク) 約2.13GiB 不足 余裕47%
  • 2GB のプランでは足りません。 起動して待つだけでほぼ使い切り、再起動のたびに 2GB を超えます。ここに OS や Docker 自体が使う分が加わります。
  • 4GB のプランが最低ラインです。公式の要件とも一致します。
  • 8GB のプランを選ぶ目安は、ナレッジベースに多くの文書を入れる場合、n8n など別のアプリと同居させる場合、複数人で使う場合です。

アイドル時の内訳

起動して管理者アカウントを作成し、10分待ってから測った値です。

Dify 1.17.1 のメモリ使用量(初期設定の直後、アイドル時)合計 1.93 GiB。半分以上の余裕が残るのは 4GB のプランからです。OS や Docker 自体が使う分は含みません。
アプリ本体: 1.69 GiBデータベースとキャッシュ: 67 MiBベクトルDB: 61 MiBサンドボックス・プロキシ・プラグイン: 121 MiB2GB 余裕3%4GB 余裕52%合計 1.93 GiB
  • アプリ本体1.69 GiB
  • データベースとキャッシュ67 MiB
  • ベクトルDB61 MiB
  • サンドボックス・プロキシ・プラグイン121 MiB
コンテナ別の内訳を表で見る
グループコンテナメモリ
アプリ本体api398 MiB
アプリ本体api_websocket386 MiB
アプリ本体worker399 MiB
アプリ本体worker_beat374 MiB
アプリ本体web64 MiB
アプリ本体agent_backend109 MiB
データベースとキャッシュdb_postgres58 MiB
データベースとキャッシュredis9 MiB
ベクトルDBweaviate61 MiB
サンドボックス・プロキシ・プラグインsandbox21 MiB
サンドボックス・プロキシ・プラグインlocal_sandbox14 MiB
サンドボックス・プロキシ・プラグインplugin_daemon35 MiB
サンドボックス・プロキシ・プラグインssrf_proxy21 MiB
サンドボックス・プロキシ・プラグインagent_ssrf_proxy21 MiB
サンドボックス・プロキシ・プラグインnginx9 MiB

測定日 。macOS 上の Docker(OrbStack、arm64、割り当て 16GB)。docker stats で5回(60秒間隔)取得した中央値。公式の docker-compose.yaml を既定の設定(ベクトルDB は Weaviate)のまま起動し、管理者アカウントを作成してから10分待って測定。

目立つのは「アプリ本体」です。api、api_websocket、worker、worker_beat の4つは、いずれも同じ dify-api のイメージから起動する Python のプロセスで、それぞれ約370〜400MiB を使っていました。4つを合わせると約1.52GiB で、全体の約8割を占めます。

一方、データベース(PostgreSQL)、キャッシュ(Redis)、ベクトルDB(Weaviate)は、データが入っていない状態ではいずれも 100MiB を下回りました。文書を登録すると、このグループが増えていくと考えられます。

再起動の直後のピーク

docker compose restart を実行した直後から、3秒間隔で60回取得し、コンテナごとの最大値を取りました。

Dify 1.17.1 のメモリ使用量(再起動直後のピーク)合計 2.13 GiB。半分以上の余裕が残るのは 8GB のプランからです。OS や Docker 自体が使う分は含みません。
アプリ本体: 1.74 GiBデータベースとキャッシュ: 52 MiBベクトルDB: 95 MiBサンドボックス・プロキシ・プラグイン: 253 MiB2GB 不足4GB 余裕47%8GB 余裕73%合計 2.13 GiB
  • アプリ本体1.74 GiB
  • データベースとキャッシュ52 MiB
  • ベクトルDB95 MiB
  • サンドボックス・プロキシ・プラグイン253 MiB
コンテナ別の内訳を表で見る
グループコンテナメモリ
アプリ本体api401 MiB
アプリ本体api_websocket385 MiB
アプリ本体worker401 MiB
アプリ本体worker_beat378 MiB
アプリ本体web93 MiB
アプリ本体agent_backend126 MiB
データベースとキャッシュdb_postgres40 MiB
データベースとキャッシュredis12 MiB
ベクトルDBweaviate95 MiB
サンドボックス・プロキシ・プラグインsandbox55 MiB
サンドボックス・プロキシ・プラグインlocal_sandbox19 MiB
サンドボックス・プロキシ・プラグインplugin_daemon76 MiB
サンドボックス・プロキシ・プラグインssrf_proxy25 MiB
サンドボックス・プロキシ・プラグインagent_ssrf_proxy55 MiB
サンドボックス・プロキシ・プラグインnginx24 MiB

測定日 。macOS 上の Docker(OrbStack、arm64、割り当て 16GB)。docker stats で60回(3秒間隔)取得したコンテナごとの最大値の合計。docker compose restart の直後から測定。コンテナごとにピークの時刻は異なるため、合計は同時に使う量の上限の目安。

合計は約2.13GiB で、アイドル時より約200MiB 多くなりました。増えたのはベクトルDB、サンドボックス、プラグイン、プロキシなどで、起動処理で一時的に使う分です。なお、コンテナごとに最大になる時刻は違うため、この合計は「同時に使う量の上限の目安」です。

測っていないこと

今回の値は、データが空の状態のものです。次の場合はこれより増えるはずですが、まだ測っていません。

  • ナレッジベースに文書を登録しているとき(分割とベクトル化の処理)
  • プラグインを多数インストールしたとき
  • 複数人で同時に使っているとき
  • 初回起動時(データベースの初期化を含む)。今回は2回目以降の起動を測りました

メモリを減らせる設定はあるか

.env には、ワーカーの数に見える CELERY_WORKER_AMOUNT(既定は 4)という設定があります。ただ、1.17.1 の起動スクリプトを読むと、ワーカーは既定で gevent という方式で動きます。この方式は1つのプロセスの中で処理を切り替えるため、CELERY_WORKER_AMOUNT はプロセスの数ではなく、同時に扱う処理の数を表します。

そのため、この値を下げてもメモリはほとんど減らないと考えられます(コードを読んで判断したもので、実測はしていません)。下げると、文書の登録などのバックグラウンド処理が遅くなるだけになりかねません。メモリが足りない場合は、設定で削るよりもプランを上げるほうが確実です。

プランを選ぶときの考え方

使い方 目安
1人で試す、少数の文書を登録する 4GB
ナレッジベースに多くの文書を入れる、チームで使う 8GB
n8n などほかのアプリと同じサーバーで動かす 8GB

同居させた場合の実測は、Dify と n8n を1台の VPS で動かすと何GB必要かで解説しています。構築の手順はDify を VPS にセルフホストする手順をご覧ください。

検証環境についての注意

測定は macOS 上の Docker(Linux 仮想マシン、arm64)で行いました。メモリの使い方は VPS(多くは x86_64)と大きくは変わらない見込みですが、同じ値になる保証はありません。CPU の速度は比べられないため、この記事では扱っていません。

出典

  1. Deploy Dify with Docker Compose(Dify 公式ドキュメント)(に確認)
  2. Dify のリリース一覧(GitHub)(に確認)