読者です 読者をやめる 読者になる 読者になる

DokiChupa -3rd-

技術系ブログを目指したい。

社内ISUCONに参加した。

カンファレンス イベント

そろそろISUCONの時期ですね!

今年は諸事情で参加できそうにないのですが...。

その変わりに(?)とある御縁からこちらの社内ISUCON(通称:ISHOCON)にお邪魔させて頂きました!

blog.mmmcorp.co.jp

やったことをざっくりと振り返りたいと思います。

言語選択はRuby。 環境は c3.xlarge。

開発環境の整備

  • AWSの構築 / sshの設定
  • ソースのGit管理
  • nginx/MySQLの設定バックアップ
  • vimの設定

アプリケーションの動作確認 (score : 104)

  • 機能の把握
  • 構成の把握

解析ツールの整備

  • kataribe
  • pt-query-diges
  • rack-lineprof
  • slow.logの出力設定
  • ログ退避したりミドルウェアを再起動したりするシェルを作成

準備していた設定ファイルの置き換え(score : 165)

アプリケーション修正 (score : 5569)

  • N+1の修正
  • 事前にJOIN出来る箇所を修正
  • OFFSETを使用している箇所の修正
  • nilを想定していない箇所の修正
  • 未使用カラムの削除

インデックスの追加 (score : 37908)

  • ベンチマークを実行しながら各種追加。
  • インデックスに合わせてクエリを修正。

キャッシュ戦略 (score :51319)

既にredis で実装している方が居たので今回は memchached でやってみることにしました。

ベンチマーク実行前に呼ばれる /initialize 内で必要な集計結果をどんどん乗せて、 最終的にベンチマークが集計時に必要としている特定テーブル以外のクエリ発行を無くしました。

sysctl.confの修正

ISUCON定番ネタですね。
ISUCON4 予選でアプリケーションを変更せずに予選通過ラインを突破するの術 - Hateburo: kazeburo hatenablog

css/imageの非同期読込み

こちらで紹介されていたテクニック。
#isucon 4に参加して予選2日目暫定1位になりました - 酒日記 はてな支店

最終調整

  • nginx, unicorn のプロセス数、workload数の調整
    • unicorn : 9, nginx worker_processes:4 / worker_connections=10240, workload: 10

足掻く (score :52403)

  • テンプレートから空白と改行の除去
  • String.freezeする

結果

f:id:Yasun:20160831175706p:plain

反省点

memchached の方がクエリ発行より速いと決めつけてどんどん乗せたのですが、 最終的にボトルネックになってしまいました...。 DBとキャッシュのバランスをとりながら実装するべきでした。

あとはリダイレクトは点数加算されないという点をレギュレーションから見落としていました。

Nginxでセッション操作ができるので、そちらで完結出来るものがあると気が付きませんでした。

自分としてはこれ以上は厳しいと思ったのですが、まだまだやれることが沢山ありました。

ISUCON4 予選 参考解答(Redis版) : ISUCON公式Blog

( ;゚Д゚)...時間内にSinatraを捨てるとか...すごい...。

まとめ

過去のISUCONではミドルウェア側に回ることが多かったのでアプリケーション修正をここまでするのは初めてでした。 そして慣れている言語の重要性を改めて身にしみました。

こういったイベントがあると実践的に楽しみながら勉強できるので良いですね。

出題を担当したshowwinさんに感謝です!

今回参加させて頂いたMMMさんではにエンジニアを募集中だそうです!
リモートワークに興味がある方は是非! www.wantedly.com

ギークハウス新宿に泊まった。

その他

一時帰国のため、ギークハウス新宿に2日間お世話になっています。

www.airbnb.jp

その名の通りプログラマー、デザイナーの方々が10名程住んでいるそうです。

Airbnb経由で短期宿泊している人と、長期滞在している人がそれぞれ居ました。

駅近、大量の書籍、WIFI完備と、快適です。

なんだか友達の家に遊びに来た感じです(˘ω˘)

f:id:Yasun:20160214195711j:plain

f:id:Yasun:20160214195725j:plain