品質 負荷試験

ISUCON練習問題private-isuの環境構築でハマったことと、初回ベンチマーク結果

2023年8月27日

  • ISUCONの参考過去問"private-isu"をLocalに環境構築しようとした時にハマったことメモ
    • 夏祭り2023↓のハンズオンでやろうとしたけどハマって時間内に終わらず...

private-isuのリポジトリはこちら

github.com

試したLocalPCのスペック

  • MacBook Pro(13-inch, 2017)
  • OS: macOS Ventura バージョン13.4
  • チップ: Intel
  • メモリ: 8GB
ITエンジニア6年目の山根です。X(Twitter)やってます。自己紹介,お問い合わせはこちらまで!

①macOS:venturaにおけるmakeインストール時のエラー

そういえばmakeコマンドって入れてないなと思って入れようとしたら以下のエラー。

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

xcode-select --installを叩けばOK。

(macOSがVenturaだとあるあるらしい)

macOSアップデート後に”xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools)”が出る場合の対処法 | プログラミング入門ナビ by Proglus(プログラス)

②初期データがLoadできない!(DB作成手順飛ばしてただけ)

GitHub - catatsuy/private-isu: 社内ISUCONここ←を読み飛ばしており、「DBサーバは起動してるけど、DBそのものがない!」状態に。。

当時のお間抜けツイート↓

private-isuのDBっていつcreateされるんだっけ、

dbサーバはdockercomposeで立ち上がったのがわかるのだが…

初期データをloadするところでこけちゃったので、何か手順漏れてそう#isucon_summer_fes#ハンズオン

— 山根正大 (@hiro_cashless) 2023年8月26日

結論、

cd webapp/sql
curl -L -O https://github.com/catatsuy/private-isu/releases/download/img/dump.sql.bz2
bunzip2 dump.sql.bz2

create db文が書かれてるsqlをbz2でLoad,解凍する手順が抜けてただけでした。

一度Docker Volumeが作成されてしまっていたので、一度Volumeを消してから上記コマンドを叩く -> docker-compose up -dで初期データをLoadすることができました。

構築できた!

localhost:80で起動できました。

「とりあえずなんもせずに初回ベンチマーク」結果

スコアが117だったり0だったり。。

{"pass":true,"score":117,"success":321,"fail":13,"messages":["リクエストがタイムアウトしました (GET /favicon.ico)","リクエストがタイムアウトしました (GET /js/timeago.min.js)","リクエストがタイムアウトしました (POST /login)","リクエストがタイムアウトしました (POST /register)"]}
{"pass":true,"score":0,"success":298,"fail":18,"messages":["リクエストがタイムアウトしました (GET /favicon.ico)","リクエストがタイムアウトしました (POST /login)","リクエストがタイムアウトしました (POST /register)"]}

これからどうする?

なんかブレてるなーと思い、問答無用でDocker for Desktopのスペックを上げてみる(意味あるかは謎)

  • メモリ 2GB → 8GB
  • コア数 2CPU →4CPU
{"pass":true,"score":146,"success":324,"fail":12,"messages":["リクエストがタイムアウトしました (GET /@hope)","リクエストがタイムアウトしました (GET /@jordan)","リクエストがタイムアウトしました (POST /login)","リクエストがタイムアウトしました (POST /register)"]}
{"pass":true,"score":0,"success":295,"fail":19,"messages":["リクエストがタイムアウトしました (GET /favicon.ico)","リクエストがタイムアウトしました (GET /js/timeago.min.js)","リクエストがタイムアウトしました (POST /login)","リクエストがタイムアウトしました (POST /register)"]}

ISUCONの初期状態は「あえて性能が微妙になる」様にネタが仕込んであるはずなので、最初はこんなもんなのかな。

(それはそれとしてLocalのPCもっとスペック上げたいな...上げたらマシになるかな...)

初期構築ができたので、今後は以下の様に遊んでいく感じかな。

  • Ruby(初期状態)で何個か思いつく改善入れてみてベンチ回す
    • commentsテーブルのpost_idカラムにIndex貼ってよくなりそうな気がするので初手はそれ
  • Goの記法/ビルドやり方等の習得
    • ちゃんとやるなら静的型付言語で出たいため
    • Java/Kotlinでも参考実装増えてくれ〜〜😭😭😭
  • とりあえずはprivate-isuで遊ぶ(@Local)
  • サーバ借りてきて継続デプロイ環境構築の練習(@オンライン)

小ネタ

ISUCON夏祭り2023ハンズオンで知ったのだが、「スコアが出たらそのスコアを冠したブランチを切ってコミット」なる小技があるらしい。

改善続けていく中で「うごかねぇ!どこいじったんだっけ!」ってなった時に、とりあえずこのブランチの内容をデプロイすれば過去の最高得点地点までは戻れる、そんなリカバリーのためのブランチ。

最後に

取り合えず初期環境はできたので、遊んでいきます!

-品質, 負荷試験