一、存算分离为什么对网络敏感
配置前的检查
说到网络调优,很多问题都出在细节上。TiDB采用存算分离架构,TiDB Server负责SQL解析与计算,TiKV负责数据存储,两者之间通过gRPC协议交换数据。一次简单的点查可能需要跨节点多次RTT:TiDB向TiKV发送请求,TiKV执行后返回结果,若涉及分布式事务还需PD协调。在高并发场景下,网络延迟每增加1ms,整体P99响应可能恶化5-10倍。这不是理论推演——我们在生产集群中实测发现,当网络往返时延从0.2ms升至0.8ms时,同一查询的P99从15ms飙升至120ms。
很多DBA把优化重心放在SQL或存储参数上,却忽略了网络层本身就是最大的放大器。下文给出可直接落地的调优方案,所有操作均基于Linux 5.4+内核和TiDB 6.x+版本验证。
想继续深入:此处可内链到“网络调优优化清单”文章。
二、最容易被忽略的TCP参数——网络调优
2.1 调整TCP缓冲区:读写都需要空间
TiDB与TiKV之间gRPC连接默认使用系统TCP缓冲区。当并发连接数高时,默认的缓冲(通常为16KB/64KB)极易成为吞吐瓶颈。我们建议将读写缓冲区统一提升至512KB~1MB:
# 临时生效(立即应用于当前所有新连接)
sysctl -w net.core.rmem_default=524288
sysctl -w net.core.wmem_default=524288
sysctl -w net.core.rmem_max=1048576
sysctl -w net.core.wmem_max=1048576
# 持久化到/etc/sysctl.conf
注意:缓冲区不是越大越好。过大会增加延迟并浪费内存。实测1MB能在2000并发、Jumbo Frame环境下将吞吐提升约40%,而2MB以上收益递减。
2.2 开启TCP BBR算法
CUBIC虽然对长肥网络友好,但TiDB内网延迟通常在0.1-1ms之间,CUBIC在这种低延迟场景下探测带宽不够灵敏。切换到BBR能显著降低排队延迟:
sysctl -w net.ipv4.tcp_congestion_control=bbr
# 确认可用
sysctl net.ipv4.tcp_available_congestion_control
BBR通过带宽和RTT的联合估计,在高并发短连接场景(TiDB每次SQL可能触发多个gRPC流)下表现突出。我们在一台40Gbps网卡节点上对比,BBR比CUBIC的P99延迟下降32%。
2.3 调整net.core.somaxconn与backlog
TiDB实例在高并发建连时,若backlog溢出会导致Connection Reset。提高socket监听队列:
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
同时调整TiDB的server配置中max-grpc-send-msg-size和grpc-keepalive-time,配合网络参数避免连接抖动。
进阶阅读:此处可内链到“网络调优性能优化”指南。
三、网卡与中断调优:硬件层面的加速
3.1 启用RPS/RFS分散中断
现代网卡支持多队列,但并非每个队列都能均匀分担流量。如果服务器CPU核数充足(建议至少8核),手动配置RPS(Receive Packet Steering)让不同的连接绑定到不同核心:
echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus # 假设CPU mask为0b1111
同时开启RFS(Receive Flow Steering)让同一流的处理落在同一个CPU上,避免缓存乒乓:
sysctl -w net.core.rps_sock_flow_entries=32768
对于TiDB节点,建议每个TikV gRPC worker线程独占一核,用taskset绑定后配合网卡中断亲和性,可以消除跨NUMA访问带来的额外延迟。
3.2 开启Jumbo Frame
TiDB内网建议MTU设为9000。一个Jumbo Frame可承载6个标准以太网帧,减少头部开销和中断次数。注意交换机端也要同时启用(大多数数据中心交换机已支持)。使用ifconfig eth0 mtu 9000临时设置,持久化需写入网卡配置文件。部署前务必用ping -M do -s 8972(8972+28=9000)测试整条链路。
网络调优:四、gRPC连接池与流控
4.1 调整TiKV gRPC并发数
TiKV配置中的server.grpc-concurrency默认是4,在物理机环境建议提升到CPU核数或2倍核数(但不建议超过16)。每个gRPC worker处理来自TiDB的请求,如果并发不够,请求会在channel中排队,增加延迟:
[server]
grpc-concurrency = 8
grpc-stream-concurrency = 4
同时增大server.grpc-memory-pool-quota,避免内存不足导致流控触发。
4.2 开启gRPC压缩
对于宽表或批量查询,gRPC传输的数据量可能很大。启用snappy压缩可以降低带宽占用,但会增加CPU开销。建议只在内存带宽成为瓶颈时开启:
[server]
grpc-compression-type = snappy
测试方法:在TiDB侧用EXPLAIN ANALYZE观察network_bytes是否减半。
关联教程:此处可内链到“网络调优部署与验证”内容。
五、验证与回滚:安全第一
5.1 压力测试工具
使用go-ycsb模拟工作负载:
./bin/go-ycsb load tikv -P workloads/workloada -p tikv.pd=127.0.0.1:2379 --threads=64
./bin/go-ycsb run tikv -P workloads/workloada -p tikv.pd=127.0.0.1:2379 --threads=64 2>&1 | grep -E 'P99|OpTime'
重点关注P99延迟和吞吐。每项调优后运行5分钟稳定数据对比。
5.2 回滚方案
所有sysctl参数可通过sysctl -p恢复之前的备份配置文件。建议每次修改前执行:
sysctl -a > /tmp/sysctl_backup_$(date +%Y%m%d).conf
TiKV配置变更后执行tiup cluster reload -R tikv在线重启,注意观察PD的Region健康度。若压测出现明显退化(P99上升超过20%),立即恢复配置文件并重新reload。
延伸阅读:此处可内链到“网络调优配置案例”相关文章。
补充参考:此处可内链到“网络调优故障排查实例”。
六、总结
验证与回滚
TiDB存算分离场景下的网络调优不是单一参数的修改,而是一套组合拳:从TCP缓冲区到拥塞控制算法,从网卡中断亲和到gRPC并发度,每一环都可能成为木桶短板。本文提供的方法已在多个生产集群验证,关键在于按步骤逐一测试并记录基线。调优不是一劳永逸,随着业务增长和数据分布变化,半年度复审并配合perf轮询热点中断是保持低延迟的常规操作。记住:网络调优的目标不是让数据“跑得更快”,而是让等待时间消失。
延伸阅读
