报错是这么冒出来的。自建 Loki 把 user_id 和 request_id 都做成了标签,跑了三周后 series 数到 120 万,查一周日志必超时,写入侧也开始报 too many outstanding requests。
中间走过弯路,把「查询范围过大,退化成全量扫描」当成主因,改完现象没变。
排查方向其实有限,先把可能性排一排。高基数字段被当成标签建了索引。也可能是日志改造后新增标签,没有评估基数。
还有一种情况,保留期设得太长,冷数据仍参与索引。
第一件事是统计各标签的取值数量
logcli series --analyze-labels '{app="llm"}' --since=24h
接着把高基数字段改成结构化元数据
python relabel.py --drop user_id,request_id --keep app,level
然后用解析器替代标签过滤
logcli query '{app="llm"} | json | request_id="abc"' --since=1h
缩短保留期并清理历史数据
logcli delete --query '{app="llm"}' --from 2026-08-01 --to 2026-10-01
怎么算真的好了,看的是同一批现象。series 数降到万级以内,一周范围查询十秒内返回,写入不再报并发超限。
提醒一点。标签是用来切分数据集的,不是用来存业务主键的,基数一旦上去只能靠删数据恢复。这类问题最好一次改到位,反复小改反而容易把原因搅混。
