From 925590bee840b5b8dd96cf8773591e1e7c32f5a8 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Fri, 9 Nov 2018 15:43:18 +1100 Subject: [PATCH] my_getncpus based on threads available Detecting the cpus based on sysconf of the online CPUs can significantly over estimate the number of cpus available. Wheither via numactl, cgroups, taskset, systemd constraints, docker containers and probably other mechanisms, the number of threads mysqld can be run on can be quite less. --- cmake/os/WindowsCache.cmake | 1 + config.h.cmake | 1 + configure.cmake | 1 + sql/resourcegroups/platform/thread_attrs_api_linux.cc | 11 ++++++++++- 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/cmake/os/WindowsCache.cmake b/cmake/os/WindowsCache.cmake index 3012c109319..e03c33a7a7b 100644 --- a/cmake/os/WindowsCache.cmake +++ b/cmake/os/WindowsCache.cmake @@ -119,6 +119,7 @@ SET(HAVE_POSIX_FALLOCATE CACHE INTERNAL "") SET(HAVE_POSIX_MEMALIGN CACHE INTERNAL "") SET(HAVE_PREAD CACHE INTERNAL "") SET(HAVE_PTHREAD_CONDATTR_SETCLOCK CACHE INTERNAL "") +SET(HAVE_PTHREAD_GETAFFINITY_NP CACHE INTERNAL "") SET(HAVE_PTHREAD_SIGMASK CACHE INTERNAL "") SET(HAVE_SETFD CACHE INTERNAL "") SET(HAVE_SIGACTION CACHE INTERNAL "") diff --git a/config.h.cmake b/config.h.cmake index 0985fe432f7..81c5f185c79 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -119,6 +119,7 @@ #cmakedefine HAVE_POSIX_MEMALIGN 1 #cmakedefine HAVE_PREAD 1 #cmakedefine HAVE_PTHREAD_CONDATTR_SETCLOCK 1 +#cmakedefine HAVE_PTHREAD_GETAFFINITY_NP 1 #cmakedefine HAVE_PTHREAD_SIGMASK 1 #cmakedefine HAVE_SETFD 1 #cmakedefine HAVE_SIGACTION 1 diff --git a/configure.cmake b/configure.cmake index 51cb0d9578d..39b765c2a7f 100644 --- a/configure.cmake +++ b/configure.cmake @@ -302,6 +302,7 @@ CHECK_FUNCTION_EXISTS (posix_fallocate HAVE_POSIX_FALLOCATE) CHECK_FUNCTION_EXISTS (posix_memalign HAVE_POSIX_MEMALIGN) CHECK_FUNCTION_EXISTS (pread HAVE_PREAD) # Used by NDB CHECK_FUNCTION_EXISTS (pthread_condattr_setclock HAVE_PTHREAD_CONDATTR_SETCLOCK) +CHECK_FUNCTION_EXISTS (pthread_getaffinity_np HAVE_PTHREAD_GETAFFINITY_NP) CHECK_FUNCTION_EXISTS (pthread_sigmask HAVE_PTHREAD_SIGMASK) CHECK_FUNCTION_EXISTS (setfd HAVE_SETFD) # Used by libevent (never true) CHECK_FUNCTION_EXISTS (sigaction HAVE_SIGACTION) diff --git a/sql/resourcegroups/platform/thread_attrs_api_linux.cc b/sql/resourcegroups/platform/thread_attrs_api_linux.cc index 891a6b7efc1..c32bd1fa876 100644 --- a/sql/resourcegroups/platform/thread_attrs_api_linux.cc +++ b/sql/resourcegroups/platform/thread_attrs_api_linux.cc @@ -146,7 +146,16 @@ bool set_thread_priority(int priority, my_thread_os_id_t thread_id) { uint32_t num_vcpus() { cpu_id_t num_vcpus = 0; -#ifdef _SC_NPROCESSORS_ONLN +#if defined(HAVE_PTHREAD_GETAFFINITY_NP) + cpu_set_t set; + + if (pthread_getaffinity_np(pthread_self(), sizeof(set), &set) == 0) + { + num_vcpus= CPU_COUNT(&set); + } + else +#endif +#if defined(_SC_NPROCESSORS_ONLN) num_vcpus = sysconf(_SC_NPROCESSORS_ONLN); #elif defined(_SC_NPROCESSORS_CONF) num_vcpus = sysconf(_SC_NPROCESSORS_CONF);