prometheus对接influxdb压测结果
由于prometheus单纯依靠本地存储远不足以应对长期历史数据持久化,因此依靠influxdb作为远端存储解决以上问题成为一种常见的策略。本次压测的目的为:一方面比较influxdb与prometheus不同规格下的性能指标,另一方面根据不同的性能指标,选出最优的匹配规格供参考,避免出现一端性能浪费以及一端成为瓶颈的情况。
influxdb规格与性能指标
参考[TSDB for InfluxDB规格测试]的结果,四种规格的Influxdb与相应指标如下:
规格 | db | timeseries | tps | qps |
---|---|---|---|---|
2c8g | 1 | 50000 | 40075.7 | 0.6 |
4c16g | 1 | 100000 | 76587.6 | 0.6 |
8c32g | 1 | 200000 | 123871 | 1.9 |
16c64g | 1 | 400000 | 182279.4 | 2.3 |
部署prometheus采取两种规格8c32g,16c64g。
为了尽量避免网络延迟对写入性能指标的影响,以上influxdb实例与prometheus实例均处于同一VPC下,通过内网访问,内网带宽峰值:5Gbps
性能摸底:
首次规格匹配选用prometheus(8c32g)与influxdb(16c64g),以influxdb(16c64g)18w的写入性能为标准,使用Avalanche作为数据源,产生18w/s的数据指标用于prometheus拉取并写入远端存储influxdb。
压测数据源采用Avalanche数据源,Avalanche具体配置参数如下:
--avaCount=6 --avaBin=/root/prometheus-avalanche/cmd/avalanche --avaMetricCount=5000 --avaSeriesCount=30 --avaValueInt=5 --avaSeriesInt=360000 --avaMetricInt=3000
测试结果:
内存使用量:
- 8c32g prometheus
- 16c64g influxdb
以上可见,prometheus占用内存较大,其存储机制为数据每2小时落盘一次,8c32g prometheus内存成为瓶颈,不足以支撑到2小时数据落盘,最终导致prometheus server崩溃。
CPU使用率:
- 8c32g prometheus
- 16c64g influxdb
以上可见,Prometheus cpu占用不大,influxdb cpu使用率近80%,但仍可稳定运行。
网络流入流出速率:
- 8c32g prometheus
- 16c64g influxdb
综上所述:
prometheus cpu占用率不大,对内存需求量大。influxdb相反,内存占用不大,cpu需求量大。网络不是瓶颈,5Gbps带宽远足以支撑数据传输。以上性能摸底结论:8c32g prometheus内存写爆,16c64g influxdb可稳定运行。
prometheus(16c64g)+influxdb(16c64g)
同样以18w/s数据点规格进行写入,稳定运行36h:
内存使用量:
- prometheus
- influxdb
CPU使用率:
- prometheus
- Influxdb
prometheus(8c32g)+influxdb(8c32g)
以9w/s数据点规格进行写入,稳定运行36h:
内存使用量:
- prometheus
- influxdb
CPU使用率:
- prometheus
- influxdb
结论:
本次压测可以看出,prometheus瓶颈在于内存,influxdb的瓶颈在于cpu,内网带宽不是问题,远足以支撑数据传输。为了避免资源浪费,性能输出最大化的条件下,建议使用以下两种规格组合:
- prometheus(16c64g)+influxdb(16c64g):
在带宽足够,平均label数量小于等于15的条件下,可稳定支持18w/s的写入。
- prometheus(8c32g)+influxdb(8c32g):
在带宽足够,平均label数量小于等于15的条件下,可稳定支持9w/s的写入。
查询测试:
本次查询测试基于JMeter测试工具,主要通过JMeter支持的HTTP Request任务摸版,模拟多用户并发情景,向Prometheus Server的HTTP API(Localhost:9090/api/vi)发送符合PromQL语义的query,JMeter会搜集相关的query latency等信息。
prometheus(16c64g)+influxdb(16c64g):
- 1MB/query
- 10MB/query
prometheus(8c32g)+influxdb(8c32g)
- 4MB/query