ISUCON本戦に行ってきた
チーム卒業の阿部(ABCanG)です。 めでたく予選を勝ち抜いたのでISUCON本戦に行ってきました。
全体のお話はmot先輩のエントリを見てください。
時系列で何をしたかとかはsyusuiくんのエントリを見てください。
syusui.tumblr.comこのエントリでは、僕がやったこととか、感想とかを書こうと思います。
当日までにやったこと
画像とか扱う系のが出るのかなーと勝手に予想してて、ISUCON4の本戦の記事とかを眺めたり、 nginxのproxy cacheの設定方法とか軽く見てました。 あまり何もしてないです。
当日
最初、ReactやらDockerやらと言う話を聞いて、マジかってなりました。 日頃からReactとかDockerは軽くは触っていたので、それほど焦りはしませんでしたが、 Docker周りの操作で結構時間を取ってしまいました。
ReactやDockerとはあまり関係のないところで、二つの大きなミスをしてしまいました。 一つは、計測を怠ってしまったことです。 最初のベンチを回した後、計測をしてボトルネックを探すことをせず、 そのまま5台のサーバをどう使うかと話し合ってしまいました。
今思えば、どう分けたら効率がいいかなんて分かるはずもなく、 なんで計測をしなかったのだろうと結構後悔してます。 そんな感じで僕らのチームはReactのサーバを1台とAppのサーバを3台で構築し、 初期実装のスコアより少し低い点で終わってしまいました。 「Appがたくさん呼ばれそうだから多めに配置するほうがいいのでは?」なんて僕が言わなければ運命は変わっていたかもしれない。
もう一つのミスは、5台のサーバを使うタイミングが早すぎたことです。 お昼頃には5台に分散させてましたが、他のチームの話を聞く感じだと終了から3時間前とかにやってる感じでした。 1台でとりあえず高速化して、ボトルネックになる部分を別のサーバに切り分けていくというのが普通なのかーなるほどーって思いました。
自分がやったこと
最初はコードを読んで、アプリの把握をしてました。 Reactのサーバが全部のリクエストを受け取って、APIはそこからプロキシさせてるしマジかってなりました。 アプリの挙動を見ながら、「あー数年前こんな感じの絵チャット作ったなー。でも適当に作ってしまったからあまり活かせる部分なさそうだなー」とか思ってました。
アプリの把握が終わった後は、主にアプリ側をやってました。 アプリにはちらほらN+1問題が仕込まれていたので、 それをせっせと直してました。 Server Sent Eventについてはメンバーのsyusuiくんにやってもらってて、僕はそれ以外の部分という感じです。
N+1問題ですが、先人の方が作ってくださったライブラリを元に自分好みに拡張したものを使って探してました。 このライブラリは、mysql2にモンキーパッチを当てて実行されるSQLと実行時間をログとして出力してくれます。
当時はこのライブラリはqueryメソッドにしか対応してなくて、本戦のコードではプリペアドステートメントが使われてたので、 しばらくの間なんで何も出力されないんだ?と悩んでました。 原因に気づいてサクッとプリペアドステートメントに(SQL出力部分のみ)対応させて利用しました。 今はプリペアドステートメントが使われている場合も実行時間を取得できるようになってます。
あとはstack-profで遅そうな部分を探したりとかもしてました。
App部分の開発はDockerを使わず、直接手元でRackサーバを立ててやってました。 その方がいろいろ楽だろうと思ってそうしてましたが、後でハマりました。 直接APIを叩いてAPIの動作確認をしていましたが、CSRFトークン付きのリクエストがうまく発行できずに苦しんで結局放置するということをしてしまいました。
N+1問題は減らしたけどスコア上がらないなーって言ってたら終了時間になってました。
まとめと感想
本戦とにかく難しいという印象を持ちました。 特に複数台構成のWebアプリを作ったことがなくて、どうしていけばいいかわかりませんでした。
あとはちゃんと計測しようということですかね、憶測で進めるのはよくないというのが実感できました。 実際、マシンがどれくらいCPU食っているか、もしくは食っていないかを把握できてなくて、 非常によくありませんでした。
スコアを伸ばせなかった原因は、計測を怠って不適切なマシン構成にしてしまったことだと思うので、 今度本戦に出る時はこれを避けれるようになりたいです。
ISUCONをすることで非常に多くのことが学べたので、その点はとても良かったです。 特に、今回の本戦の問題のおかげで複数台構成のコツを少し知れたような気がします。
今後
今年卒業するチーム卒業は、来年はチーム新卒としてリベンジしたいです。 しかしながら、来年は社会人ということで本戦出場のハードルがぐっと上がるので、 本戦に出れるように力をつけていきたいです。
最後に
運営のみなさま本当にありがとうございました!! 非常にいいイベントなので、長く続いてほしいです!
twitterをエゴサしてslackに投稿するやつを作った
最近TLの流れが速くなってきてて、 @付けずに名前が出てきた場合に反応できなくなってきてたので作ってみました。 Dockerでも動くので導入はしやすい(?)と思います。
https://hub.docker.com/r/abcang/slack-twitter-egosa/
作ったのは1ヶ月ぐらい前ですが、 今回ミュートユーザ、除外キーワード機能を追加しました。 slackに投稿されるツイートはこんな感じに表示されます。
見ての通りそのユーザのアイコンや名前が表示され、 誰の発言内容なのかわかりやすくなっています。 ツイートのリンクも貼ってあるので、すぐにブラウザから見ることもできます。 単に指定した単語が含まれているかどうかを見ているだけなので、 たまに意図しないツイートも引っかかります。
使い方は基本的にgithubのページを見てください。
READMEには書き忘れいましたが、
除外キーワード機能は単語の先頭に-
を付けることで有効になります。
検索でよく使われるあれです。
手動エゴサだるい、リアルタイム性が欲しいという方はぜひ使ってみてください。
ISUCON6予選に参加してやったことと反省と感想
nasneのエラーを監視してslackに通知するツールを作った
定期的にニュースをツイートするbotをまた作った
今回はNHK Newsのランキング上位のニュースを投稿するbotを作りました。
このbotは1時間に一回NHK Newsのランキング上位のニュースを投稿してくれるため、 以下のような人にオススメできます。
- 普段ニュースを見ないけど、主要なニュースぐらいは知っておきたい
- タイムラインをニュースだらけにしたくない(既存のニュースbotはツイート回数が多い)
そもそもこれらを満たしたbotが見つからなかったので自分で作りました。 また、最近NHK Newsが新しくなって、JSONから画像のURLまで取ってこれるようになったので、 こんな感じにツイートが表示されます。
続きを読むポケモンGO配信で“歩きスマホ”が急増 https://t.co/Ln0XFCBRnd pic.twitter.com/apLCZyHWYz
— nhk_news_ranker (@nhk_news_ranker) 2016年7月23日
ニコニコアニメスペシャルBotを作った
まず、ニコニコアニメスペシャルとはニコニコ生放送でよくやってるアニメの一挙放送のことです。名称わかりにくい気がしますね。
一挙放送情報の一覧は専用のページに追加されていきます。
しかしながらこれがなんとも不便で、新しく追加されていないか確認するためには、このサイトを定期的にアクセスするしかありません。RSSとか(ざっと探した感じ)なさそうでした。
僕は以前まで、ほぼ毎日このページをチェックして、気になるアニメが追加されていたらタイムシフト予約するという作業をしてました。
少ない時は数日に1回程度しか更新されないのに、毎日見に行くのは無駄な作業です。
それでも毎日見てたのは、追加された1日後に一挙放送があるケースもあったからです。どれだけ頑張ってるんだって話ですね。
なので、今回このページの情報を元に、新しく追加された情報をお知らせしてくれるTwitterのBotを作ってみました。
ツイートするタイミングは以下のようになってます。
- ある放送が新しく追加された時
- ある放送まで24時間を切った時
- ある放送まで2時間を切った時
1つの放送あたり3回ツイートされ、1時間に1回までしかツイートしないようにしてるので、 タイムラインの邪魔になることはないと思います。 また、ツイートは以下のように画像が付いてるので、タイムラインに埋もれにくく目につきやすいです。
【6日後(05/08 19:15)】 「くまみこ」1話~4話 振り返り上映会 https://t.co/TJBBclc86Z pic.twitter.com/bDgKFcfYpm
— ニコニコアニメスペシャルbot (@NicoAnimeSPBot) 2016年5月2日
僕のようにタイムシフトに登録して後から見る人にとって便利なbotだと思います。 是非このbotをフォローして、快適なアニメ一挙放送ライフを!
ちなみにソースコードはこちら