Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

ISUCON7オンライン予選に挑戦しました

こんにちは!新人エンジニアの佐々木です!

今回、私の発案で、3年目の@ と 2年目の@と一緒にISUCON7のオンライン予選に出場しました。
ISUCONとは、「いい感じにスピードアップコンテスト」の略称で、出題されるシステムをいかに高速化するかを
競うコンテストです。いくつかの言語での参照実装があらかじめ出されるのですが、私たちのチームは
全員pythonがメインだったので、pythonで挑みました。

結果としては、0点で終わってしまいましたが、学ぶことがあったので一部始終を書いていこうと思います。

前準備

今回はメンバーが全員初ISUCONだったので、事前にISUCON5と6の予選問題を解きました。
過去問に取り組む中で

  1. MySQLのパラメータチューニング
  2. SQLクエリの高速化
  3. Redisで高速化

などを学びつつ、本番に備えました。

13:00~14:00

まずは、

  1. アプリケーションの理解
  2. プロファイリング

に取り掛かりました。
今回のアプリケーションはチャットアプリでした。例年と違うのは、オンライン予選にも関わらず
WEBサーバ2台、DBサーバ1台という複数台構成ということでした。
この時点でだいぶ面食らいましたが@がすかさず、New Relicを差して、プロファイリングを進めていました。
そして、話し合った結果、まずは一番時間を食っているアイコンの取得を高速化しようということになりました。
初期スコアは約6000でした。

14:00~16:00

この時間帯では

  1. 画像データのファイル書き出し
  2. 画像ファイルの静的配信
  3. 画像データのRedis化
  4. gunicornのworker数の調整

に取り組みました。
まず、画像がDBの中にバイナリで入っていたので、私がWEBサーバ上に画像ファイルとして書き出して、
そのあとnginxで静的ファイルとして配信するように設定しました。
これでDBサーバまでアイコン画像データを取りに行く部分が高速化されるはずだと思って
ベンチマークを回したところ2000点程度しか上がりませんでした。
そこで、@が画像の部分をすべてRedisに置き換えたところ、19000点あたりまでスコアが伸びました。
(ここでRedisに置き換える以外にもgunicornのworker数を増やしたりしていてどれが原因で伸びたのかが曖昧でした)
スコアが上がった時には3人とも喜んでいました。

16:00~17:00

しかし、この後スコアが伸び悩んでしまいます。
なぜかというと、できることはやりつくしてしまったからです。
/fetchがN+1問題を起こしていることがわかっていたのですが、
それを解決する方法が思いつかず、行き詰ってしまいました。

17:00~21:00

するとこのあたりでDBをすべてRedisに置き換えるという力業の賭けに出ます。
ここでまずかったのが、事前に構成を定めずにスピード重視でがりがり書き換えていったせいで、
どんどん元の動きが保証できなくなってしまいました。
そして最終的に間に合わず、動かないまま終わって、最終スコアは0点でした。。。

学び

今回は残念ながら負けてしまいましたが、いろいろな学びがありました。

1.キャッシュ周り

今回はサーバとクライアントの画像のやり取りをいかに少なくするかが肝になったようです。
公式の解説を見てみると、画像をクライアント側にキャッシュさせる方法が載っていました。
私たちもキャッシュは考えたのですが、方法がわからず断念しただけに悔しいです。
isucon.net

2.SQLクエリ

他の参加者の記録を見ていると、とてもスマートにN+1クエリなどの重いクエリを改修していました。
今回参加した3人はあまりSQLに普段触らないので、直す段階での知識不足が目立ってしまいました。
次回に向けて、まだまだ勉強が必要です。

まとめ

今回は負けてしまいましたが、総合的に言うととても楽しかったです。
やはりエンジニアとして、誰かと競って、上の人の実力を知ることはとても刺激になります。
来年こそは予選突破できるように、これから頑張っていきます。

Acroquest Technologyでは、キャリア採用を行っています。


  • ビッグデータHadoop/Spark、NoSQL)、データ分析(Elasticsearch、Python関連)、Web開発(SpringCloud/SpringBoot、AngularJS)といった最新のOSSを利用する開発プロジェクトに関わりたい。
  • マイクロサービスDevOpsなどの技術を使ったり、データ分析機械学習などのスキルを活かしたい。
  • 社会貢献性の高いプロジェクトや、顧客の価値を創造するようなプロジェクトで、提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や、対外的な勉強会の開催・参加を通した技術の発信、社内勉強会での技術情報共有により、エンジニアとして成長したい。

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

【エンジニア全般(どのリンクをはるか迷った時)】
世の中に誇れるサービスを作りたいエンジニアwanted! - Acroquest Technology株式会社のエンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com