ISUCONってなんだ

※このスライドは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万円</span>**！！！

___

# どうやって競うのか
___

# どうやって競うのか
- 運営側がいくつかの言語（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` して作業します

___

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

# ブラウザで動いてるのを確認
![069202cc-3730-f135-328c-d82407d87337.png](https://qiita-image-store.s3.amazonaws.com/0/11316/70aeb526-c135-3e04-afb1-32c91cf58701.png)

___
# なにかが動いた
___

# なんだこれ :thinking: 
___

# なんだこれ :thinking: 

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

参考link： [はてなキーワード](http://d.hatena.ne.jp/keyword/), [はてな匿名ダイアリー](https://anond.hatelabo.jp/)
___
# なんだこれ :thinking: 

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

参考link： [はてなキーワード](http://d.hatena.ne.jp/keyword/), [はてな匿名ダイアリー](https://anond.hatelabo.jp/)

余談：ISUXI
___

# 実装はどこ？
> 各言語実装は systemd で管理されています。基本的には systemctl stop/start ならびに systemctl enable/disable で制御します。
> 
> [isucon6\-qualify/Regulation\.md at master · isucon/isucon6\-qualify](https://github.com/isucon/isucon6-qualify/blob/master/Regulation.md#参考実装の切り替え方法)より

___

# 実装はどこ？

```bash

ubuntu@ubuntu-xenial:~$ ls /etc/systemd/system/
```

___

# 実装はどこ？

```bash

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へ以下のようなリクエストを投げたり

```rb: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へ以下のようなリクエストを投げたり

```rb: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へ以下のようなリクエストを投げたりしていた

```rb:webapp/ruby/lib/isutar/web.rb

post '/stars'
...
res = Net::HTTP.get_response(isuda_keyword_url)
...
```

___
# 改善
___

# 改善
無駄なリクエストを投げないためにIsudaとIsutarを１つに統合

- サービスをを1つにする
- DBを1つにする

___
# 改善
無駄なリクエストを投げないためにIsudaとIsutarを１つに統合

- **サービスを1つに**
    - `isutar/web.rb`はまるまる削除
    - ロジックをすべて `isuda/web.rb`に移す
- DBを1つに

___
# 改善
無駄なリクエストを投げないためにIsudaとIsutarを１つに統合

- サービスを1つに
    - `isutar/web.rb`はまるまる削除
    - ロジックをすべて `isuda/web.rb`に移す
    - Nginxの設定を修正
- **DBを1つに**
    - database名isutarにあるテーブルをisudaに移す

___
# 改善
## before
![before.png](https://qiita-image-store.s3.amazonaws.com/0/11316/77a7e1d9-4b2b-3122-dfaf-3d0a96e9cad5.png)

___
# 改善
## after
![after.png](https://qiita-image-store.s3.amazonaws.com/0/11316/7f28e57d-b086-25bf-f964-3a0aed6d5425.png)

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

# まとめ

___

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

### 今年は予選**10月21日(土)・22日(日)**、本選**11月25日(土)**です
- **[参加登録始まったようです！！](http://isucon.net/archives/50537191.html)**

___

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