The Go Blog
Qihoo 360 と Go
このゲストブログ記事は、Qihoo 360 のソフトウェアエンジニアである Yang Zhou 氏によって書かれました。
Qihoo 360 は、中国におけるインターネットおよびモバイルセキュリティ製品とサービスの主要プロバイダーであり、主要な Android ベースのモバイル配信プラットフォームを運営しています。2014年6月末時点で、Qihoo は約5億人の月間アクティブPCインターネットユーザーと6億4千万人以上のモバイルユーザーを抱えていました。Qihoo はまた、中国で最も人気のあるインターネットブラウザとPC検索エンジンの1つを運営しています。
私のチームであるプッシュサービスチームは、オープンプラットフォームにある数千のアプリを含む、社内の50以上の製品(PCおよびモバイルの両方)に基本的なメッセージングサービスを提供しています。
Go との「恋」は、Qihoo の製品の1つにプッシュサービスを提供しようと初めて試みた2012年に遡ります。最初のバージョンは nginx + lua + redis で構築されましたが、過剰な負荷のため、リアルタイムパフォーマンスの要件を満たすことができませんでした。このような状況で、新しく公開された Go 1.0.3 リリースが私たちの注目を集めました。Go が提供する goroutine とチャネル機能のおかげで、数週間でプロトタイプを完成させました。
当初、当社の Go ベースのシステムは20台のサーバーで稼働し、合計2,000万のリアルタイム接続がありました。このシステムは1日あたり200万のメッセージを送信していました。現在、このシステムは400台のサーバーで稼働し、2億以上のリアルタイム接続をサポートしています。現在、1日あたり100億以上のメッセージを送信しています。
急速なビジネス拡大とプッシュサービスに対するアプリケーションニーズの増加に伴い、最初の Go システムはすぐにボトルネックに達しました。ヒープサイズは69Gに増加し、最大ガーベージコレクション(GC)の一時停止時間は3~6秒に達しました。さらに悪いことに、メモリを解放するために毎週システムを再起動しなければなりませんでした。Go を手放し、代わりにCでコアコンポーネント全体を書き直すことを検討しなかったとしたら正直ではありません。しかし、物事は計画通りに進まず、ビジネスロジック層のコードの移行で問題が発生しました。その結果、当時の唯一の担当者(私自身)が Go システムを維持しながら、C サービスフレームワークへのロジック移行を確実にすることは不可能でした。
したがって、私は Go システムを維持することを決定しました(おそらく私が下さなければならなかった最も賢明な決定でした)。そして、すぐに大きな進展がありました。
行ったいくつかの調整と重要なポイントは以下のとおりです。
- 通信中のバッファとオブジェクトの作成を減らすために、短い接続を永続的な接続(接続プールを使用)に置き換えます。
- GC への負荷を軽減するために、オブジェクトとメモリプールを適切に使用します。
-
寿命の短い goroutine を置き換えるために、接続 goroutine から送信されるグローバルなタスクキューまたはメッセージキューを消費する、長期実行 goroutine のグループを持つメカニズムであるタスクプールを使用します。
-
プログラム内の goroutine の数を監視および制御します。制御が不足すると、外部からのリクエストを無制限に受け入れることによる goroutine の急増により、GC に耐えがたい負担がかかる可能性があります。これは、内部サーバーに送信される RPC 呼び出しが最近作成された goroutine をブロックする可能性があるためです。
-
モバイルネットワーク下では、接続に読み取りおよび書き込みの期限を追加することを忘れないでください。そうしないと、goroutine のブロックにつながる可能性があります。LAN ネットワーク下では、適切かつ慎重に適用してください。そうしないと、RPC 通信の効率が損なわれます。
-
RPC フレームワークの通信効率を向上させるために、パイプライン(TCP の全二重機能下)を使用します。
その結果、限られた人的資源にもかかわらず、アーキテクチャの3回のイテレーションと RPC フレームワークの2回のイテレーションを成功させました。これはすべて Go の開発の利便性に起因しています。以下に、最新のシステムアーキテクチャを見つけることができます。
継続的な改善の道のりは、表で示すことができます。
また、これらの最適化後、一時的なメモリ解放やシステム再起動は不要です。
さらにエキサイティングなのは、Go プログラムをプロファイリングするためのオンラインリアルタイム可視化プラットフォームを開発したことです。現在、システムの状態に簡単にアクセスして診断し、潜在的なリスクを特定できます。システムが動作しているスクリーンショットはこちらです。
このプラットフォームの素晴らしい点は、分散ストレステストツール(Go を使用して構築)を適用することで、何百万ものオンラインユーザーの接続と動作を実際にシミュレートし、すべてのリアルタイム視覚化データを観察できることです。これにより、最適化の有効性を評価し、システムのボトルネックを特定することで問題を未然に防ぐことができます。
これまで、考えられるほとんどすべてのシステム最適化が実施されてきました。そして、GC チームからのさらなる良いニュースを楽しみにしており、重い開発作業からさらに解放されることを期待しています。Go が進化し続けるにつれて、私たちの経験もいつか時代遅れになるかもしれません。
だからこそ、Gopher China に参加する機会を与えてくださったことに心からの感謝を表明して、私の共有を締めくくりたいと思います。それは、私たちにとって学び、共有し、中国における Go の人気と繁栄を示す窓を提供するための祝典でした。Qihoo 内の他の多くのチームは、すでに Go を知っているか、Go を使い始めています。
今後も多くの中国のインターネット企業が Go でシステムを再構築することに参加し、Go チームの努力が近い将来、より多くの開発者と企業に利益をもたらすと確信しています。
次の記事: Go、オープンソース、コミュニティ
前の記事: GopherChina 参加報告
ブログインデックス