由於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