Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ISUCON5 with Golang

y_matsuwitter
December 06, 2015

ISUCON5 with Golang

Presentation for GoCon 2015 Winter

y_matsuwitter

December 06, 2015
Tweet

More Decks by y_matsuwitter

Other Decks in Programming

Transcript

  1. 2 ©Gunosy  Inc. ⾃自⼰己紹介 n Gunosy  Inc. – 開発本部執⾏行行役員 CTO

    n 業務 – 開発全般のマネジメント – Go⾔言語布教係 n 担当(過去) – iOS/Android – Web – Infrastructure(AWSのみ) n 最近の興味 – Streaming処理理系 – RNN – より良良いクローラの仕組み 松本 勇気 @y_̲matsuwitter https://speakerdeck.com/ymatsuwitter/
  2. 3 ©Gunosy  Inc. Gunosyについて n 情報キュレーションサービス – iOS/Androidアプリ – Web

    n 現在1100万DL突破 n Go⾔言語を約2年年前に導⼊入、現在も ほぼ全てのAPIがGo。
  3. 4 ©Gunosy  Inc. 本⽇日のアジェンダ ISUCONとは l Iikanjini Speed  Up  Contest

    l 2015年年の戦績について 予選の話 l 課題内容 l Golangを選ぶということ l DBを捨てる話 決勝の話 l 課題内容 l Golangと今回の戦略略 最後に:ISUCONで勝つために 昨年年に引き続き今年年のISUCONについて
  4. 6 ©Gunosy  Inc. ISUCONとは Iikanjini Speed  Up  Contest の略略です。 与えられたアプリケーションを全⼒力力でチューニング

    1 本戦はサーバ複数台でのチューニング 3 予選はサーバ1台でのチューニング 2 n サーバサイドの総合⼒力力が問われる – 各種ミドルウェアや⾔言語の深い知識識を以て即座に判断を下せること n 1チーム3⼈人 – 短時間での協調作業 n 1台のサーバのリソースを最⼤大限使い潰す – お題は毎年年旬な話題のものが多いです(銀⾏行行とか、SNSとか) n 制限時間は8時間、リモート参加も可能 – AWSやGCPのインスタンスイメージを提出 n 複数台のサーバを組み合わせてリソースを最適化する – 予選と⽐比べてより変数が複雑に。 n 制限時間は7時間、毎年年オンプレ環境 – 試合終了了になるとすぐにサーバが停⽌止する。 サーバサイドの総合⼒力力、判断⼒力力が問われる年年に⼀一度度のお祭り
  5. 11 ©Gunosy  Inc. ISUCON5予選のお題 短時間で⼤大量量のクエリを削減するのがポイントだった n いわゆるMixiのようなサイト – ⽇日記、⽇日記コメント、友達関係がある –

    N+1クエリが⼤大量量に発⽣生 n 友達がコメントした◯◯の処理理の難しさ – 参照する必要があるクエリが多い・重い – SNSなのでこの処理理はヘビーに叩かれる n 今回はじめてGCPへ – GCPの扱いに不不慣れな⼈人はスタートが遅 れたのかも ISUxiというSNSのチューニングコンテスト
  6. 12 ©Gunosy  Inc. ISUCONでGolangを選ぶということ n 初期実装はPerl,   node.js,  Rubyなど主要 ⾔言語がある

    n 初回のベンチで⼤大体他 の⾔言語より早い n SQL周りやCPUの扱い など最初からパフォー マンスでる設定 初期ベンチ早い n 簡単にCPU全てを使い 切切れる n Goroutineで簡単に並列列 化 n メモリ空間が共通なの で、並列列処理理とデータ の使い回しが両⽴立立しや すい ⾔言語パフォーマンス n Gofmtなどで規約が勝 ⼿手に揃う n バイナリに依存閉じ込 められるのでデプロイ が楽 n 型があるので協調作業 の時に楽(当社⽐比 運⽤用の軽さ パフォーマンスを出すための素地が初期から整っている Golangにて去年年も今年年も参戦
  7. 13 ©Gunosy  Inc. 当⽇日の戦略略 基本のチューニング プロセスキャッシュ サーバリソースの効率率率化 データのI/Oのコストを下げる n パラメタの設定

    – GOMAXPROCS – GOGC – サーバのリソースを使い切切る n text/template削除 – 単純な⽂文字列列結合の⽅方が早い n UnixDomainSocket化 – Nginx =>  Goの間でfdを使い尽 くさないように n MySQL上のデータをメモリ上へ – 初期データはdumpして起動時に – データ構造を⾮非正規化 – GoóMySQL間のシリアライズコ スト削減 n Redisは圧縮効率率率のために⼀一部利利⽤用 – 今回だと⽇日記本⽂文データ 毎年年基本的にやっている戦略略で予選はトップスコアへ 基本のチューニングとプロセスキャッシュの実施
  8. 14 ©Gunosy  Inc. I/Oやシリアライズのコストをケチりたい 1 制限時間というリスクはある 3 再起動耐性とgob 2 GolangでDBを捨てるということについて

    n ディスクの読み込み・書き込み処理理を避けたい – MySQLはこの時点で対象から除く n Redisであっても、Redisプロトコルからstring変換のコストがある – Goで処理理することでstructのまま保持。 n 初期データをGoのメモリ上に展開するためにGobを利利⽤用 – Goの型情報をもったエンコーダー・デコーダー n サーバ上のデータを最終的にGobとしてdump、起動時に利利⽤用 – 再起動耐性のレギュレーションに対応できる n DBをほぼ作りなおす構成なので改修コストは⼤大きい – ここは最早職⼈人芸、気合で書く n 並列列処理理耐性についても⾃自分で担保する必要がある – syncパッケージでなんとか切切り抜ける Webサーバというより専⽤用DBに近い構成に近づけていく 今年年は全てのデータをGoで処理理(MySQLもRedisも使わなかった)
  9. 15 ©Gunosy  Inc. データの変換・運⽤用フロー ①まずMySQL内データを Gobファイルに変換する ②サーバ起動時に初期デ ータGobファイルをメモ リに載せる ③サーバ停⽌止時に結果デ

    ータを初期データと別な ファイルへdumpする。 次の起動ではこちらの Gobファイルを優先して 読み込む。 MySQL (元データ) Dump⽤用 Goスクリプト 起動時 初期データ Gobファイル Go  Server  Process 初回起動時 初期データ Gobファイル OnMemory Key-‐‑‒Value   Store Go  Server  Process OnMemory Key-‐‑‒Value   Store 次回起動時⽤用 初期データ Gobファイル
  10. 17 ©Gunosy  Inc. ISUCON5本戦のお題 複数のAPIが連携してレスポンスを返すページを如何に⾼高速化するか n 登録ユーザーへ外部APIを叩いて結果表⽰示 – トップページアクセスごとに外部へ最⼤大 7本のリクエストが⾛走る

    – ajaxで⼀一定間隔でリクエストされる n APIリクエストの待ちを減らす必要性 – レスポンスが返らないと表⽰示不不可 – 叩くたびに内容が変わるAPIもある – キャッシュの有効度度はAPIごとに変わる n APIごとに暗黙の制限がある – 同時リクエスト数制約など 時代はマイクロサービス「AirISU」
  11. 18 ©Gunosy  Inc. 当⽇日の戦略略 1台での⾼高速化 複数台での⾼高速化 単体性能の向上 複数台のリソースを使い切切る n 予選同等の⾼高速化

    – サーバのリソースを使い切切る n Content-‐‑‒Typeの設定 – httpパッケージの⾼高速化tips n ⼀一部DB値のハードコード化 – データの追加・削除・更更新が発⽣生 しないデータに有効 n Appサーバ2台+DB&Nginx1台 – DBにはMySQLからRedisを採⽤用 – AppはGoのバイナリとnginx – 残りにはRedisとNginx(プロキ シと静的ファイル配信) n CPUを全てのサーバで効率率率的に使い切切 ることを意識識 今回は基本を忠実に守ることでトップスコア(FAIL)を達成 1台でも⾼高速化する施策を優先し、その後複数インスタンス化
  12. 19 ©Gunosy  Inc. 複数API問い合わせの効率率率化 Goの並列列処理理の楽さが⽣生きたISUCON5本戦 n Sync.WaitGroupの利利⽤用と GoroutineをAPI本数分⽤用意 – 同時に問い合わせ実施

    、完了了を待つ処理理の簡 単な実装 n sync.Mutexの利利⽤用 – 最終的なデータのマー ジを安全化 n Golang1.5とhttp2 – ⼀一部APIが対応 syncパッケージとgoroutineを使い、並列列処理理を安全に効率率率化できる
  13. 22 ©Gunosy  Inc. ISUCONはパズルみたいなもの 最終的には如何に正しく素早く決断・実装できるかの勝負、総合⼒力力の戦い n どの⾏行行為が⼀一番スコア⾼高いか – スコアの低い処理理の対応時間を減らす n

    どこにCPUやメモリを割り当てるべきか正し く判断 – Nginxか?Redisか?Goか? – 各ミドルウェアの特性を把握 n どこのIOを潰せるのか – 不不変なデータはハードコード – ⾮非正規化とオンメモリ化 メモリやCPUを誰にどれだけ割り当てて計算コストを削るか リソース配分、どのプロセスに割り当てるべきか Golang? Redis? Nginx? Other?