Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
俺なりのISUCONとかの
戦い方
2015-10-04
福井技術者の集い #4
りちゃ / @rch850
りちゃ / @rch850

鯖江のエンジニア

OS設定以上

フロントエンド実装以下

ふくもく会とかやってます
高専、専攻科の時
高専ロボコンとか

高専プロコンとか

ACM/ICPCとか
大学院の時
国際VRコンテスト

CGレンダリング
KOF懇親会は 11/6(金)
高専カンファレンスは 11/7(土)
オープンソース、コミュニティ活動等のテーマで発表募集
詳しくは http://kosenconf.jp/?097kof2015
http://isucon.net/
Iikanjini Secure ni surU
Contest
ではありません
Injection de Score wo Update
Contest
でもありません
http://isucon.net/
今回で5回目の開催
263チームが出場
オンライン予選 → 本戦 @ ヒカリエ
予選概要
Google Compute Engine を使う
アクセス数やエラー数などで算出され
るベンチマークスコアを競う
お題は複数言語から選択可能
予選突破条件
最初に3,000点を超えたチーム
上記を除く各日上位4チーム
上記を除く両日合計上位10チーム
上記を除く学生5チーム
3,000点を最初に超えた
チームへしこずの戦い方
9月26日(土)
オンライン予選一日目
会場:福井県産業情報センター
協力:ふくもく会
チーム名:へしこず
メンバー:rch850, macoshita,
emittam
開始0分
「始まってるの?」
「始まってるっぽい」
「あ、一昨日連絡メールきてたわ」
「おえー」
開始5分
ポータルサイトを開き、
様子を見る
「俺インスタンス立てるから、その間
ルール読んどいて」
「「おk」」
「人数分立てるから好き勝手遊んで」
問題のOS、アプリケーションが、イ
メージファイルとして提供される
これを Google Compute Engine で
読み込んで起動する。
インスタンスのスペックは指定されて
いる(当然)
nginx
unicorn
Ruby
sinatra, mysql2-cs-bind
MySQL 5.6
「進⃝ゼミでやったところだ!」
nginx
ユーザからのアクセスを最前線で受け
付けるサーバ
ここで HTML ファイルとかを提供した
り、裏のアプリケーションサーバに渡
したりする
同類:apache, IIS
unicorn
Ruby のアプリケーションを動かせる
サーバ
HTTP 接続を受け付けて、Ruby プロ
セスに投げる
同類:tomcat
Ruby
プログラミング言語
sinatra でウェブアプリケーション
mysql2-cs-bind で MySQL 接続
MySQL
データベースサーバ
バージョンは 5.6
……特に言うことないです
nginx
worker
process
worker
process
unicorn
開始45分
役割分担を決める
・ベンチマークのボトルネック調査
・Rubyのコード見て最適化
・nginx, unicorn の最適化
ベンチマークのボトルネック
nginx で request_time をログに出し
て、遅いリクエストを調べる
処理時間が秒単位なのはほぼ GET /
とにかく GET / をなんとかしよう!
https://github.com/isucon...
Rubyのコード見て最適化
ざっとクエリ見てインデックス張る
段階ごとの処理時間をログに出す
ruby のコードをクエリに書き換える
「⃝ソコードを潰す作業」
平常時
「ク⃝コードだ!⃝ソっ!」
ISUCON
「ク⃝コードだ!やったぜ!」
db.query('SELECT * FROM entries ORDER BY
created_at DESC LIMIT 1000').each do |entry|!
next unless is_friend?(entry[:user_...
nginx, unicorn の最適化
unicorn の worker_processes を増
やす (20程度)
nginx の worker_processes を増や
す (4)
開始2時間半頃
「ベンチ取るか」
「おー、3000」
「……あれ、3000でトップ!?」
「何度リロードしてもトップだ」
「やったー」
頼んでいた昼食の買い出しがちょうど
帰ってきたので一旦休憩
↑このあたりが、協力:ふくもく会
その後、試合終了まで
MySQL
メモリを使うようにする
(innodb_buffer_pool_size,
innodb_sort_buffer_size)
遅いクエリを探すために slow log を
mysqldumpslow にかける
「サブクエリなんとかならん...
アプリケーション側
erb 内のクエリを最適化
数だけあればいいのに SELECT * して
るのを COUNT に
友達関係は常に両思いだから片方だけ
チェック
予選結果
最終スコア 12,616点

トップは 27,232点
3,000点に最も早く到達したチーム枠
で本戦出場
月末の本戦が本番!
俺たちの戦いはこれからだ!
おまけ
ISUCON「とか」の戦い方
「とか」とは
ICPC 2004 アジア地区予選愛媛大会
読む、解く、打ち込むの3人体制
4問解いて7位
役割分担
あくまで初期の役割分担
時間が経つと役割が交わり、最適化され
ていく
短期決戦は本当に時間が無い
役割分担大事!
俺なりのISUCONとかの戦い方
Upcoming SlideShare
Loading in …5
×

俺なりのISUCONとかの戦い方

1,630 views

Published on

@ 福井技術者の集い #4

Published in: Technology
  • Be the first to comment

俺なりのISUCONとかの戦い方

  1. 1. 俺なりのISUCONとかの 戦い方 2015-10-04 福井技術者の集い #4 りちゃ / @rch850
  2. 2. りちゃ / @rch850
 鯖江のエンジニア
 OS設定以上
 フロントエンド実装以下
 ふくもく会とかやってます
  3. 3. 高専、専攻科の時 高専ロボコンとか
 高専プロコンとか
 ACM/ICPCとか
  4. 4. 大学院の時 国際VRコンテスト
 CGレンダリング
  5. 5. KOF懇親会は 11/6(金) 高専カンファレンスは 11/7(土) オープンソース、コミュニティ活動等のテーマで発表募集 詳しくは http://kosenconf.jp/?097kof2015
  6. 6. http://isucon.net/
  7. 7. Iikanjini Secure ni surU Contest ではありません
  8. 8. Injection de Score wo Update Contest でもありません
  9. 9. http://isucon.net/
  10. 10. 今回で5回目の開催 263チームが出場 オンライン予選 → 本戦 @ ヒカリエ
  11. 11. 予選概要 Google Compute Engine を使う アクセス数やエラー数などで算出され るベンチマークスコアを競う お題は複数言語から選択可能
  12. 12. 予選突破条件 最初に3,000点を超えたチーム 上記を除く各日上位4チーム 上記を除く両日合計上位10チーム 上記を除く学生5チーム
  13. 13. 3,000点を最初に超えた チームへしこずの戦い方
  14. 14. 9月26日(土) オンライン予選一日目
  15. 15. 会場:福井県産業情報センター 協力:ふくもく会 チーム名:へしこず メンバー:rch850, macoshita, emittam
  16. 16. 開始0分
  17. 17. 「始まってるの?」 「始まってるっぽい」 「あ、一昨日連絡メールきてたわ」 「おえー」
  18. 18. 開始5分 ポータルサイトを開き、 様子を見る
  19. 19. 「俺インスタンス立てるから、その間 ルール読んどいて」 「「おk」」 「人数分立てるから好き勝手遊んで」
  20. 20. 問題のOS、アプリケーションが、イ メージファイルとして提供される これを Google Compute Engine で 読み込んで起動する。 インスタンスのスペックは指定されて いる(当然)
  21. 21. nginx unicorn Ruby sinatra, mysql2-cs-bind MySQL 5.6 「進⃝ゼミでやったところだ!」
  22. 22. nginx ユーザからのアクセスを最前線で受け 付けるサーバ ここで HTML ファイルとかを提供した り、裏のアプリケーションサーバに渡 したりする 同類:apache, IIS
  23. 23. unicorn Ruby のアプリケーションを動かせる サーバ HTTP 接続を受け付けて、Ruby プロ セスに投げる 同類:tomcat
  24. 24. Ruby プログラミング言語 sinatra でウェブアプリケーション mysql2-cs-bind で MySQL 接続
  25. 25. MySQL データベースサーバ バージョンは 5.6 ……特に言うことないです
  26. 26. nginx worker process worker process unicorn
  27. 27. 開始45分 役割分担を決める
  28. 28. ・ベンチマークのボトルネック調査 ・Rubyのコード見て最適化 ・nginx, unicorn の最適化
  29. 29. ベンチマークのボトルネック nginx で request_time をログに出し て、遅いリクエストを調べる 処理時間が秒単位なのはほぼ GET / とにかく GET / をなんとかしよう! https://github.com/isucon/isucon5-qualify/blob/master/webapp/ruby/app.rb#L164
  30. 30. Rubyのコード見て最適化 ざっとクエリ見てインデックス張る 段階ごとの処理時間をログに出す ruby のコードをクエリに書き換える 「⃝ソコードを潰す作業」
  31. 31. 平常時 「ク⃝コードだ!⃝ソっ!」
  32. 32. ISUCON 「ク⃝コードだ!やったぜ!」
  33. 33. db.query('SELECT * FROM entries ORDER BY created_at DESC LIMIT 1000').each do |entry|! next unless is_friend?(entry[:user_id])! entry[:title] = entry[:body].split(/n/).first! entries_of_friends << entry! break if entries_of_friends.size >= 10! end とりあえず最新1000件 引っ張ってきて 友達の投稿以外は除去 10件に達したら終わり これ SQL で書けるやつだ 友達の投稿を取り出すコード
  34. 34. nginx, unicorn の最適化 unicorn の worker_processes を増 やす (20程度) nginx の worker_processes を増や す (4)
  35. 35. 開始2時間半頃
  36. 36. 「ベンチ取るか」 「おー、3000」 「……あれ、3000でトップ!?」 「何度リロードしてもトップだ」 「やったー」
  37. 37. 頼んでいた昼食の買い出しがちょうど 帰ってきたので一旦休憩 ↑このあたりが、協力:ふくもく会
  38. 38. その後、試合終了まで
  39. 39. MySQL メモリを使うようにする (innodb_buffer_pool_size, innodb_sort_buffer_size) 遅いクエリを探すために slow log を mysqldumpslow にかける 「サブクエリなんとかならんかなー」
  40. 40. アプリケーション側 erb 内のクエリを最適化 数だけあればいいのに SELECT * して るのを COUNT に 友達関係は常に両思いだから片方だけ チェック
  41. 41. 予選結果 最終スコア 12,616点
 トップは 27,232点 3,000点に最も早く到達したチーム枠 で本戦出場
  42. 42. 月末の本戦が本番! 俺たちの戦いはこれからだ!
  43. 43. おまけ ISUCON「とか」の戦い方
  44. 44. 「とか」とは ICPC 2004 アジア地区予選愛媛大会 読む、解く、打ち込むの3人体制 4問解いて7位
  45. 45. 役割分担 あくまで初期の役割分担 時間が経つと役割が交わり、最適化され ていく 短期決戦は本当に時間が無い 役割分担大事!

×