使用した問題
Yahoo! JAPAN様の社内ISUCON「Y!SUCON」を使わせていただきました。
実は昨年も同じ問題で社内ISUCONを開催したことがあるのですが、
- ISUCON8予選から半年が経過して、メンバーがISUCONの勘所を忘れてしまっている
- 今回はチーム戦ではなく個人戦での開催としたい
- ポータルサイトも用意されているので盛り上がる
という点で、Y!SUCONを使わせていただきました。(作成者のみなさま、良い問題をありがとうございました)
環境構築
EC2インスタンス立ち上げ
人数分のサーバとポータルサイト(兼ベンチマーカ)サーバをAWS上に構築します。
CentOS7.2を指定されているので、AWS MarketplaceからCentOS7のAMIを探して利用しました。
https://aws.amazon.com/marketplace/pp/B00O7WM7QW?ref=cns_1clkPro
最終的にはこのようなEC2インスタンスを起動しました。
設定項目 | 値 |
---|---|
AMI | CentOS 7 (x86_64) – with Updates HVM |
インスタンスタイプ | t2.small |
ストレージ | 汎用SSD (gp2) 16GB |
ちなみにポータル(兼ベンチマーカ)サーバも同じスペックとしました。
特に支障はありませんでしたが安心材料としてもう少しスペックを上げても良かったかもな、と思っています。
chefを流す
インスタンスにSSHログインして、こちらの手順を参考にchefを流します。
$ sudo yum install -y gcc git wget bzip2
$ git clone https://github.com/yahoojapan/yisucon.git
$ cd yisucon/provisioning
$ sudo ./provision.sh development isucon
install-phpの時間が20分程度かかるので粘り強く待ちます。
弊社はPHPerが多く、SKIPする訳にもいかないので。
今回の環境構築では、gem installでエラーが起こりました。
[INFO] Replacing existing vendor dependencies
+ go build
+ cd /var/www/webapp/ruby
+ gem install bundler
ERROR: Error installing bundler:
bundler requires Ruby version \>= 2.3.0.
---- End output of "bash" "/tmp/chef-script20190318-13056-fgsyqx" ----
Ran "bash" "/tmp/chef-script20190318-13056-fgsyqx" returned 1
[2019-03-18T03:44:28+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
これはインストールされたrubyのバージョンが古いことが原因です。
ruby-installを利用して2.3.1をインストールした上で、元々インストールされている古いrubyを無効化します。
$ wget -O ruby-install-0.7.0.tar.gz https://github.com/postmodern/ruby-install/archive/v0.7.0.tar.gz
$ tar -xzvf ruby-install-0.7.0.tar.gz
$ cd ruby-install-0.7.0/
$ sudo make install
$ sudo /usr/local/bin/ruby-install --system ruby 2.3.1
$ sudo mv /bin/ruby /bin/ruby-org
$ sudo mv /bin/gem /bin/gem-org
$ sudo ./provision.sh development isucon
sudoでも新しいrubyが使えるよう、visudoにてパスを設定します。
$ sudo visudo
#
# Adding HOME to env\_keep may enable a user to run unrestricted
# commands via sudo.
#
# Defaults env\_keep += "HOME"
# Defaults secure\_path = /sbin:/bin:/usr/sbin:/usr/bin
Defaults secure\_path = /usr/local/bin/:/sbin:/bin:/usr/sbin:/usr/bin
ポータルサイトの場合は以下の通り、development.jsonを編集した上でchefを流します。
$ cd yisucon/provisioning
$ vim environments/development.json
{
"json\_class": "Chef::Environment",
"default\_attributes": {
"env": "development",
"start\_date": "2018/03/14 13:00:00",
"end\_date": "2018/03/14 19:59:59",
"portal\_host": "127.0.0.1",
"db\_host": "127.0.0.1",
"db\_port": 3306,
"db\_user": "root",
"db\_pass": "",
"db\_name": "isucon",
"secret\_key": "GENERATE SECRET KEY"
}
}
$ sudo yum install mariadb mariadb-server
$ sudo systemctl start mariadb
$ sudo systemctl enable mariadb
$ mysql -u root \< ../benchmarker/init.sql
$ sudo ./provision.sh development portal
$ sudo ./provision.sh development benchmarker
社内ISUCON
やってみてどうだったか?
本番のISUCONとは違い個人戦だったこともあり、序盤は各自使用するツールの準備や、環境のバックアップに苦戦していた様子でした。3人いるとアプリ担当、インフラ担当といった分担をするので、自分の担当でない作業はほとんど覚えていないものです。
そういった点でも今回個人戦で開催したのは、各担当が何をやっているのか把握するという意味で良かったなと思います。
スコアの推移
スコアとしては最初の壁を突破して、何人かが6000〜7000点で競い合う展開でした。
しかし、全員8000点の壁を超えることができず競技終了しました。
ちなみに青線が私のスコアです。(一応、1位だったのでちょっとうれしい)
振り返り
競技終了後、各自どのようなチューニングをしたか意見交換をしました。
その中で「時刻でソートしているカラムをidでソートしたら効果があった」という意見がありました。昨年この問題に挑戦しているときは気づいていたのに、今年は気づかなかった、、、
ということで、自分のアプリにこの修正を反映したところ
あっさり8000点の壁を超えて、ケタが変わりました。。。
まとめ
久々に社内ISUCONを開催しましたが、上手くいった取り組みとそうでない取り組みがよくわかりました。なにより、結果が数字として見えるのでモチベーションが上がりました。
昨年も、予選まで月1を目安に社内ISUCONを開催したので今年も活動を継続し、予選突破を目指します。
今回のY!ISUCONでのチューニング内容は別記事でまとめたいと思います。