くるのプログラミング記録

プログラミングの感想とか解説とか。

isucon12 参加記

タコス、amaneko、くる の3人でチーム「タコタコ」で参加。

  • 1年前

3人でisucon予選出たいなと言いつつ誰も予選登録できず終了。参加が難しい。

  • 今年 6月11日

今年も、3人でisucon予選出たいなと言いつつ誰も予選登録できず終了......かと思われたがタコス君が登録できてた。えらい。僕は寝てました。何もしないまま参加登録完了!
持つべきものは早起きできるエンジニアだね。うんうん。

  • 6月16日

タコス太郎が招待urlとかを貼ってくれる。チームメンバーとして認証するための設定とかがあるらしい。
僕はLINEを無視していた。

  • 6月18日

無視してたら怒られた。タコス君からクビ宣言をくらう。悲しい。

なんとか登録完了。

  • 7月2日

この間も僕はLINEをずっと無視していた。気付いたらタコス君が登録確認用のec2インスタンスを立ててた。
えらい。さすがマネージドサービス。EaaS (engineering as a service) のタコス君ですね。



俺は負の工数を産んでるらしい。泣いた。
モンハンで忙しいから仕方ないね。うんうん。

黒塗りはモラルのない悪口だったので削除......(コンプライアンス!)

  • 7月5日

また解雇宣言くらってた。カスPM。
俺はこの頃はハンターランクだけが全てになっていた。
(古田くんとは僕のこと)

  • 7月16日 (1週間前)

さすがに練習をすることに。(今更)

過去問をやる。

言語なににするか〜、ってとりあえず困る。

くる: java, kotlin, php
タコス: java, python
amaneko: go, typescript


三人の最大公約数がなさそうだったので、goでやることに。

go何もわからん。pprofというやつがあるらしい。dynatraceとかnewrelic的なものととりあえず認識。便利そう。
amanekoが詳しい。タコスがハンズオン。俺は見るだけ。動いてるっぽい。良いね。


sshとかその辺確認し直して終わり。


過去問は下記のリポジトリ参考にしていました。感謝です。
github.com

  • 7月23日 (当日)

9時半。起きる。参加成功。

9時40分ごろ。とりあえずgithubで空リポジトリを作る。
3人ともコミットできるかのパーミッションを確認。



10時開始。
タコス:とりあえず配られたテンプレートのcloud formationでインスタンスを作成。
sshを3人で確認。

くる:goのソースをgit管理。master push!!


ドキュメント読む。amanekoくん読むのが早い。一緒に読み始めたはずなのに色々ディスコにリンク貼ってくれる。


くる:ciあったほうがいいかなあと思い、goのbuildだけでも確認するactionを組む
タコス:pprof導入


タコス:とりあえずappとdbのインスタンスを分離。失敗。
amaneko:タコスの間違いを見つけ修正PRを出す。神。スーパーエンジニア。

app側の疎通先の設定は変えたものの、ec2 -> mysqlの疎通がうまくできず最初困る。ネットワークを疑うがセキュリティグループはあってると俺が連呼。
結局mysql側でローカルからのみ受け付ける設定が入ってたから、ってだけだった。初歩的。マネージドに慣れすぎてこういうの爆速で倒せないね、うんうん。

mysqlログインするスクリプトとか、goを再起動するスクリプトとかを amanekoくんがいつの間にか作ってた。すごい。スーパーエンジニア。


なんか大した改善もないまま、準備だけやって12時近くになったので昼になる。
パスタを作る。美味しいパスタ作った俺。

3人がご飯食べてる間は、休憩時間に。
自分は飯食べながら暇だったので張れそうなindexを貼るPRをひたすら作っていく。


13:00ぐらい

実装を3人で読んで方針決め。
ERを読んでリレーションの確認。schemaspy使えばよかった感。

この辺から俺が人力CIになる。
PRがされたら、俺が git pullして appを再起動。ベンチマーク投げる。までをひたすらやってた。
ITドカタにも仕事を与えてくれる現場に感謝。さしみたんぽぽにもやりがいを。


インフラを露骨に変えて頑張るよりは、ドメイン知識を掴んでアプリケーション改善で頑張る方向に。


まず目をつけたのは、view_historyを使ったロジックがあるがそこがかなり無駄そう。
参照したユーザの情報を全部積む履歴のテーブルがあるが、その参照ロジックは各ユーザ最初のアクセスの時間だけが必要で、他は不要っぽい感じだった。

なので最初にinsertしたデータだけ見れば良いので、修正。insert -> insert ignore的な修正を。

ここで、pkがサロゲートになってたので、pkを変更するためにddlも修正。
ここで初めて、mysqlの初期データが存在することに気づく。これどうしようかなーと思いつつ、この対応はくる太郎の方で適当にやっておいてと言われたので、勝手に僕がsqlで移行。

-- rename
RENAME TABLE visit_history TO tmp_visit_history 

-- createすること

INSERT IGNORE INTO visit_history (competition_id, player_id, created_at, updated_at) 
SELECT competition_id, player_id, created_at, updated_at FROM tmp_visit_history ORDER BY created_at


select count(*) from (select distinct competition_id, player_id from tmp_visit_history) as tmp;


結構改善した感があったが+1000点程度。






次に僕がcompetitionテーブルのindex追加を行う。

CREATE TABLE competition (
  id VARCHAR(255) NOT NULL PRIMARY KEY,
  tenant_id BIGINT NOT NULL,
  title TEXT NOT NULL,
  finished_at BIGINT NULL,
  created_at BIGINT NOT NULL,
  updated_at BIGINT NOT NULL,
  INDEX `tenant_id_idx` (`tenant_id`)
);

アプリが落ちる。ベンチが0点になる。
タコスくんに「あー障害報告ですねこれは。」って無限に言われる。カス。

ここで、mysqlじゃなくてsqliteということに気づく。そして文法がおかしいことに気づく。というかsqlite?え???ってなる。
db2個あることに初めて気づいたよね。失態。3人とも気づかないまま結構時間経ってた。やべー。

sqliteの文法を、ぐぐりながら適当にマージして動作確認。ベンチ戻ったが500点ぐらいしか増えなかった。



sql周りを俺が一人で修正してる間に、amaneko、タコスは二人でずっと調査とかしてた。
俺はもうpprofよくわからん、タコス君が頑張っとる。

そしてamaneko君がロック周りを治す。謎のPRが出てくる。
俺は聞いてなかったのでよくわからんけどタコス君がマージしてた。

それがすごい改善になったらしく + 10000点。amaneko神。スーパーエンジニア。



競技中一番盛り上がったね。ここ。

この改善以外でも、goのsyntaxわからんとこ出てくるたびに聞いてた。



この時点で15:00とか16:00ぐらい?残り時間そこまでなくなってきてた。




全体でユニークなpkを発行しているdispenseIDで、謎の処理があったので、amanekoくんがそこをuuidに変えたりしてみたが、点数が変わらず。残念。。


次にcsv入稿周りに目をつけてた。
とりあえず、sql発行回数がやばそうだったので僕がバルクインサートに変える。+500点ぐらい。


rownum周りの参照系が無駄なロジックが多そうだった。
ソースを読むと、csv入稿時にレコードがcsvの何行目にあったかのrownumを保存しているのだが、pkがかぶったときはrownumが大きい方の値しか使っていなかった。
insert時に rownumが大きい方だけが生き残るように、mapでデータを作るように僕が修正。
ただここはベンチがあまり上がらず。。。残念。。



この辺で17:30とかになってたので、機械的にindex張れるところだけ僕が修正して。終わり。

14000点ぐらいでfinish。最後20分ぐらいは壊れるのを恐れてもうやめた。


全体的に僕とamaneko君で実装してた。タコスは指示出すだけ。
手を動かさんPMはカス!!!




PRをこまめに作って、常に正常系の振る舞いを保つって意識が良かったね。業務仕草。
revertもめちゃめちゃやった。動作戻ったか不安でベンチ回しまくり。






初参加で52/698 位はまあまあ良かったかな?と話していた。来年もやりたいね。もう少し場慣れして本戦行ける回を引きたい。

点数の推移はこんな感じ。





全体的に、改善がわからんというよりは時間との勝負だった。意外。もっと何もやることなくなる感じかと思っていた。
3年ぐらいエンジニアリングの真似事してきた知識が少しは発揮できてる感じはした。嬉しいね。



エンジニアリング、楽しいね。うんうん。仕事ではできないようなダイナミックでドラスティックでスピーディな開発をできたのが楽しかった。
最近こういう開発できてないなあ。要件定義と設計とコードレビューばっかり。なんとかしないとね。





isuconマジでマジで楽しかったです。運営・スポンサーの皆様ありがとうございました!!!!

そういえば運営が弊社だったのは結構ギリギリで気づいてびっくりした。一参加者になっちゃったけど、来年も主催なら何か投げ銭程度でも手伝えることしたいね。