Language パフォーマンス・速度

Discord

Discord、Read States(既読管理)サービスをGoからRustへ書き換え

GoRust

Goのガベージコレクションが2分ごとに大規模LRUキャッシュをスキャンしレイテンシスパイクを引き起こしていたため、Rustへ全面的に書き換えて解消した。

何が起きたか

DiscordのRead States(どのチャンネル・メッセージを既読にしたかを管理するサービス)はGoで書かれていたが、Goのガベージコレクタが最低2分ごとに強制的に走り、数百万エントリ規模のLRUキャッシュをスキャンして解放済みメモリを探すため、定期的なレイテンシスパイクが発生していた。GCチューニングを重ねても根本解決に至らなかったため、チームはサービス全体をRustで書き直すことを決断。Rustの所有権モデルによりメモリは使用完了時点で即座に解放され、GCによるスキャンが不要になった。基本的な最適化のみでもRust版は入念にチューニングされたGo版を上回る性能を示し、レイテンシ・CPU・メモリのすべてで改善、レイテンシスパイクも解消された。

移行前後の変化

GCによるレイテンシスパイク2分間隔で発生発生しない
2020-02-01
他の事例も見る