ニクニクドットミー

カッコいいおっさんを目指すエンジニアの厳かなブログ

2021/08/15 ~ 08/21の振り返りとISUCON11の感想を添えて

今週は ICL 手術後の一ヶ月検診があったり ISUCON11 に参戦したりした。ISUCON の話にも少しだけ触れておこうと思う。

仕事

  • 普段仕事でペアプロ(ペア作業)をすることが多いのだけどVS Code の Live Shareを試すなどした
    • 1年前くらいに使ったときは挙動が不安定でちょっと利用するのは難しいなとおもったけど今回はサクサク雨後したし、3人でシェアしても問題なかった
  • オペレーション作業をする時にメトリクスを見ながら「あ、この時間帯は避けておこう」と判断するのだけど、今回もやっててよかったなと改めて思った
    • 特にユーザーに影響がないと思っていた作業も実はサーバーリソースを以外と食っているケースがあるので慎重に
  • スクラムセレモニーがだいぶ慣れてきた感じで設けた時間を大きく超過することがなかった
  • 個人開発部が出来たので雑にChromeエクステンション作ってますとチャットに書いたところChromeエクステンションマスターがいたので1on1をしてみていろいろと話しを聞けた++
    • ホットリロードにweb-extがいいよと教えてもらったので試してみる

プライベート

  • 作りかけてまったく動作しなかったChromeエクステンションが動いた
    • github.com
    • エクステンションとして公開しみようと思う(需要はないだろうけど)
  • ICLの一ヶ月後検診が無事終了
    • まだハログレア現象が気になるけど半年もすればだいぶよくなるとのこと
  • 東急プラザ銀座で食べた牛タン利休の「濃い卵」が人生で一番美味しかった。ほんとうに味が濃くて食べた時に醤油に漬けてたのかと思った。それぐらい濃かった。もちろん牛タンも美味しかった
  • 16時間ファスティングを卒業した。朝を抜くと基礎代謝分のカロリーを下回ることが増えてしまったので朝も食べるようにした。ただ夜は20時ぐらいに済ますようにしている。体調はいい感じ
  • ISUCON11に参戦してきた。後述する

ISUCON11の感想

最後に出場したのがISUCON6 or 7だった記憶で約5年ぶりに出場。
毎回3人で出場して主にインフラ面を担当していたのだけど今回はソロで出場してみた(チーム名はpokke)理由はコロナの影響で直接会うことが難しそうだったのとソロでインフラ以外にも手を出してみようと思ったのが理由。オンラインでつないでやることも出来たと思ったけど、ちょっと大変そうに思えたため。
今回はソロでインフラ以外にアプリにも手を出せたのは良かった。ただ、やっぱソロはきつい。当然ながら担当範囲が広くなるのとアプリの改修に没頭してサーバーのリソース状況の把握など全く出来ずという始末。あとスコアの仕様がちゃんと理解する余裕もなかった。。。
結果はもちろん予選敗退でまた来年参戦したい。実力をシンプルに試されるのが本当に面白い。

twitter.com

事前準備

過去問をやるぞと思っていたけどまったく時間が取れずに前日にisucon10をVagrantで動かしてslowログをみたりalpを試してみた。あとはやることメモを用意しておいた。

isuconでやること
## 以下のツールのインストール
- alp
- pt-query-digest

wget https://github.com/tkuchiki/alp/releases/download/v1.0.7/alp_linux_amd64.zip
sudo apt install unzip
unzip alp_linux_amd64.zip
sudo mv alp_linux_amd64 alp
sudo mv alp /usr/local/bin/alp

wget https://github.com/percona/percona-toolkit/archive/3.0.5-test.tar.gz
tar zxvf 3.0.5-test.tar.gz
./percona-toolkit-3.0.5-test/bin/pt-query-digest --version
sudo mv ./percona-toolkit-3.0.5-test/bin/pt-query-digest /usr/local/bin/pt-query-digest

## mysqlのスロークエリの設定

[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 0


確認
show variables like 'slow%';

## myplofiler

wget https://github.com/KLab/myprofiler/releases/download/0.2/myprofiler.linux_amd64.tar.gz
tar xf myprofiler.linux_amd64.tar.gz
sudo mv myprofiler /usr/local/bin/

## スペック確認

cat /proc/cpuinfo
free -h

## 参考実装をgithubにpush

git init
git add .
git commit -m "fitst commit"

## ベンチマークを実行
初回のアプリケーションでどの程度スコアが出るか確認


## systemdでなにが動いているか
`systemctl list-unit-files --type=service | grep isu`

主にやったこと

  • デプロイ後の再起動スクリプトを用意
  • アプリケーションと各confをgithub管理
  • index追加
  • アプリケーションの改修
  • 再起動試験

以下をup.shとしてアプリケーションのリポジトリを置いた。デプロイはサーバーにログインしてgit pullしてそのあとにこのスクリプトを毎回実行していた。もっと楽ができたはず。。。

#!/bin/bash

function status(){
  systemctl status mysql
  systemctl status nginx
  systemctl status isucondition.go.service
}

function restart() {
  sudo systemctl restart mysql
  sudo systemctl restart nginx
  sudo systemctl restart isucondition.go.service
}

status
restart

pt-query-digestをインストールして時間がかかっているクエリを見てみた。一番時間がかかったクエリのexplanを取ってみたところusing filesortが出たのでindexを張った。ここで勘違いしたのがorder byでindexが効かないと勘違いしてしまった。
さらにindexを張ったけどusing filesortが消えなくてちゃんと調べるとindexのカラムの順番がクエリで指定するカラムの順番が間違っていた。
indexを入れるとことでスコアが2万台くらいに一気に跳ね上がった記憶。discordの感想戦でも同じ結果になったチームが多かった模様。

アプリケーションの改修はあまりできておらず、トランザクションを張る必要がないんじゃ?と思ったところは片っ端から消した。スコアに影響があったかはよくわかってない。あとは画像を返すところにCache-Controlを入れてみた。これも効果は不明。
あとデプロイしたはいいけどgoのbuildをすっかり忘れていて1時間くらい気づかずにいた...

今回用意されたサーバーは3台あったけど2台しか使えてない。途中まで1台だったけどさすがに勿体ないと思ったので1台をDBサーバーにしてアプリケーションからDB接続先ホストを変更(env.sh環境変数の設定をしていた)

17時ごろから再起動試験を開始。ここでミスしたのが、cloneしていたリポジトリ/tmp/に置いていたので再起動後に消えてしまい、シンボリックリンクが全滅してしまった。homeディレクトリにcloneしてシンボリックリンクを張り直してちゃんとベンチマークが取れることを確認した。

運営の追試の結果、スコア25118点で185位で着地。 isucon.net

twitter.com

本戦出場チームのみなさんおめでとうございます。そして運営のみなさんありがとうございました。そしてお昼ごはんやコーヒーの用意をしてくれて支えてくれた妻に感謝。また来年がんばるぞ。

そういえば公式テーマソングが出来てた。ちゃんとかっこよい曲。

www.youtube.com

See you next time:)