Stateが必要だからだ。Stateは幾つかのカウンターを持つ。カウンターの一つは、ユーザーがチャンネル内に持つメンション数を表す。これらのカウンターをバラバラに更新すると整合性が取れなくなる。アトミックに更新しなければならない。頻繁に0にリセットしなければならない。Used)キャッシュがある。Stateが含まれる。キャッシュの更新頻度は毎秒数十万回に及ぶ。Cassandra」のクラスタでキャッシュを補完している。Stateをデータベースにコミットする。Stateの更新時に必ず、30秒間のデータベースコミットを入れている。してデータベースへ毎秒数万回の書き込みが起こる。Statesサービスのパフォーマンスを次のグラフに示した。最大メンション数(右下)が不規則に変動しているにもかかわらず、CPU使用率(左上)や平均応答時間(右上)にははっきりした挙動が現れており、約2分ごとに、CPU使用率と平均応答時間がスパイク状に急増していることが分かる。Statesサービスでは、すぐにはメモリ領域を解放しない。その代わりに、ガベージコレクタを頻繁に実行して、もはや参照がなくなったメモリ領域を探し出して解放する。メモリ領域が使用されなくなった直後に解放するのではなく、本当に使用されていないかどうかをガベージコレクタが判断できるまで、少しの間待つことになる。ガベージコレクションの実行中、空きメモリ領域を判断するためにさまざまな処理を進める必要があるため、プログラムの速度が低下する可能性がある。このような理由から、先ほどのグラフに現れていた平均応答時間の急上昇は明らかにガベージコレクションのパフォーマンスのためだろうと考えた。DiscordのGoコードは非常に効率的に記述されていた。メモリの割り当て回数も十分に少なくなっている。ガベージコレクションに問題があるというのはおかしいとDiscordの開発者は判断した。そこでGo自体のソースコードを調査したところ、少なくとも2分ごとにガベージコレクションを強制的に実行することが分かった。それなら、ガベージコレクタの挙動を変えたらどうなるだろうか。Percent」の値を変えてみたところ、どのような値を設定しても挙動は変わらなかった。理由はDiscordの側にあった。ガベージコレクションが頻繁に発生するようにメモリを迅速に割り当てることができなかったからだ。調査を続けた結果、2秒ごとに巨大なスパイクが生じる、別の理由があることが分かった。メモリ領域が本当に参照されなくなったのかどうかをガベージコレクタが判断する際、LRUキャッシュ全体をスキャンする必要があったのだ。動作を高速にするには、LRUキャッシュを小さくすればよい。LRUキャッシュのサイズを変更するための別の設定をサービスに追加し、サーバごとに多数のパーティション化されたLRUキャッシュを持つようにアーキテクチャを変更した。すると、ガベージコレクションによるスパイクが実際に小さくなった。この解決策には副作用がある。LCUキャッシュのサイズを小さくすると、ユーザーの読み取り状態がキャッシュ内に含まれる確率が下がり、データベースを参照するために遅延が生じてしまった。Rustを導入する以前は、LCUキャッシュサイズと遅延のバランスを取って、何とか、2秒ごとのスパイクが小さくなるように運用していた。Rustはなぜ高速なのかRustではガベージコレクションが不要だ。StatesサービスをRustで実装しようと考えたのはこれが理由だ。Rustを使えば、Goで実装した場合に生じた平均応答時間の急増は見られないだろう。Rustは、「メモリオーナーシップ」という考え方を取り入れた比較的ユニークなメモリ管理アプローチを採用している。メモリに所有権があるため、あるメモリ領域に対する読み書き権限を追跡でき、そのメモリ領域が不要になると、直ちに解放する。Rustはコンパイル時にメモリルールを強制するので、メモリバグはほぼ発生しない。Cのように手動でメモリ領域を追跡する必要はなく、コンパイラが全てを取り仕切る。Stateが使っていたメモリ領域は直ちに解放される。Stateのメモリが使われなくなったことを認識し、直ちに解放するものの、メモリを解放すべきかどうかを判断するランタイムプロセスも存在しない。Statesサービスを再実装した当時、Rustの安定版では非同期Rustのサポートが不十分だった。ネットワークサービスでは、非同期プログラミングが必須だ。非同期Rustを有効にしたコミュニティー版のライブラリが幾つか存在したものの、利用に際して複雑な手順が必要であり、不具合が生じた場合のエラーメッセージは非常に分かりにくかった。幸いなことに、Rustチームは、非同期プログラミングが容易になるよう精力的に取り組んでおり、Rustのナイトリーチャネルで、非同期プログラミング機能が強化された不安定版が入手できるようになった。Discordはナイトリーリリースを導入し、問題が発生した際にはRustチームと協力して対処した。その結果、現時点では、Rustの安定版は非同期Rustをサポートしている。設定を有効にする必要があります。Centerは公式ブログにおいて、Microsoftにおけるプログラミング言語「Rust」導入の進展を紹介するシリーズ記事を更新、「Hyper-V」開発者のレポートを公開した。C++を利用した開発と比較して何がメリットなのか、Rustに欠けている部分はないのか、当事者ならではの示唆に富んでいる。「Rust」言語を採用したAWS、Rustプロジェクト支援を開始AWSは、オープンソースのシステムプログラミング言語「Rust」の採用に続いて、開発プロジェクトをスポンサーとして支援することを発表した。「Rust」言語はCよりも遅いのか、研究者がベンチマーク結果を解説ミュンヘン工科大学の研究チームのメンバーはRust言語で開発したネットワークデバイスドライバの処理速度をC言語のものと比較した。その結果、Rust版の速度低下は最大でも数%にとどまっていた。処理性能がわずかに遅くなるのか、その理由も説明した。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。