ISUCON特有のスコアを出すためのこと

草野翔氏(以下、草野):質問が来ていた。「ある程度チューニングできたあとのISUCON特有のスコアを出すところを聞きたいです」。ISUCON特有のスコア、最近の問題でありますか?

藤原俊一郎氏(以下、藤原):特有のというか、実務でやらないのはマスタデータのオンメモリキャッシュとかですよね。

草野:あるわー。

藤原:ISUCONだと1分しかないから、ユーザーがベンチ中に増えないとか、〇〇のデータはベンチ中に変わらないみたいなことが明確にわかります。オンメモリにキャッシュすることは実務では絶対にやりませんが。

ISUCONだと最初にそれをやってもしょうがないので最初はやりませんが、終盤でもうひと押しという時はやりますね。競技的な要素が強すぎてあまり好きではありませんが、背に腹は代えられないので。

草野:ISUCON特有のやつはあと何かあるかな。

金子達哉氏(以下、金子):MySQLまわりだとbinlogの無効とか。あとはわりと安全じゃない設定にするとか。

藤原:fsyncをやめるやつですよね

馬場俊彰氏(以下、馬場):アクセスログを出さないとかね。

藤原:アクセスログを出さないのは最後の最後ですよね。

金子達哉氏(以下、金子):本当に最後の最後です。

藤原:集計できなくなっちゃうので。

金子:残り10分とかにやります。

草野:でもログをとめてそんなにスコアが上がったことがないから、あまり信用していないんだよね。安心のためのおまじないぐらいの気持ちしかない。

藤原:デバッグログを出しているやつは真っ先に止めます。ミドルウェアで無駄に大量に出しているパターンがあって、それは真っ先に止めますが、私(たちのチーム)は、アクセスログは最後までオンかもしれないですね。

草野:止める時は相当詰まった時だな。相当やりきった感が出ていないと、僕(のチーム)も止めない気がします

馬場:私(たちのチーム)も最後にやることリストには入っていますが、本当に最後ですよね。

藤原:ISUCON特有、あとは何だろう。複数台構成を空いているホストにじわじわと振るみたいな。

例えば3台(サーバーが)使えて、(その中に)MySQLが1台(ある)じゃないですか。3台の中で、リソースを割り振りを「こいつはnginxがいて、こいつはアプリケーションサーバーがいるんだけど、ここがちょっと余っているからこっちには何パーセントバランスしよう」みたいなことをして、3台ギリギリにCPUを使い切るみたいなことをやることはあります。

草野:他にもありますか?

金子:他では絶対にやらないなと思ったのは、3台構成だった時にMySQLを2台立てて、レプリケーションを使わずにアプリケーション側でgoroutineを使って、2つのデータベースに対して書き込みして、両方でreadを増やすようなことをやったことがあって。普通に動きますが絶対にやらないなと思いながらコードを書きました。

草野:再起動試験はメチャクチャがんばるな。

藤原:本番でもリリース前に再起動して動かないかどうかぐらいは確認するけど(笑)。

草野:ISUCON特有は何かあるかな。

中西建登氏(以下、中西):それでいうとISUCON10のテスト試験で解いたと思うんですが、2つのテーブルがあって。そのテーブルたちはjoinしていないから片方はサーバーAでMySQLを流して、もう片方はサーバーBからMySQLに置いて、メチャクチャBの性能を稼ぐようなことはありましたね。

金子:それが僕がさっき言ったやつですね。予選でそれをやった。

中西:なるほど。

金子:それはgoroutineでやりました。

草野:メチャクチャやった。

馬場:マイクロサービスみたいなものなので、一周回ってやっているかもしれない。

草野:ISUCON特有というと変ですが、やれることがなくなった気がしたら必ずマニュアルを読み直すのをやっていて。先ほど「アプリケーション要件を変えたい」という話があったじゃないですか。「根本的に変えたい」みたいな。ドキュメントをしっかり読むと「ここは外部サービスにバルクリクエストしてもいい」みたいなことがしれっと書いてあって。でもそれはアプリケーション内から使われてない。

ISUCONの中で、コードだけを読んでいても実はわからない情報が、意外とドキュメントに書いてある時があります。ドキュメントを読まない勢では一生気付けないものとか、流し読み勢は一生気付けないものもあるので、もう1回読み直す。わりと気軽な気持ちで読み返しています。

(そうすると)意外とそういうことが書いてある。「何秒キャッシュしていい」みたいなのが書いてあるなら「やっていいんだな」と思ってやったりとかはします。

ISUCON9の本選の新幹線予約みたいなやつで、これは騙されたというかピットフォールにハマっただけなんだけど。予約の残りの「残席数があります」「ありません」「残り少ないです」みたいなものを〇・△・×で出すところで、「高負荷時は間違っていてもいい」と書いてあって。

チーム内で「高負荷時っていつだ?」みたいな話になって、「ISUCONでベンチで負荷がかかっているんだからいつでも高負荷時だろ」みたいことがあって、ずっと〇だけ返し続けるパッチを入れたら速攻で怒られて、ぜんぜんダメでした。

(一同笑)

草野:リバートするとか。「5秒で入れられるから1回やって、これでもしよくなったら計算がまるっといらなくなるし、とりあえず1回やってみようぜ」みたいなことはけっこうやりがちです。とりあえず気軽な気持ちで入れて、ベンチに怒られないか試してみることはやりがちです。

ISUCONだけのテクニックは、ISUCON本を見ていると、ISUCONだけのテクニック運用がうようよ出てきます。

ISUCONのおかげでよくなったこと

草野:いったんこれで来ている質問にはだいたい答え切れた気がしています。いろいろなことをやりながら、いろいろやってほしいなという気持ちで、みんなにISUCONに参加してほしいなとか、ISUCONに参加せずとも、ISUCON本を読んで、ISUCONという競技から学べることはたくさんあったと思っています。

今並んでいるこの著者6人も、きっとISUCONのおかげで業務で幸せになって勝ちまくり・モテまくりみたいなことが起きているはずなので。というか、みなさんISUCONで学んだことで勝ちまくりみたいなことはありました? 僕はちなみにマジでありました。

金子:僕は前から言っていますが、エンジニアとして育ててもらったのは、やはりISUCONコミュニティだなと思っています。

藤原:僕もですね。

金子:ISUCONがなかったら、やはりエンジニアとして成長できなかったと僕は思っています。

草野:「ISUCONをやるとPR TIMESのCTOになれる」みたいな話になってきましたけど大丈夫ですか?

(一同笑)

金子:まぁいいんじゃないですか(笑)。じゃあそういうことで(笑)。

草野:やばいなぁ(笑)。誇大広告(だと誤解されないか)とか大丈夫かな?  CTOになれるかはまた別な気がしますが、本当にエンジニアとして成長できるイベントだと思うし、僕はISUCONに参加した時にわからないことがけっこうハッキリしたので。

わからないことがハッキリすると勉強のしようがあって楽しい。毎年(ISUCONに)出たり関わったりする中で「これはぜんぜんわからんわ」みたいなのが毎年1個ぐらいあるんですよ。

ISUCON11の時だと、PDFを生成したりzipを生成することを速くする方法がぜんぜん意味がわからなくて、「ぜんぜんわからないな」と思っていましたが、いっぱい方法があることを勉強したり。そういうことがけっこうあったので、毎年わからないことが増えていく、いいイベントだと思っています。

そういう意味で「わからないことは何だろうな」と思いながら本を読んでもらったり、付録A・Bを読んでもらったり、全9章を読んでもらったりとかすると、みなさんの実務の役にも、人生の勉強にも役に立つのかなと思っています。ぜひぜひ本を買ったりISUCONに参加したりして、一緒に遊んでいただけるとうれしいなと思っています。

ちょうど2時間ぐらいですかね。みんなお付き合いいただきありがとうございました。ということでみなさんお疲れ様でした。拍手!

(一同拍手)

馬場:終わったら拍手(笑)。

草野:始まる時も拍手(笑)。一応ね、今日のライブが始まった瞬間みんな拍手しましたよ。もうWebですが、続きはWebでという話で。まだやるんですよ。@isucon_officialというTwitterアカウントのスペースでやるらしいので、著者のみなさんはがんばって携帯にうまく音声を入れる方法を今から勉強してください。「最速いい感じ音声入力コンテスト」が今から始まるので、みなさん続きはWebでよろしくお願いします。今日はお付き合いいただきありがとうございました。

一同:ありがとうございました。

草野:次のISUCONで会いましょう。

(一同笑)