[icinga-checkins] icinga.org: icinga2/master: Fix incorrect detection of the 'Concurrency' variable

git at icinga.org git at icinga.org
Wed Aug 17 09:25:17 CEST 2016


Module: icinga2
Branch: master
Commit: 585f0537d244fb8fb229924f9e7c5c8478bb2a92
URL:    https://git.icinga.org/?p=icinga2.git;a=commit;h=585f0537d244fb8fb229924f9e7c5c8478bb2a92

Author: Gunnar Beutner <gunnar at beutner.name>
Date:   Tue Aug 16 20:19:19 2016 +0200

Fix incorrect detection of the 'Concurrency' variable

fixes #12456

---

 icinga-app/icinga.cpp    |    2 +-
 lib/base/application.cpp |    2 +-
 lib/base/unix.hpp        |    1 +
 lib/base/utility.cpp     |   66 ++++++++++++++++++++++++++++++++++++++++++++++
 lib/base/utility.hpp     |    2 ++
 5 files changed, 71 insertions(+), 2 deletions(-)

diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp
index f504505..bd5042a 100644
--- a/icinga-app/icinga.cpp
+++ b/icinga-app/icinga.cpp
@@ -152,7 +152,7 @@ int Main(void)
 	Application::DeclareZonesDir(Application::GetSysconfDir() + "/icinga2/zones.d");
 	Application::DeclareRunAsUser(ICINGA_USER);
 	Application::DeclareRunAsGroup(ICINGA_GROUP);
-	Application::DeclareConcurrency(boost::thread::hardware_concurrency());
+	Application::DeclareConcurrency(Utility::PhysicalConcurrency());
 
 	if (!ScriptGlobal::Exists("UseVfork"))
 #ifdef __APPLE__
diff --git a/lib/base/application.cpp b/lib/base/application.cpp
index 36ea623..1064106 100644
--- a/lib/base/application.cpp
+++ b/lib/base/application.cpp
@@ -1339,7 +1339,7 @@ void Application::DeclareConcurrency(int ncpus)
  */
 int Application::GetConcurrency(void)
 {
-	Value defaultConcurrency = boost::thread::hardware_concurrency();
+	static Value defaultConcurrency = Utility::PhysicalConcurrency();
 	return ScriptGlobal::Get("Concurrency", &defaultConcurrency);
 }
 
diff --git a/lib/base/unix.hpp b/lib/base/unix.hpp
index 9fe8b7d..ab9881a 100644
--- a/lib/base/unix.hpp
+++ b/lib/base/unix.hpp
@@ -41,6 +41,7 @@
 #include <sys/time.h>
 #include <sys/resource.h>
 #include <strings.h>
+#include <sys/sysctl.h>
 
 typedef int SOCKET;
 #define INVALID_SOCKET (-1)
diff --git a/lib/base/utility.cpp b/lib/base/utility.cpp
index 8247082..29c98e1 100644
--- a/lib/base/utility.cpp
+++ b/lib/base/utility.cpp
@@ -1936,3 +1936,69 @@ String Utility::GetIcingaDataPath(void)
 }
 
 #endif /* _WIN32 */
+
+int Utility::PhysicalConcurrency(void)
+{
+#if BOOST_VERSION >= 106100
+	return boost::thread::physical_concurrency();
+#elif defined(__linux__)
+	std::ifstream fp("/proc/cpuinfo");
+	std::string line;
+	bool htFlag = false;
+
+	while (std::getline(fp, line)) {
+		std::vector<String> tokens;
+		boost::algorithm::split(tokens, line, boost::is_any_of(":"));
+
+		if (tokens.size() != 2)
+			continue;
+
+		String key = tokens[0].Trim();
+		String value = tokens[1].Trim();
+
+		if (key != "flags")
+			continue;
+
+		std::vector<String> flags;
+		boost::algorithm::split(flags, value, boost::is_any_of(" "));
+
+		if (std::find(flags.begin(), flags.end(), "ht") != flags.end()) {
+			htFlag = true;
+			break;
+		}
+	}
+
+	return boost::thread::hardware_concurrency() / (htFlag ? 2 : 1);
+#elif defined(_WIN32)
+	DWORD size = 0;
+
+	GetLogicalProcessorInformation(NULL, &size);
+
+	if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+		return boost::thread::hardware_concurrency();
+
+	std::vector<SYSTEM_LOGICAL_PROCESSOR_INFORMATION> info(size / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION));
+
+	if (GetLogicalProcessorInformation(&info.front(), &size) == FALSE)
+		return boost::thread::hardware_concurrency();
+
+	int ncpus = 0;
+
+	BOOST_FOREACH(const SYSTEM_LOGICAL_PROCESSOR_INFORMATION& slpi, info) {
+		if (slpi.Relationship == RelationProcessorCore)
+			ncpus++;
+	}
+
+	return ncpus;
+#elif defined(__APPLE__)
+	int ncpus;
+	size_t size = sizeof(ncpus);
+
+	if (sysctlbyname("hw.physicalcpu", &ncpus, &size, NULL, 0) == 0)
+		return ncpus;
+	else
+		return boost::thread::hardware_concurrency();
+#else /* __APPLE__ */
+	return boost::thread::hardware_concurrency();
+#endif /* __APPLE__ */
+}
diff --git a/lib/base/utility.hpp b/lib/base/utility.hpp
index 0e1fcc2..3688529 100644
--- a/lib/base/utility.hpp
+++ b/lib/base/utility.hpp
@@ -153,6 +153,8 @@ public:
 	static void IncrementTime(double);
 #endif /* I2_DEBUG */
 
+	static int PhysicalConcurrency(void);
+
 private:
 	Utility(void);
 	static void CollectPaths(const String& path, std::vector<String>& paths);



More information about the icinga-checkins mailing list