mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 23:21:59 +00:00
Merge pull request #71229 from ClickHouse/backport/24.8/71174
Backport #71174 to 24.8: Maybe not GWPAsan by default
This commit is contained in:
commit
563a57db09
@ -480,7 +480,7 @@ static void sanityChecks(Server & server)
|
|||||||
#if defined(OS_LINUX)
|
#if defined(OS_LINUX)
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
const std::unordered_set<std::string> fastClockSources = {
|
const std::unordered_set<std::string> fast_clock_sources = {
|
||||||
// ARM clock
|
// ARM clock
|
||||||
"arch_sys_counter",
|
"arch_sys_counter",
|
||||||
// KVM guest clock
|
// KVM guest clock
|
||||||
@ -489,7 +489,7 @@ static void sanityChecks(Server & server)
|
|||||||
"tsc",
|
"tsc",
|
||||||
};
|
};
|
||||||
const char * filename = "/sys/devices/system/clocksource/clocksource0/current_clocksource";
|
const char * filename = "/sys/devices/system/clocksource/clocksource0/current_clocksource";
|
||||||
if (!fastClockSources.contains(readLine(filename)))
|
if (!fast_clock_sources.contains(readLine(filename)))
|
||||||
server.context()->addWarningMessage("Linux is not using a fast clock source. Performance can be degraded. Check " + String(filename));
|
server.context()->addWarningMessage("Linux is not using a fast clock source. Performance can be degraded. Check " + String(filename));
|
||||||
}
|
}
|
||||||
catch (...) // NOLINT(bugprone-empty-catch)
|
catch (...) // NOLINT(bugprone-empty-catch)
|
||||||
@ -1776,10 +1776,6 @@ try
|
|||||||
if (global_context->isServerCompletelyStarted())
|
if (global_context->isServerCompletelyStarted())
|
||||||
CannotAllocateThreadFaultInjector::setFaultProbability(new_server_settings.cannot_allocate_thread_fault_injection_probability);
|
CannotAllocateThreadFaultInjector::setFaultProbability(new_server_settings.cannot_allocate_thread_fault_injection_probability);
|
||||||
|
|
||||||
#if USE_GWP_ASAN
|
|
||||||
GWPAsan::setForceSampleProbability(new_server_settings.gwp_asan_force_sample_probability);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ProfileEvents::increment(ProfileEvents::MainConfigLoads);
|
ProfileEvents::increment(ProfileEvents::MainConfigLoads);
|
||||||
|
|
||||||
/// Must be the last.
|
/// Must be the last.
|
||||||
@ -2234,7 +2230,6 @@ try
|
|||||||
|
|
||||||
#if USE_GWP_ASAN
|
#if USE_GWP_ASAN
|
||||||
GWPAsan::initFinished();
|
GWPAsan::initFinished();
|
||||||
GWPAsan::setForceSampleProbability(server_settings.gwp_asan_force_sample_probability);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
try
|
try
|
||||||
|
@ -57,7 +57,7 @@ static bool guarded_alloc_initialized = []
|
|||||||
opts.MaxSimultaneousAllocations = 1024;
|
opts.MaxSimultaneousAllocations = 1024;
|
||||||
|
|
||||||
if (!env_options_raw || !std::string_view{env_options_raw}.contains("SampleRate"))
|
if (!env_options_raw || !std::string_view{env_options_raw}.contains("SampleRate"))
|
||||||
opts.SampleRate = 10000;
|
opts.SampleRate = 0;
|
||||||
|
|
||||||
const char * collect_stacktraces = std::getenv("GWP_ASAN_COLLECT_STACKTRACES"); // NOLINT(concurrency-mt-unsafe)
|
const char * collect_stacktraces = std::getenv("GWP_ASAN_COLLECT_STACKTRACES"); // NOLINT(concurrency-mt-unsafe)
|
||||||
if (collect_stacktraces && std::string_view{collect_stacktraces} == "1")
|
if (collect_stacktraces && std::string_view{collect_stacktraces} == "1")
|
||||||
@ -224,12 +224,6 @@ void initFinished()
|
|||||||
init_finished.store(true, std::memory_order_relaxed);
|
init_finished.store(true, std::memory_order_relaxed);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::atomic<double> force_sample_probability = 0.0;
|
|
||||||
|
|
||||||
void setForceSampleProbability(double value)
|
|
||||||
{
|
|
||||||
force_sample_probability.store(value, std::memory_order_relaxed);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
#include <Common/thread_local_rng.h>
|
#include <Common/thread_local_rng.h>
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <random>
|
|
||||||
|
|
||||||
namespace GWPAsan
|
namespace GWPAsan
|
||||||
{
|
{
|
||||||
@ -23,10 +22,6 @@ extern std::atomic<bool> init_finished;
|
|||||||
|
|
||||||
void initFinished();
|
void initFinished();
|
||||||
|
|
||||||
extern std::atomic<double> force_sample_probability;
|
|
||||||
|
|
||||||
void setForceSampleProbability(double value);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* We'd like to postpone sampling allocations under the startup is finished. There are mainly
|
* We'd like to postpone sampling allocations under the startup is finished. There are mainly
|
||||||
* two reasons for that:
|
* two reasons for that:
|
||||||
@ -39,14 +34,6 @@ inline bool shouldSample()
|
|||||||
return init_finished.load(std::memory_order_relaxed) && GuardedAlloc.shouldSample();
|
return init_finished.load(std::memory_order_relaxed) && GuardedAlloc.shouldSample();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool shouldForceSample()
|
|
||||||
{
|
|
||||||
if (!init_finished.load(std::memory_order_relaxed))
|
|
||||||
return false;
|
|
||||||
std::bernoulli_distribution dist(force_sample_probability.load(std::memory_order_relaxed));
|
|
||||||
return dist(thread_local_rng);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -115,11 +115,6 @@ protected:
|
|||||||
template <typename ... TAllocatorParams>
|
template <typename ... TAllocatorParams>
|
||||||
void alloc(size_t bytes, TAllocatorParams &&... allocator_params)
|
void alloc(size_t bytes, TAllocatorParams &&... allocator_params)
|
||||||
{
|
{
|
||||||
#if USE_GWP_ASAN
|
|
||||||
if (unlikely(GWPAsan::shouldForceSample()))
|
|
||||||
gwp_asan::getThreadLocals()->NextSampleCounter = 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
char * allocated = reinterpret_cast<char *>(TAllocator::alloc(bytes, std::forward<TAllocatorParams>(allocator_params)...));
|
char * allocated = reinterpret_cast<char *>(TAllocator::alloc(bytes, std::forward<TAllocatorParams>(allocator_params)...));
|
||||||
|
|
||||||
c_start = allocated + pad_left;
|
c_start = allocated + pad_left;
|
||||||
@ -149,11 +144,6 @@ protected:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USE_GWP_ASAN
|
|
||||||
if (unlikely(GWPAsan::shouldForceSample()))
|
|
||||||
gwp_asan::getThreadLocals()->NextSampleCounter = 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
unprotect();
|
unprotect();
|
||||||
|
|
||||||
ptrdiff_t end_diff = c_end - c_start;
|
ptrdiff_t end_diff = c_end - c_start;
|
||||||
|
@ -165,7 +165,6 @@ namespace DB
|
|||||||
M(String, merge_workload, "default", "Name of workload to be used to access resources for all merges (may be overridden by a merge tree setting)", 0) \
|
M(String, merge_workload, "default", "Name of workload to be used to access resources for all merges (may be overridden by a merge tree setting)", 0) \
|
||||||
M(String, mutation_workload, "default", "Name of workload to be used to access resources for all mutations (may be overridden by a merge tree setting)", 0) \
|
M(String, mutation_workload, "default", "Name of workload to be used to access resources for all mutations (may be overridden by a merge tree setting)", 0) \
|
||||||
M(Bool, prepare_system_log_tables_on_startup, false, "If true, ClickHouse creates all configured `system.*_log` tables before the startup. It can be helpful if some startup scripts depend on these tables.", 0) \
|
M(Bool, prepare_system_log_tables_on_startup, false, "If true, ClickHouse creates all configured `system.*_log` tables before the startup. It can be helpful if some startup scripts depend on these tables.", 0) \
|
||||||
M(Double, gwp_asan_force_sample_probability, 0.0003, "Probability that an allocation from specific places will be sampled by GWP Asan (i.e. PODArray allocations)", 0) \
|
|
||||||
M(UInt64, config_reload_interval_ms, 2000, "How often clickhouse will reload config and check for new changes", 0) \
|
M(UInt64, config_reload_interval_ms, 2000, "How often clickhouse will reload config and check for new changes", 0) \
|
||||||
M(Bool, disable_insertion_and_mutation, false, "Disable all insert/alter/delete queries. This setting will be enabled if someone needs read-only nodes to prevent insertion and mutation affect reading performance.", 0)
|
M(Bool, disable_insertion_and_mutation, false, "Disable all insert/alter/delete queries. This setting will be enabled if someone needs read-only nodes to prevent insertion and mutation affect reading performance.", 0)
|
||||||
|
|
||||||
|
@ -44,16 +44,10 @@ struct Memory : boost::noncopyable, Allocator
|
|||||||
char * m_data = nullptr;
|
char * m_data = nullptr;
|
||||||
size_t alignment = 0;
|
size_t alignment = 0;
|
||||||
|
|
||||||
[[maybe_unused]] bool allow_gwp_asan_force_sample{false};
|
|
||||||
|
|
||||||
Memory() = default;
|
Memory() = default;
|
||||||
|
|
||||||
/// If alignment != 0, then allocate memory aligned to specified value.
|
/// If alignment != 0, then allocate memory aligned to specified value.
|
||||||
explicit Memory(size_t size_, size_t alignment_ = 0, bool allow_gwp_asan_force_sample_ = false)
|
explicit Memory(size_t size_, size_t alignment_ = 0) : alignment(alignment_) { alloc(size_); }
|
||||||
: alignment(alignment_), allow_gwp_asan_force_sample(allow_gwp_asan_force_sample_)
|
|
||||||
{
|
|
||||||
alloc(size_);
|
|
||||||
}
|
|
||||||
|
|
||||||
~Memory()
|
~Memory()
|
||||||
{
|
{
|
||||||
@ -133,11 +127,6 @@ private:
|
|||||||
ProfileEvents::increment(ProfileEvents::IOBufferAllocs);
|
ProfileEvents::increment(ProfileEvents::IOBufferAllocs);
|
||||||
ProfileEvents::increment(ProfileEvents::IOBufferAllocBytes, new_capacity);
|
ProfileEvents::increment(ProfileEvents::IOBufferAllocBytes, new_capacity);
|
||||||
|
|
||||||
#if USE_GWP_ASAN
|
|
||||||
if (unlikely(allow_gwp_asan_force_sample && GWPAsan::shouldForceSample()))
|
|
||||||
gwp_asan::getThreadLocals()->NextSampleCounter = 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
m_data = static_cast<char *>(Allocator::alloc(new_capacity, alignment));
|
m_data = static_cast<char *>(Allocator::alloc(new_capacity, alignment));
|
||||||
m_capacity = new_capacity;
|
m_capacity = new_capacity;
|
||||||
m_size = new_size;
|
m_size = new_size;
|
||||||
@ -165,7 +154,7 @@ protected:
|
|||||||
public:
|
public:
|
||||||
/// If non-nullptr 'existing_memory' is passed, then buffer will not create its own memory and will use existing_memory without ownership.
|
/// If non-nullptr 'existing_memory' is passed, then buffer will not create its own memory and will use existing_memory without ownership.
|
||||||
explicit BufferWithOwnMemory(size_t size = DBMS_DEFAULT_BUFFER_SIZE, char * existing_memory = nullptr, size_t alignment = 0)
|
explicit BufferWithOwnMemory(size_t size = DBMS_DEFAULT_BUFFER_SIZE, char * existing_memory = nullptr, size_t alignment = 0)
|
||||||
: Base(nullptr, 0), memory(existing_memory ? 0 : size, alignment, /*allow_gwp_asan_force_sample_=*/true)
|
: Base(nullptr, 0), memory(existing_memory ? 0 : size, alignment)
|
||||||
{
|
{
|
||||||
Base::set(existing_memory ? existing_memory : memory.data(), size);
|
Base::set(existing_memory ? existing_memory : memory.data(), size);
|
||||||
Base::padded = !existing_memory;
|
Base::padded = !existing_memory;
|
||||||
|
Loading…
Reference in New Issue
Block a user