遠端寫入調優
Prometheus 為遠端寫入(remote write)實現了合理的預設值,但許多使用者有不同的需求,並希望最佳化其遠端設定。
本頁面介紹了可透過 遠端寫入配置 獲得的調優引數。
遠端寫入特性
每個遠端寫入目的地都會啟動一個佇列,該佇列從預寫日誌(WAL)中讀取資料,將樣本寫入屬於某個分片(shard)的記憶體佇列中,然後該分片向配置的端點發送請求。資料流向如下:
|--> queue (shard_1) --> remote endpoint
WAL --|--> queue (shard_...) --> remote endpoint
|--> queue (shard_n) --> remote endpoint
當一個分片積壓並填滿其佇列時,Prometheus 將阻塞從 WAL 讀取資料到任何分片的操作。失敗的請求將會被重試且不會丟失資料,除非遠端端點持續下線超過 2 小時。2 小時後,WAL 將被壓縮,未傳送的資料將會丟失。
在執行過程中,Prometheus 將根據傳入的樣本速率、未傳送的待處理樣本數以及傳送每個樣本所需的時間,持續計算要使用的最佳分片數量。
資源佔用
使用遠端寫入會增加 Prometheus 的記憶體佔用。大多數使用者反饋記憶體使用量增加了約 25%,但該數字取決於資料的形態。對於 WAL 中的每個時間序列(series),遠端寫入程式碼會快取序列 ID 到標籤值的對映,因此大量的時間序列變動(churn)會導致記憶體使用量顯著增加。
除了序列快取之外,每個分片及其佇列也會增加記憶體使用量。分片記憶體與 分片數量 * (capacity + max_samples_per_send) 成正比。在調優時,如果增加了 capacity 和 max_samples_per_send,請考慮同時減少 max_shards,以避免意外導致記憶體不足。capacity: 10000 和 max_samples_per_send: 2000 的預設值會將每個分片的記憶體使用量限制在 2 MB 以下。
遠端寫入也會增加 CPU 和網路的使用。然而,由於上述相同的原因,很難預測具體會增加多少。如果您的 Prometheus 伺服器在透過遠端寫入傳送樣本時出現滯後(prometheus_remote_storage_samples_pending),通常的做法是檢查 CPU 和網路是否達到飽和。
引數
所有相關引數都可以在遠端寫入配置的 queue_config 部分中找到。
capacity
Capacity 控制在阻塞從 WAL 讀取資料之前,每個分片在記憶體中快取的樣本數量。一旦 WAL 被阻塞,樣本就無法追加到任何分片,所有的吞吐都將停止。
在大多數情況下,容量(capacity)應該足夠高,以避免阻塞其他分片,但過高的容量可能會導致過多的記憶體消耗,並在重新分片(resharding)期間需要更長的時間來清理佇列。建議將容量設定為 max_samples_per_send 的 3 到 10 倍。
max_shards
Max shards 配置了 Prometheus 為每個遠端寫入佇列使用的最大分片數(即併發度)。Prometheus 會盡量不使用過多的分片,但如果隊列出現積壓,遠端寫入元件會增加分片數量,最高可達到最大分片數,以提高吞吐量。除非是遠端寫入到一個非常慢的端點,否則通常不需要將 max_shards 增加到預設值以上。然而,如果有可能會壓垮遠端端點,或者為了在資料積壓時減少記憶體使用,可能需要減少最大分片數。
min_shards
Min shards 配置了 Prometheus 使用的最小分片數,即遠端寫入啟動時使用的分片數量。如果遠端寫入出現滯後,Prometheus 會自動擴容分片數量,因此大多數使用者不需要調整此引數。然而,增加最小分片數可以讓 Prometheus 在計算所需分片數量的初始階段避免出現滯後。
max_samples_per_send
可以根據所使用的後端來調整每次傳送的最大樣本數(Max samples per send)。許多系統在每批發送更多樣本時執行得非常好,且延遲不會顯著增加。但有些後端如果嘗試在每個請求中傳送大量樣本,則會出現問題。預設值足夠小,適用於大多數系統。
batch_send_deadline
批次傳送截止時間(Batch send deadline)設定了單個分片兩次傳送之間的最大時間間隔。即使佇列中的分片未達到 max_samples_per_send,也會發送請求。對於資料量較小且對延遲不敏感的系統,可以增加批次傳送截止時間,以提高請求效率。
min_backoff
最小退避時間(Min backoff)控制重試失敗請求之前等待的最小時間。增加退避時間可以在遠端端點恢復上線時分散請求。每次失敗的請求都會使退避間隔翻倍,最高可達 max_backoff。
max_backoff
最大退避時間(Max backoff)控制重試失敗請求之前等待的最大時間。