Jemalloc missing from docker container?

Hi, I tried compiling dgraph from the source and I have the jemalloc dependency being built in /usr/local/lib. When I exec into the dgraph docker container (the official 24.0.0 image), the jemalloc library is missing, however, when I run the dgraph command it says “jemalloc: true”

I ran ldd on the binary and it doesn’t have jemalloc listed as a dependency. I’m not sure what I’m missing.

My use case is to swap the docker binary out with a debug symbol-enabled binary for debugging some issues. Right now I manually copied in the libraries for jemalloc but I am a bit nervous about it so I was wondering if anyone could help me shed light on this topic.

Thanks!

Hey @raddi,

How are you building the image? Did you see the image-local target in the Makefile? That target builds a dgraph/dgraph:local image on your machine, which you can then use however you like.

1 Like

Ah thank you for the suggestion, Matthew!

When I ran it in this way (with make local-image), I noticed that jemalloc is disabled:

Dgraph version   : v24.0.0-1-g1a975fb2f
Dgraph codename  : dgraph
Dgraph SHA-256   : f9307c18dfc1835edfa81302df668f3e8cfb56ecf455ce41e9244c22038819f4
Commit SHA-1     : 1a975fb2f
Commit timestamp : 2024-08-26 18:33:49 -0400
Branch           : v24.0.0-vendored
Go version       : go1.22.0
jemalloc enabled : false

however when I pull the real image:

graph
Dgraph SHA-256   : fde573b63113a7c7289da5e2bfd61423cb3f97bd7100416a9333402d01fe7f7e
Commit SHA-1     : 3486cf4
Commit timestamp : 2024-06-06 14:07:31 -0700
Branch           : HEAD
Go version       : go1.22.4
jemalloc enabled : true

To get around this, I was doing the manual build but I ran into the issue of missing libraries. I copied those in and it seems to work but I am puzzled about the solution and it’s brittle because I am not building the libraries with the same version of glibc

I guess I still don’t understand how the jemalloc linking is working, and why the docker hub image doesn’t have the jemalloc library files but still shows that it’s using it? I also looked through this:

to see how a release image was created but these logs appear to be missing so I can’t find a difference between the two…

Have a look at the jemalloc target in the dgraph/Makefile. You might try removing the @ sign and running make jemalloc to see what’s going on there. Also check out the variable HAS_JEMALLOC which is defined a couple dozen lines above.

Hey, Matthew, so I did see that and when I run make install I am able to get the jemalloc library to download and the output is put in /usr/local/lib the question is how dgraph is baking it into its own binary. I think this is happening by packaging the libjemalloc.a static library into the go binary dgraph but I don’t see where that is happening. It’s a bit of a side project for me so I will look at it more this weekend. Thanks for your pointers, maybe there’s some info somewhere about go and C static library linking that I will find.

Indeed. I can start you off on your CGO journey with this: C? Go? Cgo! - The Go Programming Language

And of course, this: Manual Memory Management in Go using jemalloc - Dgraph Blog

1 Like

And this is where we bake (or statically link) the jemalloc lib into the Dgraph binary by passing its path to the C linker via a CGO LDFLAGS directive:

$ go tool cgo | grep ldflags 
..
-ldflags flags
	Flags to pass to the C linker. The cmd/go tool uses this to pass in the flags in the CGO_LDFLAGS variable.
..
1 Like

thanks, Rahul, this sounds like what I’ve been looking for! I still am not getting it to build the same way… Will post once I’ve figured that part out. THanks again for your help!

1 Like

What machine are you building this on?

hello, I am building it on a RHEL VM and also tried OS X and ran into similar issues on both of them

also, found this: cd-dgraph · dgraph-io/dgraph@61b8c62 · GitHub
and stepped through it a bit but didn’t see what I’m missing.

I tried hardcoding the LDFLAGS from ristretto after Rahul’s link(/usr/local/lib/libjemalloc.a -L/usr/local/lib -Wl,-rpath,/usr/local/lib -ljemalloc -lm -lstdc++ -pthread -ldl) to the Makefile here: dgraph/dgraph/Makefile at main · dgraph-io/dgraph · GitHub

also to no avail yet. Since I have been packaging my docker container with the libjemalloc libraries, I’ve been working around it for now.

Thanks for your consideration