2020年2月11日火曜日

実装言語を「Go」から「Rust」に変更、ゲーマー向けチャットアプリ「Discord」の課題とは(勉強の為に一部引用させて頂きました。)

https://www.atmarkit.co.jp/ait/articles/2002/10/news038.html
勉強の為に一部引用(シェア)しました。

Rustで処理速度を改善:実装言語を「Go」から「Rust」に変更、ゲーマー向けチャットアプリ「Discord」の課題とは

ゲーマー向けチャットアプリケーション「Discord」では、

基盤サービスの一つである「Read States」が十分に高速化

できない問題が明らかになった。開発チームは既存のコード

をさらに改善することで対応しようとした。だが、Rust言語

で再実装したところ、最適化を施す以前からパフォーマンス

が向上した。なぜだろうか。開発チームがその理由を語る。

2020年02月10日 11時40分 公開
[@IT]

Goで性能が低下したのはなぜか

 アトミックカウンターを高速に更新するために、各Read Statesサーバには、Read StateのLRU(Least Recently Used)キャッシュがある。各キャッシュには数百万人のユーザー、数千万のRead Stateが含まれる。そして、キャッシュの更新頻度は毎秒数十万回に及ぶ。
 データの永続性を確保するために、Discordは分散データベース管理システム「Apache Cassandra」のクラスタでキャッシュを補完している。キャッシュキーのエビクション(不要なデータを追い出すこと)の際に、Read Stateをデータベースにコミットする。加えて、Read Stateの更新時に必ず、30秒間のデータベースコミットを入れている。こうしてデータベースへ毎秒数万回の書き込みが起こる。
 Goで実装したRead Statesサービスのパフォーマンスを次のグラフに示した。最大メンション数(右下)が不規則に変動しているにもかかわらず、CPU使用率(左上)や平均応答時間(右上)にははっきりした挙動が現れており、約2分ごとに、CPU使用率と平均応答時間がスパイク状に急増していることが分かる。
Go版のRead Statesサービスの主な挙動(出典:Discord

「非同期Rust」の完成度は低かったものの、コミュニティーの協力を得た

 Read Statesサービスを再実装した当時、Rustの安定版では非同期Rustのサポートが不十分だった。だが、ネットワークサービスでは、非同期プログラミングが必須だ。非同期Rustを有効にしたコミュニティー版のライブラリが幾つか存在したものの、利用に際して複雑な手順が必要であり、不具合が生じた場合のエラーメッセージは非常に分かりにくかった。
 幸いなことに、Rustチームは、非同期プログラミングが容易になるよう精力的に取り組んでおり、Rustのナイトリーチャネルで、非同期プログラミング機能が強化された不安定版が入手できるようになった。
 Discordはナイトリーリリースを導入し、問題が発生した際にはRustチームと協力して対処した。その結果、現時点では、Rustの安定版は非同期Rustをサポートしている。

最適化しなくても性能を発揮したRust版

Rustで効率的なプログラムを書くのがいかに簡単かを示すよい実例だ。

 次にRead StatesサービスのGo版とRust版でCPU使用率と平均応答時間を比較したグラフを示す。紫がGo版、青がRust版だ。Rust版はCPU使用率の変動がほとんどなく、平均応答時間にスパイクのないことが分かる。
Rust版とGo版の挙動を比較したグラフ(出典:Discord

Rustのメリットは何か

 型安全性と借用チェッカー(borrow checker)は特に役に立つ。なぜなら製品の要件が変わったときなどに、コードのリファクタリングが容易になるからだ。
Copyright © ITmedia, Inc. All Rights Reserved.

0 コメント:

コメントを投稿