まさ@ブログ書き込み中

まさ@ブログ書き込み中

まさの旅、英語、プログラミング、プライベートについて、色々記録しています。

第四回模擬ISUCONをやったら5000点スコア上がった

 

こんにちは、まさです。

 

昨日8月22日にギークハウス沖縄で、第四回模擬ISUCONをやりました。

題材としたのはISUCON6のリポジトリ

github.com

 

今回の模擬ISUCONを終えてみて、考えたことをまとめたいと思います。

 

 

初見のアプリケーションを起動させる仕組みを理解する必要がある

catatsuyさんによるPixivの社内で利用されたprivate-isu、ISCUON5、ISUCON6を触れてみて感じて来たことなのですが、僕はたまにローカルでアプリケーションを実行する方法がわからなくなることがあります。

 

ある程度(例えば1年くらい)プログラミングの経験がある人たちからすれば当たり前のことなのかもしれませんが、僕はまだここで躓いてしまいますね。

 

例えばISUCON6のリポジトリには、isuda.ruisutar.ruの二つのrackupファイルがあります。bundle exec rackupとコマンドを実行をすると、「(おそらくデフォで読み込まれる)config.ruがないよ」と言われてしまい、config.ruを読み込ませないようにパスを変更する方法を考えていて10分ほど詰まってしまっていた。

 

今思えば当たり前だけど、二つのターミナルで

bundle exec rackup isuda.ru

bundle exec rackup isutar.ru

と実行すれば良かったということに気づく。

 

ただ、これはさぼさんからのアドバイスを頂かないとわからなかったことなんだけど、どうやらwebapp/bin/にあるisupamというファイルも実行しなければならなかったみたい。

 

本番は誰からもアドバイスを貰えない。そう考えると身の引き締まる思いがしました。

また、rack-lineprofでアプリケーションのパフォーマンスをチェックしましたが、ISUCON6に関しては記事の投稿機能が作動せず、それに関連するアプリケーションのパフォーマンスをチェック出来ませんでした。

 

そのような問題が起こった時に、うまく原因を究明できるようになることも重要です。

 

 

そもそもローカル以降や分析のためのログ周りは手際よく終わらせるべき

というか、ぶっちゃけ今の僕はISUCONに関する技術力に関して言えば、成長率が下がっていると思っています。

 

全体的に見て、5月や6月の頃と比べると僕のプログラミングやISUCONに対するコミット量が圧倒的に減ったと考えています。客観的に見て半分以下に減ったのではないでしょうか。

 

ぶっちゃけ、この時期にはローカル以降や分析のためのログ周りは手際よく終わらせて、次のレベルに向かっているべきだったと思います。

 

次のレベルとは、NginxやUnicornMySQLなどのチューニング、またはそれに先立つそれぞれの仕組みについて基本的なことへの理解などを指します。

 

僕は前回のISUCONからSQLRailsを少し勉強し、後に述べるように今回もチューニングポイントを分析の末見つけることはできましたが、なんというか、うーん、行動で示しますとしか言えません

 

まあ、うだうだとこういう風に考えてますよって感じです。

 

 

今回のチューニングポイント

僕はログ周りに関することはみんなにお任せして、アプリケーション側のチューニングからすぐに入りました。

 

さぼさんが以下の記事で紹介しているISUCON対策のツールの中で、Ruby周りで言えばrack-mini-profilerが便利だということは以前から知っていましたが、僕はrack-lineprofが使いやすいので使ってみました。

saboyutaka.hatenablog.com

 

すると、get '/'(トップページ)の中で気になるポイントが見えてきました。

f:id:masaincebu:20170823132119p:plain

 

rack-lineprofは時間がアプリケーションの中で時間がかかっているポイントを赤字で示してくれるのですが、この三行のコードを実行するために約4500ms(4.5秒)かかっているわけです。

 

ここで僕はgemの「pry」を使って、このkeywordsやpattern、hashed_contentという変数が何を指すのかを調べてみました。

 

するとここでは、データベースから全ての記事のデータを取って来て(keywords)、そのデータの中の「キーワード」だけを別の変数に入れ(pattern)、記事の内容の中で全キーワードの中に合致する部分をハッシュ化させているのでした(hashed_content)。

※ハッシュ化させる理由は、後にそのハッシュ化されたキーワードをリンクのパスとして使うためのようでした。その機能のイメージは、はてなブログWikipediaだと考えるとわかりやすいかも。例えば「うさぎ」という文字を使って記事を書くと、僕は何もしていないのに「うさぎ」から関連するページに飛べることがあるでしょう。

 

そこまでくると、一緒に分析をしていた樹理さんが「じゃあkeywordsに入れるべきデータは記事に関連する全データではなく、キーワードだけでいいじゃん」と至極真っ当なことを言ったのでやってみると、最終的にはこれで約5000点くらい上がりました。

 

 

ぶっちゃけまだ入り口に立ったばかり

ISUCONの模試を3回ほどやってきましたが、冒頭にも述べた通り、ぶっちゃけまだまだやれることはあります。

 

樹理さんは今日ISUCONの夏期講習を受けに東京に行きましたし、大輔も東京に行きました。僕も負けないように頑張ります!

 

優先順位を立てて、時間をかけて、結果にコミットしていきたいと思います!