狠狠撸

狠狠撸Share a Scribd company logo
俺なりの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/isucon5-qualify/blob/master/webapp/ruby/app.rb#L164
Rubyのコード見て最適化
ざっとクエリ見てインデックス張る
段階ごとの処理時間をログに出す
ruby のコードをクエリに書き換える
「?ソコードを潰す作業」
平常時
「ク?コードだ!?ソっ!」
ISUCON
「ク?コードだ!やったぜ!」
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 で書けるやつだ
友達の投稿を取り出すコード
nginx, unicorn の最適化
unicorn の worker_processes を増
やす (20程度)
nginx の worker_processes を増や
す (4)
开始2时间半顷
「ベンチ取るか」
「おー、3000」
「……あれ、3000でトップ!?」
「何度リロードしてもトップだ」
「やったー」
頼んでいた昼食の買い出しがちょうど
帰ってきたので一旦休憩
↑このあたりが、協力:ふくもく会
その后、试合终了まで
MySQL
メモリを使うようにする
(innodb_bu?er_pool_size,
innodb_sort_bu?er_size)
遅いクエリを探すために slow log を
mysqldumpslow にかける
「サブクエリなんとかならんかなー」
アプリケーション側
erb 内のクエリを最適化
数だけあればいいのに SELECT * して
るのを COUNT に
友達関係は常に両思いだから片方だけ
チェック
予選結果
最終スコア 12,616点?
トップは 27,232点
3,000点に最も早く到達したチーム枠
で本戦出場
月末の本戦が本番!
俺たちの戦いはこれからだ!
おまけ
ISUCON「とか」の戦い方
「とか」とは
ICPC 2004 アジア地区予選愛媛大会
読む、解く、打ち込むの3人体制
4問解いて7位
役割分担
あくまで初期の役割分担
時間が経つと役割が交わり、最適化され
ていく
短期決戦は本当に時間が無い
役割分担大事!

More Related Content

俺なりの滨厂鲍颁翱狈とかの戦い方