Skip to content

Commit 528e42b

Browse files
committed
Improve jemalloc contrib
1 parent 48a2b46 commit 528e42b

File tree

11 files changed

+115
-183
lines changed

11 files changed

+115
-183
lines changed

CMakeLists.txt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -351,18 +351,12 @@ if (ENABLE_TESTS)
351351
endif ()
352352

353353
# Need to process before "contrib" dir:
354-
include (cmake/find/jemalloc.cmake)
355354
include (cmake/find/cctz.cmake)
356355
include (cmake/find/mysqlclient.cmake)
357356

358357
# When testing for memory leaks with Valgrind, don't link tcmalloc or jemalloc.
359358

360-
if (USE_JEMALLOC)
361-
message (STATUS "Link jemalloc: ${JEMALLOC_LIBRARIES}")
362-
set (MALLOC_LIBRARIES ${JEMALLOC_LIBRARIES})
363-
elseif (SANITIZE)
364-
message (STATUS "Will use ${SANITIZE} sanitizer.")
365-
elseif (OS_LINUX)
359+
if (OS_LINUX AND NOT ENABLE_JEMALLOC)
366360
message (WARNING "Non default allocator is disabled. This is not recommended for production Linux builds.")
367361
endif ()
368362

base/common/argsToConfig.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include <common/argsToConfig.h>
1+
#include "argsToConfig.h"
22

33
#include <Poco/Util/Application.h>
44
#include <Poco/Util/LayeredConfiguration.h>

base/common/argsToConfig.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#pragma once
2+
23
#include <Poco/Util/Application.h>
34

45
namespace Poco::Util

base/common/config_common.h.in

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,5 @@
22

33
// .h autogenerated by cmake !
44

5-
#cmakedefine01 USE_JEMALLOC
65
#cmakedefine01 UNBUNDLED
76
#cmakedefine01 WITH_COVERAGE

base/common/coverage.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
1-
#include <common/coverage.h>
1+
#include "coverage.h"
2+
23
#include <common/config_common.h>
34

45
#if WITH_COVERAGE
56

6-
#include <unistd.h>
7-
#include <mutex>
7+
# include <mutex>
8+
# include <unistd.h>
89

9-
#if defined(__clang__)
10+
# if defined(__clang__)
1011
extern "C" void __llvm_profile_dump();
11-
#elif defined(__GNUC__) || defined(__GNUG__)
12+
# elif defined(__GNUC__) || defined(__GNUG__)
1213
extern "C" void __gcov_exit();
13-
#endif
14+
# endif
1415

1516
#endif
1617

@@ -21,11 +22,11 @@ void dumpCoverageReportIfPossible()
2122
static std::mutex mutex;
2223
std::lock_guard lock(mutex);
2324

24-
#if defined(__clang__)
25+
# if defined(__clang__)
2526
__llvm_profile_dump();
26-
#elif defined(__GNUC__) || defined(__GNUG__)
27+
# elif defined(__GNUC__) || defined(__GNUG__)
2728
__gcov_exit();
28-
#endif
29+
# endif
2930

3031
#endif
3132
}

cmake/Modules/FindJeMalloc.cmake

Lines changed: 0 additions & 46 deletions
This file was deleted.

cmake/find/jemalloc.cmake

Lines changed: 0 additions & 42 deletions
This file was deleted.

contrib/CMakeLists.txt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,7 @@ if (USE_INTERNAL_CCTZ_LIBRARY)
7979
add_subdirectory (cctz-cmake)
8080
endif ()
8181

82-
if (ENABLE_JEMALLOC AND USE_INTERNAL_JEMALLOC_LIBRARY)
83-
add_subdirectory (jemalloc-cmake)
84-
endif ()
82+
add_subdirectory (jemalloc-cmake)
8583

8684
if (USE_INTERNAL_CPUID_LIBRARY)
8785
add_subdirectory (libcpuid)
Lines changed: 98 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,108 @@
1-
set(JEMALLOC_SOURCE_DIR ${ClickHouse_SOURCE_DIR}/contrib/jemalloc)
2-
3-
set(SRCS
4-
${JEMALLOC_SOURCE_DIR}/src/arena.c
5-
${JEMALLOC_SOURCE_DIR}/src/background_thread.c
6-
${JEMALLOC_SOURCE_DIR}/src/base.c
7-
${JEMALLOC_SOURCE_DIR}/src/bin.c
8-
${JEMALLOC_SOURCE_DIR}/src/bitmap.c
9-
${JEMALLOC_SOURCE_DIR}/src/ckh.c
10-
${JEMALLOC_SOURCE_DIR}/src/ctl.c
11-
${JEMALLOC_SOURCE_DIR}/src/div.c
12-
${JEMALLOC_SOURCE_DIR}/src/extent.c
13-
${JEMALLOC_SOURCE_DIR}/src/extent_dss.c
14-
${JEMALLOC_SOURCE_DIR}/src/extent_mmap.c
15-
${JEMALLOC_SOURCE_DIR}/src/hash.c
16-
${JEMALLOC_SOURCE_DIR}/src/hook.c
17-
${JEMALLOC_SOURCE_DIR}/src/jemalloc.c
18-
${JEMALLOC_SOURCE_DIR}/src/large.c
19-
${JEMALLOC_SOURCE_DIR}/src/log.c
20-
${JEMALLOC_SOURCE_DIR}/src/malloc_io.c
21-
${JEMALLOC_SOURCE_DIR}/src/mutex.c
22-
${JEMALLOC_SOURCE_DIR}/src/mutex_pool.c
23-
${JEMALLOC_SOURCE_DIR}/src/nstime.c
24-
${JEMALLOC_SOURCE_DIR}/src/pages.c
25-
${JEMALLOC_SOURCE_DIR}/src/prng.c
26-
${JEMALLOC_SOURCE_DIR}/src/prof.c
27-
${JEMALLOC_SOURCE_DIR}/src/rtree.c
28-
${JEMALLOC_SOURCE_DIR}/src/sc.c
29-
${JEMALLOC_SOURCE_DIR}/src/stats.c
30-
${JEMALLOC_SOURCE_DIR}/src/sz.c
31-
${JEMALLOC_SOURCE_DIR}/src/tcache.c
32-
${JEMALLOC_SOURCE_DIR}/src/test_hooks.c
33-
${JEMALLOC_SOURCE_DIR}/src/ticker.c
34-
${JEMALLOC_SOURCE_DIR}/src/tsd.c
35-
${JEMALLOC_SOURCE_DIR}/src/witness.c
36-
)
37-
38-
if(OS_DARWIN)
39-
list(APPEND SRCS ${JEMALLOC_SOURCE_DIR}/src/zone.c)
40-
endif()
41-
42-
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
43-
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w")
1+
option (ENABLE_JEMALLOC "Enable jemalloc allocator" ${ENABLE_LIBRARIES})
2+
3+
if (SANITIZE)
4+
set (ENABLE_JEMALLOC FALSE)
5+
message (STATUS "jemalloc is disabled because of sanitizers")
446
endif ()
457

46-
add_library(jemalloc STATIC ${SRCS})
8+
if (ENABLE_JEMALLOC)
9+
option (USE_INTERNAL_JEMALLOC "Use internal jemalloc library" ${NOT_UNBUNDLED})
4710

48-
target_include_directories(jemalloc PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
11+
if (USE_INTERNAL_JEMALLOC)
12+
if (NOT OS_LINUX OR NOT (ARCH_AMD64 OR ARCH_ARM))
13+
message (FATAL_ERROR "Internal jemalloc can only be used on Linux with x86_64 or aarch64.")
14+
endif ()
4915

50-
if (ARCH_AMD64)
51-
target_include_directories(jemalloc PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include_linux_x86_64)
52-
elseif (ARCH_ARM)
53-
target_include_directories(jemalloc PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include_linux_aarch64)
54-
else ()
55-
message (FATAL_ERROR "jemalloc can only be used on x86_64 or aarch64.")
56-
endif ()
16+
set (LIBRARY_DIR "${ClickHouse_SOURCE_DIR}/contrib/jemalloc")
17+
18+
set (SRCS
19+
${LIBRARY_DIR}/src/arena.c
20+
${LIBRARY_DIR}/src/background_thread.c
21+
${LIBRARY_DIR}/src/base.c
22+
${LIBRARY_DIR}/src/bin.c
23+
${LIBRARY_DIR}/src/bitmap.c
24+
${LIBRARY_DIR}/src/ckh.c
25+
${LIBRARY_DIR}/src/ctl.c
26+
${LIBRARY_DIR}/src/div.c
27+
${LIBRARY_DIR}/src/extent.c
28+
${LIBRARY_DIR}/src/extent_dss.c
29+
${LIBRARY_DIR}/src/extent_mmap.c
30+
${LIBRARY_DIR}/src/hash.c
31+
${LIBRARY_DIR}/src/hook.c
32+
${LIBRARY_DIR}/src/jemalloc.c
33+
${LIBRARY_DIR}/src/large.c
34+
${LIBRARY_DIR}/src/log.c
35+
${LIBRARY_DIR}/src/malloc_io.c
36+
${LIBRARY_DIR}/src/mutex.c
37+
${LIBRARY_DIR}/src/mutex_pool.c
38+
${LIBRARY_DIR}/src/nstime.c
39+
${LIBRARY_DIR}/src/pages.c
40+
${LIBRARY_DIR}/src/prng.c
41+
${LIBRARY_DIR}/src/prof.c
42+
${LIBRARY_DIR}/src/rtree.c
43+
${LIBRARY_DIR}/src/sc.c
44+
${LIBRARY_DIR}/src/stats.c
45+
${LIBRARY_DIR}/src/sz.c
46+
${LIBRARY_DIR}/src/tcache.c
47+
${LIBRARY_DIR}/src/test_hooks.c
48+
${LIBRARY_DIR}/src/ticker.c
49+
${LIBRARY_DIR}/src/tsd.c
50+
${LIBRARY_DIR}/src/witness.c
51+
)
52+
if (OS_DARWIN)
53+
list(APPEND SRCS ${LIBRARY_DIR}/src/zone.c)
54+
endif ()
55+
56+
add_library(jemalloc STATIC ${SRCS})
57+
target_include_directories(jemalloc PRIVATE ${LIBRARY_DIR}/include)
58+
target_include_directories(jemalloc PUBLIC include)
59+
if (ARCH_AMD64)
60+
target_include_directories(jemalloc PUBLIC include_linux_x86_64)
61+
elseif (ARCH_ARM)
62+
target_include_directories(jemalloc PUBLIC include_linux_aarch64)
63+
endif ()
64+
65+
target_compile_definitions(jemalloc PRIVATE -DJEMALLOC_NO_PRIVATE_NAMESPACE)
5766

58-
target_include_directories(jemalloc PRIVATE
59-
${JEMALLOC_SOURCE_DIR}/include)
67+
if (CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG")
68+
target_compile_definitions(jemalloc PRIVATE -DJEMALLOC_DEBUG=1 -DJEMALLOC_PROF=1)
6069

61-
target_compile_definitions(jemalloc PRIVATE -DJEMALLOC_NO_PRIVATE_NAMESPACE)
70+
if (USE_UNWIND)
71+
target_compile_definitions (jemalloc PRIVATE -DJEMALLOC_PROF_LIBUNWIND=1)
72+
target_link_libraries (jemalloc PRIVATE unwind)
73+
endif ()
74+
endif ()
75+
else ()
76+
find_library(LIBRARY_JEMALLOC jemalloc)
77+
find_path(INCLUDE_JEMALLOC jemalloc/jemalloc.h)
6278

63-
if (CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG")
64-
target_compile_definitions(jemalloc PRIVATE -DJEMALLOC_DEBUG=1 -DJEMALLOC_PROF=1)
79+
add_library (jemalloc STATIC IMPORTED)
80+
set_property (TARGET jemalloc PROPERTY IMPORTED_LOCATION ${LIBRARY_JEMALLOC})
81+
target_include_directories (jemalloc PUBLIC ${INCLUDE_JEMALLOC})
6582

66-
if (USE_UNWIND)
67-
target_compile_definitions (jemalloc PRIVATE -DJEMALLOC_PROF_LIBUNWIND=1)
68-
target_link_libraries (jemalloc PRIVATE ${UNWIND_LIBRARIES})
83+
set (CMAKE_REQUIRED_LIBRARIES jemalloc)
84+
check_cxx_source_compiles (
85+
"
86+
#include <jemalloc/jemalloc.h>
87+
88+
int main() {
89+
free(mallocx(1, 0));
90+
}
91+
"
92+
EXTERNAL_JEMALLOC_WORKS
93+
)
94+
95+
if (NOT EXTERNAL_JEMALLOC_WORKS)
96+
message (FATAL_ERROR "jemalloc is unusable: ${LIBRARY_JEMALLOC} ${INCLUDE_JEMALLOC}")
97+
endif ()
6998
endif ()
99+
100+
target_compile_definitions(jemalloc PUBLIC USE_JEMALLOC=1)
101+
102+
message (STATUS "Using jemalloc")
103+
else ()
104+
add_library(jemalloc INTERFACE)
105+
target_compile_definitions(jemalloc INTERFACE USE_JEMALLOC=0)
106+
107+
message (STATUS "Not using jemalloc")
70108
endif ()

dbms/CMakeLists.txt

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ add_library (clickhouse_malloc OBJECT src/Common/malloc.cpp)
256256
set_source_files_properties(src/Common/malloc.cpp PROPERTIES COMPILE_FLAGS "-fno-builtin")
257257

258258
add_library (clickhouse_new_delete STATIC src/Common/new_delete.cpp)
259-
target_link_libraries (clickhouse_new_delete PRIVATE clickhouse_common_io)
259+
target_link_libraries (clickhouse_new_delete PRIVATE clickhouse_common_io jemalloc)
260260

261261
if (OS_FREEBSD)
262262
target_compile_definitions (clickhouse_common_io PUBLIC CLOCK_MONOTONIC_COARSE=CLOCK_MONOTONIC_FAST)
@@ -303,10 +303,12 @@ add_object_library(clickhouse_processors_sources src/Processors/Sources)
303303

304304
if (MAKE_STATIC_LIBRARIES OR NOT SPLIT_SHARED_LIBRARIES)
305305
add_library (dbms STATIC ${dbms_headers} ${dbms_sources})
306+
target_link_libraries (dbms PRIVATE jemalloc)
306307
set (all_modules dbms)
307308
else()
308309
add_library (dbms SHARED ${dbms_headers} ${dbms_sources})
309310
target_link_libraries (dbms PUBLIC ${all_modules})
311+
target_link_libraries (clickhouse_interpreters PRIVATE jemalloc)
310312
list (APPEND all_modules dbms)
311313
# force all split libs to be linked
312314
set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-as-needed")
@@ -555,18 +557,6 @@ if (USE_BROTLI)
555557
target_include_directories (clickhouse_common_io SYSTEM BEFORE PRIVATE ${BROTLI_INCLUDE_DIR})
556558
endif()
557559

558-
if (USE_JEMALLOC)
559-
dbms_target_include_directories (SYSTEM BEFORE PRIVATE ${JEMALLOC_INCLUDE_DIR}) # used in Interpreters/AsynchronousMetrics.cpp
560-
target_include_directories (clickhouse_new_delete SYSTEM BEFORE PRIVATE ${JEMALLOC_INCLUDE_DIR})
561-
562-
if(NOT MAKE_STATIC_LIBRARIES AND ${JEMALLOC_LIBRARIES} MATCHES "${CMAKE_STATIC_LIBRARY_SUFFIX}$")
563-
# mallctl in dbms/src/Interpreters/AsynchronousMetrics.cpp
564-
# Actually we link JEMALLOC to almost all libraries.
565-
# This is just hotfix for some uninvestigated problem.
566-
target_link_libraries(clickhouse_interpreters PRIVATE ${JEMALLOC_LIBRARIES})
567-
endif()
568-
endif ()
569-
570560
dbms_target_include_directories (PUBLIC ${DBMS_INCLUDE_DIR})
571561
target_include_directories (clickhouse_common_io PUBLIC ${DBMS_INCLUDE_DIR})
572562

0 commit comments

Comments
 (0)