まさ@ブログ書き込み中

まさ@ブログ書き込み中

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

6月を振り返っては模擬ISUCONを振り返る

 

こんばんは、まさです。

最近は記事の更新が滞ってますね・・・。

 

振り返ってみれば6月〜今日までは以下のようなラインナップでした。

  • 就活で東京いく
  • ハッカーズチャンプルー合宿前に追い詰められて事前勉強会する
    (結局間に合わず合宿1日目が準備の日になる笑)
  • ハッカーズチャンプルーで最高の時間を過ごす
  • 休んでた分の大学の授業の課題などを取り戻す
  • メルカリのサマーインターンシップの課題に苦しむ

 

4月末〜5月とは比べて、淡々とプログラミングを勉強したり、アプリケーションをつくることとは違うことをやっていたため、コード書きたい・・・でも毎日忙しい・・。そんな日々でした。

 

 

6月はいろんな変化の月でした。

 

色んな人に出会って、色んな場所に行って、色んな経験をしてきました。色んなチャンスもあり、「めっちゃ人生うまく行ってる!」って思った矢先のメルカリインターンの課題のレベルの高さに圧倒されました。

 

友達でエンジニアのこうだいくんはその課題に答えられたそうで「やっぱり凄いな」と刺激を受けました。

 

また最近は前期のテストや発表課題、レポートがあるなど忙しかったのですが、いまは少し落ち着いたので記事を書いています。

 

 

まずは、以前書きそびれた模擬ISUCONでやった内容をまとめたいと思います!

 

 

模擬ISUCONでやったこと

チームpenpenのPC不調により何とか一位で終われたハッカーズチャンプルー合宿での模擬ISUCONですが、僕と福地(後輩プログラマー)は何をやったのか。実は後日まとめたドキュメントがありますので、それを基に説明させていただきます。

 

題材

以前僕の記事を読んでくれた人にとっては繰り返しになりますが、ハッカーズチャンプルーの開発合宿の部で使用した模擬ISUCON用のアプリケーション・ベンチマーカーは、我らがコーチさぼさんが以前働いていたpixivのcatatsuyさんがpixiv社内ISUCON用に用意したprivate-isuです。

 

github.com

 

ログをとるよ

さぼさんから教わった、最初にISUCONでやるべきこと。

それは、ボトルネックを探すことです。

ボトルネックを探すために何をするべきか。

 

ログを取ることです!

具体的にはNginxのアクセスログMySQLのログを取りました。

本当はUnicornもログを取る必要があったらしいですが、

僕らはそこまで出来ませんでした・・・。

 

Nginxのログはalpで吐き出させました。

具体的な内容は以下の記事に譲ります。

papix.hatenablog.com

 

補足しておくと、この記事が書かれたのは約2年ほど前なので①alpを最新版に変えること、②LTSVの書き方を公式サイトに倣って書くことが必要でした。

 

 

データベースにインデックス貼るよ

さて、MySQLやNginxのログを取るだけでもわかることがあります。

題材となっている「Isucogram」はその名の通りInstagramを模した画像投稿サービスなので、データ量の重い画像のやりとりがアプリケーション全体のパフォーマンスを上げるカギとなっています。

 

また、デフォルトではNginxが画像をキャッシュとして扱っていないため、一々画像をデータベース(MySQL)から取ってきていました。

 

そのため、データベースにインデックス(文字通り「索引」)を貼るだけでデータベースからデータを取ってくるスピードがあがり、結果的にスコアが上がります。

 

もちろん索引をつける方法はADD INDEXでもいいのですが、僕はSequel ProというGUIを使っているのでそれこそクリックだけでおkでした。

qiita.com

 

Unicornのワーカー数増やすよ

まずは以下を参照。

UnicornはRack Webサーバ

UnicornはそもそもRackアプリに対応するために作られたRack Webサーバで、単体でも動作する模様。なんだけど、公式が

Designed for Rack, Unix, fast clients, and ease-of-debugging. We cut out everything that is better supported by the operating system, {nginx}http://nginx.org/ or {Rack}http://rack.github.io/.

(超絶意訳:RackとUnixと高速なクライアント向けに簡単にデバッグできるように作ったよ。nginxとかRackとかOSと相性が良くなるように調整したよ。)

defunkt/unicorn · GitHub

と言っているのもあり、nginxと組み合わせて使うことがほとんどのようだ。

参照:http://fujiike.hateblo.jp/entry/2015/08/20/170751

 

僕らの間では、絶妙なネーミングセンスをもつ樹里さんやさぼさんのおかげでユニコーンは職人さん(アプリケーション)を乗せてくれて、職人さんを増やしてくれるものだと覚えています。

 

順を追って説明すると、Unicornのワーカー数を増やさずデフォルトでベンチマークを走らせてみると、Topコマンド(ターミナルで全てのアプリケーションのCPU使用率などを確認できるもの)で見てみるとSinatra(アプリケーション)が一つしか動いていないのがわかります。

 

つまり、基本的には、Sinatraアプリケーション(職人さん)は1つしか動かない仕様になっていて、まさに一人しか職人さんが居ないお寿司屋さんのように、多くのお客さん(リクエスト)に時間がかかってしまうのですね。

 

Unicornは、その問題を解決する糸口になります。

具体的にはconfig/unicorn.rbのworker_processesを増やします。

確かCPU数✖️2までがいいとのこと。

 

Nginxのworker_connectionを増やすよ

詳しくは以下のサイトに詳しいです。

qiita.com

 

引用します。

  • 同時クライアント数はworker_process * worker_connectionとなる

 

僕はこれに目をつけました。

 

特に何も設定しない状態のディスクプリンタは以下で確認できます。

$ ulimit -n
1024

上記よりworker_connectionsディレクティブで1024以上を指定する場合には少なくとも設定が必要です。

変更する場合ですが、まずはOS全体でどれだけのファイルディスクリプタについて設定できるか確認します。

$ cat /proc/sys/fs/file-max
100015

AmazonLinuxデフォルトではOS全体で100015のファイルが扱えるようです。

とりあえず今回の例では倍の2048の値を設定するようにしたいと思います。

 上記のulimit -nコマンドでディスクプリンタを調べ、それ以下で最大の効果を発揮するようworker_connectionを変更しました。

 

福地がNginxのupstreamブロックにkeepaliveと書いたよ

福地によると

  • keepaliveを書いた。これでコネクションのために2~3往復する通信を一回でできるようになった。

 らしい。これでスコアが+2000点され、最終的にギリギリでanpanmanチームに勝ったのでした。

 

 

 

やりたかったけどできなかったこと

色々工夫してなんとか点数を取った僕らfukumotoチームですが、やりたかったけどどうしてもできなったこともあります。それは

  • Nginxを使って画像をキャッシュする設定ができなかったこと
  • rack-lineprofを使いながらアプリケーションのチューニングで点数を稼げなかったこと

などが挙げられます。

 

また、僕らが講じた対策は絶対に点数を上げるものとも言えませんし、仕組みを完全に理解した上の本質的な対策とも言えませんので、参考程度にしておいたほうがいいと思います。

 

言い方を変えると、本当の意味で理解してスコアを上げるには、僕らが勉強すべきことはまだまだあるということです。

 

 

最後に

繰り返しになりますが、模擬ISUCONをして得られたものはたくさんあります。

18時になったときに福地とハイタッチした瞬間は今でも覚えていますし、こうだいたちのpenpenチームの理解力の速さやanpanmanチームが序盤で二万点を取った時の焦りも覚えています。

 

6月はあまりコードを書く機会がなかったですし、記事も更新してきませんでしたが、7月はもっとバリバリRailsを勉強しながらアプリケーション第二弾を製作し、ISUCONにも全力でぶつかって行きたいと思っています。

 

長い記事をここまで読んで来てくれたみなさん、ありがとうございました。