Help us understand the problem. What is going on with this article?

ISUCONってなんだ

More than 1 year has passed since last update.

ISUCONってなんだ

by gaaamii
1 / 41

※このスライドは2017/08/10 に社内LTで話した内容です。社内要素はゼロだったので本家Qiitaに投稿しています。ISUCONに関して間違ったことが書かれているのを見つけた方は編集リクエスト,コメント等お願いします :bow:


今日話すこと


今日話すこと

  • ISUCONってなんだ
  • どうやって競うのか
  • ISUCON6予選問題をざっくり紹介
  • まとめ

ISUCONってなんだ :thinking:


  • 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

 32   config.vm.network "private_network", ip: "192.168.33.10"
 33   # こちらをコメントアウトconfig.vm.network "private_network", type: "dhcp"
  • 以降、この仮想環境に vagrant ssh して作業します

ブラウザで動いてるのを確認


ブラウザで動いてるのを確認

069202cc-3730-f135-328c-d82407d87337.png


なにかが動いた


なんだこれ :thinking:


なんだこれ :thinking:

はてなキーワード、 (?:匿名)? ダイアリーを模したブログとWikiの中間の様なアプリケーションです。キーワード自動リンク機能がついています。また、はてなスターのようなお気に入りを付けられる様な機能もついていました。記事の投稿時にはスパムチェックをおこなっており、一部の禁止ワードや、アダルトサイトへのリンクが含まれている場合には投稿できないようになっています。
ISUCON6 予選問題の解説と講評 : ISUCON公式Blogより

参考link: はてなキーワード, はてな匿名ダイアリー


なんだこれ :thinking:

はてなキーワード、 (?:匿名)? ダイアリーを模したブログと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へ以下のようなリクエストを投げたり

webapp/ruby/lib/isuda/web.rb
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へ以下のようなリクエストを投げたり

webapp/ruby/lib/isuda/web.rb
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へ以下のようなリクエストを投げたりしていた

webapp/ruby/lib/isutar/web.rb
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

before.png


改善

after

after.png


こういうことをどんどんやって高速化していく


まとめ


まとめ

  • 予選問題なぞると出来る気がしてくる
  • ISUCONはインフラエンジニアのコンテストと思っていたがそんなことはない(上から下まで全部)
  • どちらもできないと十分スコアを伸ばせない
  • 6回開催しているので参加ブログ記事、攻略ノウハウが見つかる
  • ノウハウが業務に直結しそう

今年は予選10月21日(土)・22日(日)、本選11月25日(土)です


ご静聴ありがとうございました :bow:

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした