Hello Thomas,

On Tue, Feb 10, 2026 at 01:11:38PM +0100, Thomas Bätzler wrote:
> Hello everybody,
> 
> Hopefully somebody can point me in the right direction. I've got a use case
> where I run multiple instances of haproxy in separate "ip netns" namespaces
> that are plumbed using macvlan virtual interfaces to the physical interfaces
> of a server.
> 
> I'm using a systemd template unit to start each instance, i.e.
> 
> ---(cut)---
> [Unit]
> Description=HAProxy Load Balancer (instance %i)
> Documentation=man:haproxy(1)
> Documentation=file:/usr/share/doc/haproxy/configuration.txt.gz
> After=network-online.target rsyslog.service
> Wants=network-online.target
> 
> [Service]
> EnvironmentFile=-/etc/default/haproxy
> EnvironmentFile=-/etc/sysconfig/haproxy
> BindReadOnlyPaths=/dev/log:/var/lib/haproxy/dev/log
> Environment="CONFIG=/etc/haproxy/haproxy@%i.cfg"
> "PIDFILE=/run/haproxy@%i.pid" "EXTRAOPTS=-S /run/haproxy-master@%i.sock"
> ExecStart=/usr/sbin/ip netns exec %i /usr/sbin/haproxy -Ws -f $CONFIG -p
> $PIDFILE $EXTRAOPTS
> ExecReload=/usr/sbin/ip netns exec %i /usr/sbin/haproxy -Ws -f $CONFIG -c
> $EXTRAOPTS
> ExecReload=/bin/kill -USR2 $MAINPID
> KillMode=mixed
> Restart=always
> SuccessExitStatus=143
> Type=notify
> 
> [Install]
> WantedBy=multi-user.target
> ---(cut)---
> 
> 
> This has been working fine on Debian 11, but not at all on Debian 13 - the
> haproxy dies immediately on startup:
> 
> ---(cut)---
> Feb 09 21:37:09 test systemd[1]: Starting [email protected] - HAProxy
> Load Balancer (instance test-ns)...
> Feb 09 21:37:09 test ip[5429]: [NOTICE]   (5429) : New worker (5431) forked
> Feb 09 21:37:09 test ip[5429]: [NOTICE]   (5429) : Loading success.
> Feb 09 21:37:09 test systemd[1]: Started [email protected] - HAProxy
> Load Balancer (instance test-ns).
> Feb 09 21:37:09 test systemd[1]: [email protected]: Main process
> exited, code=killed, status=11/SEGV
> Feb 09 21:37:09 test systemd[1]: [email protected]: Killing process
> 5431 (haproxy) with signal SIGKILL.
> Feb 09 21:37:09 test systemd[1]: [email protected]: Killing process
> 5432 (haproxy) with signal SIGKILL.
> Feb 09 21:37:09 test kernel: haproxy[5433]: segfault at 28f8 ip
> 00007f6763573d33 sp 00007f6762bf25e0 error 4 in
> libc.so.6[96d33,7f6763505000+164000] likely on CPU 9 (core 12, socket 0)
> Feb 09 21:37:09 test kernel: Code: 1f 84 00 00 00 00 00 48 89 f2 31 f6 e9 36
> f6 ff ff 66 0f 1f 44 00 00 41 56 41 55 41 54 55 53 48 89 fb 64 8b 2c 25 d0
> 02 00 00 <8b> 47 10 25 7f 01 00 00 83 f8 43 0f 87 ac 00 00 00 48 8d 1>
> Feb 09 21:37:09 test systemd[1]: [email protected]: Failed with result
> 'signal'.
> ---(cut)---
> 
> When I try the ExecStart command line in a plain shell, the haproxy starts
> just fine.
> 
> I've attached a coredump and the haproxy config that I'm using in the hopes
> that somebody can help me.
> 
> Thank you very much in advance!
> 
> Thomas

> root@test:~# gdb haproxy 
> /var/lib/coredumps/core-haproxy-sig11-user0-group0-pid5502-time1770669534 
> GNU gdb (Debian 16.3-1) 16.3
> Copyright (C) 2024 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.
> Type "show copying" and "show warranty" for details.
> This GDB was configured as "x86_64-linux-gnu".
> Type "show configuration" for configuration details.
> For bug reporting instructions, please see:
> <https://www.gnu.org/software/gdb/bugs/>.
> Find the GDB manual and other documentation resources online at:
>     <http://www.gnu.org/software/gdb/documentation/>.
> 
> For help, type "help".
> Type "apropos word" to search for commands related to "word"...
> Reading symbols from haproxy...
> (No debugging symbols found in haproxy)
> [New LWP 5506]
> [New LWP 5502]
> [Thread debugging using libthread_db enabled]
> Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
> Core was generated by `/usr/sbin/haproxy -Ws -f 
> /etc/haproxy/[email protected] -p /run/[email protected] -de -m 16'.
> Program terminated with signal SIGSEGV, Segmentation fault.
> #0  ___pthread_mutex_trylock (mutex=0x28e8) at 
> ./nptl/pthread_mutex_trylock.c:33
> 
> warning: 33     ./nptl/pthread_mutex_trylock.c: No such file or directory
> [Current thread is 1 (Thread 0x7fdbf89ff6c0 (LWP 5506))]
> (gdb) 
> (gdb) t a a bt full
> 
> Thread 2 (Thread 0x7fdbf9c84140 (LWP 5502)):
> #0  __syscall_cancel_arch () at 
> ../sysdeps/unix/sysv/linux/x86_64/syscall_cancel.S:56
> No locals.
> #1  0x00007fdbf92bd668 in __internal_syscall_cancel (a1=<optimized out>, 
> a2=<optimized out>, a3=<optimized out>, a4=<optimized out>, a5=a5@entry=0, 
> a6=a6@entry=4294967295, nr=202) at ./nptl/cancellation.c:49
>         result = <optimized out>
>         pd = <optimized out>
>         ch = <optimized out>
> #2  0x00007fdbf92bdc8c in __futex_abstimed_wait_common64 (private=128, 
> futex_word=0x7fdbf89ff990, expected=<optimized out>, op=<optimized out>, 
> abstime=0x0, cancel=true) at ./nptl/futex-internal.c:57
> No locals.
> #3  __futex_abstimed_wait_common (futex_word=futex_word@entry=0x7fdbf89ff990, 
> expected=<optimized out>, clockid=clockid@entry=0, abstime=abstime@entry=0x0, 
> private=private@entry=128, cancel=cancel@entry=true) at 
> ./nptl/futex-internal.c:87
>         err = <optimized out>
>         clockbit = 256
>         op = <optimized out>
> #4  0x00007fdbf92bdceb in __GI___futex_abstimed_wait_cancelable64 
> (futex_word=futex_word@entry=0x7fdbf89ff990, expected=<optimized out>, 
> clockid=clockid@entry=0, abstime=abstime@entry=0x0, 
> private=private@entry=128) at ./nptl/futex-internal.c:139
> No locals.
> #5  0x00007fdbf92c2774 in __pthread_clockjoin_ex (threadid=140582745798336, 
> thread_return=0x0, clockid=0, abstime=0x0, block=<optimized out>) at 
> ./nptl/pthread_join_common.c:108
>         ret = <optimized out>
>         _buffer = {__routine = 0x7fdbf92c25f0 <cleanup>, __arg = 
> 0x7fdbf89ffce0, __canceltype = -2117861734, __prev = 0x0}
>         tid = <optimized out>
>         pd = 0x7fdbf89ff6c0
>         self = <optimized out>
>         result = 0
>         pd_result = <optimized out>
> #6  0x0000560d81c8dc06 in ?? ()
> No symbol table info available.
> #7  0x0000560d81a07e76 in main ()
> No symbol table info available.
> 
> Thread 1 (Thread 0x7fdbf89ff6c0 (LWP 5506)):
> #0  ___pthread_mutex_trylock (mutex=0x28e8) at 
> ./nptl/pthread_mutex_trylock.c:33
>         oldval = <optimized out>
>         id = 5506
>         again = <optimized out>
>         __PRETTY_FUNCTION__ = "___pthread_mutex_trylock"
> #1  0x00007fdbf94cf375 in ?? () from /lib/x86_64-linux-gnu/libjemalloc.so.2
> No symbol table info available.
> #2  0x00007fdbf94d046f in ?? () from /lib/x86_64-linux-gnu/libjemalloc.so.2
> No symbol table info available.
> #3  0x00007fdbf94d06f0 in ?? () from /lib/x86_64-linux-gnu/libjemalloc.so.2
> No symbol table info available.
> #4  0x00007fdbf94d236b in ?? () from /lib/x86_64-linux-gnu/libjemalloc.so.2
> No symbol table info available.
> #5  0x00007fdbf9445842 in ?? () from /lib/x86_64-linux-gnu/libjemalloc.so.2
> No symbol table info available.
> #6  0x00007fdbf9e96d06 in malloc (size=56) at ../include/rtld-malloc.h:56
> No locals.
> #7  _dl_map_object_deps (map=map@entry=0x7fdbf9cbeb30, 
> preloads=preloads@entry=0x0, npreloads=npreloads@entry=0, 
> trace_mode=trace_mode@entry=0, open_mode=open_mode@entry=-2147483648) at 
> ./elf/dl-deps.c:463
>         known = <optimized out>
>         runp = <optimized out>
>         tail = <optimized out>
>         nlist = 3
>         i = <optimized out>
>         name = <optimized out>
>         errno_saved = <optimized out>
>         errno_reason = <optimized out>
>         exception = {objname = 0x0, errstring = 0x0, message_buffer = 0x0}
>         needed_space = {data = 0x7fdbf89f2a80, length = 1024, __space = 
> {__align = {__max_align_ll = 0, __max_align_ld = <invalid float value>}, __c 
> = 
> "\000\000\000\000\000\000\000\000T\357\351\371\333\177\000\000\000\000\000\000\000\000\000\000%~=\371\333\177\000\000\370:\351\371\333\177\000\000t\304\351\371\333\177\000\000\000\000\000\000\000\000\000\000\002\000\000\220\002\000\000\000\220\n\316\371\333\177",
>  '\000' <repeats 706 times>...}}
>         __PRETTY_FUNCTION__ = "_dl_map_object_deps"
>         old_l_initfini = 0x0
>         l_initfini = <optimized out>
>         map_index = <optimized out>
>         l_reldeps = <optimized out>
> #8  0x00007fdbf9ea0087 in dl_open_worker_begin (a=0x7fdbf89f31e0) at 
> ./elf/dl-open.c:606
>         args = 0x7fdbf89f31e0
>         file = <optimized out>
>         mode = -2147483646
>         call_map = <optimized out>
>         dst = <optimized out>
>         new = 0x7fdbf9cbeb30
>         __PRETTY_FUNCTION__ = "dl_open_worker_begin"
>         reloc_mode = <optimized out>
>         first = <optimized out>
>         last = <optimized out>
>         j = <optimized out>
>         l = <optimized out>
>         relocation_in_progress = <optimized out>
>         r = <optimized out>
>         any_tls = <optimized out>
> #9  0x00007fdbf9e95399 in __GI__dl_catch_exception 
> (exception=exception@entry=0x7fdbf89f3040, 
> operate=operate@entry=0x7fdbf9e9ff80 <dl_open_worker_begin>, 
> args=args@entry=0x7fdbf89f31e0) at ./elf/dl-catch.c:241
>         errcode = 0
>         c = {exception = 0x7fdbf89f3040, errcode = 0x7fdbf89f2f4c, env = 
> {{__jmpbuf = {140582745747936, 6250777515939346415, 140734807454248, 
> 140582745747520, 140582755491865, 140582767598088, 6250780706392258543, 
> 6250777496286541807}, __mask_was_saved = 0, __saved_mask = {__val = {0 
> <repeats 16 times>}}}}}
>         old = 0x7fdbf89f30c0
> #10 0x00007fdbf9e9f7e8 in dl_open_worker (a=a@entry=0x7fdbf89f31e0) at 
> ./elf/dl-open.c:761
>         ex = {objname = 0x0, errstring = 0x0, message_buffer = 0x0}
>         err = <optimized out>
>         args = 0x7fdbf89f31e0
>         mode = <optimized out>
>         new = <optimized out>
> #11 0x00007fdbf9e95399 in __GI__dl_catch_exception 
> (exception=exception@entry=0x7fdbf89f31c0, 
> operate=operate@entry=0x7fdbf9e9f7b0 <dl_open_worker>, 
> args=args@entry=0x7fdbf89f31e0) at ./elf/dl-catch.c:241
>         errcode = 0
>         c = {exception = 0x7fdbf89f31c0, errcode = 0x7fdbf89f30bc, env = 
> {{__jmpbuf = {140582745747904, 6250777117444421615, 140734807454248, 9, 
> 140582755491865, 140582767598088, 6250780705664546799, 6250777496286541807}, 
> __mask_was_saved = 0, __saved_mask = {__val = {0 <repeats 16 times>}}}}}
>         old = 0x7fdbf89f32c0
> #12 0x00007fdbf9e9fbe8 in _dl_open (file=0x7fdbf93d7e25 "libgcc_s.so.1", 
> mode=<optimized out>, caller_dlopen=0x7fdbf933e019 
> <__GI___libc_unwind_link_get+73>, nsid=<optimized out>, argc=9, 
> argv=0x7fff6034b228, env=0x7fff6034b278) at ./elf/dl-open.c:874
>         args = {file = 0x7fdbf93d7e25 "libgcc_s.so.1", mode = -2147483646, 
> caller_dlopen = 0x7fdbf933e019 <__GI___libc_unwind_link_get+73>, map = 
> 0x7fdbf9cbeb30, nsid = 0, original_global_scope_pending_adds = 0, 
> libc_already_loaded = true, worker_continue = false, argc = 9, argv = 
> 0x7fff6034b228, env = 0x7fff6034b278}
>         exception = {objname = 0x0, errstring = 0x0, message_buffer = 0x0}
>         errcode = <optimized out>
>         r_state = <optimized out>
>         __PRETTY_FUNCTION__ = "_dl_open"
> #13 0x00007fdbf938dccd in do_dlopen (ptr=ptr@entry=0x7fdbf89f3430) at 
> ./elf/dl-libc.c:95
>         args = 0x7fdbf89f3430
> #14 0x00007fdbf9e95399 in __GI__dl_catch_exception 
> (exception=exception@entry=0x7fdbf89f33b0, operate=0x7fdbf938dc90 
> <do_dlopen>, args=0x7fdbf89f3430) at ./elf/dl-catch.c:241
>         errcode = 32731
>         c = {exception = 0x7fdbf89f33b0, errcode = 0x7fdbf89f32bc, env = 
> {{__jmpbuf = {140582745748471, 6250780705549203439, 140582745748472, 0, 
> 140734807452512, 140582737408000, 6250780705731655663, 6250777496286541807}, 
> __mask_was_saved = 2, __saved_mask = {__val = {0 <repeats 16 times>}}}}}
>         old = 0x0
> #15 0x00007fdbf9e954bf in _dl_catch_error (objname=0x7fdbf89f33f8, 
> errstring=0x7fdbf89f3400, mallocedp=0x7fdbf89f33f7, operate=<optimized out>, 
> args=<optimized out>) at ./elf/dl-catch.c:260
>         exception = {objname = 0x3000000020 <error: Cannot access memory at 
> address 0x3000000020>, errstring = 0x7fdbf89f3490 "\3204\237\370\333\177", 
> message_buffer = 0x7fdbf89f33d0 ""}
>         errorcode = <optimized out>
> #16 0x00007fdbf938dc3f in dlerror_run (operate=operate@entry=0x7fdbf938dc90 
> <do_dlopen>, args=args@entry=0x7fdbf89f3430) at ./elf/dl-libc.c:45
>         objname = 0x7fff6034ac57 "\001\001\n1"
>         last_errstring = 0x0
>         malloced = false
>         result = <optimized out>
> #17 0x00007fdbf938de4f in __libc_dlopen_mode (name=name@entry=0x7fdbf93d7e25 
> "libgcc_s.so.1", mode=mode@entry=-2147483646) at ./elf/dl-libc.c:162
>         args = {name = 0x7fdbf93d7e25 "libgcc_s.so.1", mode = -2147483646, 
> caller_dlopen = 0x7fdbf933e019 <__GI___libc_unwind_link_get+73>, map = 0x0}
> #18 0x00007fdbf933e019 in __GI___libc_unwind_link_get () at 
> ./misc/unwind-link.c:51
>         local_libgcc_handle = <optimized out>
>         local = <optimized out>
>         __PRETTY_FUNCTION__ = "__libc_unwind_link_get"
> #19 0x00007fdbf92c1d29 in __GI___pthread_exit (value=0x0) at 
> ./nptl/pthread_exit.c:28
>         unwind_link = <optimized out>
> #20 0x0000560d81c8dc4f in ?? ()
> No symbol table info available.
> #21 0x00007fdbf92c0b7b in start_thread (arg=<optimized out>) at 
> ./nptl/pthread_create.c:448
>         ret = <optimized out>
>         pd = <optimized out>
>         out = <optimized out>
>         unwind_buf = {cancel_jmp_buf = {{jmp_buf = {128, 6266535886278739984, 
> 32, 0, 140734807452512, 140582737408000, 6250780705545009135, 
> 6250776970899372015}, mask_was_saved = 0}}, priv = {pad = {0x0, 0x0, 0x0, 
> 0x0}, data = {prev = 0x0, cleanup = 0x0, canceltype = 0}}}
>         not_first_call = <optimized out>
> #22 0x00007fdbf933e7b8 in __GI___clone3 () at 
> ../sysdeps/unix/sysv/linux/x86_64/clone3.S:78
> No locals.

This trace is very strange, it doesn't even crash in haproxy code, it
seems to crash in the dynamic linker while loading dynamic libraries,
either libgcc_s or jemalloc, it's uncertain to me. It's not uncommon to
face chicken-and-egg issues in program initialization in general since
every step expects to be started once the other ones are ready, but it's
not necessarily granted that a memory allocator is properly initialized
at this point for example.

IMHO at this point the config was not even processed yet, and you could
equally use /dev/null as the config path and it would do the same. It
might even be possible that it happens due to the link ordering, and
that changing the order of -l on the LDFLAGS could fix it. I have no
idea what role the namespaces can play in this by the way.

I suspect that you could get out of that problem by just dropping jemalloc
from your build options since it crashes there (it seems to be using a mutex
on a not-yet allocated variable). But even if that would solve the problem,
it wouldn't necessarily tell us what the exact cause is.

Willy


Reply via email to