Scala 3 slowed us down?

2025/12/08 0:08

Scala 3 slowed us down?

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

Summary:

Scala 2.13 で書かれたサービスを Scala 3.7.3 にアップグレードしました。すべてのユニットテストとステージングデプロイは合格しましたが、新しいビルドでは実際のトラフィック下で深刻なパフォーマンス低下が発生しました:数時間後に Kafka のレイテンシーが増加し、全体のスループットが約 50 % 減少しました。プロファイル解析によって、コード内でメタプログラミングに使用されている

quicklens
ライブラリが Scala 3 上では CPU 負荷が大幅に増加していることが判明しました。この問題はこの依存関係に限定されており、他のライブラリは段階的なロールバックで除外されました。
quicklens
を新しい Scala 3 対応バージョンに更新すると、パフォーマンスは移行前と同等に回復しました。このケースは、小さなライブラリアップグレードでも本番ワークロードで重要な回帰を隠す可能性があることを示しており、言語移行時には詳細なプロファイリングの重要性を強調しています。

Summary Skeleton

What the text is mainly trying to say (main message)
Scala 2.13 のサービスを Scala 3.7.3 に移行しましたが、そのアップグレードは実際のワークロード下でのみ現れる深刻なパフォーマンス回帰を引き起こしました。

Evidence / reasoning (why this is said)
数時間運用後に Kafka のレイテンシーが上昇し、ロールバックでスループットが復旧、プロファイル解析で

quicklens
が 50 % の CPU 負荷増加を示しました。この問題は Scala 3 上のライブラリの非効率に起因し、アップグレードで修正されました。

Related cases / background (context, past events, surrounding info)
移行には依存関係の更新、コンパイラオプション、構文変更が含まれ、すべてのテストはローカルとステージングで合格しました。他のライブラリを段階的にロールバックしても問題は解決せず、

quicklens
に特有の問題であることが明らかになりました。

What may happen next (future developments / projections written in the text)

quicklens
をアップグレードした後、Scala 3 のパフォーマンスは Scala 2.13 と同等になり、再デプロイ前にさらなるベンチマークが必要になることを示唆しており、将来の移行でも同様のプロファイル手順を含めるべきです。

What impacts this could have (users / companies / industry)
遅延は本番データ処理や顧客向けサービスに影響し、メタプログラミングライブラリを使用する組織にとってリスクがあることを示す教訓であり、慎重なパフォーマンス検証の重要性を強調しています。

本文

クリックベイトでしょうか? そうでもありません。
言語の問題なのかコンパイラの欠陥なのか? それも確実に違います。
むしろ、急ぎで行った移行作業の一環だったと言えます。そこで得た教訓を共有します。

あるサービスをリフレッシュしていたとき、そのプロセスの一部としてコードベースを Scala 2.13 から Scala 3 に移行しました。以前にも何度かやった経験があり、概ね良好な結果でした。ただし、マクロ魔法(macro wizardry)が絡むプロジェクトになると状況は変わります。

今回対象だったサービスにはマクロは一切ありませんでしたが、データ取り込みの中心に位置していたため、性能は後回しにならない重要項目です。
通常通り依存関係やコンパイラオプションを更新し、型・構文上の変更も行いました。そのうち数点の難しい暗黙的解決と設定派生(config derivation)を解消した結果、Scala 3.7.3 でビルドが通りました 🎉 テストはすべて合格し、ローカルではエンドツーエンドフローも完璧に動作。そこでテスト環境へ変更を展開しましたが、問題なく動きました。ログにも警戒すべき点はなく、インフラから JVM、アプリケーションレベルまでの指標も健全でした。

それを踏まえて段階的リリースを開始しましたが、状況は引き続き良好に見えました。サービスを監視し続けましたが、仕事は完了したように感じていました。

しかし、予想通りではありませんでした。


謎の遅延

5〜6時間後、いくつかの環境で Kafka のレイテンシ(lag)が増加し始めました。これは決して珍しい現象ではなく、多くの場合データスパイクが原因です。当社にはその対処に十分な機材があります。通常は手を打たずともレイテンシは自動的に解消されます。

今回だけは何かがおかしかったのです。上流側の負荷は比較的穏やかなものだったにも関わらず、サービスのインスタンス数が多く必要になりました ― すなわち1インスタンスあたりの処理速度が低下したということです。これには困惑しました:どうしてこれらの環境だけで処理速度が落ちるのでしょう?

結局、変更をロールバックすることで速さは戻りました。


より深く掘り下げて

テストに戻り、特にロードテストを行いました。しかし、本番環境と同様に回帰は確認できませんでした。そこで負荷パターンやメッセージの粒度を変えて試しましたが、より細かく異種なワークロードでは処理速度が大幅に低下することが判明。

それでも原因は分からず、依存関係が疑わしいと考え、一つずつシリアライゼーションライブラリ、データベース SDK、ベース Docker イメージ、設定ライブラリをロールバックしました。どれも影響はありませんでした。

そこで本格的に調査を進めるため、async-profiler を用いてプロファイルを取得しました。すると次のような事実が明らかになりました:

  • Scala 3 の CPU プロファイルは Scala 2.13 と比べて大きく異なる
  • JVM レベルでは JIT コンパイラが CPU 時間を支配し、アプリケーションレベルではデコード処理が主
  • Scala 3 のフレームグラフ上で長い quicklens 呼び出しが目立つ

以前は透明に機能していた(実際使っていること自体気づいていなかった) quicklens が、Scala 3 では総 CPU 時間のほぼ半分を占めるようになりました。Scala 2.13 ではわずか 0.5 % 程度しかサンプルに現れませんでした。

実際には Scala 3 におけるチェーン評価が非効率になる微妙なバグが存在し、これが JIT が多く時間を費やす原因でもありました。ライブラリのアップデート後、Scala 3 での性能と CPU 特性は Scala 2.13 とほぼ差異なくなりました。


学び

バグ自体の詳細は興味深いものですが(SoftwareMill チームが発見してくれたことに敬意を表します)、ここで強調したいポイントは別です。マクロやメタプログラミングを利用するライブラリは、Scala のバージョン間で極端に振る舞いが変わる可能性があります。

移行がスムーズでサービスが Scala 3 でも正常に動作している場合でも、性能が「あればいい」ではなく「必須」のケースでは仮定せずに自らホットスポットを把握しベンチマークするべきです。さもないと、コードはあなたの代わりにベンチマークを行い、知らなかった場所でボトルネックが明らかになることがあります。

同じ日のほかのニュース

一覧に戻る →

2025/12/08 2:18

I failed to recreate the 1996 Space Jam website with Claude

## Japanese Translation: ## 要約 著者は、Claude AI を使って 1996 年の Warner Bros の「Space Jam」ランディングページをスクリーンショットとアセットフォルダから再構築しようとしました。元のサイトは 200 KB 未満の単一 HTML ファイルで、絶対位置決め、テーブルレイアウト、およびタイル状の星空 GIF 背景に依存しています。 **プロセスと所見** 1. **初期試行:** Claude は概算レイアウトを生成しましたが、惑星軌道を誤った位置に配置しました。軌道パターンは認識できたものの、それを再現することには失敗しました。 2. **構造化プロンプト:** 著者は Claude に「知覚分析」「空間解釈」「再構築計画」の各セクションで理由を説明させ、正確なピクセル座標を要求しましたが、Claude はそれらを提供できませんでした。 3. **カスタムツール:** 精度向上のために 50 px → 5 px のグリッドオーバーレイ、ラベル付き座標参照点、色差比較、スクリーンショットサイドバイサイドビューア、およびスクリーンショットを 6 区域に分割するスクリプトを構築しました。 4. **結果:** Claude の調整は目標から 5–10 px 内に留まりましたが、正しい軌道半径(約 350–400 px)には決して収束しませんでした。内部レイアウトが生成されると、その後のフィードバックは元のスクリーンショットではなく、この誤ったモデルに基づいて行われました。 5. **トークナイズ仮説:** 著者は Claude が 16×16 パッチで画像をトークナイズしているため、細かい視覚的粒度が欠如し、セマンティック理解はあるもののピクセル精度が低いと考えました。 6. **ズームインテスト:** 200 % に拡大したスクリーンショットを提供して、大きなパッチで解像度が向上するか確認しましたが、Claude は依然として比例スケーリング指示に従いませんでした。 **結論** このタスクは未解決のままです。実験は Claude の空間推論限界をベンチマークとし、ピクセル単位で正確な画像再構築におけるモデルの現在の制約を示しています。

2025/12/08 7:18

How I block all online ads

## Japanese Translation: > **概要:** > 著者は、ウェブブラウザとモバイルアプリの両方で広告を排除するために長期的かつ多層的なアプローチを説明しています。彼は **Firefox + uBlock Origin** と最小限のフィルタリスト(組み込みのuBlockフィルタ、EasyList、AdGuard – Ads)と「広告でない不快要素」のためのカスタム非広告フィルタを使用します。 > DNS フィルタリングには **Pi‑hole(または AdGuard Home)** を Docker 上で $5 の DigitalOcean ドロップレットに稼働させ、WireGuard VPN の DNS サーバとして設定しています。トラフィックは **クラウドベースの VPN**(DigitalOcean、Hetzner、Azure、Google Cloud、または AWS)を経由し、プラットフォームが公的クラウド IP を検知して広告配信を減らします。 > この設定では **Cloudflare のキャプチャや HTTP エラー** が発生する場合があるため、著者は該当サイトで VPN を無効化しています。また、**Consent‑O‑Matic**(クッキーポップアップ)、**Buster**(キャプチャ)、**SponsorBlock**(動画広告)などのブラウザ拡張機能を推奨します。iOS では **Background App Refresh** をオフにするとデータ収集が減少し、Android では **ReVanced がアプリをパッチできますが、セキュリティリスクがあります** と指摘しています。 > 著者はこの統合戦略を 3 年以上使用しており、現在ほとんど広告を見ることはありません。プラットフォーム別の効果は異なります:YouTube は uBlock Origin + VPN(1週間〜1か月)が必要;Instagram は uBlock Origin のみで十分;Twitch は主に VPN に依存し、数日で効果が現れます;TikTok は両方のツールを使用しますが、数時間だけです。**AdMob** を利用するアプリも DNS ブロックの恩恵を受けます。 > 広告配信ネットワークは数日から数週間でパターンを観察し調整する可能性があるため、継続的な監視が必要です。著者は **Firebog** をブロックリストの良い情報源として引用し、正当なサイトを壊さないように許可リスト(allowlist)を維持する重要性を強調しています。

2025/12/07 23:37

Dollar-stores overcharge cash-strapped customers while promising low prices

## Japanese Translation: ドルジェネラルとファミリードラーは、棚に貼られたタグの価格よりも高い価格で顧客を頻繁に請求し、低所得層の買い物客に不釣り合いな過剰課金が広く発生しています。州検査と独立調査では、一部店舗でエラー率が88%に達するケースや、両チェーン全体で価格設定失敗が一貫して報告されています。 主な例としては、ノースカロライナ州ウィンザーのファミリードラーで23%のスキャンアイテムが過剰請求(同店の4回連続失敗)、オハイオ州ハミルトンのドルジェネラルで76%のエラー率(2022年10月)、ニュージャージー州バウンドブルックのファミリードラーで68%の不一致(2023年2月)があります。2022年1月以降、ドルジェネラルは4,300件以上、ファミリードラーは2,100件以上の価格失敗事例を記録しています。 アリゾナ州(60万ドル)、コロラド州(40万ドル)、ニュージャージー州・バーモント州・ウィスコンシン州・オハイオ州(最大100万ドル)など複数の州がチェーンと訴訟を和解し、連邦および州の司法長官は追加訴訟を提起しています。株主訴訟では、経営陣がシステム的問題を認識していたと主張されています。ニュージャージー州の連邦裁判所は、モバイルアプリ利用に関連する仲裁条項を理由にドルジェネラルに対する集団訴訟を停止し、消費者の救済手段を制限しました。 規制当局は現在の1検査あたり5,000ドル上限を超えるより厳格な執行や高い罰則を課すことができ、さらに州が調査を進めるにつれて追加の和解が生じる可能性があります。影響としては顧客信頼の低下、チェーンへの潜在的財務損失、評判へのダメージ、およびドルストア業界全体での価格設定と人員管理の強化への動きが挙げられます。

Scala 3 slowed us down? | そっか~ニュース