🚀

ishocon2 記録

2024/01/02に公開
  • 初回ベンチ
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443"
2024/01/01 23:15:48 Start GET /initialize
2024/01/01 23:15:48 期日前投票を開始します
2024/01/01 23:15:49 期日前投票が終了しました
2024/01/01 23:15:49 投票を開始します  Workload: 3
2024/01/01 23:16:35 投票が終了しました
2024/01/01 23:16:35 投票者が結果を確認しています
2024/01/01 23:16:50 投票者の感心がなくなりました
2024/01/01 23:16:50 {"score": 6980, "success": 6340, "failure": 0}

~/ghq/github.com/mickamy/ISHOCON2 imp1* 1m 2s
  • Locale/TZ 設定
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443"
2024/01/01 23:34:15 Start GET /initialize
2024/01/01 23:34:15 期日前投票を開始します
2024/01/01 23:35:03 期日前投票が終了しました
2024/01/01 23:35:03 投票を開始します  Workload: 3
2024/01/01 23:35:50 投票が終了しました
2024/01/01 23:35:50 投票者が結果を確認しています
2024/01/01 23:36:05 投票者の感心がなくなりました
2024/01/01 23:36:05 {"score": 6098, "success": 5474, "failure": 0}

~/ghq/github.com/mickamy/ISHOCON2 imp1* 1m 51s

TZ 設定できてない :pieng:

  • update ruby to 3.1.4
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443"
2024/01/01 23:41:21 Start GET /initialize
2024/01/01 23:41:21 期日前投票を開始します
2024/01/01 23:41:29 期日前投票が終了しました
2024/01/01 23:41:29 投票を開始します  Workload: 3
2024/01/01 23:42:15 投票が終了しました
2024/01/01 23:42:15 投票者が結果を確認しています
2024/01/01 23:42:31 投票者の感心がなくなりました
2024/01/01 23:42:31 {"score": 6948, "success": 6324, "failure": 0}

~/ghq/github.com/mickamy/ISHOCON2 imp1* 1m 11s
  • show create table
| votes | CREATE TABLE `votes` (
  `id` int(32) NOT NULL AUTO_INCREMENT,
  `user_id` int(32) NOT NULL,
  `candidate_id` int(11) NOT NULL,
  `keyword` text NOT NULL,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=950393 DEFAULT CHARSET=utf8mb4 |

| users | CREATE TABLE `users` (
  `id` int(32) NOT NULL AUTO_INCREMENT,
  `name` varchar(128) NOT NULL,
  `address` varchar(256) NOT NULL,
  `mynumber` varchar(32) NOT NULL,
  `votes` int(4) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `mynumber` (`mynumber`)
) ENGINE=InnoDB AUTO_INCREMENT=4000001 DEFAULT CHARSET=utf8mb4 |

| candidates | CREATE TABLE `candidates` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(128) NOT NULL,
  `political_party` varchar(128) NOT NULL,
  `sex` varchar(32) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb4 |
  • bundle update and specify ruby version
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443"
2024/01/02 00:35:45 Start GET /initialize
2024/01/02 00:35:45 期日前投票を開始します
2024/01/02 00:35:46 期日前投票が終了しました
2024/01/02 00:35:46 投票を開始します  Workload: 3
2024/01/02 00:36:31 投票が終了しました
2024/01/02 00:36:31 投票者が結果を確認しています
2024/01/02 00:36:47 投票者の感心がなくなりました
2024/01/02 00:36:47 {"score": 7144, "success": 6472, "failure": 0}

~/ghq/github.com/mickamy/ISHOCON2 imp1* 1m 2s
  • unicorn のワーカ増やした
  • candidates をメモリに載せようとしたら壊れたので戻した
    • 元々30件だからたいしたことないか?
    • TODO: 余裕できたら再チャレンジ
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443"
2024/01/02 01:19:04 Start GET /initialize
2024/01/02 01:19:05 期日前投票を開始します
2024/01/02 01:19:13 エラーメッセージに誤りがあります at POST /vote
make: *** [bench] Error 1

~/ghq/github.com/mickamy/ISHOCON2 imp1* 9s
  • unicorn のプロセスのおかげでスコアだけ上がった
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443"
2024/01/02 01:33:23 Start GET /initialize
2024/01/02 01:33:23 期日前投票を開始します
2024/01/02 01:33:24 期日前投票が終了しました
2024/01/02 01:33:24 投票を開始します  Workload: 3
2024/01/02 01:34:09 投票が終了しました
2024/01/02 01:34:09 投票者が結果を確認しています
2024/01/02 01:34:25 投票者の感心がなくなりました
2024/01/02 01:34:25 {"score": 17144, "success": 16072, "failure": 0}
  • workload と unicorn worker を増やすが、悪くなった
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 8"
2024/01/02 01:40:43 Start GET /initialize
2024/01/02 01:40:43 期日前投票を開始します
2024/01/02 01:40:48 期日前投票が終了しました
2024/01/02 01:40:48 投票を開始します  Workload: 8
2024/01/02 01:41:42 投票が終了しました
2024/01/02 01:41:42 投票者が結果を確認しています
2024/01/02 01:41:57 投票者の感心がなくなりました
2024/01/02 01:41:57 {"score": 12196, "success": 10148, "failure": 0}

~/ghq/github.com/mickamy/ISHOCON2 imp1* 1m 15s
  • workload: 4, unicorn: 12
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 4"
2024/01/02 01:43:27 Start GET /initialize
2024/01/02 01:43:27 期日前投票を開始します
2024/01/02 01:43:55 期日前投票が終了しました
2024/01/02 01:43:55 投票を開始します  Workload: 4
2024/01/02 01:44:41 投票が終了しました
2024/01/02 01:44:41 投票者が結果を確認しています
2024/01/02 01:44:56 投票者の感心がなくなりました
2024/01/02 01:44:56 {"score": 16942, "success": 16046, "failure": 0}

~/ghq/github.com/mickamy/ISHOCON2 imp1* 1m 30s
  • ALTER TABLE votes ADD INDEX idx_votes_candidate_id (candidate_id);
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 4"
2024/01/02 01:49:33 Start GET /initialize
2024/01/02 01:49:33 期日前投票を開始します
2024/01/02 01:49:34 期日前投票が終了しました
2024/01/02 01:49:34 投票を開始します  Workload: 4
2024/01/02 01:50:20 投票が終了しました
2024/01/02 01:50:20 投票者が結果を確認しています
2024/01/02 01:50:35 投票者の感心がなくなりました
2024/01/02 01:50:35 {"score": 19292, "success": 16996, "failure": 0}

~/ghq/github.com/mickamy/ISHOCON2 imp1* 1m 2s
  • unicorn: 24 多分意味ない
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 4"
2024/01/02 01:52:15 Start GET /initialize
2024/01/02 01:52:15 期日前投票を開始します
2024/01/02 01:52:15 期日前投票が終了しました
2024/01/02 01:52:15 投票を開始します  Workload: 4
2024/01/02 01:53:02 投票が終了しました
2024/01/02 01:53:02 投票者が結果を確認しています
2024/01/02 01:53:17 投票者の感心がなくなりました
2024/01/02 01:53:17 {"score": 19568, "success": 17384, "failure": 0}
  • css 配信を nginx に任せる
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 4"
2024/01/02 01:58:22 Start GET /initialize
2024/01/02 01:58:22 期日前投票を開始します
2024/01/02 01:58:23 期日前投票が終了しました
2024/01/02 01:58:23 投票を開始します  Workload: 4
2024/01/02 01:59:09 投票が終了しました
2024/01/02 01:59:09 投票者が結果を確認しています
2024/01/02 01:59:25 投票者の感心がなくなりました
2024/01/02 01:59:25 {"score": 19652, "success": 17476, "failure": 0}
  • unicorn: 16, workload: 6 24094
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 6"
2024/01/02 02:02:20 Start GET /initialize
2024/01/02 02:02:20 期日前投票を開始します
2024/01/02 02:02:26 期日前投票が終了しました
2024/01/02 02:02:26 投票を開始します  Workload: 6
2024/01/02 02:03:12 投票が終了しました
2024/01/02 02:03:12 投票者が結果を確認しています
2024/01/02 02:03:28 投票者の感心がなくなりました
2024/01/02 02:03:28 {"score": 24094, "success": 21822, "failure": 0}
  • candidates をメモリに載せる 21250
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 6"
2024/01/02 02:40:03 Start GET /initialize
2024/01/02 02:40:03 期日前投票を開始します
2024/01/02 02:40:04 期日前投票が終了しました
2024/01/02 02:40:04 投票を開始します  Workload: 6
2024/01/02 02:40:51 投票が終了しました
2024/01/02 02:40:51 投票者が結果を確認しています
2024/01/02 02:41:06 投票者の感心がなくなりました
2024/01/02 02:41:06 {"score": 21250, "success": 19650, "failure": 0}
  • votes を bulk insert 20114
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 6"
2024/01/02 03:49:19 Start GET /initialize
2024/01/02 03:49:19 期日前投票を開始します
2024/01/02 03:49:20 期日前投票が終了しました
2024/01/02 03:49:20 投票を開始します  Workload: 6
2024/01/02 03:50:05 投票が終了しました
2024/01/02 03:50:05 投票者が結果を確認しています
2024/01/02 03:50:22 投票者の感心がなくなりました
2024/01/02 03:50:22 {"score": 20114, "success": 19682, "failure": 0}
  • votes に count column を追加して、投票数を保存 27926
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 6"
2024/01/02 04:19:42 Start GET /initialize
2024/01/02 04:19:42 期日前投票を開始します
2024/01/02 04:19:43 期日前投票が終了しました
2024/01/02 04:19:43 投票を開始します  Workload: 6
2024/01/02 04:20:29 投票が終了しました
2024/01/02 04:20:29 投票者が結果を確認しています
2024/01/02 04:20:44 投票者の感心がなくなりました
2024/01/02 04:20:44 {"score": 27926, "success": 25238, "failure": 0}
  • 遅そうなクエリの explain
mysql> EXPLAIN SELECT c.id, c.name, c.political_party, c.sex, v.count
    -> FROM candidates AS c
    -> LEFT OUTER JOIN
    ->   (SELECT candidate_id, IFNULL(SUM(count), 0) AS count
    ->   FROM votes
    ->   GROUP BY candidate_id) AS v
    -> ON c.id = v.candidate_id
    -> ORDER BY v.count DESC;
+----+-------------+------------+------------+-------+------------------------+------------------------+---------+---------------+-------+----------+---------------------------------+
| id | select_type | table      | partitions | type  | possible_keys          | key                    | key_len | ref           | rows  | filtered | Extra                           |
+----+-------------+------------+------------+-------+------------------------+------------------------+---------+---------------+-------+----------+---------------------------------+
|  1 | PRIMARY     | c          | NULL       | ALL   | NULL                   | NULL                   | NULL    | NULL          |    30 |   100.00 | Using temporary; Using filesort |
|  1 | PRIMARY     | <derived2> | NULL       | ref   | <auto_key0>            | <auto_key0>            | 4       | ishocon2.c.id |   128 |   100.00 | NULL                            |
|  2 | DERIVED     | votes      | NULL       | index | idx_votes_candidate_id | idx_votes_candidate_id | 4       | NULL          | 12863 |   100.00 | NULL                            |
+----+-------------+------------+------------+-------+------------------------+------------------------+---------+---------------+-------+----------+---------------------------------+
  • add foreign key to votes to candidates 28840
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 6"
2024/01/02 04:26:26 Start GET /initialize
2024/01/02 04:26:26 期日前投票を開始します
2024/01/02 04:26:27 期日前投票が終了しました
2024/01/02 04:26:27 投票を開始します  Workload: 6
2024/01/02 04:27:13 投票が終了しました
2024/01/02 04:27:13 投票者が結果を確認しています
2024/01/02 04:27:28 投票者の感心がなくなりました
2024/01/02 04:27:28 {"score": 28840, "success": 26120, "failure": 0}
  • election_results の複数回コールを止める 33168
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 6"
2024/01/02 04:29:00 Start GET /initialize
2024/01/02 04:29:01 期日前投票を開始します
2024/01/02 04:29:02 期日前投票が終了しました
2024/01/02 04:29:02 投票を開始します  Workload: 6
2024/01/02 04:29:47 投票が終了しました
2024/01/02 04:29:47 投票者が結果を確認しています
2024/01/02 04:30:02 投票者の感心がなくなりました
2024/01/02 04:30:02 {"score": 33168, "success": 28584, "failure": 0}
  • ALTER TABLE votes ADD INDEX idx_votes_candidate_and_count (candidate_id, count); 33718
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 6"
2024/01/02 04:39:22 Start GET /initialize
2024/01/02 04:39:22 期日前投票を開始します
2024/01/02 04:39:23 期日前投票が終了しました
2024/01/02 04:39:23 投票を開始します  Workload: 6
2024/01/02 04:40:08 投票が終了しました
2024/01/02 04:40:08 投票者が結果を確認しています
2024/01/02 04:40:23 投票者の感心がなくなりました
2024/01/02 04:40:23 {"score": 33718, "success": 27934, "failure": 0}
  • YJIT 有効化(なぜかローカルだと遅くなったけど速くなるはずなので CI で確認) 19963
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 6"
2024/01/02 05:08:31 Start GET /initialize
2024/01/02 05:08:32 期日前投票を開始します
2024/01/02 05:08:34 期日前投票が終了しました
2024/01/02 05:08:34 投票を開始します  Workload: 6
2024/01/02 05:09:19 投票が終了しました
2024/01/02 05:09:19 投票者が結果を確認しています
2024/01/02 05:09:35 投票者の感心がなくなりました
2024/01/02 05:09:35 {"score": 19963, "success": 16931, "failure": 0}
  • 静的ファイルが nginx で返せていないようなので revisit(なんだかローカルが遅い) 22143
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 6"
2024/01/02 05:41:38 Start GET /initialize
2024/01/02 05:41:38 期日前投票を開始します
2024/01/02 05:41:40 期日前投票が終了しました
2024/01/02 05:41:40 投票を開始します  Workload: 6
2024/01/02 05:42:26 投票が終了しました
2024/01/02 05:42:26 投票者が結果を確認しています
2024/01/02 05:42:41 投票者の感心がなくなりました
2024/01/02 05:42:41 {"score": 22143, "success": 18471, "failure": 0}
  • nginx のログを捨てる 20725
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 6"
2024/01/02 05:50:39 Start GET /initialize
2024/01/02 05:50:39 期日前投票を開始します
2024/01/02 05:50:41 期日前投票が終了しました
2024/01/02 05:50:41 投票を開始します  Workload: 6
2024/01/02 05:51:26 投票が終了しました
2024/01/02 05:51:26 投票者が結果を確認しています
2024/01/02 05:51:42 投票者の感心がなくなりました
2024/01/02 05:51:42 {"score": 20725, "success": 16637, "failure": 0}
  • 最新の ruby を使用(3.2.2) 31606
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 6"
2024/01/02 06:41:24 Start GET /initialize
2024/01/02 06:41:24 期日前投票を開始します
2024/01/02 06:41:25 期日前投票が終了しました
2024/01/02 06:41:25 投票を開始します  Workload: 6
2024/01/02 06:42:11 投票が終了しました
2024/01/02 06:42:11 投票者が結果を確認しています
2024/01/02 06:42:26 投票者の感心がなくなりました
2024/01/02 06:42:26 {"score": 31606, "success": 26078, "failure": 0}
  • keyword をテーブルにする 28084
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 6"
2024/01/02 07:23:59 Start GET /initialize
2024/01/02 07:23:59 期日前投票を開始します
2024/01/02 07:24:00 期日前投票が終了しました
2024/01/02 07:24:00 投票を開始します  Workload: 6
2024/01/02 07:24:46 投票が終了しました
2024/01/02 07:24:46 投票者が結果を確認しています
2024/01/02 07:25:23 投票者の感心がなくなりました
2024/01/02 07:25:23 {"score": 28084, "success": 23692, "failure": 0}
  • add desc to count index 29668
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 6"
2024/01/02 07:42:14 Start GET /initialize
2024/01/02 07:42:14 期日前投票を開始します
2024/01/02 07:42:16 期日前投票が終了しました
2024/01/02 07:42:16 投票を開始します  Workload: 6
2024/01/02 07:43:02 投票が終了しました
2024/01/02 07:43:02 投票者が結果を確認しています
2024/01/02 07:44:00 投票者の感心がなくなりました
2024/01/02 07:44:00 {"score": 29668, "success": 25884, "failure": 0}
  • set content max age to /, /candidates/:id and /political_parties/:name 30742
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 6"
2024/01/02 07:52:22 Start GET /initialize
2024/01/02 07:52:23 期日前投票を開始します
2024/01/02 07:52:24 期日前投票が終了しました
2024/01/02 07:52:24 投票を開始します  Workload: 6
2024/01/02 07:53:10 投票が終了しました
2024/01/02 07:53:10 投票者が結果を確認しています
2024/01/02 07:54:03 投票者の感心がなくなりました
2024/01/02 07:54:03 {"score": 30742, "success": 26046, "failure": 0}
  • cache at nginx level 19152
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 6"
2024/01/02 08:43:20 Start GET /initialize
2024/01/02 08:43:21 期日前投票を開始します
2024/01/02 08:43:36 期日前投票が終了しました
2024/01/02 08:43:36 投票を開始します  Workload: 6
2024/01/02 08:44:22 投票が終了しました
2024/01/02 08:44:22 投票者が結果を確認しています
2024/01/02 08:44:47 投票者の感心がなくなりました
2024/01/02 08:44:47 {"score": 19152, "success": 16176, "failure": 0}
  • increase nginx worker process 20122
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 6"
2024/01/02 08:50:34 Start GET /initialize
2024/01/02 08:50:34 期日前投票を開始します
2024/01/02 08:50:36 期日前投票が終了しました
2024/01/02 08:50:36 投票を開始します  Workload: 6
2024/01/02 08:51:21 投票が終了しました
2024/01/02 08:51:21 投票者が結果を確認しています
2024/01/02 08:51:43 投票者の感心がなくなりました
2024/01/02 08:51:43 {"score": 20122, "success": 17186, "failure": 0}
  • workload を 8 に 18968
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 6"
2024/01/02 09:10:56 Start GET /initialize
2024/01/02 09:10:56 期日前投票を開始します
2024/01/02 09:10:57 期日前投票が終了しました
2024/01/02 09:10:57 投票を開始します  Workload: 6
2024/01/02 09:11:43 投票が終了しました
2024/01/02 09:11:43 投票者が結果を確認しています
2024/01/02 09:12:13 投票者の感心がなくなりました
2024/01/02 09:12:13 {"score": 18968, "success": 16184, "failure": 0}
  • more cache on nginx 20442
❯ make bench
docker exec -i ishocon2-bench-1 sh -c "./benchmark --ip app:443 --workload 6"
2024/01/02 09:41:10 Start GET /initialize
2024/01/02 09:41:10 期日前投票を開始します
2024/01/02 09:41:21 期日前投票が終了しました
2024/01/02 09:41:21 投票を開始します  Workload: 6
2024/01/02 09:42:07 投票が終了しました
2024/01/02 09:42:07 投票者が結果を確認しています
2024/01/02 09:42:30 投票者の感心がなくなりました
2024/01/02 09:42:30 {"score": 20442, "success": 15346, "failure": 0}

途中からローカルでの実行が遅くなったが、CI 上での 38098 を最終スコアとしたい

docker exec -i ishocon2-bench-1 sh -c " \
	service mysql restart \
	&& tar -jxvf /root/admin/ishocon2.dump.tar.bz2 && mysql -u root -pishocon ishocon2 < /root/admin/ishocon2.dump \
	&& ./benchmark --ip app:443 --workload 8 \
";
 * Stopping MySQL database server mysqld
   ...done.
 * Starting MySQL database server mysqld
   ...done.
ishocon2.dump
Warning: arning] Using a password on the command line interface can be insecure.
2024/01/02 09:59:57 Start GET /initialize
2024/01/02 09:59:57 期日前投票を開始します
2024/01/02 10:00:24 期日前投票が終了しました
2024/01/02 10:00:24 投票を開始します  Workload: 8
2024/01/02 10:01:09 投票が終了しました
2024/01/02 10:01:09 投票者が結果を確認しています
2024/01/02 10:02:38 投票者の感心がなくなりました
2024/01/02 10:02:38 {"score": 38098, "success": 31698, "failure": 0}

https://github.com/mickamy/ISHOCON2/actions/runs/7384387968

Discussion