From 6df54611a9da2fde3f76bb04798248d89a7af0b9 Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Sun, 17 Apr 2022 15:01:56 +0300 Subject: [PATCH] Log which taskstats provider is in use Signed-off-by: Azat Khuzhin v2: add missing __builtin_unreachable() for gcc built [1] [1]: https://s3.amazonaws.com/clickhouse-builds/36351/99e72a960325cc1fb3cd3d6a1b56cf2b1cc2d733/binary_gcc/build_log.log (cherry picked from commit 2be022cb56b4d8f65f02393c4c6069f409ace4e8) --- programs/server/Server.cpp | 7 ++++++- src/Common/ThreadProfileEvents.cpp | 14 ++++++++++++++ src/Common/ThreadProfileEvents.h | 18 ++++++++++-------- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/programs/server/Server.cpp b/programs/server/Server.cpp index 786fff9b0e4..085018fbb87 100644 --- a/programs/server/Server.cpp +++ b/programs/server/Server.cpp @@ -1507,7 +1507,8 @@ int Server::main(const std::vector & /*args*/) } #if defined(OS_LINUX) - if (!TasksStatsCounters::checkIfAvailable()) + auto tasks_stats_provider = TasksStatsCounters::findBestAvailableProvider(); + if (tasks_stats_provider == TasksStatsCounters::MetricsProvider::None) { LOG_INFO(log, "It looks like this system does not have procfs mounted at /proc location," " neither clickhouse-server process has CAP_NET_ADMIN capability." @@ -1518,6 +1519,10 @@ int Server::main(const std::vector & /*args*/) " It also doesn't work if you run clickhouse-server inside network namespace as it happens in some containers.", executable_path); } + else + { + LOG_INFO(log, "Tasks stats provider: {}", TasksStatsCounters::metricsProviderString(tasks_stats_provider)); + } if (!hasLinuxCapability(CAP_SYS_NICE)) { diff --git a/src/Common/ThreadProfileEvents.cpp b/src/Common/ThreadProfileEvents.cpp index e28e5d3e85e..1a7b4d88322 100644 --- a/src/Common/ThreadProfileEvents.cpp +++ b/src/Common/ThreadProfileEvents.cpp @@ -67,6 +67,20 @@ namespace ProfileEvents namespace DB { +const char * TasksStatsCounters::metricsProviderString(MetricsProvider provider) +{ + switch (provider) + { + case MetricsProvider::None: + return "none"; + case MetricsProvider::Procfs: + return "procfs"; + case MetricsProvider::Netlink: + return "netlink"; + } + __builtin_unreachable(); +} + bool TasksStatsCounters::checkIfAvailable() { return findBestAvailableProvider() != MetricsProvider::None; diff --git a/src/Common/ThreadProfileEvents.h b/src/Common/ThreadProfileEvents.h index befd759c71b..0f2ad7dfd74 100644 --- a/src/Common/ThreadProfileEvents.h +++ b/src/Common/ThreadProfileEvents.h @@ -176,7 +176,17 @@ extern PerfEventsCounters current_thread_counters; class TasksStatsCounters { public: + enum class MetricsProvider + { + None, + Procfs, + Netlink, + }; + + static const char * metricsProviderString(MetricsProvider provider); static bool checkIfAvailable(); + static MetricsProvider findBestAvailableProvider(); + static std::unique_ptr create(UInt64 tid); void reset(); @@ -186,16 +196,8 @@ private: ::taskstats stats; //-V730_NOINIT std::function<::taskstats()> stats_getter; - enum class MetricsProvider - { - None, - Procfs, - Netlink - }; - explicit TasksStatsCounters(UInt64 tid, MetricsProvider provider); - static MetricsProvider findBestAvailableProvider(); static void incrementProfileEvents(const ::taskstats & prev, const ::taskstats & curr, ProfileEvents::Counters & profile_events); };