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

Perl歴半年の3人が #isucon2 に参加してディフェンディングチャンピオンを倒そうと思った話

#isucon2 参加者・関連エントリまとめ

運営の方々、@kazeburoさん、@tagomorisさん
お疲れ様でした!とても楽しく参加させて頂きました!

優勝が前回覇者のチームfujiwaraということで、やれやれですね。

@fujiwaraさんと席を並べて半年経ったのかな。

インフラチームとして2人で仕事をするようになり、
同じサーバを見て、同じメトリクスを確認し
同じアラートを受け取り、同じ課題を見てきていました。

暁美ほむらがよく軍隊なら一個中隊規模の軍事力があるという話がありますが、
@fujiwaraさんは一国の軍隊ぐらいのパワーを持っているんじゃないかって思います。

サービスエンジニアが書いたコードをチェックし、アドバイスを行い、
スイッチやLANケーブルの配線を行い、ネットワーク構成を考え、
アプライアンスのロードバランサを設定し
ボトルネックを瞬時に判断し、誰よりも早くアラートに対応する。

簡単に言えば、Webサービスに必要なものはなんでもできるんです。
しかも全て、迅速かつ丁寧に。

事実として、みなさんがヤバいなって思ってる数倍ヤバいんです。

で、どうしてそんなスーパーな神になれるのかなーって考えると

 - 誰よりも責任感を持って仕事をする
 - 誰よりもその事象に対して正確に理解しようとする

この2点が大切なのではないかなーと、そばにいて思います。

え、もうこのアラートウザいんで止めちゃってよくないですか?
え、単純にこれが解決すればいいんじゃないんですか?

みたいに思考停止すると、それ以上の技術の発展はなくなって
いかにして課題に誠実に技術力で向き合うかってところが
技術力の向上に繋がるのではないかと思います。

私は結構雑なので、興味あるものには必要以上やるのに
興味ないと全然手を動かさなかったりするのがあって、
本当にそういうところは見習わないといけないなーと、今書いてて反省しております。

@fujiwaraさんみたいになりたい人がいたら、
多分@fujiwaraさん本人にどうしたら良いですか?って聞いたら
丁寧に教えてもらえると思うので、聞いてみてください。

カヤックでは毎週金曜日に勉強会やってて、
その後毎週馬車道で美味しいクラフトビール飲みに行ってるので
遊びに来て頂いてもオッケーだと思います!


これだけヨイショしておけば席がなくなってることは避けられるかな。。。



ということで、ここからは#isucon2でやったことの言い訳を書きたいと思います。



まず、社内にはディフェンディングチャンピオンのメンバー2人(@songmuさん、@fujiwaraさん)がいて
社内IRCで一緒のチームで出たい人いますかーという応募があったのですが、
@fujiwaraさんと同じチームになってもあんまり面白く無いかなーと思って、
同じ中途でC++erのレモンさんと、新卒でリードエンジニアやってるPythonistaのマコピーと出ました。

結果的にディフェンディングチャンピオン@typesterさんが入るという
他社のみなさまには申し訳がないぐらいの本気チームができてしまいました。

本当は変態天才マッドエンジニアのtaroさんっていう人がいて、レモンさん
3人で出ようかなって考えたんですけど、多分斜め上すぎるメンバーでダメだな
ということでマコピーを加えた3人で参加しました。

全員Perl歴半年以内で、かつ私に至ってはプログラムをまともに書いたのが
ここ半年なので、なかなかどうしてなメンバーでしたけど、試みは面白かったのかなーと思います。

やったことを過剰書きに

= けんじすかいうぉーかー=
  環境整備

  o ssh
     - ポートを22に戻す
     - Rootログインの許可
     - Rootを鍵認証でログインできるように設定

  o .bashrc
     - hostnameが覚えづらかったので
       PROMPTの表示を「proxy」、「app01」、「app02」、「db01」と表示するように変更
     - alias
       aa = ap01にログイン
       ab = ap02にログイン
       db = db01にログイン

  o iptables off

  o SELinux off

  o MySQL
     - slowquery の出力設定
     - noindex の設定
     - 取り敢えず innodb_buffer_pool_size = 12G <= 安易な設定変更、ダメ、ゼッタイ 
= レモンさん、マコピー =

DB周りを確認。軽いDBだと判明。これもう全部Redisに書き換えたらいいんじゃね?
全員賛成。レモンさんが書きなおす

= けんじすかいうぉーかー =

取り敢えず全台にRedis入れる。

Apacheがただ裏のAPサーバに渡してるだけだってわかったけど
取り敢えず

Apache -> nginx

に変更。ベンチ走らせても特に変化なし。
静的ファイルだけnginxで返すようにしたら多少スコア上がるも
根本的なボトルネック解決にはならず。
取り敢えずレスポンスタイムを取得できるようにログファイルを修正。

側だけだと特にやることなくなったので、nginxの前に
Varnishを置いて、そこから直接アプリに向けたら

Varnish <=> Redis

で最強じゃない?という案が思いついたので、Varnishを設置する。
取り敢えず一切細かい設定入れないでベンチマークを走らせ

ブラフのスコアを叩きだす。爆笑してたら@tagomorisさんがやってきて
それちゃんと動いてないよね。という正確なツッコミを頂く。

もしかしたら動かす機会があるかもと、動かした際にローカルポートが枯渇しそうだったので
net.ipv4.tcp_tw_recycle = 1 と net.ipv4.tcp_fin_timeout = 10 を設定。
50000ぐらいTIME_WAITがあったのが130前後まで減ったので、設定次第では使えるようになった。
TTLを1sにしてうまいこと回避できないかと思ってやってみたが、どうもコケてしまった。
この辺もちゃんと全体を見てないので後回しにした。


レモンさんが書き終えるまで時間があるのでnginx-lua-redisとかで
コンテンツもオンメモリで返せないかなーとか思いながらVarnishのドキュメントを読む。
Varnishも2系と3系で偉い設定が変わるので、付け焼刃には厳しい状態だった。

マコピーと

nginxのログを見て、ボトルネック箇所を特定する。
テンプレートの生成に時間を食っているのも確認。


最終的に、最悪でも静的ファイルのJSとCSSとJPGぐらいはVarnishで返せるようになった。

しかし、MySQLをFull Redisに書き換える前にタイムアップした。

失敗したところ
  • 必死すぎてみんながみんなのアラートを共有できなかった
  • 役割分担が上手くできず、レモンさんがずっとコードを書いている状態だった。
  • 来週末報告会やるよってさんざん話してて、fujiwara組とIRCのログ照らしあわせようって決めていたのに

 実際は大声で大爆笑しながら口頭でやりとりしててまともにログが残ってなかった。

よかったところ
  • 楽しくできた


MySQLをRedisで丸めるっていうのは方法的には面白い発想であったので、完走させたかった。
完走させても、@typesterさんが実際にボトルネックの部分をMySQLからRedisに変更しているので、
チームfujiwaraに勝てるスコアではもちろんなかったと思う。

ボトルネックを改善するよりかは、再実装でタイムアップしてしまったので
ちょっと悔しい。ちょっとではなく無茶苦茶悔しい。

Varninshは業務で使ってないけど、ESIとか利用すればそこそこ面白いスコアが出たのではないかと思った。


という感じで日頃の業務+Varnishな感じでしたが、
完走することができず悔しかったです。

懇親会はレモンさんがシャイだったので、あまり多くの方とお話しできなかったのが残念でした。
あと、優勝おめでとうボードはレモンさんが会社に持って行ってくれたので、どこかに飾りましょう。

そして、社内のエンジニアでインフラチームに入りたい若者は上司にかけあってみると良いかもしれませんね。

ということでみなさまおつかれさまでした!
最高に楽しい週末でした!

週明けにわたしの席が残っていることを祈っていてくださいね!

( ◔_◔)