I tried benchmarking BenchmarkSampleSend and the results seem awful, from ~150000 B/op and ~250 allocs/op to ~1400000 B/op to ~170000 allocs/op. Profiling the code, it seems like labelsToLabelsProto is the offender, as it allocates a *prompb.Label per label. I experimented with using a map[string]string instead, but it seems like the results aren't that much different.
One potential solution to this - which would require a relatively big refactor - would be to replace repeated Label labels with the raw byte representation that is held inside of labels_stringlabels, and switch from an array of Sample to two arrays of Timestamp and Value. Just doing the former seems to speed up the benchmarks by 30% (while allocations are still huge because of the *prompb.Sample). On Friday, February 16, 2024 at 10:03:57 AM UTC+1 Bryan Boreham wrote: > Do you have one for sending remote-write data? The one you linked > is RemoteWritehandler which is for receiving. > > From what I've seen elsewhere, Proto3 structs have extra data members > which I expect to show significantly increased memory allocation. > Unfortunately the remote-write structure with a struct for every > name-value pair and all labels repeated is maximally bad for this. > > Bryan > > On Wednesday 14 February 2024 at 18:32:28 UTC [email protected] wrote: > >> Would the already present benchmarks in the code be sufficient? >> >> If so, here are the remote read >> <https://github.com/mircodz/go-proto-bench/blob/main/benchmarks/rr_baseline_csproto> >> , remote write >> <https://github.com/mircodz/go-proto-bench/blob/main/benchmarks/rw_baseline_csproto>, >> >> and a cheeky remote read with pooling for snappy decompression >> <https://github.com/mircodz/go-proto-bench/blob/main/benchmarks/rw_baseline_csproto_pooling> >> comparisons >> (ran with -tags stringlabels), along side the raw results in the same >> directory. >> The remote read tests don't look great, but I might have missed something >> inside of the code. >> >> Note: I took the liberty to use 10 labels for both tests >> <https://github.com/prometheus/prometheus/commit/7080c6ac8cc4175d79a1fd047cb17f0976f57130> >> . >> >> On Wednesday, February 14, 2024 at 10:18:30 AM UTC+1 Bryan Boreham wrote: >> >>> No need to apologise! >>> >>> Do you have benchmarks using the Prometheus remote-read and remote-write >>> protobufs ? >>> >>> On Wednesday 14 February 2024 at 08:08:37 UTC [email protected] wrote: >>> >>>> Hi all, sorry to disrupt this discussion. >>>> >>>> Before stumbling upon this thread, I had worked on a separate fork >>>> <https://github.com/prometheus/prometheus/compare/main...mircodz:prometheus:deprecate-gogo> >>>> >>>> to deprecate gogo in favor of csproto, as compiling it using >>>> enableunsafedecode=true seems >>>> <https://github.com/mircodz/go-proto-bench> to give performance even >>>> better than vtproto. (Note, I have only compared the performance of >>>> csproto and vtproto to the official proto generator, and not gogo). >>>> As of now the branch compiles and passes all tests, but I haven't gone >>>> through the code to check for possible optimizations that could arise from >>>> migrating away from gogo. >>>> Would you be interested in a pull request? As mentioned above, this >>>> would be also a good opportunity to cleanup the proto generation code >>>> using >>>> buf. >>>> >>>> P.S.: This would depend on a change in prometheus/client_model, but >>>> would allow removing the duplicate proto definition in the repository. >>>> >>>> King Regards, >>>> Mirco De Zorzi. >>>> On Monday, February 5, 2024 at 10:58:17 AM UTC+1 Bartłomiej Płotka >>>> wrote: >>>> >>>>> Issue for reference: >>>>> https://github.com/prometheus/prometheus/issues/11908 >>>>> >>>>> Kind Regards, >>>>> Bartek Płotka >>>>> >>>>> On Saturday, February 3, 2024 at 12:56:09 PM UTC Bartłomiej Płotka >>>>> wrote: >>>>> >>>>>> We did a bit of testing for remote write 2.0 work (e.g. here >>>>>> <https://github.com/bwplotka/go-proto-bench>) for gogo vs different >>>>>> plugins, and vtproto is the most promising even with more pointers. >>>>>> >>>>>> We have to get rid of nullables, yes (more pointers, pore separate >>>>>> objects on heap, generally more allocs), but even for our current remote >>>>>> write (especially with interning) there is literally not many slices >>>>>> (with >>>>>> many elements) that use custom types. And even if there are (e.g. >>>>>> []*TimeSeries) those objects might be worth to keep separate on the >>>>>> heap. >>>>>> This is also what protobuf direction will be, given the vision of >>>>>> "opaque >>>>>> API" (ability to load/allocate/ parts of proto message in a lazy way). >>>>>> >>>>>> Furthermore we hit a roadblock a bit, as a apparently "optional >>>>>> <https://github.com/gogo/protobuf/issues/713>" proto3 option does >>>>>> not work with proto. This makes it maybe even more worth doing. (e.g. >>>>>> PRW >>>>>> 2.0 optional timestamp int64 would not be able to have valid value of 0 >>>>>> etc). >>>>>> >>>>>> I think I would consider doing this work this summer, perhaps as a GSoC >>>>>> mentorship >>>>>> <https://github.com/cncf/mentoring/blob/main/programs/summerofcode/2024.md>. >>>>>> >>>>>> Anyone would like to mentor/co-mentor that with me or Callum? (: >>>>>> >>>>>> Kind Regards, >>>>>> Bartek Plotka >>>>>> >>>>>> On Wednesday, November 29, 2023 at 2:38:14 AM UTC [email protected] >>>>>> wrote: >>>>>> >>>>>>> As part of all the remote write proto changes I've been working on I >>>>>>> tried out moving us off of gogoproto, cherry picking Austin's original >>>>>>> changes into a new branch off of the current main branch. >>>>>>> >>>>>>> As Tom mentioned, the main reason for using gogoproto is that >>>>>>> `repeated SomeMessageType = n;` fields within messages are generated as >>>>>>> slices of concrete types rather than slices of pointers, which makes it >>>>>>> much easier to write code that avoids extra memory allocations. From >>>>>>> what >>>>>>> I've hacked together, we can get similar (or potentially better) >>>>>>> performance using vtproto and their pooling feature, but it's going to >>>>>>> be a >>>>>>> big refactoring effort. >>>>>>> >>>>>>> It might, however, be worth it. It looks to me like even with >>>>>>> slightly more allocations the proto marshalling is faster and the >>>>>>> marshalled message is smaller. I'll push what I have later this week >>>>>>> when >>>>>>> I'm more confident it's working correctly. >>>>>>> >>>>>>> On Thursday, July 8, 2021 at 2:42:41 AM UTC-7 Frederic Branczyk >>>>>>> wrote: >>>>>>> >>>>>>>> I think I'd be most useful to rebase, and create a PR from this, >>>>>>>> then we can see whether tests pass and we can run prombench (although >>>>>>>> I >>>>>>>> don't think there are any perf tests that involve the proto parts). >>>>>>>> Then we >>>>>>>> can discuss on there and figure out where to take this. >>>>>>>> >>>>>>>> Thank you so much for the work you have already put into this! >>>>>>>> >>>>>>>> On Mon, 21 Jun 2021 at 19:53, Austin Cawley-Edwards < >>>>>>>> [email protected]> wrote: >>>>>>>> >>>>>>>>> I've updated my branch ( >>>>>>>>> https://github.com/austince/prometheus/tree/feat/drop-gogo) to >>>>>>>>> use both the vitess plugin and the buf tool, which indeed fit very >>>>>>>>> nicely >>>>>>>>> together. >>>>>>>>> >>>>>>>>> I've only updated the code enough for it to compile, have not >>>>>>>>> investigated the semantic differences. This is likely the furthest >>>>>>>>> I'll be >>>>>>>>> able to take this for a bit, so feedback and playing around are >>>>>>>>> welcome and >>>>>>>>> appreciated if this is where we'd like protobuf in Prometheus to go >>>>>>>>> :) >>>>>>>>> >>>>>>>>> Best, >>>>>>>>> Austin >>>>>>>>> >>>>>>>>> On Thu, Jun 17, 2021 at 12:56 PM Frederic Branczyk < >>>>>>>>> [email protected]> wrote: >>>>>>>>> >>>>>>>>>> I have heard great thing, but haven’t used it. Wrongfully thought >>>>>>>>>> that they are mutually exclusive but turns out they are actually >>>>>>>>>> complementary: >>>>>>>>>> https://twitter.com/fredbrancz/status/1405192828049838080?s=21 >>>>>>>>>> >>>>>>>>>> We should probably do an investigation of the combination. >>>>>>>>>> >>>>>>>>>> On Thu 17. Jun 2021 at 18:26, Austin Cawley-Edwards < >>>>>>>>>> [email protected]> wrote: >>>>>>>>>> >>>>>>>>>>> Just saw this on the CNCF blog as well, seems like a promising >>>>>>>>>>> library. >>>>>>>>>>> >>>>>>>>>>> Tangentially, have you heard of https://github.com/bufbuild/buf? >>>>>>>>>>> It seems much nicer than compiling with shell scripts and protoc. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- 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/905a998d-998b-4058-a6c9-112c30c9ee59n%40googlegroups.com.

