Are you building with -tags stringlabels?  This tends to reduce memory used 
by Labels.
Also I hope to reduce memory much more, though work stalled for a bit. (PR 
<https://github.com/prometheus/prometheus/pull/12304>)

Since Prometheus has to store all the output series in the head, I wouldn't 
take Cortex ruler impact as a guide to Prometheus impact.
But if you measure that please do update us.

I expect we would accept a PR adding an interface, unless it impacted 
performance noticeably.

Can you share a pointer to your Cortex branch?

Bryan
(Prometheus maintainer, ex-Cortex maintainer)

On Monday, 4 September 2023 at 16:14:40 UTC+1 Noam Dishon wrote:

> Hello,
>
> I’m from Microsoft managed Prometheus team. We are running multiple cortex 
> ruler instances.
> I’ve noticed that a large percentage of the memory of the ruler is 
> invested in keeping track of stale marks for series that no longer appear 
> in the result set.
>
> The complete set of labels of each iteration (of each rule, of each rule 
> group) are stored in memory, in seriesInPreviousEval 
> <https://github.com/prometheus/prometheus/blob/95e705612c1d557f1681bd081a841b78f93ee158/rules/manager.go#L325C8-L325C8>,
>  
> until the next iteration. They are then compared 
> <https://github.com/prometheus/prometheus/blob/95e705612c1d557f1681bd081a841b78f93ee158/rules/manager.go#L755C13-L755C13>
>  
> to the current iteration to see if any series is no longer returns from the 
> query. If so, that series is sent to the appender to be marked as stale.
>
>
> I did a POC where the seriesInPreviousEval of each rule in stored in a 
> disk temp file. The results shows a reduction of about 75%  in memory. 
> There is also a reduction of around 30% in CPU. No apparent negative affect 
> on evaluation duration.
>
> [image: Picture1.png]
> [image: Picture2.png]
> [image: Picture3.png]
> [image: Picture4.png]
> [image: Picture5.png]
>
> (These results are for cortex ruler, which does only rule processing, so 
> the effect is dramatic. But I’m positive that a standalone Prometheus 
> installation which handles a large number of rules will also benefit from 
> different handling of seriesInPreviousEval.)
>
>   
>
> I would like to propose a couple of changes in this area:
>
> 2    1.  Create an interface “PreviousTimeseriesStore” (or any better 
> name…)
>
> 2    2.      Create a default implementation 
> MemoryPreviousTimeseriesStore. It would be similar to the current one. 
> However, I do think we can improve the memory implementation. It currently 
> is based on map[string]labels.Labels 
> <https://github.com/prometheus/prometheus/blob/95e705612c1d557f1681bd081a841b78f93ee158/rules/manager.go#L739>
>  
> . The string part is made from the Bytes 
> <https://github.com/prometheus/prometheus/blob/b6f903b5f92b5458ad2244d9f442f7f859c01eb3/model/labels/labels.go#L72C33-L72C33>
>  
> of the labels.
>
> I think we can use instead a map[string]bool (effectively a hash-set).
>
> Only if the labels are needed (which is just when a series doesn’t appear 
> in the current result set) then we need the labels set, and it can then be 
> reconstructed from the string. It requires FromBytes function in Labels 
> pkg, which isn’t complicated.
>
> C    3. Create another implementation which stores the series into the 
> disk. The same string of each series will be stored in a file as lines. 
> Switching to this implementation will be done via configuration.
>
>
> 4. Custom implementation of the interface could be passed in 
> ManagerOptions
>
>  
>
> Thanks,
> Noam
>
>  
>
>  
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Prometheus Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/prometheus-developers/6666c947-352f-4f0e-9f19-ff9b94c149ben%40googlegroups.com.

Reply via email to