Control: reassign -1 eatmydata
Control: affects -1 mongodb-server-core
Control: retitle -1 eatmydata is incompatible with tcmalloc

Hi,

On 09:24 Thu 06 Sep     , Michael Stapelberg wrote:
> This is not a bug with this package, but with mongodb-server:
> 
> root@gce1535991:~# mongod --version
> db version v3.4.15
> git version: 52e5b5fbaa3a2a5b1a217f5e647b5061817475f9
> OpenSSL version: OpenSSL 1.1.0f  25 May 2017
> allocator: tcmalloc
> modules: none
> build environment:
>     distarch: x86_64
>     target_arch: x86_64
> root@gce1535991:~# eatmydata mongod --version
> ^C

It looks like this is an incompatibility between eatmydata and tcmalloc:

(gdb) bt
#0  0x00007f4e24cf9c41 in __GI___nanosleep (requested_time=0x7ffcaa6523e0, 
    remaining=0x0) at ../sysdeps/unix/sysv/linux/nanosleep.c:28
#1  0x00007f4e25d08753 in base::internal::SpinLockDelay(int volatile*, int, int)
    () from /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4
#2  0x00007f4e25d08623 in SpinLock::SlowLock() ()
   from /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4
#3  0x00007f4e25cfcf54 in tcmalloc::ThreadCache::InitModule() ()
   from /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4
#4  0x00007f4e25cfd06d in tcmalloc::ThreadCache::CreateCacheIfNecessary() ()
   from /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4
#5  0x00007f4e25d0b20a in tc_calloc ()
   from /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4
#6  0x00007f4e2503ba25 in _dlerror_run (
    operate=operate@entry=0x7f4e2503b3b0 <dlsym_doit>, 
    args=args@entry=0x7ffcaa652500) at dlerror.c:140
#7  0x00007f4e2503b42f in __dlsym (handle=handle@entry=0xffffffffffffffff, 
    name=name@entry=0x7f4e26144000 "open") at dlsym.c:70
#8  0x00007f4e261430b1 in eatmydata_init () at libeatmydata/libeatmydata.c:80
#9  0x00007f4e261434a5 in eatmydata_is_hungry () at 
libeatmydata/libeatmydata.c:96
#10 msync (addr=<optimized out>, length=<optimized out>, flags=<optimized out>)
    at libeatmydata/libeatmydata.c:204
#11 0x00007f4e24911fc4 in ?? () from /usr/lib/x86_64-linux-gnu/libunwind.so.8
#12 0x00007f4e24915d21 in ?? () from /usr/lib/x86_64-linux-gnu/libunwind.so.8
#13 0x00007f4e2491601f in ?? () from /usr/lib/x86_64-linux-gnu/libunwind.so.8
#14 0x00007f4e24916569 in ?? () from /usr/lib/x86_64-linux-gnu/libunwind.so.8
#15 0x00007f4e24912ac1 in _ULx86_64_step ()
   from /usr/lib/x86_64-linux-gnu/libunwind.so.8
#16 0x00007f4e25d0905b in ?? () from /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4
#17 0x00007f4e25d09634 in GetStackTrace(void**, int, int) ()
   from /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4
#18 0x00007f4e25cfa6a6 in tcmalloc::PageHeap::GrowHeap(unsigned long) ()
   from /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4
#19 0x00007f4e25cfa93b in tcmalloc::PageHeap::New(unsigned long) ()
   from /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4
#20 0x00007f4e25cf8865 in tcmalloc::CentralFreeList::Populate() ()
   from /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4
#21 0x00007f4e25cf8a68 in tcmalloc::CentralFreeList::FetchFromOneSpansSafe(int, 
void**, void**) () from /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4
#22 0x00007f4e25cf8b67 in tcmalloc::CentralFreeList::RemoveRange(void**, 
void**, int) () from /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4
#23 0x00007f4e25cfc3a0 in tcmalloc::ThreadCache::FetchFromCentralCache(unsigned 
int, int, void* (*)(unsigned long)) ()
   from /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4
#24 0x00007f4e25d0c775 in tcmalloc::allocate_full_malloc_oom(unsigned long) ()
   from /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4
#25 0x00007f4e24f46416 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#26 0x00007f4e261af0ca in call_init (l=<optimized out>, argc=argc@entry=2, 
    argv=argv@entry=0x7ffcaa6535e8, env=env@entry=0x7ffcaa653600) at 
dl-init.c:72
#27 0x00007f4e261af1d6 in call_init (env=0x7ffcaa653600, argv=0x7ffcaa6535e8, 
    argc=2, l=<optimized out>) at dl-init.c:118
#28 _dl_init (main_map=0x7f4e261c9170, argc=2, argv=0x7ffcaa6535e8, 
    env=0x7ffcaa653600) at dl-init.c:119
#29 0x00007f4e261a124a in _dl_start_user () from /lib64/ld-linux-x86-64.so.2

Without digging too deep, AFAICT eatmydata is injected in tcmalloc's 
initialization path (#24) through msync (#10), which in turn tries to 
calloc() more memory, causing a deadlock. I'm reassigning this to 
eatmydata, since I guess it should be as transparent as possible and not 
interfere with the underlying memory allocator used.

Regards,
Apollon

Reply via email to