2018年8月29日

イベント

OJTでY!SUCONを行い優勝した話

  • このエントリーをはてなブックマークに追加

はじめに

こんにちは。SWATに配属されて「新卒として見ない」と言われ若干ビビっていた齋藤です。これはSWATに配属された新卒がY!SUCON課題を解いていき、優勝した記録です。

Y!SUCONの始まり

配属された初日、僕ら新卒6人を待ち受けていたのはOJTではなく通常の業務とY!SUCONの課題でした。キックオフ資料の中で急に出てきてびっくりしました。

Y!SUCON概要

内容自体は過去に開催された内容と全く同じものでした。それに加えて自分たちは時間的な制約があり、

  • 約2週間後に発表会を行う
  • 1日に作業できるのは2時間まで

このようなものがありました。

前半戦

自分たちはまず用意されている言語の確認とどのようなアプリなのかを調査し始めました。言語についてはNode.js, Java, Go, PHP, Rubyが用意されており、今後の業務を考えNode.jsで実装しようと決め、作戦会議を行いました。

  • applicationについて
    • まずどんなアプリなのか、実際に触ってみつつ初回ベンチ測る
    • マイクロサービスが2つ立ち上がっているので削除、一つのアプリに
    • htmlifyを事前にやり、データベースに入れる
    • passwordの認証方法がshaだがrot1で判別するように
    • テンプレートエンジンを捨てる
  • sqlについて
    • * で持ってこずに必要最低限のものだけ持ってくる
    • where in または exists使う
    • limitつかう
  • データベースについて
    • 正規化
    • データベースの中身書き換える、具体的にはツイート削除、friends軽量化
    • index貼る
    • オンメモリにする
    • そもそもやめるかを考える
  • nginxについて
    • alpで計測するのでlogを適切に
    • favicon, css, jsなどの静的ファイルを配信
    • gzip使う
    • unix domain socket使う
    • try_file使う

競技をやっている最中にも気付いたところがあり、適度に方向を修正しつつ取り組んでいました。

*僕たちのチーム名は「アルファ米」、実装が思うように行かず点数も伸びなかった*この時点ではruBチームがトップをとっていた

中盤戦その1

自分たちのチームのスコアが思うように伸びず、そもそもNode.jsにお互い明るくない状態だったため、勝ちたい一心で言語をGoに変更しました。Node.js → Goに変更しただけで一気にスコアが2000弱まで伸びましたがまたruBチームに追い越されてしまいました。

*かなしい。

さらにここでteamcもぐんぐんスコアを伸ばしていき、圧倒的な差をつけられてしまいました。

*とてもかなしい。

中盤戦その2

ここでいったん、方向性を見直そうと作戦会議をまた行いました。会議の結果、自分たちは「何をしてもいい」と言われていたため、「なんでもやって圧倒的に勝つ」という方針になりました。

  • 全般に関して
    • 削れるところは徹底的に削る
    • ログやベンチマーカーのエラー文からメタ読みする
  • データベース
    • 完全削除
  • app
    • エラー文から必要なところを残し、不必要なところを削除する

このように割り切った結果、スコアが爆上がりしました。

*うれしい

後半戦

前半戦のやり残したことを実装しつつ、Nginxのログやfmt.Printデバッグ、ベンチマーカーのエラー文を読み、ベンチマーカーの挙動を調べていきました。

*エラーがいっぱい

ここで自分たちのスコアが15万超えし、残りの時間はエラーをつぶして減点されているのをプラスにする作業が続きました。最終的にはスコアが217,917点まで行き、ここで競技が終了になりました。

*すごいうれしい

結果発表

アルファ米

  • 217,917点

ruB

  • 50,230点

teamc

  • 43,297点

自分たちのチームが優勝しました!ちなみに過去に開催されたY!SUCONの優勝チームは210,158点だったらしく、それも抜いて優勝しました!!

一般的に抑えるべきと思ったポイント

今回はメタ読みをしまくり優勝しましたが、最初に掲げていた方針は的を得ているなと感じました。特にデータベース周りの正規化だったり、Indexを貼ったりというものやアプリ内のボトルネックを見つけ出して修正する、というのはいい経験になったと思います。それに加え、nginxの設定だったり、CentOS7の設定だったりも重要だなと感じました。

感想

もともと自分はISUCONに興味があり、他の過去問などもやったりしていましたが、社内でこういった取り組みがあるのはすごくいいなと思いました。今回はnginxやCentOS自体のチューニングがあまりできていないと感じていたためそちらの方の知識を今後つけていきたいなと思いました。また、次回開催されるようであれば最近はやり(?)の複数台構成のウェブアプリを題材にやってみたいです。

後日談

優勝のお祝いとしてお寿司を頂きました!すごく美味しかったです!!!

Yahoo! JAPANでは情報技術を駆使して人々や社会の課題を一緒に解決していける方を募集しています。詳しくは採用情報をご覧ください。

  • このエントリーをはてなブックマークに追加