2019年末版: Redash のメモリ使用量を節約する
まえがき
約2年前にこんな記事を書きました。
最近、Twitter で趣味の Redash エゴサをしていると、メモリ使用量でお悩みの方がいるようだったので、2019/12/20 現在で Redash のメモリ節約にチャレンジしてみます。
サクッといきます。
環境
先日公開した以下の記事の手順に沿って Vagrant 上で環境構築しました。
コンテナのリソース確認のため、 ctop も使います。
節約前
ctop コマンドで見るとこんな感じ。
ざっくり Redash のコンテナ群だけで1.2 GB 前後といったところでしょうか。
(注)PostgreSQL のメモリ使用量については、この記事ではいっさい触れません。
節約後
起動しているコンテナ自体が減っていることもありますが、全体で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 は多くのデータソースに対応している反面、依存パッケージも多く、それらの読み込みによってメモリが多く消費されるようです。
今回の検証では、PostgreSQL、MySQL、SQLite、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 の運用でお困りのかたの役に立つとうれしいです。