ISUCON14感想戦

まずownerGetChairsで使われている
をクエリ分割してロジックで組み立てるようにした
SELECT
`id`,
`owner_id`,
`name`,
`access_token`,
`model`,
`is_active`,
`created_at`,
`updated_at`,
IFNULL (`total_distance`, N) AS `total_distance`,
`total_distance_updated_at`
FROM
`chairs`
LEFT JOIN (
SELECT
`chair_id`,
SUM(IFNULL (`distance`, N)) AS `total_distance`,
MAX(`created_at`) AS `total_distance_updated_at`
FROM
(
SELECT
`chair_id`,
`created_at`,
ABS(
`latitude` - LAG (`latitude`) OVER (
PARTITION BY
`chair_id`
ORDER BY
`created_at`
)
) + ABS(
`longitude` - LAG (`longitude`) OVER (
PARTITION BY
`chair_id`
ORDER BY
`created_at`
)
) AS `distance`
FROM
`chair_locations`
) AS `tmp`
GROUP BY
`chair_id`
) AS `distance_table` ON `distance_table`.`chair_id` = `chairs`.`id`
WHERE
`owner_id` = 'S'

Indexをもりもり貼った
RetryAfterMsを1000とかにした
あたりで8000点でて、そこから全く進捗なし

マッチングロジック変えてもずっとこんな感じ。
msg=53.8%のライドは椅子がマッチされるまでの時間、100.0%のライドはマッチされた椅子が乗車地点までに掛かる時間、38.5%のライドは椅子の実移動時間に不満がありました
空いている椅子とrides引っこ抜いて、二乗でDistance全部計算して上1/3の組み合わせをマッチング、みたいなことをしたけど全然改善しない
(バグらせているかも)

RetryAfterMsを1000とかにした
これがやりすぎている説

200にしたら結構初動が早くなったのでこれだったかも

色々やってたらDBが死に始めた mysqlのログが肥大化していたのでrotate

ロジックバグらせていたのを直したらめっちゃ動くようになった
time=00:10:56.977 level=INFO msg=75.2%のライドは椅子がマッチされるまでの時間、9.7%のライドはマッチされた椅子が乗車地点までに掛かる時間、77.3%のライドは椅子の実移動時間に不満がありました
タイムアウト系踏んでエラー数でfailしてしまった

ERROR error response wrote !BADKEY="Error 1040: Too many connections
初歩的なところだった
mysql> SHOW variables LIKE "%max_connections%";
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| max_connections | 151 |
| mysqlx_max_connections | 100 |
+------------------------+-------+
2 rows in set (0.00 sec)

21609点に伸びた
現状のslow queryはこれ
そしてAPIのタイムアウトがこれ
time=00:28:06.277 level=WARN msg="取得した付近の椅子情報に不備があります (CODE=30): GET /api/app/requests/nearby-chairsのリクエストが失敗しました: Get "https://xiv.isucon.net/api/app/nearby-chairs?distance=50&latitude=322&longitude=272": context deadline exceeded (Client.Timeout exceeded while awaiting headers)"

当日やったけど成果でなかった(そこにボトルネックが移動していなかった)、chair_locationの最新だけ保存するテーブルを分けるを入れてみて21967点
あんまり変化なし、ボトルネック違うししょうがない

22134点/22840点
nearby-chairsで、あるchairについて過去のride全部見る実装になっていたけど、最新の1ride以外は全部COMPLETEDになっているはずなので、limit1をつける
appPostRidesも同様
若干不整合で始めたけど、一旦タイムアウトしなくなっていい感じ
time=00:45:31.298 level=WARN msg="取得した付近の椅子情報に不備があります (CODE=30): ID:01JFAMQ21154XE5WKDHJQAN98Kの椅子は既にライド中です"
ボトルネックは変わらずだが、散ってきた

alp
+-------+-------+-----+-----+--------+---------------------------------------+----------+-------+
| COUNT | 2XX | 4XX | 5XX | METHOD | URI | SUM | AVG |
+-------+-------+-----+-----+--------+---------------------------------------+----------+-------+
| 17177 | 17177 | 0 | 0 | GET | /api/chair/notification | 1900.470 | 0.111 |
| 13227 | 13227 | 0 | 0 | GET | /api/app/notification | 1761.852 | 0.133 |
| 518 | 516 | 2 | 0 | GET | /api/app/nearby-chairs | 1630.583 | 3.148 |
| 10038 | 10038 | 0 | 0 | POST | /api/chair/coordinate | 989.601 | 0.099 |
| 368 | 368 | 0 | 0 | POST | ^/api/app/rides/[0-9A-Z]+/evaluation$ | 133.759 | 0.363 |
| 2840 | 2835 | 0 | 5 | GET | /api/internal/matching | 110.973 | 0.039 |
| 158 | 158 | 0 | 0 | GET | /api/owner/sales | 88.124 | 0.558 |
| 521 | 521 | 0 | 0 | GET | /api/app/rides | 73.578 | 0.141 |
| 477 | 477 | 0 | 0 | POST | /api/app/rides | 66.109 | 0.139 |
| 785 | 785 | 0 | 0 | POST | ^/api/chair/rides/[0-9A-Z]+/status$ | 59.590 | 0.076 |
| 135 | 135 | 0 | 0 | GET | /api/owner/chairs | 23.187 | 0.172 |
| 481 | 481 | 0 | 0 | POST | /api/app/rides/estimated-fare | 21.703 | 0.045 |
| 211 | 209 | 0 | 2 | POST | /api/app/users | 9.771 | 0.046 |
| 209 | 209 | 0 | 0 | POST | /api/app/payment-methods | 6.834 | 0.033 |
| 129 | 129 | 0 | 0 | POST | /api/chair/activity | 4.593 | 0.036 |
| 131 | 131 | 0 | 0 | POST | /api/chair/chairs | 3.843 | 0.029 |
| 1 | 1 | 0 | 0 | POST | /api/initialize | 1.812 | 1.812 |
| 1 | 1 | 0 | 0 | GET | /api/owner/sales? | 0.054 | 0.054 |
| 5 | 5 | 0 | 0 | POST | /api/owner/owners | 0.005 | 0.001 |
| 1237 | 217 | 0 | 0 | GET | /assets/api-components-dDIZztSJ.js | 0.000 | 0.000 |
| 1098 | 212 | 0 | 0 | GET | /assets/api-base-url-Bd0x18OB.js | 0.000 | 0.000 |
+-------+-------+-----+-----+--------+---------------------------------------+----------+-------+

27180点
retry msを500にしたら伸びた ボトルネックにしない程度にいっぱい叩くのが良い気がする
次はnearby-chairsをなんとかしないといけなさそう
+-------+-------+-----+-----+--------+---------------------------------------+----------+-------+
| COUNT | 2XX | 4XX | 5XX | METHOD | URI | SUM | AVG |
+-------+-------+-----+-----+--------+---------------------------------------+----------+-------+
| 635 | 635 | 0 | 0 | GET | /api/app/nearby-chairs | 1542.721 | 2.429 |
| 9452 | 9452 | 0 | 0 | GET | /api/app/notification | 893.297 | 0.095 |
| 11889 | 11889 | 0 | 0 | POST | /api/chair/coordinate | 820.551 | 0.069 |
| 9916 | 9916 | 0 | 0 | GET | /api/chair/notification | 757.877 | 0.076 |
| 453 | 453 | 0 | 0 | POST | ^/api/app/rides/[0-9A-Z]+/evaluation$ | 154.192 | 0.340 |
| 160 | 160 | 0 | 0 | GET | /api/owner/sales | 70.103 | 0.438 |
| 638 | 638 | 0 | 0 | GET | /api/app/rides | 64.924 | 0.102 |
| 582 | 582 | 0 | 0 | POST | /api/app/rides | 50.903 | 0.087 |
| 952 | 952 | 0 | 0 | POST | ^/api/chair/rides/[0-9A-Z]+/status$ | 50.793 | 0.053 |
| 250 | 244 | 0 | 6 | GET | /api/internal/matching | 41.910 | 0.168 |
| 145 | 145 | 0 | 0 | GET | /api/owner/chairs | 21.361 | 0.147 |
| 586 | 586 | 0 | 0 | POST | /api/app/rides/estimated-fare | 17.742 | 0.030 |
| 222 | 220 | 0 | 2 | POST | /api/app/users | 6.439 | 0.029 |
| 220 | 220 | 0 | 0 | POST | /api/app/payment-methods | 5.170 | 0.024 |
| 144 | 144 | 0 | 0 | POST | /api/chair/activity | 3.792 | 0.026 |
| 147 | 147 | 0 | 0 | POST | /api/chair/chairs | 3.328 | 0.023 |
| 1 | 1 | 0 | 0 | POST | /api/initialize | 1.756 | 1.756 |
| 1 | 1 | 0 | 0 | GET | /api/owner/sales? | 0.046 | 0.046 |
| 5 | 5 | 0 | 0 | POST | /api/owner/owners | 0.003 | 0.001 |
| 1460 | 228 | 0 | 0 | GET | /assets/api-components-dDIZztSJ.js | 0.000 | 0.000 |
| 1311 | 223 | 0 | 0 | GET | /assets/api-base-url-Bd0x18OB.js | 0.000 | 0.000 |
+-------+-------+-----+-----+--------+---------------------------------------+----------+-------+

試しに1000にすると、23944点
軽くはなってるけど、ベンチの負荷が上がりきらない感じがする
+-------+-------+-----+-----+--------+---------------------------------------+---------+-------+
| COUNT | 2XX | 4XX | 5XX | METHOD | URI | SUM | AVG |
+-------+-------+-----+-----+--------+---------------------------------------+---------+-------+
| 589 | 589 | 0 | 0 | GET | /api/app/nearby-chairs | 691.262 | 1.174 |
| 11431 | 11431 | 0 | 0 | POST | /api/chair/coordinate | 472.201 | 0.041 |
| 6555 | 6555 | 0 | 0 | GET | /api/app/notification | 334.365 | 0.051 |
| 4515 | 4515 | 0 | 0 | GET | /api/chair/notification | 180.366 | 0.040 |
| 382 | 382 | 0 | 0 | POST | ^/api/app/rides/[0-9A-Z]+/evaluation$ | 112.540 | 0.295 |
| 155 | 155 | 0 | 0 | GET | /api/owner/sales | 31.667 | 0.204 |
| 494 | 487 | 0 | 7 | GET | /api/internal/matching | 28.375 | 0.057 |
| 854 | 854 | 0 | 0 | POST | ^/api/chair/rides/[0-9A-Z]+/status$ | 26.781 | 0.031 |
| 592 | 592 | 0 | 0 | GET | /api/app/rides | 25.998 | 0.044 |
| 523 | 523 | 0 | 0 | POST | /api/app/rides | 24.102 | 0.046 |
| 165 | 165 | 0 | 0 | GET | /api/owner/chairs | 20.952 | 0.127 |
| 527 | 527 | 0 | 0 | POST | /api/app/rides/estimated-fare | 8.846 | 0.017 |
| 221 | 219 | 0 | 2 | POST | /api/app/users | 4.362 | 0.020 |
| 219 | 219 | 0 | 0 | POST | /api/app/payment-methods | 3.103 | 0.014 |
| 128 | 128 | 0 | 0 | POST | /api/chair/activity | 2.330 | 0.018 |
| 132 | 132 | 0 | 0 | POST | /api/chair/chairs | 1.694 | 0.013 |
| 1 | 1 | 0 | 0 | POST | /api/initialize | 1.638 | 1.638 |
| 1 | 1 | 0 | 0 | GET | /api/owner/sales? | 0.054 | 0.054 |
| 5 | 5 | 0 | 0 | POST | /api/owner/owners | 0.003 | 0.001 |
| 1193 | 222 | 0 | 0 | GET | /assets/api-base-url-Bd0x18OB.js | 0.000 | 0.000 |
| 1362 | 227 | 0 | 0 | GET | /assets/api-components-dDIZztSJ.js | 0.000 | 0.000 |
+-------+-------+-----+-----+--------+---------------------------------------+---------+-------+