From: Rishabh Choudhary (rishacho) Date: Wed, 27 Nov 2024 03:02:25 +0000 (+0000) Subject: Pull request #4524: main: remove mutex from snort command to show snort cpu X-Git-Tag: 3.6.0.0~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ca6c29da54e7cdb3a911c5500c5b438b3e3e6dc3;p=thirdparty%2Fsnort3.git Pull request #4524: main: remove mutex from snort command to show snort cpu Merge in SNORT/snort3 from ~RISHACHO/snort3:snort_cpu_fix to master Squashed commit of the following: commit 18b3cc1bddd7ee90e287dd8c08c1aa5c3388897e Author: Rishabh Choudhary Date: Wed Nov 20 19:02:22 2024 +0530 main: remove mutex from snort command to show snort cpu --- diff --git a/src/main/analyzer_command.cc b/src/main/analyzer_command.cc index b59529199..ef2687d70 100644 --- a/src/main/analyzer_command.cc +++ b/src/main/analyzer_command.cc @@ -304,9 +304,27 @@ ACShowSnortCPU::~ACShowSnortCPU() { if (DAQ_SUCCESS == status) { - LogRespond(ctrlcon, "\nSummary \t%.1f%% \t%.1f%% \t%.1f%%\n", - cpu_usage_30s/instance_num, cpu_usage_120s/instance_num, - cpu_usage_300s/instance_num); + double cpu_usage_30s = 0.0; + double cpu_usage_120s = 0.0; + double cpu_usage_300s = 0.0; + int instance = 0; + + for (const auto& cu : cpu_usage) + { + log_message("%-3d \t%-6d \t%.1f%% \t%.1f%% \t%.1f%%\n", + instance, ThreadConfig::get_instance_tid(instance), cu.cpu_usage_30s, + cu.cpu_usage_120s, cu.cpu_usage_300s); + + cpu_usage_30s += cu.cpu_usage_30s; + cpu_usage_120s += cu.cpu_usage_120s; + cpu_usage_300s += cu.cpu_usage_300s; + instance++; + } + + if (instance) + log_message("\nSummary \t%.1f%% \t%.1f%% \t%.1f%%\n", + cpu_usage_30s/instance, cpu_usage_120s/instance, + cpu_usage_300s/instance); } } @@ -314,40 +332,21 @@ bool ACShowSnortCPU::execute(Analyzer& analyzer, void**) { DIOCTL_GetCpuProfileData get_data = {}; - { - std::lock_guard lock(cpu_usage_mutex); - assert(DAQ_SUCCESS == status); - - SFDAQInstance* instance = get_daq_instance(analyzer); - ThreadConfig *thread_config = SnortConfig::get_conf()->thread_config; - int tid = thread_config->get_instance_tid(get_instance_id()); + SFDAQInstance* instance = get_daq_instance(analyzer); - status = instance->ioctl( - (DAQ_IoctlCmd)DIOCTL_GET_CPU_PROFILE_DATA, - (void *)(&get_data), - sizeof(DIOCTL_GetCpuProfileData)); - - if (DAQ_SUCCESS != status) - { - LogRespond(ctrlcon, "Fetching profile data failed from DAQ instance\n"); - return true; - } - - double cpu_30s = static_cast (get_data.cpu_usage_percent_30s); - double cpu_120s = static_cast (get_data.cpu_usage_percent_120s); - double cpu_300s = static_cast (get_data.cpu_usage_percent_300s); - - // Print CPU usage - LogRespond(ctrlcon, "%-3d \t%-6d \t%.1f%% \t%.1f%% \t%.1f%%\n", - instance_num, tid, cpu_30s, cpu_120s, cpu_300s); - - // Add CPU usage data - cpu_usage_30s += cpu_30s; - cpu_usage_120s += cpu_120s; - cpu_usage_300s += cpu_300s; - instance_num++; + status = instance->ioctl((DAQ_IoctlCmd)DIOCTL_GET_CPU_PROFILE_DATA, + (void *)(&get_data), sizeof(DIOCTL_GetCpuProfileData)); + if (DAQ_SUCCESS != status) + { + LogRespond(ctrlcon, "Fetching profile data failed from DAQ instance %d\n", get_instance_id()); + return true; } + auto& stat = cpu_usage[get_instance_id()]; + stat.cpu_usage_30s = static_cast(get_data.cpu_usage_percent_30s); + stat.cpu_usage_120s = static_cast(get_data.cpu_usage_percent_120s); + stat.cpu_usage_300s = static_cast(get_data.cpu_usage_percent_300s); + return true; } diff --git a/src/main/analyzer_command.h b/src/main/analyzer_command.h index 45b7e9e58..3bbfe9a82 100644 --- a/src/main/analyzer_command.h +++ b/src/main/analyzer_command.h @@ -27,6 +27,7 @@ #include #include "main/snort_types.h" +#include "main/thread_config.h" class Analyzer; class ControlConn; @@ -210,19 +211,22 @@ private: class ACShowSnortCPU : public snort::AnalyzerCommand { public: - explicit ACShowSnortCPU(ControlConn* conn) : AnalyzerCommand(conn) + explicit ACShowSnortCPU(ControlConn* conn) + : AnalyzerCommand(conn), cpu_usage(snort::ThreadConfig::get_instance_max()) { } bool execute(Analyzer&, void**) override; const char* stringify() override { return "SHOW_SNORT_CPU"; } ~ACShowSnortCPU() override; private: + struct CpuUsage + { + double cpu_usage_30s; + double cpu_usage_120s; + double cpu_usage_300s; + }; + std::vector cpu_usage; int status = DAQ_SUCCESS; - double cpu_usage_30s = 0.0; - double cpu_usage_120s = 0.0; - double cpu_usage_300s = 0.0; - int instance_num = 0; - std::mutex cpu_usage_mutex; }; namespace snort