こんにちは。PyConJPを楽しんできた佐々木(@Ssk1029Takashi)です。
9/16(日)に今年も懲りずにWebシステムの性能改善コンテストISUCONにチャレンジしました。
isucon.net
チームも去年と同じく@tereka114と@maron8676の3人チームで挑みました。
チームメンバ全員が機械学習・分析業務をメインに行っているため、Webサーバなどのインフラの知識は少ないです。
※昨年の記録はこちらです。
acro-engineer.hatenablog.com
今回は私たちのチームの解法とその流れを紹介します。
当日の流れ
10:00~11:00
競技開始後まずは、以下の3つを行いました。
- 環境とアプリの確認
- ソースコードをレポジトリにコミット
- pt-query-digestやalpなどのプロファイリングツールのインストール
まずはどのような環境でどのようなアプリが動いているのかを確認します。
アプリは映画館の席予約のようなアプリでした。
ユーザがログインして、複数あるイベントの席の予約状況を取得したり、予約したりするアプリケーションです。
環境については最近のISUCONとは全く違った構成で面食らいました。
最近はnginx+mysqlという構成が続いていたのですが、今回はh2o+MariaDBという構成でした。
(私は両方とも使ったことなかったです。)
更に従来まで利用されていたUbuntuではなく、Redhat系のOSでインストール時にも面くらいました。
そのため、一部のプロファイリングツールを動かせなくなりました。
また、今回も予選から3台構成になっており、初期構成は次の通りです。
1台目:Web+DB
2,3台目:何もしない
この3台をどう使いきるかというのも重要な要素になりました。
11:00~13:00
この時間帯ではpt-query-digestの結果から、席の予約情報を取る処理がN+1処理になっていました。
ここが一番のボトルネックになっていることがわかりました。
そこで、アプリ担当の@tereka114がクエリの発行回数を減らすようにアプリを書き換えてくれました。
reservationsテーブル関連のget_event, get_events関数の処理が多かったので調査し、N+1クエリを解消しました。
インフラ側では、MariaDBのチューニングや、h2oでの静的コンテンツのキャッシュ、そして、gunicornのworker数の変更などを行いました。
この段階で、10000点前後のスコアで一時3位にまで浮上していました。
13:00~15:00
最初に目についた問題やもろもろのチューニングを終えたので、アプリ側でRedisを使って高速化を図ります。
get_eventsの処理結果をRedisにキャッシュして一部のSQLクエリの発行回数を減らしました。
この時間はアプリの改修→ベンチマークで計測を繰り返しました。
1台構成でこの改修で18000点程まで上がりました。
15:00~17:00
いよいよこの時間から複数台構成に変更していきます。
当初は
1台目:Web
2台目:DB
3台目:Redis
という構成でやってみました。
3台目のRedisがむしろネットワークのトラフィックで遅くなるだけだったので、RedisはWebと同じサーバに移しました。
そのため、最終的には次の構成になり、一台余らしてしまいました。
1台目:Web+redis
2台目:DB
3台目:なし
また、DB側の変更として、@maron8676が調査してreservationsにuser_idのインデックスを貼ってくれました。
最高得点の約23000点を出すことができました。
ただ、この段階でdead lockによるスコアの上下が激しくなりました。(原因については後述します。)
おおむね18000~23000を行き来するようなスコアでした。
17:00~18:00
この時間はほとんど変更を加えず、何度かいい結果が出るまでベンチマークを回しました。
祈りながらベンチマークを回し、最後は19677点でフィニッシュしました。
49位/528チームとまだまだ予選突破は遠い悔しい結果となってしまいました。
良かったこと・後悔すること
良かったこととしては、次の2つが大きいです。
- 3人が明確な役割を持ちつつ進められたこと
- 細かく話し合い、着実にスコアを伸ばせられたこと
去年の反省を生かし、チームで細かい時間で問題を設定して取り組めたのは大きな成果でした。
後悔していることとして、
- dead lockの対応
- 構成ミス
1のdead lockに関して、内部でFOR UPDATEを使っているSQLがあります、
これにより、LOCKをかけてしまい、クエリの処理タイミングによってはエラーを返してしまいスコアが下がりました。
それに最後までうまく対応できませんでした。
また、ボトルネックがDBにあると思ってしまい、DBを分散する方針にしました。
WEBの処理を分散することに気付かず、分散できなかったのは反省点です。
他のチームでは、WEB2台のDB1台にしているようなので、WEBの処理がボトルネックになっていたようです。
こちらを読み違えてしまったのがとても悔しいです。
まとめ
というわけで今年もISUCONにチャレンジしましたが、予選突破はなりませんでした。
ただ、確実に個人としてもチームとしても成長はしているので、来年こそは予選突破してみせます!
それではまた来年。
Acroquest Technologyでは、キャリア採用を行っています。
- ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
- Elasticsearch等を使ったデータ収集/分析/可視化
- マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
- 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
モノリシックなアプリケーションをマイクロサービス化したいエンジニア募集! - Acroquest Technology株式会社のWeb エンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com