おこんばんは。今度は文明的な時間ですね。nitoliです。

昨日に引き続き、ISUCON 8の練習に、ISUCON 7 予選の問題を解いてみました。
なお、前回のエントリは以下です。ISUCONって何?という方はこちらからご覧ください。

ISUCON8の練習にISUCON 7 本戦を解いてみた

ISUCON 7 予選について

今回は、isubataというチャットアプリケーションでした。
重いのかな?という印象を受けましたが、投稿の数を見るにとんでもない量のアクセスで、少しの遅延が大きくなっていく……という形の問題なのでしょうね。

というかそうなのですが。

ISUCON(過去問)を開催した話

ISUCONを試しにやってみたときの、チーム2にぼくとkabeが参加しておりましたので。
あのときのスコアは、確か2位で6000点弱、往時には1万の壁を擦るといった感じだったはずです。
ぼくはnginxにほとんど触れていなかったひよっこでしたが、担当はnginxでした。

 

やったこと

今日については前日とは異なり、各自でサーバをConoHaに立て、検証作業にあたっていました。

前回、4時間シェルを書くという暴挙に出たぼくは、しかし今回については人並みでした。
githubのレポジトリの作成、サーバの初期設定、前日の設定の持ち込み、予選用の自動デプロイスクリプトの書き換えまでを1時間で仕上げ、nginxのキャッシュ、@marco製MySQLのコンフィグのみでScore: 9737。初期状態では5393だったので、ずいぶんいい出来のコンフィグだったのではないかと思います。
続けてGoのソース内でコネクション数が絞られていたのを増やして、Score: 10956に到達しました。

こんな感じです。秘伝のタレのブーストだけで10000点到達しても、まだ7時間残っている。いい感じですね。

 

あとはインデックスをよきように張り、なぜかDBにバカスカ乗ってる画像をストレージに載せ替えるとそれなりの点数になるのは知っていたのですが、今回は実施しませんでした。前日の反省として、Goのプロファイリングをどうするかというのと、オンメモリ戦略はどうするのか、nginxやMySQLのビルド、MySQLをMariaDBに載せ替えるなど実験したい点がさまざま挙げられていたためです。

ぼくはnginxのビルドと、pprofというGoのCPUプロファイリングツールの使い方を調べました。

pprofはGoにはじめから入っているツールです。
Web系のアプリケーションのために、30秒ひたすら待機してプロファイルしてくれる機能があるのがうれしい。

https://golang.org/pkg/net/http/pprof/

いろいろな機能があるのですが、中でも画像にある遅い行にどれだけ時間がかかったのかを計測してくれる機能が使いやすそうでした。

今回は、DBにアイコンがひたすら乗っているため、ここがひとつ大きなボトルネックです。pprofを確認すると、ちゃんとSQLを実行したところが遅いようなので、確からしいみたい。
本番でも十分使えそうですね。

 

他のメンバーの仕事も書いておきましょう。

@kabeはnginxのビルド周辺と、sync.Map の動作を調査していたようです。nginxはぼくが難航していたところをスムーズに駆け抜けててoh…って感じでした(これは説明なのだろうか)。オンメモリDBで有名なのはやはりredisなのですが、NoSQLの知見がメンバーになく、当日に実装するのは難しそうだったので、代用としてMapを使うことになりました。sync.Mapは、スレッドセーフなMapです。Webアプリケーションは基本的にマルチスレッドですからね。案外簡単に使えそうなので、実践では投入されるでしょう。

@marcoは、redisの試用と、MySQLからMariaDBへの載せ替えに着手していました。redisは比較的早い段階で導入できたのですが、メンバーは「NoSQL…どう使うの…?」という大学生なのに太古の地層から出土した化石エンジニアと化し、ひとまず導入を見送りました。時間があれば勉強してみたいですね。また、MariaDBのほうがMySQLよりも高速だろうということで、MariaDBを導入して現在も調整してくれているようです。速さは想像するしかないのですが、ArchlinuxではMySQLをインストールするとデフォルトでバックエンドとしてMariaDBがあるくらいですから、きっとよく動いてくれるはずです。

 

とりあえず、ボロボロの食生活を送っていたので、これからやよい軒に行ってリセットしてきます。
安くて健康にいい食事があればコメントください。切に願います。この記事は一体なんの記事なのか。

次の記事はきっと、本番レポートでしょうか?nitoliでした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)