Go to file
Azat Khuzhin cafe9a3158 Disable percpu arena in case of non deterministic CPU count
Determinitic number of CPUs is important for percpu arena to work
correctly, since it uses cpu index - sched_getcpu(), and if it will
greater then number of CPUs bad thing will happen, or assertion will be
failed in debug build:

    <jemalloc>: ../contrib/jemalloc/src/jemalloc.c:321: Failed assertion: "ind <= narenas_total_get()"
    Aborted (core dumped)

Number of CPUs can be obtained from the following places:
- sched_getaffinity()
- sysconf(_SC_NPROCESSORS_ONLN)
- sysconf(_SC_NPROCESSORS_CONF)

For the sched_getaffinity() you may simply use taskset(1) to run program
on a different cpu, and in case it will be not first, percpu will work
incorrectly, i.e.:

    $ taskset --cpu-list $(( $(getconf _NPROCESSORS_ONLN)-1 )) <your_program>

_SC_NPROCESSORS_ONLN uses /sys/devices/system/cpu/online, LXD/LXC
virtualize /sys/devices/system/cpu/online file [1], and so when you run
container with limited limits.cpus it will bind randomly selected CPU to
it

  [1]: https://github.com/lxc/lxcfs/issues/301

_SC_NPROCESSORS_CONF uses /sys/devices/system/cpu/cpu*, and AFAIK nobody
playing with dentries there.

So if all three of these are equal, percpu arenas should work correctly.

And a small note regardless _SC_NPROCESSORS_ONLN/_SC_NPROCESSORS_CONF,
musl uses sched_getaffinity() for both. So this will also increase the
entropy.

Also note, that you can check is percpu arena really applied using
abort_conf:true.

Refs: https://github.com/jemalloc/jemalloc/pull/1939
Refs: https://github.com/ClickHouse/ClickHouse/issues/32806

v2: move malloc_cpu_count_is_deterministic() into
    malloc_init_hard_recursible() since _SC_NPROCESSORS_CONF does
    allocations for readdir()
v3:
- mark cpu_count_is_deterministic static
- check only if percpu arena is enabled
- check narenas
2021-12-21 11:53:09 -08:00
bin Added --debug-syms-by-id option 2021-05-17 10:00:40 -07:00
build-aux Update config.{sub,guess} to support support-aarch64-apple-darwin as a target 2021-01-11 14:00:03 -08:00
doc Correct opt.prof_leak documentation 2021-11-23 15:10:21 -08:00
doc_internal Add a logo to doc_internal. 2020-10-19 15:32:51 -07:00
include Fix base_ehooks_get_for_metadata 2021-12-20 15:37:53 -08:00
m4 Support C++17 over-aligned allocation 2019-11-22 10:14:16 -08:00
msvc Update visual studio projects 2021-12-15 10:39:17 -08:00
scripts CI: Refactor gen_travis.py 2021-12-06 15:11:14 -08:00
src Disable percpu arena in case of non deterministic CPU count 2021-12-21 11:53:09 -08:00
test Fix base_ehooks_get_for_metadata 2021-12-20 15:37:53 -08:00
.appveyor.yml Appveyor: fix 404 errors. 2020-10-27 15:28:20 -07:00
.autom4te.cfg Disable autom4te cache. 2014-09-02 17:49:29 -07:00
.cirrus.yml Add Cirrus CI testing matrix 2021-08-10 09:59:10 -07:00
.clang-format Add a .clang-format file. 2020-10-02 14:49:56 -07:00
.gitattributes fix git handling of newlines on windows 2014-05-07 18:48:39 -04:00
.gitignore Add opt.experimental_infallible_new. 2021-06-24 12:22:51 -07:00
.travis.yml CI: Refactor gen_travis.py 2021-12-06 15:11:14 -08:00
autogen.sh Move repo contents in jemalloc/ to top level. 2011-03-31 20:36:17 -07:00
ChangeLog Update Changelog for 5.2.1. 2019-08-05 12:52:43 -07:00
config.stamp.in Move repo contents in jemalloc/ to top level. 2011-03-31 20:36:17 -07:00
configure.ac freebsd 14 build fix proposal. 2021-12-06 13:15:21 -08:00
COPYING Update copyright dates. 2019-01-25 13:25:20 -08:00
INSTALL.md Update INSTALL.md to mention 'autoconf' 2021-02-16 17:48:46 -08:00
jemalloc.pc.in Reformat the version number in jemalloc.pc.in. 2018-05-07 20:12:03 -07:00
Makefile.in San: Implement bump alloc 2021-12-15 10:39:17 -08:00
README Update project URL. 2016-09-12 11:56:24 -07:00
run_tests.sh Introduce scripts to run all possible tests 2017-01-30 17:51:57 -08:00
TUNING.md Add TUNING.md. 2018-05-03 12:52:52 -07:00

jemalloc is a general purpose malloc(3) implementation that emphasizes
fragmentation avoidance and scalable concurrency support.  jemalloc first came
into use as the FreeBSD libc allocator in 2005, and since then it has found its
way into numerous applications that rely on its predictable behavior.  In 2010
jemalloc development efforts broadened to include developer support features
such as heap profiling and extensive monitoring/tuning hooks.  Modern jemalloc
releases continue to be integrated back into FreeBSD, and therefore versatility
remains critical.  Ongoing development efforts trend toward making jemalloc
among the best allocators for a broad range of demanding applications, and
eliminating/mitigating weaknesses that have practical repercussions for real
world applications.

The COPYING file contains copyright and licensing information.

The INSTALL file contains information on how to configure, build, and install
jemalloc.

The ChangeLog file contains a brief summary of changes for each release.

URL: http://jemalloc.net/