mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-06 07:07:04 +02:00
Limiting total allocatable process memory (VSZ) via setting RLIMIT_AS limit is no longer effective, in order to restrict memory consumption at run time. We can see from process memory map below, that there are many holes within the process VA space, which bumps its VSZ to 1.5G. These holes are here by many reasons and could be explaned at first by the full randomization of system VA space. Now it is usually enabled in Linux kernels by default. There are always gaps around the process stack area to trap overflows. Holes before and after shared libraries could be explained by the fact, that on many architectures libraries have a 'preferred' address to be loaded at; putting them elsewhere requires relocation work, and probably some unshared pages. Repetitive holes of 65380K are most probably correspond to the header that malloc has to allocate before asked a claimed memory block. This header is used by malloc to link allocated chunks together and for its internal book keeping. $ sudo pmap -x -p `pidof haproxy` 127136: ./haproxy -f /home/haproxy/haproxy/haproxy_h2.cfg Address Kbytes RSS Dirty Mode Mapping 0000555555554000 388 64 0 r---- /home/haproxy/haproxy/haproxy 00005555555b5000 2608 1216 0 r-x-- /home/haproxy/haproxy/haproxy 0000555555841000 916 64 0 r---- /home/haproxy/haproxy/haproxy 0000555555926000 60 60 60 r---- /home/haproxy/haproxy/haproxy 0000555555935000 116 116 116 rw--- /home/haproxy/haproxy/haproxy 0000555555952000 7872 5236 5236 rw--- [ anon ] 00007fff98000000 156 36 36 rw--- [ anon ] 00007fff98027000 65380 0 0 ----- [ anon ] 00007fffa0000000 156 36 36 rw--- [ anon ] 00007fffa0027000 65380 0 0 ----- [ anon ] 00007fffa4000000 156 36 36 rw--- [ anon ] 00007fffa4027000 65380 0 0 ----- [ anon ] 00007fffa8000000 156 36 36 rw--- [ anon ] 00007fffa8027000 65380 0 0 ----- [ anon ] 00007fffac000000 156 36 36 rw--- [ anon ] 00007fffac027000 65380 0 0 ----- [ anon ] 00007fffb0000000 156 36 36 rw--- [ anon ] 00007fffb0027000 65380 0 0 ----- [ anon ] ... 00007ffff7fce000 4 4 0 r-x-- [ anon ] 00007ffff7fcf000 4 4 0 r---- /usr/lib/x86_64-linux-gnu/ld-2.31.so 00007ffff7fd0000 140 140 0 r-x-- /usr/lib/x86_64-linux-gnu/ld-2.31.so ... 00007ffff7ffe000 4 4 4 rw--- [ anon ] 00007ffffffde000 132 20 20 rw--- [ stack ] ffffffffff600000 4 0 0 --x-- [ anon ] ---------------- ------- ------- ------- total kB 1499288 75504 72760 This exceeded VSZ makes impossible to start an haproxy process with 200M memory limit, set at its initialization stage as RLIMIT_AS. We usually have in this case such cryptic output at stderr: $ haproxy -m 200 -f haproxy_quic.cfg (null)(null)(null)(null)(null)(null) At the same time the process RSS (a memory really used) is only 75,5M. So to make process memory accounting more realistic let's base the memory limit, set by -m option, on RSS measurement and let's use RLIMIT_DATA instead of RLIMIT_AS. RLIMIT_AS was used before, because earlier versions of haproxy always allocate memory buffers for new connections, but data were not written there immediately. So these buffers were not instantly counted in RSS, but were always counted in VSZ. Now we allocate new buffers only in the case, when we will write there some data immediately, so using RLIMIT_DATA becomes more appropriate. |
||
---|---|---|
.github | ||
addons | ||
admin | ||
dev | ||
doc | ||
examples | ||
include | ||
reg-tests | ||
scripts | ||
src | ||
tests | ||
.cirrus.yml | ||
.gitattributes | ||
.gitignore | ||
.mailmap | ||
.travis.yml | ||
BRANCHES | ||
BSDmakefile | ||
CHANGELOG | ||
CONTRIBUTING | ||
INSTALL | ||
LICENSE | ||
MAINTAINERS | ||
Makefile | ||
README | ||
SUBVERS | ||
VERDATE | ||
VERSION |
The HAProxy documentation has been split into a number of different files for ease of use. Please refer to the following files depending on what you're looking for : - INSTALL for instructions on how to build and install HAProxy - BRANCHES to understand the project's life cycle and what version to use - LICENSE for the project's license - CONTRIBUTING for the process to follow to submit contributions The more detailed documentation is located into the doc/ directory : - doc/intro.txt for a quick introduction on HAProxy - doc/configuration.txt for the configuration's reference manual - doc/lua.txt for the Lua's reference manual - doc/SPOE.txt for how to use the SPOE engine - doc/network-namespaces.txt for how to use network namespaces under Linux - doc/management.txt for the management guide - doc/regression-testing.txt for how to use the regression testing suite - doc/peers.txt for the peers protocol reference - doc/coding-style.txt for how to adopt HAProxy's coding style - doc/internals for developer-specific documentation (not all up to date)