ISUCON 10 にチーム curl gottiで参加し、予選突破しました!!!!!!!
2020/09/19 追記
「ISUCON 10 にチーム curl gottiで参加し、本当に後一歩(主観)で惜敗しました!!」というタイトルを「ISUCON 10 にチーム curl gottiで参加し、予選突破しました!!!!!!!」に変更しました。
結果!!!!
残念!!!32位!!!(御存知の通り、当落ラインは31位でした(といいつつ、学生枠があるのでまあ、そうではないし、追試Failもいるのだが、気分気分…))
(あらためて順位はでるらしいですが、まだ公式がだしてないんで、一回ふせておきます。これは22時の追試時のデータがなぜかブラウザにあったので…)
うおおおおおお!!!!おしい!!!!!!!!
今回は id:moznion、id:onk と私の三人参加で、去年の屈辱を晴らすぞ!!実際32位はかなり上出来じゃねえの!!??って思うんですが…。
まあ、負けだよ!といわれたら負けですね…。
すげーおしかったな〜〜。マジで手応えアッたんですけどねえ〜〜…。
参加言語はPHPです
今回はチームメイトにお願いしてPHPで参加しました、理由は私もコードを書きたかったからです!どうせストレージが問題になるのであって、言語でそんな差がつくことはないしね(なお、私は非同期処理も準備はしていた)
結果として、アプリサーバーが足を引っ張る事無く終えました。PHP負けてないぞ(負けてます)
今回PHPのコードは(見ていただくと理解るんですが)PHPだけすごくまっとうな作りになっていて()、オートローダー周りでかなり時間を食ってしまっていました。しかしながら、これはPHP7.4をつかえばPreloadで解決です。PHPはちゃんと速いので全く問題になりませんでした。
また、メモリ効率も断然(前より)上がっているので、2GBのインスタンスであっても48ワーカーにしました、余裕です。
むしろ、ベンチが最初の方で負荷をあげてくれないのがマジで悩みどころで、過去みたいに「セール」機能がないのか!?って本当に悩んだくらいです(それがあれば、1000点伸びるのも夢ではなかった…かも)
チームメイトの話
今回自分はコードを書く、と宣言していたので、普段はOSパラメタやnginxとかをいじってるところを id:moznion にまかせました。nginxのコンフィグって難しいですよね、僕は苦手です。彼はまったく問題無く仕上げてくれたので最高です。
今回静的ファイル周りでの加点要素(ミドルウェアでの飛び道具)はあまりなかったのですが、ミドルウェア周りって本当にミスすると全員に迷惑がかかるのですが、彼はミス無く終えたということがインフラ担当としては最高だったと言えます。つかわなかったけど、redisみたいなのもバッチリしたごしらえしていて安心感がちがいました(私はPHPでRedisとかのコピペコードをつくっていた)
え、わからない?再起動試験が一回もミスなかったんですよ?わかりますか?
(すくなくとも、今回私は「Mysqlのパラメタチューンします!」っていって3回くらいテストコカしたからね?)
あとはsshの接続confとかの準備もおねがいしました。 (その間私はレギュレーションを呼んで「botを無視せよ、あと、資料請求と椅子売却以外は加点なし、つまりnazotteにsleepをいれよう(真顔」とか言ってました)
id:onkさんはモクモクと不慣れなPHPでも色々となおしてくれました。ところでイスコンってFail直すのがチョー難しいじゃないですか、テストがブラックボックスだし。ちょっとfailしてもリトライしたり、「あそこかな!?」ってなって手が止まるじゃないですか、そこで「よし戻そう」っていって速攻revertするのは本当に胆力がいることだと思うんですけど、即revertしててさすがだな〜となりました。そして id:moznionも、「そうしましょう!」っていっててこの人達はサンクコストないのか?って思った。
あと、たまに「これ、これやって」と id:onk さんがいいます。私はそのとおりにシュッと実装したらビュンと得点がのびます、すごい。やっぱりボトルネックを見抜く目というものは重要ですね。 (おかげで僕は「やったけど速度があがらない!」というのがほとんど無くて、チートだった気がします)
自分のコードの話
PHPerだから、だとはいいませんが、今回のPHPコードは普段PHP書いてない人だと結構しんどかったかもしれません(まあ普段PHPかかない人がPHP選ぶか?というのはありますが)。
onkさんのエントリにもあったんですが、DB負荷がマックスということは全員で認識できて、
「転地テーブルつくって」「はい」
「テーブル分割してアプリなおして」「はい」
という感じでした(そんで、これでパーーンと点数伸びた)
こう書くとまあ、自分がさもすごいような話ですけど、大体id:moznionとid:onkさんが「これ、全く別のアプリだよね、なんで一個なの?」みたいな議論をしており、よこできいていた僕は「じゃあ(PHPerには簡単なので)DB接続分割しますわ」と、返して20分くらいで実装したんですけど「すぐにでてきてほぼ一発で通ったのですごかった」といわれたので、すごかったんだと思います(?)
そう、昨今のPHPは静的解析もきっちりきくし、PHPStormなどの支援も強いのでリファクタリングが得意な言語ですね(俺の最近の普段のしごともリファクタリングですが…)。秒でDIとPDO周りを修正するだけ!
(なんですけど、今振り返れば、DIやPDOを普段触らない人はあれむずかしかったのかもな、「db[PDO::class]
ってなんだよっておもった」って言われたし)
ただ、バルクインサートの速度の都合なんですかね?initializeがシェル呼んでててウケた。
失敗したなとおもったところ
これは id:onk さんも言う通り、我がチームが前回も今回も3人司令塔みたいな所だったからだと思うんですが、
「これあかんやろ」を全員でめいめいみつけて、めいめいでやっていっており(まあ前述の通り、私は「これやって」は多少ありましたが)指示出しや、「これどうすんの?」みたいなのが多分他チームより少なかった。
これはオーバーヘッドが少ないものの、逆に「得意なやつがやる(やって!)」「わからんところを聞く(おしえて!)」というのがもっとできたかもしれないとはおもったりはする。
結局コード書く!といっていた自分が、(一声はかけましたが)Mysqlのチューニングしたりしてたり、
(まあこれは「暇だったから」ではなく、自分でメトリック見て「やります!」と宣言してやったわけだが。結果、dstatでreadゼロ、CPUもRUNが98%でサーバがHDDだった事は全く問題にならなくなった)
あとは「PHPで!」と言った事に後悔はないんですけど(PHPは今回の案件においては十分に速いし)、「実はエラーログの出し方がよくわからなかった…」といわれたときに「ああ…ごめん…」とちょっとなりました。
(そういえば、ログといえばAppArmorウザかった)
PHPはログ周りが本当にクセがあり、わからない人はマジでわからないと思う。僕はPHPのエラーハンドリング周りに情熱があるタイプなのでさっさと直したが、それをチームメイトにうまく共有できていなかったのを知ったのは、祭りのあとであった。
単純に悔いの残るところ
DB2台にわけたのをAPPはCPUが20~30%あまってたので、3台に分ければよかったですね、あと20分あればできた。(接続先を3つ用意して、サイコロふるだけだったので)そしたらいけたでしょ、しかしできなかったのでいけなかった。
自分がSQLのごく初歩が書けなくなってビビりました。前回もそうだったんですけど、緊張からか普段絶対にできる事が突然できなくなるんですよね、今回はDROP TABLE IF EXISTS Table
がかけなくて(なんで?!?!)ほんとに最初調子が出なかったです。
こういう時「あっ!呆れられたか!?俺はもっと普段できるんですけど!?」ってなってしまい、その後30分くらいメンタル下がったのですが、「普段のチームメイト」とやっているところはこういうのないんだろうなと思いました。これが心理的安全性とか、チームビルディングってやつか?(フリーランス引きこもりの感想)
PHPerまとめ
PHPは以下をちゃんと活用すれば十分に速度が出ます。そこはボトルネックではない。むしろリファクタがやりすい現代のPHPは便利。
PHPerがISUCONで使うべきツールをここにならべておく
- preload
- 静的解析と、それをサポートするエディタ
- xhprof(と秘伝のタレ)
- (Apache好きなので気に食わないがw) nginxとphp-fpm(の調整)
- (今回使わなかったが)Redis
- (今回使わなかったが)curl_multi(をWrapした様々)
今回の問題に限らず、素振りでもちゃんと書けばバンバン得点でてました、それが確認できたことが私の一番うれしかったことであり。そして後もうちょっとで手がとどかなかったという一番悔しい所でありました。
感想まとめ
本当に、あと一歩をのぼれなかった事をまたしばらく引きずるとはおもいますが、ISUCON運営の皆様にはこのような楽しいイベントを開催し、昨今の風評被害(主観です)にも負けず、実装言語にPHPを残してくれていることに最大の感謝をお送りいたします。
ISUCONは本当にたのしい、そして悔しい。
こちらからは以上です。
余談
PHPerで、composer.jsonみて「…?…???えっ…?」ってなった(わかった)人と話したい。だれか!!