BLOGSpeee開発陣による技術情報発信ブログです。明日、ISUCON7本戦が開催されます。今からドキドキがとまりませんが、よく考えたら予選で惨敗していたので明日は何もすることがありませんでした。「遠足は帰るまでが遠足だ」とはよくいったもので、ISUCONも復習するまでがISUCONだと自分を戒めISUCON予選の復習を行いましたので、そのことについてレポートいたします。Journey社の記事をご参照ください。blog.bitjourney.com講義ではISUCON上位陣の戦略の違いを説明していただきました。3台のサーバーの使い方はそれぞれ異なっていましたが、帯域問題をクリアするために3台全てでリクエストを受け付けているという点では共通していました。僕のチームは帯域問題を全くクリアできなかったため、上位陣の帯域問題をクリアするための戦略は非常に勉強になりました。ActiveRecordのincludesメソッドやjoinsメソッドでN+1を解決するということしかしてこなかった結果、SQLでN+1を解決するのに多くの時間を浪費した僕にとっては非常に耳が痛くためになるお話でした。時間無制限でISUCON7予選の問題を再度1人で解いてみた勉強しただけでは本番でいきなり成果を出すことは難しいので、@gfxさんに教えていただいた内容を血肉とすべく1人でもくもくとチューニングしました。macOS上にVirtualBoxで以下の2台のサーバーを立ち上げて行いました。VagrantFileを使用させていただいております。1WebDAVを使ってpublicディレクトリに画像をアップロードする今回の復習ではサーバーが1台なのでWebDAVを使う必要はなかったのですが、過去のISUCONでも使う機会があったそうなので勉強を兼ねて導入してみました。WebDAVとはHTTP1.1を拡張したプロトコルでサーバー上のファイル操作を行う技術です。Rubyレイヤーでファイルアップロードを実装するよりも短時間で実装できる場合があるため、このやり方に慣れておくと今後のISUCONで役に立つかもしれません。nginx.confを以下のように設定しWebDAVで画像のアップロードができるようにしました。必要な全ての中間ディレクトリの作成を許可する。パフォーマンス問題はクリアできました。未読数をチャンネルごとに計算している処理がN+1問題を引き起こしています。スギャブロエックスチームの実装を参考に、既に読んだ数を別テーブルに格納しておくように変更しました。それを参照することでN+1問題を解決することができました。このようなN+1問題の解決方法もさらっと実装できるようになる必要があるので、精進あるのみです。同様にN+1問題を引き起こしていたのでこちらも対応しました。こちらは1とは異なりSQLのJoinを用いて解消しました。ActiveRecordを用いずMysql2を用いて解決することに手間取ってしまったので、このあたりを深く考えずに実装できてしまうくらい鍛錬を積もうと思います。37583これくらいまでチューニングしたところで点数は30000点を超えました。本番の環境とスペック等が異なっていますが、上位陣が行ったチューニングを実際に手で動かして再現することで血肉となった気がします。頭でわかっているのと、実際に手を動かして効果がでるまで実装できるのとでは大きな違いがあると実感しました。いうあたりまえのことができていないことが多く、その修正に多くの時間を使ってしまっていることがわかりました。身につけることが今後の課題です。ISUCON予選の実装内容を公開してくださっている上位チームのリポジトリやブログを参考にして再度実装しなおすことで確かな力になりましたので皆さんもぜひ再実装してみてはいかがでしょうか。引き続きチューニングを進めて次回大会では本戦出場できるように精進していきたいと思います。※実装はmnc/isucon7-reviewにあります。18:57復習するまでがISUCONですTweet関連記事2018-08-08広告レコメンドにおける多腕バンディット問題の適用とその解法Speeeエンジニアの義田@yoppiblogです。最近はUZOUのレコメン...2017-11-14SwiftでRiemann球面を扱うこんにちは。iOSエンジニアの飯田@iida-hayatoです。参加してきました月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。