ISUCON8 予選に参加して再起動試験に落ちました

Infrastructure Programming

おはようございます。名取さなにハマっている kyontan です。

最終スコア

チーム「hhkb」で同期3人 (自分 @kyontan, @hogashi, @h-otter) 2回目の参加で2日目で Go 実装でした。学生枠突破ならずでした、悔しい。というよりは 55,982点で全体4位の点数で落ちました。ちなみに hhkb は h-otter, hogashi, kyontan, :boom: ???? の略です。
スキルセット的には、 @h-otter がインフラ(ミドルウェア含)なんでもできる+Goの経験が一番あるマンで、 @hogashi がアプリケーションなんでもできるマンで、 @kyontan はアプリとインフラとDBを一通り見られるマンみたいな感じでした。

今回は真面目に本戦に行きたかったので前々日に ConoHa で ISUCON7 の予選を解き直して練習しました。具体的には ConoHa の練習用イメージを使って 1GBプラン x3台で予選環境を再現しました。結果、10時間程度で 5,204点から509,190点まで持っていけることが分かり、計測と試行の反復を効率的に行えば ISUCON の予選は突破できるという確信を深めていました。
また、前回は最後の最後でベンチマーカを走行させた結果点数が下がって落ちたので、前回の直後に「泣きの1回はやらない」というスローガンを掲げ、1年越しでそれを達成しました。

ベンチマークの初回走行の結果しばらく1位になった

事前に準備したのは Prometheus のサーバ (@h-otter がいい感じにやってくれた)と、やること/できることチェックリストぐらいでしょうか。だいたい大会では開始した瞬間にテンパってそのまま撃沈するのが常なので、思考停止状態でもコピペで動くようなコード片とかを用意しておくと便利ですね。あとは思考が無になったときに確認するべき事項とかを作っておくと良いのではないでしょうか? 頻繁に無になって帰りたくなりました。メンタルは大事。

例えば下のような感じです。

当日は3人がローカルで開発し、本番環境のVMへバイナリを転送して検証する、という進め方でやっていました。Go はクロスプラットフォームでのビルドがしやすいのが便利ですね。

具体的にやったことを羅列します。というか @h-otter が書いていたのを未承諾引用します。順番は適当

  • SELECT * する系のクエリを必要な列しか取らないようにした
  • /api/usersuser_idreservations を全部とってきて、アプリ側で処理してやったらめっちゃ速くなった
    • ここでベンチマーカが重いと言ってくるエンドポイントが /users/:id から /api/events/:id/actions/reserve になった
  • getEventgetEventWithoutDetail と分けた
  • getEventgetEvents を2クエリに
  • sheets へのクエリを消す
    • 効果があったのかは良くわからない
  • MariaDB のチューニング
  • Prometheus と Grafana で可視化
  • ログインのクエリを1つに
  • パスワードを平文で突っ込むようにした
  • DB にインデックス張った (けどあまり良い結果がでなくてもんにょりした)
    • 最初に mysql コマンドでインデックス張ったけど結果が全く変わらなくて、なぜ? と思ったら毎回 /initialize でテーブルを作り直していることに気がついた。
  • IN句を使いたかったので DBにアクセスするライブラリを sqlx に切り替えた
  • トランザクションの開始がおかしいところがあったので直したり デッドロック時にエラーを返さずリトライするようにした

最後は予約時のシート決定を高速化するコードが安定化しなくて入らなかったり、Redisでいい感じにやろうぜみたいなことを思うだけ思ってやらなかったりしました。多分ここができると数万点上がったはず。

あとはスコアに関係ないけど作業便利になる系として、 エラーログでソースコードの行番号を吐くようにしたり、 Makefile 弄って1コマンドでデプロイできるようにしました。
開発は3台のサーバでバラバラにやっていましたがDBは1台だけを参照するようにしました。これはDBのチューニングとかがあって、1台でやった変更を他に反映したりするのが面倒くさかったので。こうすると、やりたい人間が適当にベンチマーク対象のサーバを変更して実行してやればいいので楽でした。

ソースコードは GitHub で管理し、いい感じにやりました。コミットログは下の通りです。

数字がタグに付いていることがありますが、これはいいスコアが出た時にバイナリごとコミットしてタグつけておこうぜ、みたいな感じにした結果でした。

今回の僕の活躍はよく分からなくて、いい感じデバッグ担当だった気がします。PRを見るなりとりあえずマージしてベンチマーカを落としたりバグ探しをしていたりしました。とにかく @h-otter がぶち壊しつつ @hogashi がいい感じに安定化するコードを書いてくれてよかった感がある。

Webサーバはh2oで十分高速だし、画像のトラフィック詰まりもないしで、とにかくアプリケーションコードの改善に注力した/するしかなかった8時間でした。

最終的に残り30分でベンチマーカを叩いたところ3万点前後のスコアが5万点に若干跳ねてそこで打ち止め。一度再起動をしてブラウザからアクセスできることを確認し天命を待ったところ、無事再起動試験で落ち失格となりました。天命……

(追記: スコアが跳ねたのは、最後に実行先サーバを変えた時に インデックスを張る処理を init.sh に書いたサーバで実行したからかもしれないことを思い出した。)

なぜ失格になったのかは分かっていなくて、おそらく /admin/api/reports/events/:id/sales の処理が遅くて不整合が起きて落ちたのかなあなどと思っていますが、2回連続で落ちるのは運が悪かったなと……

なんやかんやでやることがなくならない8時間で、やることが見つからない8時間よりは良かったのではないかと思います。

イキっているなどと言われてもこれは事実だと信じていて、典型的な N+1 を潰すなどすれば予選は通過できるはずなことは分かりましたね。くぅ〜〜

来年はちゃんと本選に行けたらいいですね。頑張りましょう。

そして、参加会場を提供していただいた mixi 様、惜敗の悔しさを教えてくれる最高のコンテストを運営をしていただいたISUCONの運営の皆様、お疲れ様でした、ありがとうございました!

以下は画像です

リクルートのインターンに参加しました

雑記

こんにちは、kyontanです。最高のインターンに行ってきました。

.+のインターンに(参加(し(まし)?た)|行った)シリーズも気が付いたら3本目です。タイトルに統一感がない。

インターンの正式名称は 「WINTER INTERNSHIP 2018 -ENGINEER-」です。

ちなみに過去のエンジニアインターン参加記事は以下です。

多分この記事を参照する人の7割ぐらいはそもそもこのインターン (業務委託契約なので実際にはインターンではない) の概要に興味があると思うんですけど、探すと若干出てくるので以下の偉大なる先達の記事をご参照ください。

Recruit Summer Internshipに参加しました. – 未来永劫
http://shopetan.hatenablog.com/entry/2016/10/13/133031

cormoran’s note – Recruit Winter Internship 2017 参加記
https://blog.cormoran-web.com/blog/2017/03/rhd-winter-internship-2017/

DeNAのサマーインターンシップに参加してきました – たいむかぷせる2
http://studio-graph.hateblo.jp/entry/2017/09/16/211335
> リクルートホールディングスのインターンに参加していたので,それはまた書きます。

リクルートのインターンは飯が凄いみたいな印象だけがあって、そういう記事が他にもあったと思うんだけどググっても引っかからなかった。
ぜひご連絡ください。ちなみに飯は凄かった。

例のごとくNDAでほとんど書けないのでそれ以外のことを少しだけ書きます。

read more »

2018年3月あたりの今日このごろ

雑記

こんばんは。

まさか2018年最初の記事が確定申告の記事になるとは思いもしませんでしたが、なんか生きてます。

最近は人生の楽しみを増やすみたいなことを考えていて、幸福とは……みたいな抽象的な問題を具体的に解きたい。
これは就職活動をしていて「将来何がやりたいの?」とか聞かれるからというのももちろんありますが、大学が春休みになり、インターンに行ったりすると環境が変わったり生活が変わるわけで、そうなると考える対象や思考の対象もがらっと変わり、その時に何を幸せに思ってるんだろうなあ、みたいな感じのことをふと思ったからです。

とりあえず諸事の進捗状況について

read more »

主に学生やアルバイト向けの確定申告一問一答

お役立ち情報

こんばんは。確定申告は終わりましたか?

とりあえずこの記事のヘッダにでも書いておきたい情報なんですが、「103万行ってないのに所得税取られたけど確定申告の期間過ぎたからいいやって思ってる人はまだ間に合うからやってないならやってみてくれ!!」です。

一介の学生であったはずなのですが、掛け持ちをしていること、そして業務委託契約の名ばかりインターンシップの報酬により年末調整を断られ、泣く泣く確定申告をすることになった kyontan です。

そんな確定申告初心者な自分向けの情報をまとめました。おそらく、似たような境遇の学生の方や、その他の103万円という数字に震える方が気になるであろう情報になっているかと思います。

(正しい情報になるよう努めてはいますが、自分自身、専門家ではないため誤った情報を含んでいる可能性があります。間違いがありましたら、ご指摘いただけますと幸いです。)

記事中の税率や税額のソースはできるかぎり示していますが、税制は毎年何らかが変わっています。この記事の内容は記事の更新日時点での情報とお考えください。
(ちなみに150万になるとか色々言われてますがあれは配偶者控除の話で扶養者は関係ないと思っています。)

また、個人事業主として開業届を出している場合については今回の記事ではスコープ外としています。業務委託契約の収入等と書いた場合、雑収入としての業務委託による報酬とお考えください。

以下、一問一答形式です。

2018-04-09追記: 2017/3/31 の国税庁サイトのリニューアルに伴いURLを修正しました。

read more »

2017年まとめ

雑記

こんばんは。この記事は生放送ではありません。

2017年もコミケで終わります。多分2010年ぐらいからコミケで終わっている気がします。
気になったのでコミケ遍歴を†封印の書†から過去を掘り返してみました。
初参加は忘れもしない2010年の冬コミ、C79でした。この時は1日目のみの参加だったようで、アニプレックスに並んで俺妹の桐乃セットを買ったのを覚えています。今もたまにTシャツ着てますね。

その次がなかなか記憶になくて、漁った所どうやら2012年の冬コミ(C83)らしい。夏コミとか行ってそうだったんですけど行ってなかったんですね。
そこからは毎回行っていて、C84に一度始発で行って轟沈してからは二度と始発では行かないぞと誓っています。

そこからは毎回ほぼ3日間参加していて、今回のC93で11回目の参加になるようです。

C90ではコミケにサークル参加したこともありますが、毎度スペースや誘導の変化を見ていると時代を感じたり感じなかったりします。
最初の頃は企業は西34だけでしたが、C90の前後では企業が2日間だけになり、3日目は西34がサークルになったりしました。そのときに自分のサークルが西34だったからです。

コミケは複数人で行くときのコミュニケーションが難しいなとしばしば思います。ファンネルとか言うらしいですね。僕はそういう規模で参加したことはないです。欲しいものは欲しいですが……
どうでもいいことを書くと、東1-3は外周が”A”で島が”B”~”サ”, 東4-6は外周が”シ”で島が”ス”~”レ”、なんか多分前々回ぐらいからある東7は外周が”あ”で島が”い”~”の”, 東8は壁が”も”で島が”ま”~”め”です。西34はなんかアルファベットでした。難しい。特に東78のひらがなは難しくて、音声コミュニケーションを破壊しに来ます。そもそも”シ”と”C”とか難しいんですが。それを言うと西もアルファベットで破壊しているんですが、西とか東とかをプレフィックスで言うので破滅しないことが多いです。
とにかく良いツールで解決していきたいがSlackはコネクションが貼れないことがしばしばあります。僕はこの3日間は大半がメールでした。偉大なそりゅーしょん。

さてどうでもいいことを書いていたら23:55らしく、爆速で統括をします。

今年の変化点は3月にシリコンバレーに行ったことで、とにかくそこで思考が変わって面白いなと思ったり、人間重視になりました。
あとは12月に就活の真似っ子をして破滅しました。もう何も信じたくないという気持ちがあります。

全然統括できていないですね、来年も色々動きがあると思うのでやっていきましょう。

皆様1年間お世話になりました。来年もどうかよろしくお願いいたします。

 

これは2017年最後のツイートです

http://twitter.com/sukukyon/status/947482473742528515