Spanner单节点CPU占用过高问题排查咨询
Spanner单节点CPU占用过高问题
基本情况
当前QPS仅200-300,但Spanner单节点CPU占用已达~50%。部署细节:
- 40个Pod,每个Pod对应订阅一个PubSub Lite分区拉取消息
- 每条消息是批量压缩事件(包含10-30个事件),从中提取约140个主键,通过IN子句执行数据库查询
- 每个Pod配置会话池:最大30个会话、5条gRPC通道,查询使用参数化方式
查询代码
stmt := spanner.Statement{ SQL: query, Params: paramsVal, } readOnlyTxn := cc.client.Single() defer readOnlyTxn.Close() iter := readOnlyTxn.WithTimestampBound(spanner.MaxStaleness(time.Hour)).Query(cc.ctx, stmt)
会话池配置代码
config := spanner.ClientConfig{ NumChannels: numGRPCChannels, SessionLabels: labelMap, SessionPoolConfig: spanner.SessionPoolConfig{ InactiveTransactionRemovalOptions: spanner.InactiveTransactionRemovalOptions{ ActionOnInactiveTransaction: spanner.WarnAndClose, }, MaxOpened: uint64(sessionPoolSize), }, }
异常点与疑问
- Spanner指标显示活跃会话数超过会话池配置的最大值,不确定是否会造成额外CPU开销
- 用主键的IN子句查询是否会影响性能?
- 明明是主键查询,但查询计划显示全表扫描,这正常吗?查询计划显示有20次RPC调用,CPU总耗时和响应时间都很高
- 查询统计数据未发现明显异常;之前用预定义主键做PoC时,单节点能跑到22K QPS且CPU占用70%,但生产环境数据是动态生成的,怀疑预编译语句没被缓存
相关图表
- Spanner指标图
- 查询洞察图
- 查询计划图
- 查询执行统计图
- 查询摘要图
内容的提问来源于stack exchange,提问作者Vijay Srinivasaraghavan
相关产品推荐
相关产品推荐

