ISUCON に関する投稿を表示しています

残念ながら ISUCON 7 は予選敗退で幕を閉じた

この記事は公開されてから1年以上経過しており、情報が古い可能性があります。

ISUCON 5, ISUCON 6, と引き続き ISUCON 7 に参加しました。

ISUCON についてはこのあたりを見ると良いです。
ISUCON7 まとめ : ISUCON公式Blog

今回もぼっちーむを回避して、会社の人と組んでいきました。前回の ISUCON 6 と同じメンバーです。

過去の参戦レポはこのあたり参照するとよいです。

今回は、ぼくの参戦時間が実質 3 時間程度、少ない時間しか当てられませんでした。
(ぼくからみた義親、つまりは妻の両親が家庭訪問という重大なイベントが発生して、椅子コンよりも優先度高めだった)

当日までにやっておいたこと

メンバーで集まって、何度か方針や準備するものについて話あっていました。準備するのは当日にあたふたしないように、ある程度は機械的に出来るように、というところからです。
具体的にはこんなものが挙がりました。

  • さくらクラウドのアカウント準備
    • クーポン投入
    • お金をケチらない気持ち。必要なら大規模マシンで殴って戻すことも視野に。
  • 個々人の環境
    • ISUCONイメージがさくらクラウドから提供される?情報まち。
    • されないならubuntu使って空っぽマシン用意
      • 中身をがばっともってくる
  • 簡単に色々なログ仕込める君
    • スクリプトとかansible的なやつでやりたいよね
    • mysql-slowとかアクセスログとか。
    • CPUとかメモリ、ネットワークの様子もみたいよね
    • プロファイリングツールの準備
      • alp
      • new relicをいれたい
        • 準備だけしておきたい
        • PHPの計測もできるが細かに計測する記述をしないといけない
      • Kibana
        • mysql も
        • td-agent でいろいろ飛ばせば全部見れる
  • ssh公開鍵の準備
    • 鍵をcurlするだけでつなげるような状態にしたい
  • gitリポジトリ作る
    • 鍵とssh-configとを準備する
  • つけるべきHTTPヘッダの整理
    • 304 not modified, expire + etag
    • 200 ok
    • 301 / 302 転送
  • 画像圧縮
    • ツールや構築の下準備
  • ご飯@ランチの用意
    • 当日朝各自で買ってこよう
    • 大人なのでお菓子とアルコールはご自由に!
  • FWになれる
  • 実装の読み解き
    • 頭の中でやるとつらい
    • ホワイトボードに書こう
    • 付箋を使おう
  • 当日の流れを作っておく

ISUCON のたびに毎回考えるのはアレなので、そろそろメンテしながら使いまわしをしていきたい所存。

それと、練習しよっ♡、なんて言ってたけど結局一回もやってない。いや、環境構築までは一回やった。 vagrant-isucon という素晴らしいものがあって、これを使わせてもらった。当時行われた時の得点まで伸びはしないだろうが、何をしたらどう伸びるのか、という部分は見ていける、便利ちゃん。

matsuu/vagrant-isucon: ISUCON過去問を構築するためのVagrantfile集

ちなみに結局当日になっても、このリストの大半は実施あるいは準備されませんでした。。熱量の違いだったり、そういうアレ。

当日にやったこと

合流したのは18時過ぎ。それまでに以下のことをチームメンバーが進めていました。

  • phpへの切り替え
  • リポジトリの準備
  • /messages/ の N+1 の解消
  • インデックス設定
  • 画像ファイルを DB から取り出し DB に保存しないようにする
  • nginx, mysql, php-fpm の微調整

合流したときにはスコア的には 1 万くらい?
( っ˘ω˘c).。o○( なんでスコア伸びてないんだ…? )

そこからはこんなことを進めていきました。

  • 画像圧縮するしないで揉めてたっぽいのでやるなって言った
  • それするより画像に 304 つけろって言った
  • LINE 通話をつなげた
  • ハッピーターンでお腹を満たす
  • /fetch の N+1 改善
  • nginx の設定サポート
  • /message や /login あたりの微妙な改善

時間も少なく、現場まで合流するのは厳しかったのでリモートで作業せざるを得ませんでした。チャットだけでも良かったんですが、声が繋がったほうが何かと便利なので LINE 通話を PC で繋ぎっぱなしにして、あーだこーだ言いながらやってました。

最終スコアは 37000 くらい、だったかな?(結果一覧に出ている点数と微妙に違うっぽい?)

ISUCON 5 とくらべて、アプリ上の実装の問題はほとんど消化できたと思っていて、そのあたりは前回からレベルアップしたと思う(チームとして)

画像の304については理解が浅くて結局出来ていなかった。周りの攻略記事を見ると、ここが出来る出来ないでスコアが大きく変わっていたように思える。最後までベンチマーク実行結果に icons のレスポンスが遅くて~、とあって、これが改善できないともうスコア伸びないってのは分かっていたけど、いろいろなものを信用しすぎて何も動けなかった。

結局よくわかんなくて合流してからずっと右往左往したところがあって、ベンチマーク時に 2 つチェックいれたらどうなんねん、というところ。リバースプロキシしてバランシングしたり、外したり、そもそも設定うまく行かなくて、だいぶ時間がかかった。結局 2 つチェックいれたらベンチが倍速になってスコア上がるんかな?どこかに説明あったっけ(見落としたかも?)

サーバ構成的には AP + AP + DB という、多分他と同じ構成。

次に向けて

ISUCON が来年も実施されるかわからないけれども(ものすごく楽しいイベントなので実施されてほしい)、自分のスキルアップはもちのろん、チーム側の意識・熱量・レベル感が合ってないどうすっかなあ、というところをやっていかないと勝てないだろうなって気持ち。例えばあった話だと、とりあえず画像圧縮してプロキシキャッシュすれば勝てるやろ~~、とか真面目に雑な話をしている人とか。19時くらいになってわかんないからスロークエリ入れるか~~~とか言ってたり、先やれよ。とか。うごかないんだけど見てくれ~って、別にこっちも分からないから都度調べてるんだけどなあ…。とかなんとか、こんな人と仕事していたのかとか云々。余談が過ぎた。ようは 3 人で役割を分けてそれぞれ最高のパフォーマンスをしていくべきで、それは 2 人になっても変わらなくて、ぼくが居ないまたは手が出せない状況だろうと頑張ってくれって気持ち。なのでそれが足りないっぽいのでチームビルディングというか、そういう類の云々がだめだめだったんだろうなあ~~。

もし次があったとして、次も同じチームででるかっていうと怪しく、楽しく全力で戦えるチームで出来るといいな。どんどんやっていこう。
結果として ISUCON 7 は予選敗退だったけれども、俺の、俺たちの、 ISUCON 7 はまだ終わってない!(練習しよ

そんなポエムで〆


ISUCON 運営の人たちメチャ忙しいと思いますけど、こうやって今年も楽しいイベントを開催してくれてありがとうございました?

今度はチームでISUCONに参戦したものの予選敗退でした

この記事は公開されてから1年以上経過しており、情報が古い可能性があります。

詳しくはこちら > ISUCON6 開催&日程決定! #isucon : ISUCON公式Blog

今回はぼっちーむを回避して、会社の人と合わせて3人(+おまけ)でやっていました。
5、6人いれば2チームで競う感じの参戦方法もありだったのですが、ちょっと都合が合わず。。なので1チームでした。

今回は初のチーム参戦ということもあって、意外と勝手がわからないことが多く、苦戦しました。

結果としては予選敗退でした・・・次はもうちょっと上位へ・・・!

ちなみに前回の参加レポはこちら > ISUCON5 オンライン予選に参加していました

やったことをまとめていきますねー

==============================

■初Azure!!

初というとちょっと語弊がありますが、触ったことがあるのはかなり昔のAzureなので初Azureでもいいでしょう。
当時と比べてかなり進化したUIになっていて、とても使いやすかったです。
ガッツリインフラマンじゃないのでなんとも言えないところもありますが、まあまあいい感じなのではないでしょうか。

ちょっぴり残念ポイントとしては、無料枠をなぜか使いきっており(もしかして:MSのAPI的なやつで登録した?)、
仕方なく従量課金になったところでしょうか。数百円くらいの請求が来ると思います。まあまあ。

■とりあえずシステムをPHPに切り替えた

まっさきにPHPへ切り替えました。
切り替えたとき、nginxのMIME読み込みがなかったためか、Chromeで正しく画面が表示されておらず、この解決にも時間がかかってしまいました。
ただまあ、静的ファイルはちゃんと出ていたのでベンチは通っていましたw

3000点くらいですかね。

ちなみにPHP7が入っていました。
5.6.xxxだったら7入れてようと思っていたのですが、さすがにそこでの利点はないようです;;

■とりあえずgit pullで更新できるようにした

とりあえず社内のリポジトリにぶっこんで、git pullしてコードを更新できるようにしました。
capistranoなど仕込んでもよかったのですが、おてがるに、最速に、安定に。

■isudaの文字列長を別カラムに保存してインデックスを張った

チームメイトがなんだこれはーーーって言いながら直していました。
これでスコアが6000点くらいでしたかね。

他にもインデックスがなさそうなところにもりもり張ってこのくらいだったかと。

■isutar→isudaにHTTP通信するのをやめた

ぼくがなんだこれはーーーーって言いながら書き直していました。
具体的にはDBも同居しているんだからそのまま直にSELECT掛けにいけばいいんじゃないかなあ、という実装に変更しました。
同居ではなく、サーバ台数が多いなら分けたほうが縦横に広げやすいと思うので、そっちのほうがいいですよねきっと。

この同タイミングで、nginxも1サーバだけにするように変更しました。

ちょこちょこバグが発生して時間がとられていくものの、無事完了してスコアが15000点くらいです。

■isuda→isutarにHTTP通信するのをやめた

逆も同じつくりになっていたので、こちらも同様にしてやめました。
また同タイミングで、nginxのfastcgicacheを入れました。

スコアが23000点ほど。

ただfastcgicacheはうまく設定できていなかったようで、スコアへの要因はあまりなかったようです。

■Redisキャッシュへ

ここまでですでにhtmlifyメソッドがヤバソウ、スターをキャッシュとかできないかなあ、といった話題が出ていました。
こつこつ裏で実装を進めており、夕方ころに完成、マージしていきます。

ここでスコアが25000点ほど。
うーん、キャッシュの作り方が悪かったのか、ちょっと微妙な結果でした。

■時間切れ。
といったあたりで終了の時間になりました。

2万点台に乗ったとき、ベンチのランキング上位に入ったので、このまま順調に対応していければ本選出場も行けそうな予感がチーム内にあったのですが、、
バグが出まくったりコンフリクトしたりと、課題が残る結果に終わってしまいました。

==============================

時系列的にはこんなところです。

やり残した部分や気になる部分を挙げると…

・htmlifyをちゃんと見れていなかった
 ここ改善する余地めっちゃありそう。

・スパムチェックも何かできそう
 バイナリがWebサーバになっていて、そこそこパフォーマンス高そうでしたが、HTTP通信はやっぱりコストが高いと思います。キャッシュできるといいなあ、とか。
 バイナリになっていて隠されていましたが、例えばベンチをガンガン回してチェックした内容をRedisとかnginxのリバースプロキシなどにとりあえず入れておくとか…。
 気合い入れてリバースエンジニアリング的なこととか…;;
 最初からちょっと様子をみていたのですが、パフォーマンス高そう、がわかったときに一気に後回しにしていました(この判断はただしい気がする)

・キャッシュをちゃんと作る
 もうちょっと気合い入れて作ったらもうちょっとスコア伸びてくれそう
 というか作ったキャッシュが当たっているか見てないのも問題→当たってないならそのキャッシュは作ってもダメなのではーーー

・最初にスコア計算の方法をちゃんと見ておくべき
 POST遅延がかなり減点されるので、そこで一部足を引っ張られていた可能性が高そう

・初期化処理生かせてない
 前回参加したISUCONでは初期化処理もそこそこコードを書いていたのですが、今回はまったく書いていませんでした。
 キャッシュを作ったり、下準備をしたりなどいろいろできるはず。。。

・個々人で開発できる環境整備してあげよう
 ケチって1サーバで動作確認しまくっていたのですが効率が悪すぎて。。。
 ローカルでも動くようにDBコピーするとかいろいろ手は打てたはず

・リブート検証してないよ
 結果としてはしなくてもよかった点数になりましたが、ここもちゃんと見てあげないと、でした。
 ルールにも再起動して大丈夫なこと、とかって書いてありましたね。

・git pullしてたけどコンフリクトしてやばい感じになってた
 雑にフリースタイルにコミット!プッシュ!マージ!していましたが、ぶつかって直すと壊れて、が後半に頻発してヤバイ感じになっていました。
 ある程度のルールを事前に決めるなりすり合わせするべきですねー

・個々人の役割があまり明確でなかった
 ある人はこれをやり、ある人も同じものをやり、が多くは無いですが少し発生していました。
 それぞれ得意スキルが異なっているはず(あまり詳しい得意スキルを把握していなかった)なので、最高のパフォーマンスを出せる場所へ誘導してもりもりやってもらう感じに~~~
 うぐぐぐ。。

ぐぬぬ・・・・課題が山盛りじゃ・・・

ISUCON5 オンライン予選に参加していました

この記事は公開されてから1年以上経過しており、情報が古い可能性があります。

こんにちは。ごみばこです。

以前より気になっていたISUCON、ついに初参加しました。

同じ会社の人もでたいー!と言っていたので、これはいいチャンスだと思っていたのですが、
結果的にみんな予定が…とかでボッチ参戦でした。オコです。とてもかなしい。


ISUCONとは?

「Iikanjini Speed Up Contest」の略で、Webアプリケーションのパフォーマンスをあげようぜ!というものです。
http://isucon.net/


やったこと。

  • 用事のため、12時半ごろからの参加。ぐぬぬ。
  • PHPの実装があやしいということで、再実装する勇気は出ず、Rubyに逃げる
  • 静的ファイルをnginxで返すようにした
      ちょっとだけ上がった。
  • worker_processをあげてみた
      1kくらい上がった
  • relationsをRedisにキャッシュしてみるもうまくできない…
      /initializeで持ってきて、全部そこを使えばいいんじゃね!?!?と思ったけどうまく行かず。
  • footprintのDATE(created_at)をやめる
      ちょっと上がった。
  • / と /login を見直した
      8kくらいまで上がった
  • entriesがアレすぎるのでキャッシュしてみる。
      参照したentriesを全部redisに突っ込む仕様にした。が、スコアが5kまで落ちる。
  • Redisが詰まった…?(????)か、ベンチボタンダブルクリックして2回走ってた…?
      結果よくわからないので戻す。
  • 最後いろいろいじくったら9700くらいになって時間切れ
      インデックス張ったり、ビューの処理をなるたけやめたり。
  • ペプシのストロングゼロめっちゃのんでた。おすすめ
      500mlペットが75円なのめっちゃつよい。

やらなかった、やれなかったこと

  • 過去問で練習
      やろう!やろう!言っててなにもしてない!ひどい!
  • PHPでがんばる
      妥協。PHP7とかHHVMとか試したかったでござる
  • デプロイの仕組みを作る
      1人だし妥協。git pullすらしてない。
  • entriesのカラム調整
      ALTER TABLEに時間がかかりすぎ…。
  • erbをやめる
      erbめっちゃ遅いで。と噂を聞いた程度、実際にloginページはやめた。nginxのプロキシキャッシュも試してみたかった
  • SQLクエリの様子を見る
      スローログの設定がうまくできなかった。アプリ側でログだせばよかったなあ
  • Redisキャッシュ
      やり方がだいぶおかしかったかもしれない。
  • アクセスログの詳細度をあげる
      レスポンスタイムとか見れたはず
  • チームで戦う
      次こそ!
  • erb中のロジック見直し
      終了後によく見たら、もうちょっとだけなんとかできそうな部分あるじゃん…
  • 再起動しての動作確認
      完全に忘れてた。

「1日目、2日目、それぞれで3000点に最も早く到達したチーム (ただし予選終了後の追試の対象には含まれます)」とあったので、ひとまずの目標を3000点にしていました。最終的に1万にとどかないくらいというところで、まあまあ満足する結果になりました。

そんな感じで、1人でも意外といけそうということはわかったのですが、見たいところやいじりたいところが多すぎて、うまく整理できてなかったようです。
もうちょっと、ここがこうでーとか色々メモして、見ていく順番をつけてあげると、自分の動き方がよくなってスコアも伸ばせたかなあ、という印象です

あとは、圧倒的な知識不足を感じました。
以前やっていたとはいえ、Rubyもなんだっけなーくらいだったり、どんなライブラリ使うといいかとかわからないし。
nginxよくわからないし、ミドルウェアもうーん、うーん…、うーーーーーん。

直前で猛練習したり、日頃から触っているような生活じゃないと、いきなりコンテスト!は厳しい感じでした。

あとは1人なのもあって、時間とスコアだけしか見てない動き方だった部分も反省点かなと。

git?いやいや、面倒だから本番いじっちゃおー。_bkとかしときゃいいでしょ。とか。
特定のページだけ静的化とか普通しないけど、スコア伸びたしいいやこれ。とか。
なんでそうなるのかわからないけどこういう設定すりゃいいんでしょwとか。

ということで、次回(もしあれば)は、3人で出る!を目標にがんばります。
本選もいけるなら行きたいけど、楽しいのがいちばんだよね!

最後に、運営のみなさま、楽しいイベントをありがとうございました!