2019年末版: Redash のメモリ使用量を節約する

まえがき

約2年前にこんな記事を書きました。

ariarijp.hatenablog.com

最近、Twitter で趣味の Redash エゴサをしていると、メモリ使用量でお悩みの方がいるようだったので、2019/12/20 現在で Redash のメモリ節約にチャレンジしてみます。

サクッといきます。

環境

先日公開した以下の記事の手順に沿って Vagrant 上で環境構築しました。

ariarijp.hatenablog.com

コンテナのリソース確認のため、 ctop も使います。

github.com

節約前

ctop コマンドで見るとこんな感じ。

f:id:ariarijp:20191220232537p:plain

ざっくり Redash のコンテナ群だけで1.2 GB 前後といったところでしょうか。

(注)PostgreSQL のメモリ使用量については、この記事ではいっさい触れません。

節約後

f:id:ariarijp:20191220232728p:plain

起動しているコンテナ自体が減っていることもありますが、全体で300MBほど。メモリ使用量だけでいえば 1/4 程度に収まりました。

何をやったか

サービス、プロセスを減らす

docker-compose.yml をいろいろ書き換えました。詳しくは diff を見てみましょう。

@@ -13,25 +13,13 @@
     ports:
       - "5000:5000"
     environment:
-      REDASH_WEB_WORKERS: 4
-  scheduler:
+      REDASH_WEB_WORKERS: 1
+  worker:
     <<: *redash-service
     command: scheduler
     environment:
-      QUEUES: "celery"
+      QUEUES: "celery,scheduled_queries,schemas,queries"
       WORKERS_COUNT: 1
-  scheduled_worker:
-    <<: *redash-service
-    command: worker
-    environment:
-      QUEUES: "scheduled_queries,schemas"
-      WORKERS_COUNT: 1
-  adhoc_worker:
-    <<: *redash-service
-    command: worker
-    environment:
-      QUEUES: "queries"
-      WORKERS_COUNT: 2
   redis:
     image: redis:5.0-alpine
     restart: always

Web のワーカーを減らす

性能度外視で節約を目的にするので、プロセス数を1にします

Celery のワーカーをまとめて減らす

デフォルトでは Celery の管理、スケジュール実行、アドホック実行と、3つのサービスにわかれていますが、それをひとつのサービスにまとめます。

ひとつのサービスに詰め込むことになるので、サービス名を worker としています。さらにワーカーのプロセス数も減らして 1 にします。

もちろん、キューが処理されるのは遅くなりますが、これも節約のためです。

使用しないクエリランナーを無効にする

Redash は多くのデータソースに対応している反面、依存パッケージも多く、それらの読み込みによってメモリが多く消費されるようです。

今回の検証では、PostgreSQLMySQLSQLite、BigQuery 以外は無効にするため、以下の設定を /opt/redash/env に追加しました。

REDASH_DISABLED_QUERY_RUNNERS=redash.query_runner.athena,redash.query_runner.google_spreadsheets,redash.query_runner.graphite,redash.query_runner.mongodb,redash.query_runner.couchbase,redash.query_runner.url,redash.query_runner.influx_db,redash.query_runner.elasticsearch,redash.query_runner.amazon_elasticsearch,redash.query_runner.presto,redash.query_runner.databricks,redash.query_runner.hive_ds,redash.query_runner.impala_ds,redash.query_runner.vertica,redash.query_runner.clickhouse,redash.query_runner.yandex_metrica,redash.query_runner.rockset,redash.query_runner.treasuredata,redash.query_runner.dynamodb_sql,redash.query_runner.mssql,redash.query_runner.memsql_ds,redash.query_runner.mapd,redash.query_runner.jql,redash.query_runner.google_analytics,redash.query_runner.axibase_tsd,redash.query_runner.salesforce,redash.query_runner.prometheus,redash.query_runner.qubole,redash.query_runner.db2,redash.query_runner.druid,redash.query_runner.kylin,redash.query_runner.drill,redash.query_runner.uptycs,redash.query_runner.snowflake,redash.query_runner.phoenix,redash.query_runner.json_ds,redash.query_runner.cass,redash.query_runner.dgraph,redash.query_runner.azure_kusto

まとめ

とにかくメモリ使用量を減らすことに集中すると、設定を変えるだけでかなり多くのメモリを節約できます。実用性はともかく、ここまでやれば AWS EC2 の t3.micro 相当でもなんとか動かせるのではないかなと思います。

この記事で紹介した設定はあくまでメモリ使用量節約のデモであり、そのまま使うことはおすすめできませんが、使っていないデータソースの精査だけでも効果が大きいというのを以前の記事でもご紹介していますので、まずはそこから手を付けてみるのが良いと思います。

この記事が Redash の運用でお困りのかたの役に立つとうれしいです。