连接池到底设多大?池越大吞吐越高吗?等待型查询和 CPU 密集型查询有什么区别?这篇用 64 个线程在本机 MySQL 上把 maximum-pool-size 从 1 逐个加到 64,看吞吐和获取连接的等待。
maximum-pool-size= 1:吞吐 163 次/秒 | 获取连接 平均 403.30 ms P99 5327.9 ms | 总耗时 平均 409.95 ms P99 5334.5 ms | 失败 0 maximum-pool-size= 2:吞吐 324 次/秒 | 获取连接 平均 195.89 ms P99 5123.0 ms | 总耗时 平均 202.33 ms P99 5129.4 ms | 失败 0 maximum-pool-size= 4:吞吐 633 次/秒 | 获取连接 平均 96.11 ms P99 5006.7 ms | 总耗时 平均 102.54 ms P99 5014.3 ms | 失败 0 maximum-pool-size= 8:吞吐 1253 次/秒 | 获取连接 平均 45.01 ms P99 1565.7 ms | 总耗时 平均 51.33 ms P99 1572.1 ms | 失败 0 maximum-pool-size=16:吞吐 2407 次/秒 | 获取连接 平均 20.35 ms P99 376.8 ms | 总耗时 平均 26.72 ms P99 383.3 ms | 失败 0 maximum-pool-size=32:吞吐 4516 次/秒 | 获取连接 平均 7.89 ms P99 0.2 ms | 总耗时 平均 14.22 ms P99 27.3 ms | 失败 0 maximum-pool-size=64:吞吐 7718 次/秒 | 获取连接 平均 1.88 ms P99 0.0 ms | 总耗时 平均 8.30 ms P99 11.7 ms | 失败 0
数据库里只是等待时,吞吐随池大小接近线性增长。
maximum-pool-size= 1:吞吐 82 次/秒 | 获取连接 平均 837.28 ms P99 5821.7 ms | 总耗时 平均 851.62 ms P99 5834.6 ms | 失败 0 maximum-pool-size= 2:吞吐 138 次/秒 | 获取连接 平均 470.16 ms P99 5391.0 ms | 总耗时 平均 485.99 ms P99 5403.8 ms | 失败 0 maximum-pool-size= 4:吞吐 245 次/秒 | 获取连接 平均 252.86 ms P99 5201.0 ms | 总耗时 平均 270.04 ms P99 5216.0 ms | 失败 0 maximum-pool-size= 8:吞吐 318 次/秒 | 获取连接 平均 180.11 ms P99 5088.6 ms | 总耗时 平均 205.61 ms P99 5111.4 ms | 失败 0 maximum-pool-size=16:吞吐 361 次/秒 | 获取连接 平均 137.52 ms P99 4824.2 ms | 总耗时 平均 180.74 ms P99 4846.8 ms | 失败 0 maximum-pool-size=32:吞吐 405 次/秒 | 获取连接 平均 88.73 ms P99 2442.0 ms | 总耗时 平均 162.42 ms P99 2523.3 ms | 失败 0 maximum-pool-size=64:吞吐 434 次/秒 | 获取连接 平均 33.71 ms P99 907.7 ms | 总耗时 平均 149.13 ms P99 966.6 ms | 失败 0
CPU 密集的查询在池达到 8 之后增长很慢。