「難しかったです」――MySQLに初めて触れた木村


昨日の日曜日、なぜか工房でISUCON過去問を解く大会を開催しました。
ISUCONってなんだよという方も多いと思うのでざっくり説明すると、

(出題される)ウェブサービスを限界までチューニングし、高得点を競い合う競技

です。

開始時にサーバーが三台与えられ、その中で動いているサービスを改善していくというもので、
バックエンドで走るアプリケーションの改善、nginxなどWebサーバーのチューニング、データベースのチューニング、
更にはOS自体のチューニングなど、その三台の環境であればサービスの挙動が変化しない限り制限のない戦いです。

基本的には1チーム3人が基本ですが、今回は突然企画したので人数が集まらなかったため、2人*2チーム+GMという構成で開催しました。
なお後述しますが、何故かGMが途中から参戦するというアクシデント(?)が発生するという事態にも発展し、白熱した戦いが行われました。
以降は時系列に沿って記述していきますが、若干誇張した表現が含まれる可能性があります。
現実を元にしたドラマ、という感覚で楽しんでいただけたらと思います。


13時、ISUCON in 工房の集合時間。
――このとき工房で生きていたのは1人だけでした。

大会サーバー、ジャッジシステムのセットアップを前日に行っていた二人は寝落ちし、
大会参加者は”休日ダイヤに阻まれ30分足止め”、”忘れ物を取りに下宿先に行き、ついでに昼食”、”来ると言って音沙汰無し”という最高のメンバー。
先についた一人はSlackで、 集合時間だけど俺一人しか生きてないんだけど と現実を受け入れる姿勢を表明(しているか怪しいがそういうことにしておく)。

ようやく説明を終え、大会が始まったのは14時ごろ。チーム1は開始早々に意味不明の連続ベンチマーク
何も手を加えていないのにベンチを何度も回し始め、チーム2・GMは困惑する会場。
今思えばチーム1の火の玉ストレートはここから始まりました。

開始から一時間ほどが立ち、すでに何故か5回ほどベンチを回しているチーム1ですが、
この頃からリーダーボード(順位表)が壊れ始めます。
コンフィグファイルのミスらしきエラーから0点を出したチーム2が表の上から消えたのです。
厳密に言うと得点を示すグラフ上のが消え、マウスをホバーしないと得点が確認できないという現状に、会場がさらなる困惑に巻き込まれました。
このあとチーム1も消え、無事マウスをぐるぐるする参加者の姿が工房に発生しました。

この頃からGMは 暇だし大体チューニングする場所わかるから参加したいなあ と言葉を吐き始め、
いつかくるその時を気長に待っていたのでした。

そんな中コンフィグの修正を終え、チーム2はデータベースのネックを解消しはじめました。
結果としてチーム1を置き去りにして2000点ほどの差をつけていきます。
チーム1はnginxのコンフィグ改善と初心者がGoを解読する作業に勤しんでいたものの、データベースを気にする素振りすら見せません。

いつの間にかGMはサーバーをセットアップし終え、 さてやるか とドミネート宣言をし始める始末。
開始から四時間ほどが経過したころ、途中参戦のチーム3(GM)はチーム1に5000点、チーム2に2000点少しの差をつける圧倒的なチート得点を魅せつけたのです。

この頃からかチーム1に雑言怒号が生まれ始めます。
Go初心者がGoを触れていたものの改善点がわからず、nginxのチューニングで点数が若干上がるのも頭打ちになってしまいました。
二人共MySQLに触れた経験はなく、模索するものの理解できずMySQLに対する暴言が相次ぎます。
あとから考えると、 データベース内に画像をblobとして格納していた ため、確かに おかしい という指摘は正しかったのですが、
それは内部のデータベースに向けられるべきでMySQLというものに投げても意味がないのでした。

一人がMySQLに向き合うことを諦めてしまったため、Goに触れていた側がどうにか触れることに。
しかし思うようにチームワークが取れず、 本番環境のコンフィグをいじっている時にサービスを再起動
といった味方内での足の引っ張り合いが目立ちはじめてしまいました。

そんなチーム1を置き去りに、チーム2はコンフィグの改善やデータベースのインデックスの改善、
チーム3はアプリケーションのコードを改善、インデックスを適切に貼るなどと改善を続け、
開始から八時間ほど経過したタイミングで以下の得点になっていました。

  1. 4000
  2. 6500
  3. 8000

この頃すでにチーム3はジャッジガチャに勤しみ、納得行く点数を迎えたということで8500点ほどでフィニッシュ。
GMはその後リーダーボードの修正をしてくれました。

チーム2は終盤でコンフィグをミスしたりなどありましたが、最後はジャッジガチャを済ませ7000点ほどでフィニッシュ。

チーム1は終盤でも未だSQLのコンフィグと格闘し、データベース内の画像を救出する作戦は潰えていました。
最後の最後でどうにかコンフィグを書いて通せたものの、データベース内の画像が圧倒的なボトルネックとなり、
得点はなんと最序盤で行った意味不明な連続ベンチより点数が落ち4800点でフィニッシュ。

以上が9時間ちょっと(10時間中、途中で買い物に行く休憩がありました)のISUCON in 工房のレポートでした。


感想

(私はチーム1でした)
「SQL――難しいですね」

いつIOが発生するだとか、どのコンフィグを増やせばキャッシュが増えるだとか、
どのようなクエリでどのように処理が走るかとか、そういった分かりそうで理解できていない部分が露骨に出てきました。

それだけでなく、序盤Goを触れている時にDBから画像を抽出さえすればよかったものの、
(常にベンチが回っているなどいろいろな事情で)簡易スクリプトを書こうという案が上がらなかったことも大きな敗因です。

知識、技術だけでなく、得点を上げるための戦略面であったり、どのような構成なのか俯瞰してボトルネックを発見すること、
単純なCPU/Mem/Netだけではなく、様々なモニターツールを活用することなど、私自身に足りていないことがたくさん見えてきました。

ちなみにベンチマークの回数ですが、チーム1は51回、チーム2は24回、チーム3は31回という具合でした。
スコアでダブルスコア近く取られましたが、ベンチ回数でダブルスコア近く取れたので実質同率ではないでしょうか(?)。

参加者にとても好評だったことから、今後予定しているSWK Conferenceでも開催したいと考えています。

総合的な技術を試すだけでなく学ぶきっかけとしても優れたコンテストなので、総合的な技術力向上に繋がると思います。
他にもCTFなどといった競技イベントも検討していますので、そういったイベントに興味ある方はぜひソフトウェア工房にお越しください。

突然主催し始めたGMなど、環境セットアップに協力してくださった方々、工房インフラを整えてくださった方々に感謝です。
面白いコンテストをありがとうございました。

おそらくこのあとほかチームの方々からも感想記事が上がりますので、そちらもぜひご覧ください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください