Open14

ISUCON14感想戦

Toshiya MatsuzakiToshiya Matsuzaki

まず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'
Toshiya MatsuzakiToshiya Matsuzaki

Indexをもりもり貼った

RetryAfterMsを1000とかにした

あたりで8000点でて、そこから全く進捗なし

Toshiya MatsuzakiToshiya Matsuzaki

マッチングロジック変えてもずっとこんな感じ。
msg=53.8%のライドは椅子がマッチされるまでの時間、100.0%のライドはマッチされた椅子が乗車地点までに掛かる時間、38.5%のライドは椅子の実移動時間に不満がありました

空いている椅子とrides引っこ抜いて、二乗でDistance全部計算して上1/3の組み合わせをマッチング、みたいなことをしたけど全然改善しない
(バグらせているかも)

Toshiya MatsuzakiToshiya Matsuzaki

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

Toshiya MatsuzakiToshiya Matsuzaki

ロジックバグらせていたのを直したらめっちゃ動くようになった

time=00:10:56.977 level=INFO msg=75.2%のライドは椅子がマッチされるまでの時間、9.7%のライドはマッチされた椅子が乗車地点までに掛かる時間、77.3%のライドは椅子の実移動時間に不満がありました

タイムアウト系踏んでエラー数でfailしてしまった

Toshiya MatsuzakiToshiya Matsuzaki

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)
Toshiya MatsuzakiToshiya Matsuzaki

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

あんまり変化なし、ボトルネック違うししょうがない

Toshiya MatsuzakiToshiya Matsuzaki

22134点/22840点

nearby-chairsで、あるchairについて過去のride全部見る実装になっていたけど、最新の1ride以外は全部COMPLETEDになっているはずなので、limit1をつける
appPostRidesも同様

若干不整合で始めたけど、一旦タイムアウトしなくなっていい感じ

time=00:45:31.298 level=WARN msg="取得した付近の椅子情報に不備があります (CODE=30): ID:01JFAMQ21154XE5WKDHJQAN98Kの椅子は既にライド中です"

ボトルネックは変わらずだが、散ってきた

Toshiya MatsuzakiToshiya Matsuzaki

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 |
+-------+-------+-----+-----+--------+---------------------------------------+----------+-------+
Toshiya MatsuzakiToshiya Matsuzaki

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 |
+-------+-------+-----+-----+--------+---------------------------------------+----------+-------+
Toshiya MatsuzakiToshiya Matsuzaki

試しに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 |
+-------+-------+-----+-----+--------+---------------------------------------+---------+-------+