]> git.ipfire.org Git - thirdparty/haproxy.git/commit
MINOR: pools: release the pool's lock during the malloc/free calls
authorWilly Tarreau <w@1wt.eu>
Thu, 4 Jul 2019 09:30:00 +0000 (11:30 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 9 Jul 2019 08:40:33 +0000 (10:40 +0200)
commit3e853ea74dcf9040fc684332d41b306212252057
tree4964b1a0b428a4a477706f43ffb8e18924377afe
parent497991613469b588b969f94aea2228720a1bddab
MINOR: pools: release the pool's lock during the malloc/free calls

The malloc and free calls and especially the underlying mmap/munmap()
can occasionally take a huge amount of time and even cause the thread
to sleep. This is visible when haproxy is compiled with DEBUG_UAF which
causes every single pool allocation/free to allocate and release pages.
In this case, when using the locked pools, the watchdog can occasionally
fire under high contention (typically requesting 40000 1M objects in
parallel over 8 threads). Then, "perf top" shows that 50% of the CPU
time is spent in mmap() and munmap(). The reason the watchdog fires is
because some threads spin on the pool lock which is held by other threads
waiting on mmap() or munmap().

This patch modifies this so that the pool lock is released during these
syscalls. Not only this allows other threads to request try to allocate
their data in parallel, but it also considerably reduces the lock
contention.

Note that the locked pools are only used on small architectures where
high thread counts would not make sense, so this will not provide any
benefit in the general case. However it makes the debugging versions
way more stable, which is always appreciated.
include/common/memory.h
src/memory.c