+1

Great work.

Thanks,
Penghui

On Wed, Feb 23, 2022 at 8:56 PM Enrico Olivelli <eolive...@gmail.com> wrote:

> Cool
>
> I also observed such problems but I haven't time to work on a proposal.
>
> Looking forward to see your patch
>
>
> Enrico
>
> Il Mer 23 Feb 2022, 10:43 Jiuming Tao <jm...@streamnative.io.invalid> ha
> scritto:
>
> > Hi all,
> >
> > 1. I have learned that the /metrics endpoint will be requested by more
> than
> > one metrics collect system. In the condition, I want to reimplement
> > `PromethuesMetricsServlet` by sliding window.
> > PrometheusMetricsGenerator#generate will be invoked once in a period(such
> > as 1 minute), the result will be cached and returned for every metrics
> > collect request in the period directly. It could save memory and avoid
> high
> > CPU usage.
> >
> > 2. When there are hundreds MB metrics data collected, it causes high heap
> > memory usage, high CPU usage and GC pressure. In the
> > `PrometheusMetricsGenerator#generate` method, it uses
> > `ByteBufAllocator.DEFAULT.heapBuffer()` to allocate memory for writing
> > metrics data. The default size of `ByteBufAllocator.DEFAULT.heapBuffer()`
> > is 256 bytes, when the buffer resizes, the new buffer capacity is 512
> > bytes(power of 2) and with `mem_copy` operation.
> > If I want to write 100 MB data to the buffer, the current buffer size is
> > 128 MB, and the total memory usage is close to 256 MB (256bytes + 512
> bytes
> > + 1k + .... + 64MB + 128MB). When the buffer size is greater than netty
> > buffer chunkSize(16 MB), it will be allocated as UnpooledHeapByteBuf in
> the
> > heap. After writing metrics data into the buffer, return it to the client
> > by jetty, jetty will copy it into jetty's buffer with memory allocation
> in
> > the heap, again!
> > In this condition, for the purpose of saving memory, avoid high CPU
> > usage(too much memory allocations and `mem_copy` operations) and reducing
> > GC pressure, I want to change `ByteBufAllocator.DEFAULT.heapBuffer()` to
> > `ByteBufAllocator.DEFAULT.compositeDirectBuffer()`, it wouldn't cause
> > `mem_copy` operations and huge memory allocations(CompositeDirectByteBuf
> is
> > a bit slowly in read/write, but it's worth). After writing data, I will
> > call the `HttpOutput#write(ByteBuffer)` method and write it to the
> client,
> > the method won't cause `mem_copy` (I have to wrap ByteBuf to ByteBuffer,
> if
> > ByteBuf wrapped, there will be zero-copy).
> > I tested NO.2 in my local, and it turns out performance is better than
> the
> > heap buffer(below images).
> >
> >
> >
> https://drive.google.com/file/d/1-0drrs9s9kZ2NbbVmzQDwPHdgtpE6QyW/view?usp=sharing
> > (CompositeDirectByteBuf)
> >
> >
> https://drive.google.com/file/d/1-0m15YdsjBudsiweZ4DO7aU3bOFeK17w/view?usp=sharing
> > (PooledHeapByteBuf)
> >
> > Thanks,
> > Tao Jiuming
> >
>

Reply via email to