※このスライドは2017/08/10 に社内LTで話した内容です。社内要素はゼロだったので本家Qiitaに投稿しています。ISUCONに関して間違ったことが書かれているのを見つけた方は編集リクエスト,コメント等お願いします
今日話すこと
今日話すこと
- ISUCONってなんだ
- どうやって競うのか
- ISUCON6予選問題をざっくり紹介
- まとめ
ISUCONってなんだ
- ISUCON = Iikanjini Speed Up Contest
- ウェブアプリチューニングのスコアを競う大会
- LINE 株式会社 主催
- 2011年〜 これまで6回開催
- 今年も10月に開催予定
- 優勝賞金100万円
- ISUCON = Iikanjini Speed Up Contest
- ウェブアプリチューニングのスコアを競う大会
- LINE 株式会社 主催
- 2011年〜 これまで6回開催
- 今年も10月に開催予定
優勝賞金100万円!!!
どうやって競うのか
どうやって競うのか
- 運営側がいくつかの言語(Ruby, Go, Node.jsなど)でウェブアプリの実装を用意
- そのアプリの振る舞いを保ったままパフォーマンスを向上させる
- ベンチマークを取りスコアが最も高いチームが優勝
ISUCON6予選問題ざっくり紹介
ISUCON6予選問題ざっくり紹介
- Vagrantfileを配付してくれてるのでそれを持ってきて
vagrant up
- ブラウザで動いてるのを確認
- ベンチマークをとる(最初はscoreが0)
- 改善する
vagrant up
-
https://github.com/matsuu/vagrant-isucon/tree/master/isucon6-qualifier-standalone から取ってこれます
wget https://raw.githubusercontent.com/matsuu/vagrant-isucon/master/isucon6-qualifier-standalone/Vagrantfile
vagrant up
- 自分の場合はVagrantfileをここだけ修正しました(これでhttp://192.168.33.10 でブラウザで確認できる)
32 config.vm.network "private_network", ip: "192.168.33.10"
33 # こちらをコメントアウトconfig.vm.network "private_network", type: "dhcp"
- 以降、この仮想環境に
vagrant ssh
して作業します
ブラウザで動いてるのを確認
ブラウザで動いてるのを確認
なにかが動いた
なんだこれ
なんだこれ
はてなキーワード、 (?:匿名)? ダイアリーを模したブログとWikiの中間の様なアプリケーションです。キーワード自動リンク機能がついています。また、はてなスターのようなお気に入りを付けられる様な機能もついていました。記事の投稿時にはスパムチェックをおこなっており、一部の禁止ワードや、アダルトサイトへのリンクが含まれている場合には投稿できないようになっています。
ISUCON6 予選問題の解説と講評 : ISUCON公式Blogより
参考link: はてなキーワード, はてな匿名ダイアリー
なんだこれ
はてなキーワード、 (?:匿名)? ダイアリーを模したブログとWikiの中間の様なアプリケーションです。キーワード自動リンク機能がついています。また、はてなスターのようなお気に入りを付けられる様な機能もついていました。記事の投稿時にはスパムチェックをおこなっており、一部の禁止ワードや、アダルトサイトへのリンクが含まれている場合には投稿できないようになっています。
ISUCON6 予選問題の解説と講評 : ISUCON公式Blogより
参考link: はてなキーワード, はてな匿名ダイアリー
余談:ISUXI
実装はどこ?
各言語実装は systemd で管理されています。基本的には systemctl stop/start ならびに systemctl enable/disable で制御します。
isucon6-qualify/Regulation.md at master · isucon/isucon6-qualifyより
実装はどこ?
ubuntu@ubuntu-xenial:~$ ls /etc/systemd/system/
実装はどこ?
ubuntu@ubuntu-xenial:~$ ls /etc/systemd/system/
cloud-init.target.wants iscsi.service isuda.php.service isutar.go.service isutar.ruby.service sockets.target.wants
default.target.wants isucon6-bench-worker.service isuda.python.service isutar.js.service isutar.scala.service sshd.service
final.target.wants isuda.go.service isuda.ruby.service isutar.perl.service multi-user.target.wants sysinit.target.wants
getty.target.wants isuda.js.service isuda.scala.service isutar.php.service network-online.target.wants syslog.service
graphical.target.wants isuda.perl.service isupam.service isutar.python.service paths.target.wants timers.target.wants
いま動いてるウェブアプリはどれ?
ubuntu@ubuntu-xenial:~$ ps aux | grep isu
いま動いてるウェブアプリはどれ?
ubuntu@ubuntu-xenial:~$ ps aux | grep isu
...<略>
isucon 5915 0.1 1.2 89512 25060 ? Ss 23:16 0:00 /home/isucon/webapp/perl/local/bin/plackup
...<略>
それっぽいのがあった
いま動いてるウェブアプリはどれ?
ubuntu@ubuntu-xenial:~$ ps aux | grep isu
...<略>
isucon 5915 0.1 1.2 89512 25060 ? Ss 23:16 0:00 /home/isucon/webapp/perl/local/bin/plackup
...<略>
それっぽいのがあった
Perlじゃん
いま動いてるウェブアプリはどれ?
ubuntu@ubuntu-xenial:~$ ps aux | grep isu
...<略>
isucon 5915 0.1 1.2 89512 25060 ? Ss 23:16 0:00 /home/isucon/webapp/perl/local/bin/plackup
...<略>
それっぽいのがあった
Perlじゃん
Rubyにしたい
Ruby実装を動かす
isucon@ubuntu-xenial:~$ systemctl stop isuda.perl.service isutar.perl.service
isucon@ubuntu-xenial:~$ sudo systemctl start isuda.ruby.service isutar.ruby.service
改善する
改善する
- キーワードリンク作成の高速化(memcachedなどでキャッシュ)
- なぜか分割されているサービスをモノリシックにする
- 余計な通信を減らす
- 静的ファイルはNginxに返させる
- MySQLのインデックスを追加
- MySQLへつなぐときはtcpではなくunixドメインソケットで
など
改善する
- キーワードリンク作成の高速化(memcachedなどでキャッシュ)
- なぜか分割されているサービスをモノリシックにする
- 余計な通信を減らす
- 静的ファイルはNginxに返させる
- MySQLのインデックスを追加
- MySQLへつなぐときはtcpではなくunixドメインソケットで
など
今回は一例としてサービスをモノリシックにする流れをざっくり紹介
改善前
IsudaからIsutarへ以下のようなリクエストを投げたり
def load_stars
...
Net::HTTP.get(isutar_url)
# https://github.com/isucon/isucon6-qualify/blob/master/webapp/ruby/lib/isuda/web.rb#L119
...
改善前
IsudaからIsutarへ以下のようなリクエストを投げたり
def load_stars
...
Net::HTTP.get(isutar_url)
# https://github.com/isucon/isucon6-qualify/blob/master/webapp/ruby/lib/isuda/web.rb#L119
IsuarからIsudaへ以下のようなリクエストを投げたりしていた
post '/stars'
...
res = Net::HTTP.get_response(isuda_keyword_url)
...
改善
改善
無駄なリクエストを投げないためにIsudaとIsutarを1つに統合
- サービスをを1つにする
- DBを1つにする
改善
無駄なリクエストを投げないためにIsudaとIsutarを1つに統合
-
サービスを1つに
-
isutar/web.rb
はまるまる削除 - ロジックをすべて
isuda/web.rb
に移す
-
- DBを1つに
改善
無駄なリクエストを投げないためにIsudaとIsutarを1つに統合
- サービスを1つに
-
isutar/web.rb
はまるまる削除 - ロジックをすべて
isuda/web.rb
に移す - Nginxの設定を修正
-
-
DBを1つに
- database名isutarにあるテーブルをisudaに移す
改善
before
改善
after
こういうことをどんどんやって高速化していく
まとめ
まとめ
- 予選問題なぞると出来る気がしてくる
- ISUCONはインフラエンジニアのコンテストと思っていたがそんなことはない(上から下まで全部)
- どちらもできないと十分スコアを伸ばせない
- 6回開催しているので参加ブログ記事、攻略ノウハウが見つかる
- ノウハウが業務に直結しそう