A code review has demonstrated that Arrow uses posix_memalign ... I do
believe mimalloc preload is "catching" this but I didn't tool it with my
customization.  Still interested in any guidance on the other points
raised, and sorry for some of this being noise.

-John

On Tue, Jun 14, 2022 at 9:06 AM John Muehlhausen <j...@jgm.org> wrote:

> Hello,
>
> This comment is regarding installation with `apt` on ubuntu 18.04 ...
> `libarrow-dev/bionic,now 8.0.0-1 amd64`
>
> I'm a bit confused about the memory pool situation:
>
> * I run with `ARROW_DEFAULT_MEMORY_POOL=system` and check that
> `arrow::default_memory_pool()->backend_name() ==
> arrow::system_memory_pool()->backend_name()`
>
> * I then LD_PRELOAD a customized (*) mimalloc according to the directions
> at the mimalloc git repo and things like `strm->Reset(INT32_MAX);` seem not
> to be hitting it... I figured that is a big enough chunk to jostle it into
> doing something... `BufferOutputStream::Create(INT32_MAX)` is also not
> intercepted by mimalloc.  Is the "system" pool somehow going around the
> typical allocation interfaces on linux?  I built my own .so and linked it
> to the app and malloc() is getting intercepted.
>
> * `arrow::mimalloc_memory_pool(&mmmp);` does return something... but
> apparently not "my" mimalloc ... statically linked?
>
> * what is going on in Arrow with constructor (pre-main()) allocations?
> Some of this does hit my LD_PRELOADed mimalloc
>
> * any way to get symbols for the apt-installed libs or would I need to
> build from source to get backtrace with symbols? (for chasing down sources
> of allocations)
>
> * what is the C++ lib equivalent of the following from the Python code?  I
> figure I could stop trying to understand the built-in/default allocators if
> I could just replace them... but this may also intersect with my question
> about constructors.  Maybe I'd have to make sure my constructor runs first
> to perform the switch-a-roo before anything else tries to use the default
> pool?
>
> ```
> namespace py {
>
> static std::mutex memory_pool_mutex;
> static MemoryPool* default_python_pool = nullptr;
>
> void set_default_memory_pool(MemoryPool* pool) {
>   std::lock_guard<std::mutex> guard(memory_pool_mutex);
>   default_python_pool = pool;
> }
> ```
>
>
> (*) the mimalloc customization: the main app has a weak reference that
> ends up defined by the LD_PRELOAD mimalloc, where the function so-supplied
> allows the app to install a function pointer (back to the main app) that
> gets called (if defined) at various interesting points in mimalloc
>
>
> Thanks,
> John
>

Reply via email to