Metabase のロゴ

Metabase / 公式ブログ / 2026/05/12 / 通常

Metabase 2026年5月12日の公式ブログ解説: clojure-lsp の性能改善

公式ブログ原文

Metabase は 2026年5月12日、Clojure 開発で広く使われる clojure-lsp の性能改善について公式ブログを公開しました。Metabase の大規模コードベースで起動時間が長く、メモリ割り当ても大きかった問題を、profiling と upstream への改善提案でどう縮めたかを説明しています。

要点

  • Metabase の開発者は、大規模コードベースで clojure-lsp の起動が遅い問題に直面していた
  • heap headroom、GC、allocation profile を確認し、単なる体感ではなく測定に基づいて原因を追った
  • clj-kondo と rewrite-clj 周辺の hot path を改善し、deep-merge、dynamic variable、memoization などに手を入れた
  • 結果として elapsed time は約2倍改善し、heap allocation は約3分の1まで減った
  • 変更は clj-kondo 側へ個別PRとして提案され、clojure-lsp の今後のリリースに取り込まれる見込み

今回のブログ記事で語られていること

今回の Metabase 公式ブログは、Metabase の製品機能リリースというより、大規模な Clojure コードベースを扱う開発者体験の改善事例です。Metabase の開発者は、clojure-lsp がプロジェクト解析を始めるまでに時間がかかる問題に向き合いました。最初に確認したのは heap size です。JVM の既定設定では利用可能メモリの一部が最大heapとして使われますが、Metabase のような大きなコードベースでは解析中に解放できないオブジェクトが増え、GC が頻発し、処理時間を押し上げていました。heap を広げるだけでも起動時間は短くなりましたが、それだけでは根本対策にならないため、さらに allocation profiling に進んでいます。

記事では、clj-async-profiler を使って allocation profile と flamegraph を取り、どの処理が大量の割り当てを生んでいるかを見ています。clojure-lsp の初期化処理の多くは clj-kondo 関連であり、そこから deep-merge、rewrite-clj、memoization などの改善点を抽出しています。deep-merge では不要な中間オブジェクトや collection 操作を減らし、rewrite-clj では hot path 上の dynamic variable を避けることで割り当てを抑えています。memoization についても、任意arityに対応する汎用実装ではなく、clj-kondo の用途に合う1引数・2引数向けの実装に寄せ、cache key を作るための余計な allocation を減らしています。

興味深いのは、改善の見せ方です。単に「速くなった」と主張するのではなく、GC event を使って benchmark 中の総割り当てbytesを測り、変更前後を比較しています。個別PRごとの実行時間差は揺れが大きく読みづらいため、総allocationという補助指標を使って、どの変更がどの程度効いたかを説明しています。最終的には elapsed time が約2倍改善し、heap allocation は約3分の1に減ったとされます。diffgraph でも、clj-kondo の namespace analysis や rewrite-clj の parse path などで大きく割り当てが減っていることが示されています。

この投稿は、Metabase が自社の開発基盤をどう改善しているかを知る材料であると同時に、大規模コードベースでAIやエージェント以前の基本的な開発者体験がどれほど重要かを示す話でもあります。LSP が遅いと、補完、定義ジャンプ、診断、コード理解の速度が落ち、開発の小さな待ち時間が積み上がります。Metabase のように 500K-line 規模のバックエンドを扱うチームでは、開発ツールの性能改善がそのままチーム全体の生産性に効きます。さらに、改善を upstream に返すことで、Metabase だけでなく同じ Clojure ecosystem を使う他のチームにも効果が広がります。

対象になりそうなチーム

  • Clojure / JVM 系の大規模コードベースを運用している開発チーム
  • Metabase の開発文化やOSS貢献の動きを追っている読者
  • LSP、formatter、static analysis などの開発者向けツールを社内で重く使っている platform / developer productivity team
  • BI製品やデータ基盤の裏側にある開発運用の成熟度を見たい技術リーダー

実務でまず確認したいこと

  1. 自社の主要開発ツールで、起動時間やメモリ使用量が開発体験を悪化させていないか確認する
  2. 遅さを体感で済ませず、heap、GC、allocation、CPU profile など測定指標に分けて見る
  3. 汎用的な便利関数や動的な仕組みが hot path で余計な allocation を生んでいないか点検する
  4. 社内だけで回避策を持つのではなく、OSS upstream に返せる改善かどうかを検討する

結局、今回のブログ記事をどう読むべきか

clojure-lsp の改善記事は、Metabase の直接的な新機能発表ではありません。ただし、Metabase が大規模なClojureコードベースを維持し、開発者体験を測定し、OSS ecosystem に改善を返していることを示す重要な公式ブログです。Metabase を業務ツールとして見る読者にとっても、製品の裏側にある開発基盤の成熟度を知る手がかりになります。