1日あたり数十億のクエリがGo 1.5を満たしている

会社がインフラストラクチャをGo 1.5に移行し、ガベージコレクターの一時停止を279ミリ秒から10ミリ秒に短縮した方法に関する記事の翻訳。



顧客指向のマーケティングシステムは、可能な限り多くの関連イベントを収集して分析することに依存しています。 顧客は文字通りどこにでもあり、データの量は指数関数的に増加しています。 Go言語は、データ収集システムで重要な役割を果たします。 現在、FLXoneはアプリケーションによって1日あたり30億件以上のリクエストをゼロから処理しています。



そのような生産性を達成するための私たちの道は、テクノロジーとマーケティングと広告の間のインターフェースの重要なタスクを特定することから始まりました。



2013年に、Go(当時は別の1.1)が有望であると判断し、5日以内にアプリケーションの最初のバージョンを作成し、2人のプログラマのみがそれに取り組みました。 ゴルーチンやチャネルなどの言語チップは、豊富な競合(同時実行性)を備えたコード作成タスクを大幅に簡素化しました。 最小限の最適化でMacbook Proで毎秒数千のクエリを達成することは非常に有望です。



実際、アプリケーションは次のことを行います。多数のパラメーターURL(それぞれ平均1KB)を持つ要求を受け入れます。 サーバーは要求を解析し、メッセージを分散キューに送信します。 この最後に、クライアントに空の応答を返します。



さらに成長する



ビジネスが成長し始めるとすぐに、応答時間が増加し始めたことがわかりました。 リクエストごとに約100ミリ秒のSLAがありました。 そして、私たちがさらに成長したとき、それはますます問題になりました。 最初は、サーバーへのネットワーク接続と関係があると判断しましたが、テラバイト単位のデータを毎日生成していても、問題は別のものでした。



次に、Goプログラムの動作を分析し始めました。 平均して、アプリケーションはリクエストごとに約2ミリ秒かかりました。 ネットワークのオーバーヘッド、SSLハンドシェイク、DNSクエリ、およびインターネットを維持するためのその他すべてのために、98ミリ秒が残っていました。



残念ながら、応答時間の標準偏差は大きく、約100ミリ秒でした。 SLA要件を満たすことがギャンブルになりました。 Goランタイムパッケージを使用して、アプリケーションのプロファイルを作成し、問題がガベージコレクションであることを認識しました。これは、応答時間の95パーセンタイルが279ミリ秒になった...



ガベージをまったく生成しないように、アプリケーションの大きなチャンクを書き換えることにしました。 これにより、ガベージコレクターがアプリケーション全体を停止してマジックを実行する間隔が大幅に短縮されました。 しかし、応答時間に関する問題はとにかく残っていたため、SLAに適合するようにノードを追加することにしました。 1秒あたり80Kリクエストのピーク負荷では、ごくわずかなジャンクでさえ深刻な問題になります。



そして、この日が来ました



ここ数ヶ月、Go 1.5について多くの話題がありました。 コンパイラはCからGoに完全に書き直され、映画「インセプション」を思い出しました。 しかし、それ以上に、ガベージコレクターは完全にやり直されています。



昨夜(8月19日)、この瞬間がついに来ました。 Go 1.5の安定バージョンがリリースされ、次のステートメントが含まれています。

コレクターの「世界の停止」の一時停止は、ほとんど常に10ミリ秒未満で、ほとんどの場合、はるかに短くなります。


リリースのわずか数時間後に、Go 1.5でアプリケーションを再構築し、ユニットテストと機能テストを開始しました。 すべてがスムーズに進みました。 見た目が良すぎたため、機能も手動でテストしました。 数時間後、実稼働環境の1つのノードでこのビルドを展開しても安全であると判断しました。



私たちは彼女に仕事に12時間を与え、新しい応答時間の値を分析しました。リクエスト全体、アプリケーションを個別に、そして重要なパラメーターであるガベージコレクターが一時停止する時間です。 以下のグラフで、値の広がりと応答時間の平均値がどのように減少したかを確認できます。





アプリケーションの応答時間の2つのヒストグラム(私たちにとって重要な唯一のもの)。 X軸:応答時間、Y軸:要求の数。 左:Go 1.4で実行されているサーバー、右:Go 1.5で実行されているサーバー、違いは肉眼で見える



Goの新しいバージョンでは、ガベージコレクタの95パーセンタイルの値が279ミリ秒からわずか10ミリ秒に削減されました。 これは、一時停止が96%短縮され、リリースノートに示されているとおりです。



ガベージコレクションの休止が96%削減


新しいバージョンを残りのインフラストラクチャ(7つの地理的ゾーンにある12のデータセンター)に展開することを決定し、リクエストに対する平均応答時間が53%減少することを確認しました。 これは、100msに簡単に収まることを意味し、さらに各ノードが大きな負荷を保持できるようになりました。



チームの献身と柔軟性のおかげで、Go 1.5リリースは生産性を大幅に向上させ、24時間で実現しました。



All Articles