首页/数据/NoSQL 速查/序列基数与内存控制

序列基数与内存控制

序列基数 = measurement 与全部标签组合的唯一数量;每个序列都要维护索引与内存结构,基数失控是时序库最常见的性能故障源。

NoSQL 速查数据更新于 2026-10-13

基数是什么

序列基数指 measurement 与全部标签取值组合出的唯一序列数量。时序库按序列组织写入与查询,每条序列都要维护索引与内存结构,所以基数不是抽象指标,而是直接决定内存占用与写入速度的硬约束;基数失控是时序库最常见的性能故障源。

基本信息

适用产品InfluxDB 1.x / 2.x、Prometheus 等标签模型时序库
基数来源标签键数量 × 每个键的取值数量,组合相乘
危险信号内存持续增长、写入变慢、查询超时、日志出现 too many series
控制手段移除无界标签、限制取值、预聚合采样、按维度分桶拆库
查看方式InfluxDB 用 SHOW SERIES CARDINALITY,Prometheus 用 promtool tsdb analyze

典型使用场景

  • 接入新数据源前预估基数:标签键能取多少值,能不能枚举穷举
  • 容量评审按增长算:标签取值随业务扩张翻倍,内存需求也跟着涨
  • 排查内存只见涨不见落:先区分是查询缓存还是序列索引
  • 排查写入变慢:批量写超时往往先命中序列索引这一环
  • 重新设计标签方案:决定哪些字段进标签、哪些留在字段里

示例

示例
# InfluxDB v1:查看序列基数(需开启相关统计)
SHOW SERIES CARDINALITY
SHOW SERIES CARDINALITY FROM "cpu"

# InfluxDB v1:看某个 measurement 下的标签键与取值规模
SHOW TAG KEYS FROM "cpu"
SHOW TAG VALUES FROM "cpu" WITH KEY = "host"

# InfluxDB 2.x:用 CLI 检查 bucket 相关统计
influx bucket list

# Prometheus:用 promtool 检查本地 TSDB 的序列规模
promtool tsdb analyze /var/lib/prometheus

异常信号与应对

信号表现应对
内存持续增长序列索引常驻内存且不随查询结束释放定位高基数标签从设计上移除
写入变慢每批写入都要更新序列索引与 WAL减少标签取值数量,或改批量提交
查询超时高基数标签过滤要扫过大量序列换更粗粒度标签,或用预聚合表回答
日志出现 too many series触达服务端保护阈值先治理标签组合,再考虑拆分实例
备份与压缩变慢元数据体积随序列数膨胀按业务或地域拆分实例,缩小单实例规模
设计阶段就把标签取值枚举化:区域、机型、状态这类可控维度适合当标签;用户 ID、URL、容器 ID、请求 ID 通常不适合,它们会把序列数推向无界。
高基数维度放字段(field)而不是标签(tag):在 InfluxDB 的模型里字段不参与序列索引,同样的取值放对位置,基数可以差出好几个数量级。
标签里放高精度数值(毫秒时间戳、浮点采样值、递增主键)等于给每个数据点建一条序列,写入几条就会把内存打满;这类值一律进字段。

易错点

  • 上线初基数千级看不出问题,运营半年后标签取值翻倍才暴露,容量评审要按增长算
  • 给标签做基数排名只能看到现状,排查还要结合标签键的取值增长趋势
  • 把用户 ID、URL、请求 ID 当标签,写入路径直接生成海量序列,内存与写入同时恶化
  • 标签值里放时间戳或浮点采样值,等价于每点一条序列 → 这类维度必须放字段
  • 以为加内存就能解决基数问题,实际上序列增长会持续吃掉新增内存 → 从标签设计上治理

数据来源与参考

  • InfluxData Docs: Resolve high series cardinality
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌