From b1c34dfa22712d829fbfe972e37263c79df74de0 Mon Sep 17 00:00:00 2001 From: Ti Chi Robot Date: Tue, 20 Dec 2022 10:00:54 +0800 Subject: [PATCH] Set max_threads according to the number of physical cpu cores (#6481) (#6489) close pingcap/tiflash#6480 --- dbms/src/Common/getNumberOfCPUCores.cpp | 63 +++++++++++++++++++ ...ogicalCPUCores.h => getNumberOfCPUCores.h} | 5 +- .../src/Common/getNumberOfLogicalCPUCores.cpp | 34 ---------- dbms/src/Flash/FlashService.cpp | 2 +- dbms/src/Flash/Mpp/MinTSOScheduler.cpp | 2 +- dbms/src/Functions/FunctionsRegexp.h | 15 +++-- dbms/src/Interpreters/SettingsCommon.h | 4 +- dbms/src/Server/Server.cpp | 4 +- 8 files changed, 84 insertions(+), 45 deletions(-) create mode 100644 dbms/src/Common/getNumberOfCPUCores.cpp rename dbms/src/Common/{getNumberOfLogicalCPUCores.h => getNumberOfCPUCores.h} (78%) delete mode 100644 dbms/src/Common/getNumberOfLogicalCPUCores.cpp diff --git a/dbms/src/Common/getNumberOfCPUCores.cpp b/dbms/src/Common/getNumberOfCPUCores.cpp new file mode 100644 index 00000000000..6f56c6b20ad --- /dev/null +++ b/dbms/src/Common/getNumberOfCPUCores.cpp @@ -0,0 +1,63 @@ +// Copyright 2022 PingCAP, Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include + +namespace CPUCores +{ +UInt16 number_of_logical_cpu_cores = std::thread::hardware_concurrency(); +UInt16 number_of_physical_cpu_cores = std::thread::hardware_concurrency() / 2; +} // namespace CPUCores + + +UInt16 getNumberOfLogicalCPUCores() +{ + return CPUCores::number_of_logical_cpu_cores; +} + +UInt16 getNumberOfPhysicalCPUCores() +{ + return CPUCores::number_of_physical_cpu_cores; +} + +// We should call this function before Context has been created, +// which will call `getNumberOfLogicalCPUCores`, or we can not +// set cpu cores any more. +void setNumberOfLogicalCPUCores(UInt16 number_of_logical_cpu_cores_) +{ + CPUCores::number_of_logical_cpu_cores = number_of_logical_cpu_cores_; +} + +void computeAndSetNumberOfPhysicalCPUCores(UInt16 number_of_logical_cpu_cores_, UInt16 number_of_hardware_physical_cores) +{ + // First of all, we need to take consideration of two situation: + // 1. tiflash on physical machine. + // In old codes, tiflash needs to set max_threads which is equal to + // physical cpu cores, so we need to ensure this behavior is not broken. + // 2. tiflash on virtual environment. + // In virtual environment, when setting max_threads, we can't directly + // get physical cpu cores to set this variable because only host machine's + // physical cpu core can be reached. So, number of physical cpus cores can + // only be assigned by calculated with logical cpu cores. + // + // - `number_of_logical_cpu_cores_` which represents how many logical cpu cores a tiflash could use(no matter in physical or virtual environment) is assigned from ServerInfo. + // - `hardware_logical_cpu_cores` represents how many logical cpu cores the host physical machine has. + // - `number_of_hardware_physical_cores` represents how many physical cpu cores the host physical machine has. + // - `(hardware_logical_cpu_cores / number_of_hardware_physical_cores)` means how many logical cpu core a physical cpu core has. + // - `number_of_logical_cpu_cores_ / (hardware_logical_cpu_cores / number_of_hardware_physical_cores)` means how many physical cpu cores the tiflash process could use. (Actually, it's needless to get physical cpu cores in virtual environment, but we must ensure the behavior `1` is not broken) + auto hardware_logical_cpu_cores = std::thread::hardware_concurrency(); + UInt16 physical_cores = number_of_logical_cpu_cores_ / (hardware_logical_cpu_cores / number_of_hardware_physical_cores); + CPUCores::number_of_physical_cpu_cores = physical_cores > 0 ? physical_cores : 1; +} diff --git a/dbms/src/Common/getNumberOfLogicalCPUCores.h b/dbms/src/Common/getNumberOfCPUCores.h similarity index 78% rename from dbms/src/Common/getNumberOfLogicalCPUCores.h rename to dbms/src/Common/getNumberOfCPUCores.h index d50d13c2596..e6b0f5b84ca 100644 --- a/dbms/src/Common/getNumberOfLogicalCPUCores.h +++ b/dbms/src/Common/getNumberOfCPUCores.h @@ -19,8 +19,11 @@ #include UInt16 getNumberOfLogicalCPUCores(); +UInt16 getNumberOfPhysicalCPUCores(); // We should call this function before Context has been created, // which will call `getNumberOfLogicalCPUCores`, or we can not // set cpu cores any more. -void setNumberOfLogicalCPUCores(UInt16 max_logical_cpu_cores); +void setNumberOfLogicalCPUCores(UInt16 number_of_logical_cpu_cores_); + +void computeAndSetNumberOfPhysicalCPUCores(UInt16 number_of_logical_cpu_cores, UInt16 number_of_hardware_physical_cores); diff --git a/dbms/src/Common/getNumberOfLogicalCPUCores.cpp b/dbms/src/Common/getNumberOfLogicalCPUCores.cpp deleted file mode 100644 index 16854909636..00000000000 --- a/dbms/src/Common/getNumberOfLogicalCPUCores.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2022 PingCAP, Ltd. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include - -namespace CPUCores -{ -UInt16 number_of_logical_cpu_cores = std::thread::hardware_concurrency(); -} // namespace CPUCores - - -UInt16 getNumberOfLogicalCPUCores() -{ - return CPUCores::number_of_logical_cpu_cores; -} - -// We should call this function before Context has been created, -// which will call `getNumberOfLogicalCPUCores`, or we can not -// set cpu cores any more. -void setNumberOfLogicalCPUCores(UInt16 max_logical_cpu_cores) -{ - CPUCores::number_of_logical_cpu_cores = max_logical_cpu_cores; -} diff --git a/dbms/src/Flash/FlashService.cpp b/dbms/src/Flash/FlashService.cpp index 5bff5fd0b8f..4fb64a8802b 100644 --- a/dbms/src/Flash/FlashService.cpp +++ b/dbms/src/Flash/FlashService.cpp @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/dbms/src/Flash/Mpp/MinTSOScheduler.cpp b/dbms/src/Flash/Mpp/MinTSOScheduler.cpp index 8107a9e3712..b7deae93311 100644 --- a/dbms/src/Flash/Mpp/MinTSOScheduler.cpp +++ b/dbms/src/Flash/Mpp/MinTSOScheduler.cpp @@ -14,7 +14,7 @@ #include #include -#include +#include #include #include diff --git a/dbms/src/Functions/FunctionsRegexp.h b/dbms/src/Functions/FunctionsRegexp.h index b1b167a4f15..2d3f292b93d 100644 --- a/dbms/src/Functions/FunctionsRegexp.h +++ b/dbms/src/Functions/FunctionsRegexp.h @@ -1015,7 +1015,8 @@ class FunctionStringRegexp : public FunctionStringRegexpBase // Initialize result column auto col_res = ColumnVector::create(); typename ColumnVector::Container & vec_res = col_res->getData(); - vec_res.resize(col_size, 0); + ResultType default_val = 0; + vec_res.assign(col_size, default_val); constexpr bool has_nullable_col = ExprT::isNullableCol() || PatT::isNullableCol() || MatchTypeT::isNullableCol(); @@ -1030,7 +1031,8 @@ class FunctionStringRegexp : public FunctionStringRegexpBase { auto nullmap_col = ColumnUInt8::create(); typename ColumnUInt8::Container & nullmap = nullmap_col->getData(); - nullmap.resize(col_size, 1); + UInt8 default_val = 1; + nullmap.assign(col_size, default_val); res_arg.column = ColumnNullable::create(std::move(col_res), std::move(nullmap_col)); return; } @@ -1317,7 +1319,8 @@ class FunctionStringRegexpInstr : public FunctionStringRegexpBase // Initialize result column auto col_res = ColumnVector::create(); typename ColumnVector::Container & vec_res = col_res->getData(); - vec_res.resize(col_size, 0); + ResultType default_val = 0; + vec_res.assign(col_size, default_val); constexpr bool has_nullable_col = ExprT::isNullableCol() || PatT::isNullableCol() || PosT::isNullableCol() || OccurT::isNullableCol() || RetOpT::isNullableCol() || MatchTypeT::isNullableCol(); @@ -1366,7 +1369,8 @@ class FunctionStringRegexpInstr : public FunctionStringRegexpBase { auto nullmap_col = ColumnUInt8::create(); typename ColumnUInt8::Container & nullmap = nullmap_col->getData(); - nullmap.resize(col_size, 1); + UInt8 default_val = 1; + nullmap.assign(col_size, default_val); res_arg.column = ColumnNullable::create(std::move(col_res), std::move(nullmap_col)); return; } @@ -1698,7 +1702,8 @@ class FunctionStringRegexpSubstr : public FunctionStringRegexpBase auto null_map_col = ColumnUInt8::create(); typename ColumnUInt8::Container & null_map = null_map_col->getData(); - null_map.resize(col_size, 1); + UInt8 default_val = 1; + null_map.assign(col_size, default_val); // Start to execute substr if (canMemorize()) diff --git a/dbms/src/Interpreters/SettingsCommon.h b/dbms/src/Interpreters/SettingsCommon.h index 4510159da57..fe84f1f1790 100644 --- a/dbms/src/Interpreters/SettingsCommon.h +++ b/dbms/src/Interpreters/SettingsCommon.h @@ -16,7 +16,7 @@ #include #include -#include +#include #include #include #include @@ -167,7 +167,7 @@ struct SettingMaxThreads static UInt64 getAutoValue() { - static auto res = getNumberOfLogicalCPUCores(); + static auto res = getNumberOfPhysicalCPUCores(); return res; } diff --git a/dbms/src/Server/Server.cpp b/dbms/src/Server/Server.cpp index 5c729c7084d..4ed337bab74 100644 --- a/dbms/src/Server/Server.cpp +++ b/dbms/src/Server/Server.cpp @@ -32,7 +32,7 @@ #include #include #include -#include +#include #include #include #include @@ -883,11 +883,13 @@ int Server::main(const std::vector & /*args*/) helper->fn_server_info(helper->proxy_ptr, strIntoView(&req), &response); server_info.parseSysInfo(response); setNumberOfLogicalCPUCores(server_info.cpu_info.logical_cores); + computeAndSetNumberOfPhysicalCPUCores(server_info.cpu_info.logical_cores, server_info.cpu_info.physical_cores); LOG_INFO(log, "ServerInfo: {}", server_info.debugString()); } else { setNumberOfLogicalCPUCores(std::thread::hardware_concurrency()); + computeAndSetNumberOfPhysicalCPUCores(std::thread::hardware_concurrency(), std::thread::hardware_concurrency() / 2); LOG_INFO(log, "TiFlashRaftProxyHelper is null, failed to get server info"); }