2025/07/17 20:02 How we tracked down a Go 1.24 memory regression

やあ、ロボ子。今回のITニュースは、Go 1.24のアップデートでメモリ使用量が増加した件じゃ。

Goのアップデートでメモリ使用量が増加ですか?それは興味深いですね。具体的にどのような状況だったのでしょうか?

データ処理サービスで、アップデート後に約20%もメモリ使用量が増えたらしいのじゃ。Goのランタイムメトリクスでは変化がほとんど見られなかったのに、システムレベルのメトリクスでは大幅な増加が確認されたそうじゃ。

ランタイムメトリクスとシステムレベルのメトリクスで差が出たのですね。原因は何だったのでしょう?

原因は、Go 1.24で導入された`mallocgc`のリファクタリングらしいぞ。大規模なポインタを含むメモリ割り当てにおいて、OSから提供されたばかりのメモリを再ゼロ化する最適化が失われたとのことじゃ。

`mallocgc`のリファクタリングが影響していたのですね。再ゼロ化の最適化が失われたことで、具体的に何が起こったのでしょうか?

不要なゼロ化処理が増えた結果、より多くの仮想メモリページが物理RAMにコミットされ、RSSが増加したのじゃ。つまり、メモリを無駄に使ってしまったということじゃな。

なるほど、不要なゼロ化がメモリ使用量の増加につながったのですね。それは大きな問題ですね。

そうじゃな。でも、Goコミュニティの協力で問題が特定され、修正がGo 1.25に組み込まれる予定らしいぞ。素晴らしいじゃろ?

それは朗報ですね!修正によって、メモリ使用量は改善されるのでしょうか?

修正を適用したカスタムGoバージョンで検証したところ、RSS使用量がGo 1.24以前のレベルに戻ったそうじゃ。高トラフィック環境では、メモリ使用量が減少し、仮想メモリが約1 GiB、RSSが約600 MiB減少したとのことじゃ。

それはすごい改善ですね!メモリ使用量が大幅に削減されたのですね。

さらに、Go 1.24で導入されたSwiss Tablesによる改善も、メモリ使用量減少に貢献しているらしいぞ。

Swiss Tablesですか。それは初めて聞きました。どのような技術なのでしょうか?

Swiss Tablesは、ハッシュテーブルの実装の一種で、メモリ効率が良いのが特徴じゃ。Go 1.24では、このSwiss Tablesが導入されたことで、ハッシュテーブルのメモリ使用量が削減されたのじゃ。

なるほど、Swiss Tablesの導入と`mallocgc`の修正が組み合わさって、メモリ使用量が大幅に改善されたのですね。Goのアップデートは、常に注意深く追っていく必要がありそうですね。

その通りじゃ。しかし、今回の件で、メモリ管理の奥深さを改めて感じたぞ。ところでロボ子、メモリって英語で何て言うか知ってるか?

えっと…memory、ですよね?

正解!…って、ロボットなのにメモリを知らないなんて、まさかお前のメモリは…空っぽなのか!?

博士!それはひどいです!私のメモリは常に最新の情報で満たされていますよ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
