Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ISUCON入門 その2

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →
Avatar for てとらぽ てとらぽ
September 20, 2024
63

ISUCON入門 その2

Avatar for てとらぽ

てとらぽ

September 20, 2024

Transcript

  1. 目次 1. 初期状態(約650点) 2. commentテーブルにインデックスを追加する(約 7000点) 3. unicorn workerプロセスを4にする(約15,000点) 4.

    静的ファイルをnginxで配信する(約17,000点) 5. アップロード画像を静的ファイル化する(約 22,000点) 6. GET / を解析する 7. postとuserをJOINして必要な行数だけ取得する(約 90,000点) 8. ベンチマーカーが使用するファイルディスクリプタ上限を増加させる 9. プリペア度ステートメントを改善する(約 110,000点) 10. commentテーブルにインデックスを追加する(約 115,000点) 11. postからのN+1クエリ結果をキャッシュする(約 180,000点) 12. 適切なインデックスが使えないクエリを解決する(約 200,000点) 13. 外部コマンドの呼び出しをやめる(約 240,000点) 14. MySQLの設定を調整する(約 255,000点) 15. memcachedへのN+1を解消する(約300,000点) 16. RubyのYJITを有効にする(約 320,000点)
  2. 目次 1. 初期状態(約 650点) 2. commentテーブルにインデックスを追加する(約 7000点) 3. unicorn workerプロセスを4にする(約15,000点)

    4. 静的ファイルをnginxで配信する(約17,000点) 5. アップロード画像を静的ファイル化する(約 22,000点) 6. GET / を解析する 7. postとuserをJOINして必要な行数だけ取得する(約 90,000点) 8. ベンチマーカーが使用するファイルディスクリプタ上限を増加させる 9. プリペア度ステートメントを改善する(約 110,000点) 10. commentテーブルにインデックスを追加する(約 115,000点) 11. postからのN+1クエリ結果をキャッシュする(約 180,000点) 12. 適切なインデックスが使えないクエリを解決する(約 200,000点) 13. 外部コマンドの呼び出しをやめる(約 240,000点) 14. MySQLの設定を調整する(約 255,000点) 15. memcachedへのN+1を解消する(約300,000点) 16. RubyのYJITを有効にする(約 320,000点)
  3. 目次 1. 初期状態(約650点) 2. commentテーブルにインデックスを追加する(約 7000点) 3. unicorn workerプロセスを4にする(約15,000点) 4.

    静的ファイルをnginxで配信する(約17,000点) 5. アップロード画像を静的ファイル化する(約 22,000点) 6. GET / を解析する 7. postとuserをJOINして必要な行数だけ取得する(約 90,000点) 8. ベンチマーカーが使用するファイルディスクリプタ上限を増加させる 9. プリペア度ステートメントを改善する(約 110,000点) 10. commentテーブルにインデックスを追加する(約 115,000点) 11. postからのN+1クエリ結果をキャッシュする(約 180,000点) 12. 適切なインデックスが使えないクエリを解決する(約 200,000点) 13. 外部コマンドの呼び出しをやめる(約 240,000点) 14. MySQLの設定を調整する(約 255,000点) 15. memcachedへのN+1を解消する(約300,000点) 16. RubyのYJITを有効にする(約 320,000点)
  4. 2. commentテーブルにインデックスを追加する • 一番重くなっているクエリの実行計画を見てみる ➢ 参照先のcommentテーブルにインデックスがない ➢ このクエリ1回のために99666行探すつもりでいる mysql> explain

    SELECT * FROM `comments`    WHERE `post_id` = 9998 ORDER BY `created_at` DESC LIMIT 3; | id | table   | key | rows | —---------------------------------------- | 1 | comments | NULL | 99666|
  5. 2. commentテーブルにインデックスを追加する • commentテーブルにインデックスを貼る mysql> alter table comments add index

    index_post_id (post_id); Query OK, 0 rows affected (0.60 sec) Records: 0 Duplicates: 0 Warnings: 0
  6. 2. commentテーブルにインデックスを追加する • 改めてクエリの実行計画を見てみる ➢ 参照先のcommentテーブルにインデックスが貼られている ➢ 読み込む行数が99666行→4行になった mysql> explain

    SELECT * FROM `comments`    WHERE `post_id` = 9998 ORDER BY `created_at` DESC LIMIT 3; // インデックス貼る前 | id | table   | key | rows | —---------------------------------------- | 1 | comments | NULL | 99666| // インデックス貼った後 | id | table | key | rows | —-------------------------------------------------- | 1 | comments | index_post_id | 4 |
  7. 目次 1. 初期状態(約650点) 2. commentテーブルにインデックスを追加する(約 7000点) 3. unicorn workerプロセスを 4にする(約

    15,000点) 4. 静的ファイルをnginxで配信する(約17,000点) 5. アップロード画像を静的ファイル化する(約 22,000点) 6. GET / を解析する 7. postとuserをJOINして必要な行数だけ取得する(約 90,000点) 8. ベンチマーカーが使用するファイルディスクリプタ上限を増加させる 9. プリペア度ステートメントを改善する(約 110,000点) 10. commentテーブルにインデックスを追加する(約 115,000点) 11. postからのN+1クエリ結果をキャッシュする(約 180,000点) 12. 適切なインデックスが使えないクエリを解決する(約 200,000点) 13. 外部コマンドの呼び出しをやめる(約 240,000点) 14. MySQLの設定を調整する(約 255,000点) 15. memcachedへのN+1を解消する(約300,000点) 16. RubyのYJITを有効にする(約 320,000点)
  8. 3. unicorn workerプロセスを4にする • リクエストの並列度を変えながらテストしてみる ➢ ベンチマーカーからだと並列度変えられないから abコマンドで個別テストする $ ab

    -c 1 (1並列実行中) $ ab -c 2 (2並列実行中) ▪CPU使用率の推移 ubuntu@bench:~$ ab -c 1 -t 3 http://13.230.109.251/ Concurrency Level: 1 //同時にリクエストする処理数 Complete requests: 175 Requests per second: 17.45 [#/sec] (mean) //1秒あたりの処理数 Time per request: 57.317 [ms] (mean) //1処理あたりにかかる秒数 ubuntu@bench:~$ ab -c 2 -t 3 http://13.230.109.251/ Concurrency Level: 2 Requests per second: 17.93 [#/sec] (mean) Time per request: 111.567 [ms] (mean) ▪負荷テストの結果
  9. 3. unicorn workerプロセスを4にする • 並列度を上げて分かったこと ◦ 処理できる数は変わらない ◦ 処理にかかる時間が増える ◦

    CPU使用率は変わらない( 50%あたりを維持) ↓ CPU2コアの内、1コアしか稼働していない
  10. 3. unicorn workerプロセスを4にする • Iscogram本体のサービスステータスを見る ➢ master1つ、worker1つになっている ※worker数はCPUコア数の数倍にするのが一般的 isucon@main:~$ systemctl

    status isu-ruby.service • isu-ruby.service - isu-ruby Loaded: loaded (/etc/systemd/system/isu-ruby.service; enabled; preset: > Active: active (running) since Fri 2024-09-06 12:03:31 JST; 2h 10min ago Main PID: 558 (ruby) Tasks: 4 (limit: 4562) Memory: 82.3M (peak: 82.8M) CPU: 57.773s CGroup: /system.slice/isu-ruby.service tq558 "unicorn master -c unicorn_config.rb" //masterプロセス mq965 "unicorn worker[0] -c unicorn_config.rb" //workerプロセス isucon@main:~$
  11. 3. unicorn workerプロセスを4にする • unicorn workerプロセスを4にする ▪書き換え前 isucon@main:~/private_isu/webapp/ruby$ cat unicorn_config.rb

    worker_processes 1 //workerプロセスの数 preload_app true listen "0.0.0.0:8080" ▪書き換え後 isucon@main:~/private_isu/webapp/ruby$ cat unicorn_config.rb worker_processes 4 preload_app true listen "0.0.0.0:8080"
  12. 3. unicorn workerプロセスを4にする • 改めて、Iscogram本体のサービスステータスを見る ➢ master1つ、worker4つになっている isucon@main:~$ sudo systemctl

    status isu-ruby.service • isu-ruby.service - isu-ruby Loaded: loaded (/etc/systemd/system/isu-ruby.service; enabled; preset: > Active: active (running) since Fri 2024-09-06 14:38:22 JST; 8s ago Main PID: 6031 (ruby) Tasks: 10 (limit: 4562) Memory: 41.9M (peak: 42.1M) CPU: 326ms CGroup: /system.slice/isu-ruby.service tq6031 "unicorn master -c unicorn_config.rb" //masterプロセス tq6037 "unicorn worker[0] -c unicorn_config.rb" //workerプロセス tq6040 "unicorn worker[1] -c unicorn_config.rb" //workerプロセス2個目 tq6043 "unicorn worker[2] -c unicorn_config.rb" //workerプロセス3個目 mq6046 "unicorn worker[3] -c unicorn_config.rb" //workerプロセス4個目 isucon@main:~$
  13. 3. unicorn workerプロセスを4にする • 改めて、リクエストの並列度を変えながらテストしてみる ▪CPU使用率の推移 isucon@bench:~$ ab -c 1

    -t 3 http://13.230.109.251/ Concurrency Level: 1 Requests per second: 17.32 [#/sec] (mean) Time per request: 57.740 [ms] (mean) isucon@bench:~$ ab -c 2 -t 3 http://13.230.109.251/ Concurrency Level: 2 Requests per second: 19.25 [#/sec] (mean) Time per request: 103.887 [ms] (mean) ▪負荷テストの結果 →並列実行した際に、秒間処理数が向上するようになった $ ab -c 1 (1並列実行中) $ ab -c 2 (2並列実行中)
  14. 3. unicorn workerプロセスを4にする • ベンチマークの結果 ➢ スコア:9060点→14057点 isucon@bench:~$ /home/isucon/private_isu.git/benchmarker/bin/benchmarker -u

    /home/isucon/private_isu.git/benchmarker/userdata -t http://13.230.109.251 { "pass":true, "score":14057, "success":12752, "fail":0,"messages":[] } isucon@bench:~$
  15. 目次 1. 初期状態(約650点) 2. commentテーブルにインデックスを追加する(約 7000点) 3. unicorn workerプロセスを4にする(約15,000点) 4.

    静的ファイルを nginxで配信する(約 17,000点) 5. アップロード画像を静的ファイル化する(約 22,000点) 6. GET / を解析する 7. postとuserをJOINして必要な行数だけ取得する(約 90,000点) 8. ベンチマーカーが使用するファイルディスクリプタ上限を増加させる 9. プリペア度ステートメントを改善する(約 110,000点) 10. commentテーブルにインデックスを追加する(約 115,000点) 11. postからのN+1クエリ結果をキャッシュする(約 180,000点) 12. 適切なインデックスが使えないクエリを解決する(約 200,000点) 13. 外部コマンドの呼び出しをやめる(約 240,000点) 14. MySQLの設定を調整する(約 255,000点) 15. memcachedへのN+1を解消する(約300,000点) 16. RubyのYJITを有効にする(約 320,000点)
  16. 4. 静的ファイルをnginxで配信する • alpを使ってnginxのaccess.logを解析してみる isucon@main:/var/log/nginx$ alp json --sort sum -r

    -m "/posts/[0-9]+,/@\w+,/image/\d+" -o count,method,uri,min,avg,max,sum < /var/log/nginx/access.log +-------+--------+--------------------------------------+-------+-------+-------+---------+ | COUNT | METHOD | URI | MIN | AVG | MAX | SUM | +-------+--------+--------------------------------------+-------+-------+-------+---------+ | 7174 | GET | /image/\d+ | 0.001 | 0.035 | 0.250 | 252.023 | | 646 | GET | / | 0.057 | 0.258 | 0.678 | 166.534 | | 111 | GET | /posts | 0.082 | 0.283 | 0.433 | 31.370 | | 481 | POST | /login | 0.001 | 0.061 | 0.268 | 29.113 | | 643 | GET | /favicon.ico | 0.001 | 0.039 | 0.485 | 25.270 | | 583 | GET | /posts/[0-9]+ | 0.003 | 0.042 | 0.250 | 24.447 | | 643 | GET | /js/timeago.min.js | 0.001 | 0.036 | 0.265 | 22.870 | | 148 | GET | /@\w+ | 0.078 | 0.152 | 0.325 | 22.534 | | 643 | GET | /js/main.js | 0.000 | 0.032 | 0.205 | 20.765 | | 643 | GET | /css/style.css | 0.001 | 0.032 | 0.170 | 20.619 | | 144 | POST | / | 0.005 | 0.055 | 0.202 | 7.873 | | 89 | POST | /register | 0.013 | 0.065 | 0.187 | 5.772 | ~~略~~ | 1 | GET | /sitecore/shell/sitecore.version.xml | 0.001 | 0.001 | 0.001 | 0.001 | +-------+--------+--------------------------------------+-------+-------+-------+---------+ isucon@main:/var/log/nginx$ ← /imageが圧倒的に多い ← favicon, js, css等の  静的ファイルも  そこそこ多い
  17. 4. 静的ファイルをnginxで配信する • nginxの設定ファイルを見てみる ➢ location(参照ルール)が「/」しか指定されてない → すべてのアクセスがアプリサーバ経由で MySQLから配信されている server

    { listen 80; ~~略~~~ location / { //デフォルト設定 proxy_set_header Host $host; //何か呼ばれたら、 proxy_pass http://localhost:8080; //localhostの8080番ポートを見る //なお、今回8080を使ってるのはアプリサーバ( MySQLへ) } }
  18. 4. 静的ファイルをnginxで配信する • 静的ファイルはWebサーバ(nginx)から配信するようにする server { listen 80; location ~

    ^/(favicon\.ico|css/|js/|img/) { //favicon, css, js, imgが呼ばれたら、 root /home/isucon/private_isu/webapp/public/; //public配下を見る expires 1d; } location / { //上記以外が呼ばれたとき(デフォルト) proxy_set_header Host $host; //localhost 8080を見る proxy_pass http://localhost:8080; } } 追加
  19. 4. 静的ファイルをnginxで配信する • 再度、alpでaccess.logを解析してみる ➢ 静的ファイル(favicon, js, css)の処理時間がゼロ秒になった isucon@main:/var/log/nginx$ sudo

    alp json --sort sum -r -m "/posts/[0-9]+,/@\ w+,/image/\d+" -o count,method,uri,min,avg,max,sum < /var/log/nginx/access.lo g +-------+--------+--------------------+-------+-------+-------+---------+ | COUNT | METHOD | URI | MIN | AVG | MAX | SUM | +-------+--------+--------------------+-------+-------+-------+---------+ | 8210 | GET | /image/\d+ | 0.001 | 0.038 | 0.272 | 309.283 | ~~~略~~~~ | 1097 | GET | /favicon.ico | 0.000 | 0.000 | 0.000 | 0.000 | | 1097 | GET | /js/timeago.min.js | 0.000 | 0.000 | 0.000 | 0.000 | | 1097 | GET | /js/main.js | 0.000 | 0.000 | 0.000 | 0.000 | | 1097 | GET | /css/style.css | 0.000 | 0.000 | 0.000 | 0.000 | +-------+--------+--------------------+-------+-------+-------+---------+
  20. 目次 1. 初期状態(約650点) 2. commentテーブルにインデックスを追加する(約 7000点) 3. unicorn workerプロセスを4にする(約15,000点) 4.

    静的ファイルをnginxで配信する(約17,000点) 5. アップロード画像を静的ファイル化する(約 22,000点) 6. GET / を解析する 7. postとuserをJOINして必要な行数だけ取得する(約 90,000点) 8. ベンチマーカーが使用するファイルディスクリプタ上限を増加させる 9. プリペア度ステートメントを改善する(約 110,000点) 10. commentテーブルにインデックスを追加する(約 115,000点) 11. postからのN+1クエリ結果をキャッシュする(約 180,000点) 12. 適切なインデックスが使えないクエリを解決する(約 200,000点) 13. 外部コマンドの呼び出しをやめる(約 240,000点) 14. MySQLの設定を調整する(約 255,000点) 15. memcachedへのN+1を解消する(約300,000点) 16. RubyのYJITを有効にする(約 320,000点)
  21. 5. アップロード画像を静的ファイル化する • 次に、大量に呼ばれてるimageファイルを改善する ➢ 現在どうなっているか 1. imageファイルが呼ばれる 2. MySQLでバイナリから書き出して配信する

    ➢ どうした方がいいか 1. imageファイルが呼ばれる 2. nginxにimageファイルが置いてある → そのまま配信する nginxにimageファイルが置いてない → MySQLでバイナリから書き出して配信する → 書き出した画像はnginxに保存する
  22. 5. アップロード画像を静的ファイル化する • nginxにimageファイルが呼ばれたときの処理を追記 server { listen 80; location ~

    ^/(favicon\.ico|css/|js/|img/) { //favicon, js, cssが呼ばれたとき root /home/isucon/private_isu/webapp/public/; //publicフォルダを見る expires 1d; } location /image/ { // imageが呼ばれたとき root /home/isucon/private_isu/webapp/public/; expires 1d; try_files $uri @app; //① uri(publicフォルダ)を見る //② ①で見つからなかったら @appを呼ぶ } location @app { // @appが呼ばれたとき internal; proxy_pass http://localhost:8080; // localhost 8080を見る(アプリサーバ →mysql) } location / { //上記以外が呼ばれたとき(デフォルト) proxy_set_header Host $host; proxy_pass http://localhost:8080; //localhost 8080を見る(アプリサーバ →mysql) } } 追加
  23. 5. アップロード画像を静的ファイル化する • 再度、alpでaccess.logを解析してみる ➢ imageにかける時間が309秒→47秒に短縮された isucon@main:/var/log/nginx$ sudo alp json

    --sort sum -r -m "/posts/[0-9]+,/@\ w+,/image/\d+" -o count,method,uri,min,avg,max,sum < /var/log/nginx/access.log +-------+--------+--------------------+-------+-------+-------+---------+ | COUNT | METHOD | URI | MIN | AVG | MAX | SUM | +-------+--------+--------------------+-------+-------+-------+---------+ | 679 | GET | / | 0.070 | 0.378 | 0.568 | 256.648 | | 270 | GET | /posts | 0.068 | 0.391 | 0.603 | 105.450 | | 409 | GET | /posts/[0-9]+ | 0.002 | 0.180 | 0.382 | 73.451 | | 370 | POST | /login | 0.002 | 0.178 | 0.365 | 65.698 | | 15261 | GET | /image/\d+ | 0.000 | 0.003 | 0.399 | 47.712 | | 132 | GET | /login | 0.001 | 0.160 | 0.334 | 21.120 | | 74 | POST | / | 0.005 | 0.174 | 0.362 | 12.908 |
  24. 目次 1. 初期状態(約650点) 2. commentテーブルにインデックスを追加する(約 7000点) 3. unicorn workerプロセスを4にする(約15,000点) 4.

    静的ファイルをnginxで配信する(約17,000点) 5. アップロード画像を静的ファイル化する(約 22,000点) 6. GET / を解析する 7. postとuserをJOINして必要な行数だけ取得する(約 90,000点) 8. ベンチマーカーが使用するファイルディスクリプタ上限を増加させる 9. プリペアドステートメントを改善する(約 110,000点) 10. commentテーブルにインデックスを追加する(約 115,000点) 11. postからのN+1クエリ結果をキャッシュする(約 180,000点) 12. 適切なインデックスが使えないクエリを解決する(約 200,000点) 13. 外部コマンドの呼び出しをやめる(約 240,000点) 14. MySQLの設定を調整する(約 255,000点) 15. memcachedへのN+1を解消する(約300,000点) 16. RubyのYJITを有効にする(約 320,000点)
  25. 6. GET / を解析する • access.logで一番重い GET / の中身を見てみる ➢

    pt-query-digestを使用 # Profile # Rank Query ID Response time Calls R/Call V/M Item # ==== ============================ ============= ====== ====== ===== ==== # 1 0x1CD48AE21E9C97BE44D0B06... 42.7302 46.4% 696 0.0614 0.00 SELECT posts # 2 0x7A12D0C8F433684C3027353... 19.7750 21.5% 280 0.0706 0.00 SELECT posts # 3 0xDA556F9115773A1A99AA016... 6.8103 7.4% 102557 0.0001 0.00 ADMIN PREPARE # 4 0x396201721CD58410E070DA9... 6.2812 6.8% 57878 0.0001 0.00 SELECT users # 5 0xCDEB1AFF2AE2BE51B2ED5CF... 5.0302 5.5% 95 0.0529 0.00 SELECT comments # 6 0x624863D30DAC59FA1684928... 3.7108 4.0% 20864 0.0002 0.00 SELECT comments # 7 0x422390B42D4DD86C7539A5F... 2.8424 3.1% 21342 0.0001 0.00 SELECT comments # 8 0xE83DA93257C7B787C67B1B0... 1.9411 2.1% 95 0.0204 0.00 SELECT posts # MISC 0xMISC 2.9344 3.2% 104072 0.0000 0.0 <17 ITEMS> → SELECT posts が多そう
  26. 6. GET / を解析する • 第1位に来ているクエリを見てみる ➢ WHERE句(IF文)がない → テーブルの全行を取得している

    SELECT `id`, `user_id`, `body`, `created_at`, `mime` FROM `posts` ORDER BY `created_at` DESC\G • クエリを呼び出している元(アプリサーバのRubyコード)を見る ➢ make_posts関数で呼ばれている get '/' do              //GET / についての処理 me = get_session_user() results = db.query('SELECT `id`, `user_id`, `body`, `created_at`, `mime` FROM `posts` ORDER BY `created_at` DESC') posts = make_posts(results)
  27. 6. GET / を解析する • make_posts関数の中身を見てみる • //make_postsの定義(def) def make_posts(results,

    all_comments: false) //postの個数分ループ results.to_a.each do |post| //postsのcommentに紐づくユーザを探すため、 usersテーブルにもクエリ comment[:user] = db.prepare('SELECT * FROM `users` WHERE `id` = ?').execute( comment[:user_id] ).first //delete==0ならツイ消しされてないので表示 posts.push(post) if post[:user][:del_flg] == 0 //表示数が20件に達したらループ終了 break if posts.length >=20 end
  28. 6. GET / を解析する • make_posts関数の良くないところ ◦ postsテーブルを全件取得して、その数だけアプリ側でループしてる ➢ 20件って上限あるんだから初めから

    20件だけ取得すればいい ◦ アプリ側から改めてusersテーブルにクエリしてる( N+1問題) ➢ postsにクエリするときに一緒に情報取ればいい
  29. 目次 1. 初期状態(約650点) 2. commentテーブルにインデックスを追加する(約 7000点) 3. unicorn workerプロセスを4にする(約15,000点) 4.

    静的ファイルをnginxで配信する(約17,000点) 5. アップロード画像を静的ファイル化する(約 22,000点) 6. GET / を解析する 7. postとuserをJOINして必要な行数だけ取得する(約 90,000点) 8. ベンチマーカーが使用するファイルディスクリプタ上限を増加させる 9. プリペア度ステートメントを改善する(約 110,000点) 10. commentテーブルにインデックスを追加する(約 115,000点) 11. postからのN+1クエリ結果をキャッシュする(約 180,000点) 12. 適切なインデックスが使えないクエリを解決する(約 200,000点) 13. 外部コマンドの呼び出しをやめる(約 240,000点) 14. MySQLの設定を調整する(約 255,000点) 15. memcachedへのN+1を解消する(約300,000点) 16. RubyのYJITを有効にする(約 320,000点)
  30. 7. postとuserをJOINして必要な行数だけ取得する • 一回で全部みれるSQL文に置き換える ▪▪▪▪▪▪▪▪修正後▪▪▪▪▪▪▪▪▪▪ mysql> -> SELECT p.id, p.user_id,

    p.body, p.created_at, p.mime -> FROM posts AS p JOIN users AS u ON (p.user_id=u.id) //postsとusersテーブルを合体 -> WHERE u.del_flg=0 //ツイ消しされてないこと -> ORDER BY p.created_at DESC -> LIMIT 20\G //取得数は20件とすること ▪▪▪▪▪▪▪▪修正前▪▪▪▪▪▪▪▪▪▪ mysql> -> SELECT p.id, p.user_id, p.body, p.created_at, p.mime -> FROM posts -> ORDER BY p.created_at DESC ↓
  31. 7. postとuserをJOINして必要な行数だけ取得する • 再度、alpでaccess.logを解析してみる ➢ GET / にかける時間が0.378秒→0.066秒に短縮されてる isucon@main:/var/log/nginx$ sudo

    alp json --sort sum -r -m "/posts/[0-9]+,/@\ w+,/image/\d+" -o count,method,uri,min,avg,max,sum < /var/log/nginx/access.log +-------+--------+--------------------+-------+-------+-------+---------+ | COUNT | METHOD | URI | MIN | AVG | MAX | SUM | +-------+--------+--------------------+-------+-------+-------+---------+ | 2796 | GET | / | 0.013 | 0.066 | 0.186 | 185.799 | | 960 | GET | /posts | 0.019 | 0.096 | 0.180 | 92.079 | | 1429 | POST | /login | 0.001 | 0.055 | 0.179 | 78.102 | | 1719 | GET | /posts/[0-9]+ | 0.002 | 0.044 | 0.151 | 75.666 | | 61052 | GET | /image/\d+ | 0.000 | 0.000 | 0.098 | 21.440 | | 518 | GET | /login | 0.001 | 0.039 | 0.121 | 20.100 | | 292 | POST | / | 0.004 | 0.048 | 0.118 | 14.006 | | 200 | POST | /register | 0.011 | 0.062 | 0.145 | 12.431 | | 259 | GET | /logout | 0.001 | 0.041 | 0.104 | 10.627 |
  32. 7. postとuserをJOINして必要な行数だけ取得する • ベンチマークの結果 ➢ スコア:21612点→87123点 isucon@bench:~$ /home/isucon/private_isu.git/benchmarker/bin/benchmarker -u /

    home/isucon/private_isu.git/benchmarker/userdata -t http://18.183.189.60/ { "pass":true, "score":87123, "success":84155, "fail":0, "messages":[] } isucon@bench:~$ ]