The Go Blog(Goブログ)
Qihoo 360とGo
このゲストブログ記事は、Qihoo 360のソフトウェアエンジニアであるYang Zhouによって書かれました。
Qihoo 360は、中国におけるインターネットおよびモバイルセキュリティ製品とサービスの大手プロバイダーであり、主要なAndroidベースのモバイル配信プラットフォームを運営しています。2014年6月末時点で、Qihooは約5億人の月間アクティブPCインターネットユーザーと6億4000万人以上のモバイルユーザーを抱えていました。Qihooはまた、中国で最も人気のあるインターネットブラウザとPC検索エンジンの1つを運営しています。
私のチームであるプッシュサービスチームは、オープン プラットフォームにある数千のアプリを含む、社内(PCとモバイルの両方)の50以上の製品に、基本的なメッセージング サービスを提供しています。
Goとの「恋に落ちた」のは、2012年にQihoo製品の1つにプッシュサービスを提供しようと初めて試みたときのことです。初期バージョンはnginx + lua + redisで構築されましたが、負荷が高すぎるため、リアルタイムパフォーマンスの要件を満たすことができませんでした。このような状況下で、新しく公開されたGo 1.0.3リリースが注目を集めました。Goが提供するゴルーチンとチャネル機能のおかげで、数週間でプロトタイプを完成させることができました。
当初、Goベースのシステムは20台のサーバーで稼働し、合計2,000万のリアルタイム接続がありました。システムは1日に200万件のメッセージを送信していました。現在、そのシステムは400台のサーバーで稼働し、2億以上のリアルタイム接続をサポートしています。現在、1日に100億件以上のメッセージを送信しています。
ビジネスの急速な拡大とプッシュサービスに対するアプリケーションニーズの増加に伴い、初期のGoシステムはすぐにボトルネックに達しました。ヒープサイズは69Gまで増加し、最大ガベージコレクション(GC)ポーズは3〜6秒でした。さらに悪いことに、メモリを解放するために毎週システムを再起動する必要がありました。Goを諦めて、コアコンポーネント全体をCで書き直すことを検討しなかったと言えば嘘になります。しかし、物事は計画通りに進まず、ビジネスロジック層のコードの移行に問題が発生しました。その結果、当時の唯一の担当者(私)がGoシステムを維持しながら、ロジックをCサービスフレームワークに転送することを保証することは不可能でした。
そのため、Goシステムを使い続けることを決定しました(おそらく私がしなければならなかった最も賢明な決断でしょう)。そして、すぐに大きな進歩がありました。
私たちが行ったいくつかの調整と重要なポイントをご紹介します。
- 短い接続を永続的な接続(コネクションプールを使用)に置き換え、通信中のバッファとオブジェクトの作成を削減します。
- オブジェクトとメモリプールを適切に使用して、GCの負荷を軽減します。

-
タスクプール(コネクションゴルーチンによって送信されたグローバルタスクまたはメッセージキューを消費する、長寿命のゴルーチンのグループを持つメカニズム)を使用して、短寿命のゴルーチンを置き換えます。
-
プログラム内のゴルーチンの数を監視および制御します。制御がないと、内部サーバーに送信されたRPC呼び出しによって最近作成されたゴルーチンがブロックされる可能性があるため、外部リクエストの無制限の受け入れによるゴルーチンの急増によってGCに耐え難い負担がかかる可能性があります。
-
モバイルネットワーク下では、接続に読み取りおよび書き込みの期限を追加することを忘れないでください。そうしないと、ゴルーチンのブロックにつながる可能性があります。LANネットワーク下では、適切かつ慎重に適用してください。そうしないと、RPC通信効率が低下します。
-
パイプライン(TCPの全二重機能を使用)を使用して、RPCフレームワークの通信効率を高めます。
その結果、限られた人的資源でアーキテクチャの3回の反復とRPCフレームワークの2回の反復に成功しました。これはすべて、Goの開発の利便性のおかげです。以下は最新のシステムアーキテクチャです。

継続的な改善の道のりは、表で説明できます。

また、これらの最適化後、メモリの臨時解放やシステムの再起動は必要ありません。
さらにエキサイティングなのは、Goプログラムのプロファイリングのためのオンラインリアルタイム可視化プラットフォームを開発したことです。システムの状態に簡単にアクセスして診断し、潜在的なリスクを特定できるようになりました。システムの動作中のスクリーンショットを以下に示します。


このプラットフォームの素晴らしい点は、分散ストレステストツール(これもGoを使用して構築)を適用することで、数百万人のオンラインユーザーの接続と動作を実際にシミュレートし、すべてのリアルタイムの視覚化データを観察できることです。これにより、最適化の効果を評価し、システムのボトルネックを特定することで問題を回避できます。
これまでに、考えられるあらゆるシステム最適化が実践されてきました。そして、GCチームからのさらなる朗報を期待しており、重い開発作業からさらに解放されることを願っています。Goは進化し続けているため、私たちの経験もいつか時代遅れになるでしょう。
Gopher Chinaに参加する機会をいただいたことに心から感謝の意を表することで、私の共有を締めくくりたいと思います。Goの中国での人気と繁栄を紹介する窓口を提供してくれた、私たちにとって学び、共有するための祝祭でした。Qihoo内の他の多くのチームは、すでにGoを知っているか、Goを使用しようと試みています。
より多くの中国のインターネット企業がGoでシステムを再構築し、Goチームの努力が近い将来、より多くの開発者と企業に利益をもたらすと確信しています。
次の記事:Go、オープンソース、コミュニティ
前の記事:GopherChina旅行レポート
ブログインデックス