You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by sz...@apache.org on 2021/06/14 14:51:38 UTC
[nifi-minifi-cpp] 01/03: MINIFICPP-1557 Fix CPU usage percentage
calculation
This is an automated email from the ASF dual-hosted git repository.
szaszm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git
commit fb04567a0c3c4f29271742369a98d171a162549d
Author: Gabor Gyimesi <ga...@gmail.com>
AuthorDate: Mon Jun 14 15:27:53 2021 +0200
MINIFICPP-1557 Fix CPU usage percentage calculation
Closes #1101
Signed-off-by: Marton Szasz <sz...@gmail.com>
---
extensions/http-curl/tests/HTTPHandlers.h | 11 ++++++++---
libminifi/src/utils/ProcessCpuUsageTracker.cpp | 11 +++++++++--
libminifi/src/utils/SystemCpuUsageTracker.cpp | 16 ++++++++++++----
libminifi/test/unit/CpuUsageTest.cpp | 2 +-
4 files changed, 30 insertions(+), 10 deletions(-)
diff --git a/extensions/http-curl/tests/HTTPHandlers.h b/extensions/http-curl/tests/HTTPHandlers.h
index e410f3b..f13e2be 100644
--- a/extensions/http-curl/tests/HTTPHandlers.h
+++ b/extensions/http-curl/tests/HTTPHandlers.h
@@ -27,6 +27,7 @@
#include "CivetStream.h"
#include "io/CRCStream.h"
#include "rapidjson/document.h"
+#include "rapidjson/error/en.h"
#include "HTTPUtils.h"
#include "ServerAwareHandler.h"
#include "utils/gsl.h"
@@ -422,11 +423,15 @@ class HeartbeatHandler : public ServerAwareHandler {
void verify(struct mg_connection *conn) {
auto post_data = readPayload(conn);
+ if (!isServerRunning()) {
+ return;
+ }
if (!IsNullOrEmpty(post_data)) {
rapidjson::Document root;
- rapidjson::ParseResult ok = root.Parse(post_data.data(), post_data.size());
- assert(ok);
- (void)ok; // unused in release builds
+ rapidjson::ParseResult result = root.Parse(post_data.data(), post_data.size());
+ if (!result) {
+ throw std::runtime_error(fmt::format("JSON parse error: {0}\n JSON data: {1}", std::string(rapidjson::GetParseError_En(result.Code())), post_data));
+ }
std::string operation = root["operation"].GetString();
if (operation == "heartbeat") {
handleHeartbeat(root, conn);
diff --git a/libminifi/src/utils/ProcessCpuUsageTracker.cpp b/libminifi/src/utils/ProcessCpuUsageTracker.cpp
index c970c18..3a9eade 100644
--- a/libminifi/src/utils/ProcessCpuUsageTracker.cpp
+++ b/libminifi/src/utils/ProcessCpuUsageTracker.cpp
@@ -22,6 +22,7 @@
#endif
#include <thread>
+#include <algorithm>
namespace org {
namespace apache {
@@ -68,10 +69,13 @@ bool ProcessCpuUsageTracker::isCurrentQuerySameAsPrevious() const {
double ProcessCpuUsageTracker::getProcessCpuUsageBetweenLastTwoQueries() const {
clock_t cpu_times_diff = cpu_times_ - previous_cpu_times_;
+ if (cpu_times_diff == 0) {
+ return -1.0;
+ }
clock_t sys_cpu_times_diff = sys_cpu_times_ - previous_sys_cpu_times_;
clock_t user_cpu_times_diff = user_cpu_times_ - previous_user_cpu_times_;
double percent = static_cast<double>(sys_cpu_times_diff + user_cpu_times_diff) / static_cast<double>(cpu_times_diff);
- percent = percent / std::thread::hardware_concurrency();
+ percent = percent / (std::max)(uint32_t{1}, std::thread::hardware_concurrency());
return percent;
}
@@ -123,10 +127,13 @@ void ProcessCpuUsageTracker::queryCpuTimes() {
double ProcessCpuUsageTracker::getProcessCpuUsageBetweenLastTwoQueries() const {
uint64_t cpu_times_diff = cpu_times_ - previous_cpu_times_;
+ if (cpu_times_diff == 0) {
+ return -1.0;
+ }
uint64_t sys_cpu_times_diff = sys_cpu_times_ - previous_sys_cpu_times_;
uint64_t user_cpu_times_diff = user_cpu_times_ - previous_user_cpu_times_;
double percent = static_cast<double>(sys_cpu_times_diff + user_cpu_times_diff) / static_cast<double>(cpu_times_diff);
- percent = percent / std::thread::hardware_concurrency();
+ percent = percent / (std::max)(uint32_t{1}, std::thread::hardware_concurrency());
return percent;
}
#endif
diff --git a/libminifi/src/utils/SystemCpuUsageTracker.cpp b/libminifi/src/utils/SystemCpuUsageTracker.cpp
index d7b5ec7..9ca5344 100644
--- a/libminifi/src/utils/SystemCpuUsageTracker.cpp
+++ b/libminifi/src/utils/SystemCpuUsageTracker.cpp
@@ -75,8 +75,11 @@ double SystemCpuUsageTracker::getCpuUsageBetweenLastTwoQueries() const {
uint64_t total_user_low_diff = total_user_low_ - previous_total_user_low_;
uint64_t total_system_diff = total_sys_ - previous_total_sys_;
uint64_t total_idle_diff = total_idle_ - previous_total_idle_;
- uint64_t total_diff = total_user_diff + total_user_low_diff + total_system_diff;
- double percent = static_cast<double>(total_diff)/static_cast<double>(total_diff+total_idle_diff);
+ uint64_t total_diff = total_user_diff + total_user_low_diff + total_system_diff;
+ if (total_diff + total_idle_diff == 0) {
+ return -1.0;
+ }
+ double percent = static_cast<double>(total_diff) / static_cast<double>(total_diff + total_idle_diff);
return percent;
}
@@ -126,6 +129,9 @@ double SystemCpuUsageTracker::getCpuUsageBetweenLastTwoQueries() const {
uint64_t total_sys_diff = total_sys_ - previous_total_sys_;
uint64_t total_idle_diff = total_idle_ - previous_total_idle_;
uint64_t total_diff = total_user_diff + total_sys_diff;
+ if (total_diff == 0) {
+ return -1.0;
+ }
double percent = static_cast<double>(total_diff - total_idle_diff) / static_cast<double>(total_diff);
return percent;
@@ -176,8 +182,10 @@ bool SystemCpuUsageTracker::isCurrentQuerySameAsPrevious() const {
double SystemCpuUsageTracker::getCpuUsageBetweenLastTwoQueries() const {
uint64_t total_ticks_since_last_time = total_ticks_-previous_total_ticks_;
uint64_t idle_ticks_since_last_time = idle_ticks_-previous_idle_ticks_;
-
- double percent = static_cast<double>(total_ticks_since_last_time-idle_ticks_since_last_time)/static_cast<double>(total_ticks_since_last_time);
+ if (total_ticks_since_last_time == 0) {
+ return -1.0;
+ }
+ double percent = static_cast<double>(total_ticks_since_last_time - idle_ticks_since_last_time) / static_cast<double>(total_ticks_since_last_time);
return percent;
}
diff --git a/libminifi/test/unit/CpuUsageTest.cpp b/libminifi/test/unit/CpuUsageTest.cpp
index d9e6c06..c8ac357 100644
--- a/libminifi/test/unit/CpuUsageTest.cpp
+++ b/libminifi/test/unit/CpuUsageTest.cpp
@@ -49,7 +49,7 @@ TEST_CASE("Test System CPU Utilization", "[testcpuusage]") {
org::apache::nifi::minifi::utils::SystemCpuUsageTracker hostTracker;
org::apache::nifi::minifi::utils::ProcessCpuUsageTracker processTracker;
- int vCores = std::thread::hardware_concurrency();
+ auto vCores = (std::max)(uint32_t{1}, std::thread::hardware_concurrency());
auto test_start = std::chrono::system_clock::now();
for (int i = 0; i < number_of_rounds; ++i) {
{