【PD性能问题】TiKV请求集中期间,PD Leader的CPU占用率异常偏高到7100%

【业务模型】
业务侧,客户端直接通过tikv go client进行tikv事务读写,不经过tidb;
每天晚上到凌晨(22:00-6:00),客户端有集中tikv请求,且QPS是周期脉冲型(即,请求集中期间,交替出现约3min的高QPS和约3min的低QPS)
整个集群里的Region数量不多,约5K
【遇到的问题:问题现象及影响】
在上述集中请求期间,PD Leader的CPU也随着tikv请求大幅波动,占用率最高可达7000%到8000%。通过pprof和perf定位到futex内部自旋占的CPU时间占比最大,pprof定位到futex调用方是go runtime的gc和调度器,没能直接和tso、心跳、operator等pd业务路径建立联系
这个集群按照官方文档修改过tso生成参数,但官方文档目前的写法是这种改法只会影响【10%】的CPU占用率。另外一个无法解释的现象是,另一个硬件条件相同、采取同样参数修改方式但负载形态不同的集群(tikv请求数目高且恒定,非脉冲)没有出现cpu占用的异常升高。参数如下所示:tso-update-physical-interval: 1ms
TSO 配置文件描述 | TiDB 文档中心
【部署方式】
物理机。受到客观条件限制,PD Leader所在节点上还有2个tikv服务,pd和tikv都部署在nvme磁盘上。此外,该节点上还有若干个内置tikv go client的服务,该服务的QPS也和PD/TiKV QPS有同样的周期。集群的其他每个节点也有2个tikv服务和这些tikv client(与问题节点的区别就是没有PD Leader),其CPU占用情况可参考监控截图。

【监控有关截图-有问题的集群】







【pprof火焰图】

【perf符号表】


【TiDB 使用环境】生产环境
【TiDB 版本】v8.5.3
【kernel版本】
5.10,定制发行版
【CPU】
Architecture: aarch64
CPU op-mode(s): 64-bit
Byte Order: Little Endian
CPU(s): 128
On-line CPU(s) list: 0-127
Vendor ID: HiSilicon
BIOS Vendor ID: HiSilicon
Model name: Kunpeng-920
BIOS Model name: HUAWEI Kunpeng 920 7260
Model: 0
Thread(s) per core: 1
Core(s) per socket: 64
Socket(s): 2
Stepping: 0x1
BogoMIPS: 200.00
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma dcpop asimddp asimdfhm
Caches (sum of all):
L1d: 8 MiB (128 instances)
L1i: 8 MiB (128 instances)
L2: 64 MiB (128 instances)
L3: 128 MiB (4 instances)
NUMA:
NUMA node(s): 4
NUMA node0 CPU(s): 0-31
NUMA node1 CPU(s): 32-63
NUMA node2 CPU(s): 64-95
NUMA node3 CPU(s): 96-127

【内存大小】376GB
【集群数据量】2.1T
【集群节点数】10台物理机,每个物理机上2个tikv实例
【问题复现路径】见业务模型描述
【附:上下游另一个比较正常的集群】
该集群8个节点,每个节点上有6个tikv。同样不使用tidb。tikv配置(含tso)、CPU型号和系统版本与之前的集群相同。该集群有约45K个Region。和上面的集群接入的是不同的tikv go client,但这些tikv client请求之间有上下游关系。(注:该集群同样设置了tso-update-physical-interval: 1ms)


想问下各位是否有可排查的方向,非常感谢!

另一个正常的集群配置也是tso-update-physical-interval: 1ms吗,这个配置业务高峰的话感觉会请求tso好频繁。

  • Decreasing this configuration item might increase the CPU usage of PD. According to the test, compared with the interval of 50ms, the CPU usage of PD will increase by about 10% when the interval is 1ms.
    官方文档说间隔调整为1ms cpu消耗增加10%是针对默认场景(即有tidb的场景)还是这种没有tidb的场景也适用,只能官方大大来解释了

是的,所以比较奇怪

或者能把这个值调大点再观察吗

解决了吗,我好像也遇到了这个问题。

响应不过来了,很明显集中请求占用的资源较大

pd所在节点,绑过numa吗?把pd和tikv绑到不同的numa试试?

有调整过吗,后面结果怎么样

CPU高就是说有大量并发运行慢进程。这套是一直不正常还是才出现不正常?有没有正常时的性能数据?PD所在的物理磁盘性能如何?磁盘有没有满载和等待IO

感谢老师分享

1 个赞

试试关闭NUMA, cpu绑核

建议启用 TSO 批量与复用,调整和减少 futex 自旋与调度延迟

这个感觉是TSO调用太频繁了

设置一个top 定时任务收集cpu使用的进程情况
#!/bin/bash

— 配置部分 —

日志文件保存路径,请根据实际情况修改

LOG_DIR=“/path/to/your/logs”
LOG_FILE=“${LOG_DIR}/cpu_top_processes.log”

— 逻辑部分 —

1. 确保日志目录存在

mkdir -p “$LOG_DIR”

2. 获取当前时间戳

timestamp=$(date ‘+%Y-%m-%d %H:%M:%S’)

3. 获取CPU占用率排名前10的进程信息

使用 ps 命令,按CPU使用率降序排序,并取前11行(包含表头)

然后在每一行前面加上时间戳

ps aux --sort=-%cpu | head -n 11 | while read line; do
echo “$timestamp, $line” >> “$LOG_FILE”
done

crontab -e
*/5 * * * * /full/path/to/your/monitor_cpu.sh

先修改pd.config.yml
tso-update-physical-interval: 10ms # 先从1ms改回10ms/20ms
至少 5ms,观察CPU是否立刻下降

这个配置是直接reload就可以了嘛

  1. 从有监控记录以来就不正常(因此没有正常时的数据)
  2. nvme盘,iops远未达到瓶颈,不存在IO时延问题,profile结果也不支持io瓶颈

作为对比的集群的TSO响应量和问题集群的TSO响应量都在45K ops左右