方案概要
- Loki支持对于用户指定的Key可以开启BloomFilter,解决根据requestid等在时间上分布集中的字段来检索日志的性能问题
性能预估和成本估计
假设:
- 单条日志500字节,压缩比5,单个chunk大小压缩后4MB,一个chunk中有50000条日志,1个chunk对应一个bloomfilter
- BloomFilter参数:误判率0.9%,散列函数个数5,1个元素占用10bit。参见附录
性能提升预估
1、requestId场景,假设在M个chunk中存在该数据
2、若没有BloomFilter,需要扫描N个chunk的数据,即需要对50000*N条日志进行json序列化和grep计算
3、若采用BloomFilter,N * 99.1%的chunk进行5次散列计算,0.9*N的chunk需要进行扫描确认;另外命中的M个chunk也需要扫描
4、假设json序列化和grep计算的性能和单次散列的耗时一样,实际情况散列的性能应该会好很多
有BloomFilter的计算次数 | 没有BloomFilter的计算次数 |
---|---|
5.855 * N + M * 50000 | 50000*N |
若 M << N,则性能优化大约为8000倍
成本增加预估
暂不考虑对于写入性能的影响导致ingester机器数目则增加
1条日志需要10bit,单条日志500 Byte;所以存储占比 1.25/500 = 0.25%