Go
golang
isucon
isucon8

ISUCON8に参加して予選通過してきました

先日、ISUCONに参加してきました。そして予選通過しました。
参加チームは学生でultra_fast_gopherです。(チーム名はslackのEmojiのultra_fast_parrotから)
MOXという名前で参加しました。
今回でISUCONの参加は2回目です。前回は去年のISUCON7に参加しました。
自分以外のチームメイト二人は、初参加でした。去年はメンバーの都合上、社会人チームとして参加しました。
ところで、Qiitaはじめました。

事前準備

事前には1回ISUCON7の予選問題を解きましたが、そのときは自分は体調不良で参加できず・・・
使うものは事前に監視ツールとしてnetdataを決めていました。
4日前までどこで参加するかも決まっておらず、急いで新宿周辺の貸し会議室を借りました。(チームメイトが予約してくれました)

当日

朝、寝坊し9:30に新宿の貸し会議室待ち合わせだったのですが間に合いそう無く、特急ロマンスカー課金をし無事に9:30くらいに貸し会議室とは名ばかりのマンションの一室へ到着。チームメイトが一人は9:00くらいについており、また排水口が詰まったと言っていたチームメイトも程なくして到着。
まずはPC一式を広げ準備し、ネット環境は貸し会議室にあったポケットWi-Fiをへ接続。しかし、Pingが53msとSSHで作業するには厳しい感じの速度で、自前のポケットWi-Fiを使用。(こちらはPing20msくらいでまぁマシといった速度)

初動

最初にレギュレーションをざっと読み、チームメイトがSSH鍵の登録・Gitへ鍵の登録・ホスト名の変更などをやっていて、私は、netdataを各マシンにインストール。
問題を読んでいる際にチームメイトがNginxではなくh2oであるとの旨のことを言っており、自分はh2oを使ったことがないのでその周りは触れませんでした。
とりあえず何もしない状態でベンチを回したところ、fail。とりあえずなんとか動く状態にし、done。この時のスコアが1,500程度。また、このときに去年とは違いCPUが食い尽くされていることを確認。

11:00〜

次に実装を読みながらボトルネック箇所を探す作業。このところですでに11:00。
mariadbがCPUを食い尽くしていることが確認されたので2台目のサーバーにmariadbだけ切り分け。dbをAppサーバーと別にしたところで、初期化処理でfailするようになり、困惑。チームメイトが原因を特定し、init.shを2台目へ処理するよう修正。
チームメイトがh2oをalpで読めるようにするためにログフォーマットを編集。
お昼になりお腹も減り、頭も少し疲れてきたところで一旦お昼。近くのファミリーマートへ行き、各自適当にお昼ご飯を買い、戻り大会へ参加しながら食べることに。

13:00〜

お昼を食べながら見ているとgetEeventsの中でgetEventがループしなんども呼ばれていることに気づき、そこの修正を開始。また、存在意義がわからないsheetテーブルを撲滅すべく修正を開始。
そこで、チームメイトがreservationテーブルへのリクエストを1回にし、そこでベンチマークを回したところ、スコアが13,000超になり順位も7位へ。
getEventを修正してこんなにもスコアが変わるものなのか・・・

また、何度かベンチを回しているとmariadbが突如「too many connection.」と言ってきたので、Go側からmaxConnectionなどの設定を変更し、mariadbの方もそれに合わせコネクション数を変更。

さらに、ベンチを何度か回してるとランダムでfailに遭遇。どうやら、高速化されたことで整合性が取れずに死んだ模様・・・

15:00〜

この頃、私が修正した座席のランダム予約を昇順にし、Go側でchannelを使った実装にしたものを完成させる。が、バグがいくつかありチームメイトが修正を。これは申し訳ない気持ちだった。
また、ベンチを回したところベンチマーカーは座席予約がランダムではないとエラーを・・・
座席予約ってランダムじゃないとだめだったのかよ・・・と思いつつ、ベンチマーカーでこれを判断するのは大変だろうなぁと。

17:00〜

私の作業していたものと、チームメイトが作業していたものをマージ。このときにgitがconfrictを起こし、急いでマージさせる。マージが完了し、ギリギリのところでベンチを何度か回し、終了。
最後のスコアは13,628へ。
ベストスコアの24,680は何処へ・・・
Screenshot_2018-09-15 ISUCON8 Portal(7).png

感想

今回、ISUCONへ学生チームとして参加し、去年とは違った面白さがありました。
去年はネットワーク周りが主にボトルネックになっていたが、今年は処理周りがボトルネックになっていました。
今年のISUCONでは再起動テストなどがうまくできず本戦や来年以降は再起動テストをしっかりやりたいなぁといった感じです。また、今回は運良く予選通過できたのですが実際はGoのアプリケーションにランダムfailするバグが残っていて、これのバグを潰しきれていなかったのが失格になってしまうのでは・・・?といった感じで怖かったです。
ともあれ、無事予選を通過したことはとても嬉しいです。今回の予選を通過できたのは主にいいチームメンバーと組めたことかと思っています。

後日

今年のISUCONでは大会終了後にサーバーにアクセスできるだけでなく、ベンチマーカーも使える状態にしてもらえました。
GMOさん、ありがとうございます。ConoHa神!!!
ベンチマーカーも回るとのことで、少しアプリケーションやDBをいじってみたのですが、
- reservationsuser_id にIndexを追加
- innoDBのバッファサイズを調整
- query cacheを調整
をやったところ、スコア47,981を叩き出せたので、大会中はもっとスコアを取れたと思います。
Screenshot_2018-09-19 ISUCON8 Portal(1).png

私のISUCONの履歴

  • ISUCON7: 何もわからずに終了
  • ISUCON8: 学生チームとして参加し、予選通過 <- New!!!