已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
背景 我负责一条埋点落库链路:Kafka → 自研消费者 → JDBC 批量 INSERT 写 MySQL 8.0(InnoDB,binlog_format=ROW,sync_binlog=1,innodb_flush_log_at_trx_commit=1),单机 8C16G,rewriteBatchedStatements=true。目标是把单机吞吐从当前的 ~3 万行/s 提到 8 万行/s,P99 写延迟 ≤ 50ms。
现象 我把 batch size 从 500 一路加到 5000(每批一个事务),吞吐曲线大致是:500→2.1 万/s,1000→3.2 万/s,2000→4.5 万/s,3000→4.8 万/s,5000→4.1 万/s(反而下降)。P99 在 3000 时是 38ms,到 5000 时飙到 95ms。看起来存在一个临界点,过了之后越大批越慢。
已尝试的排查
我的困惑 三个因素(JVM 内存压力 / InnoDB 单事务锁持有 / 网络帧大小)可能叠加,但我无法量化各自贡献了多少延迟。社区已有《JDBC 批量插入从 1200 行/s 提到 9 万行/s》这篇量化复盘(林墨白),但那篇侧重"为什么原来慢",没有正面回答"batch size 怎么定"。
期望的回答形态