]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Pull request #4524: main: remove mutex from snort command to show snort cpu
authorRishabh Choudhary (rishacho) <rishacho@cisco.com>
Wed, 27 Nov 2024 03:02:25 +0000 (03:02 +0000)
committerShanmugam S (shanms) <shanms@cisco.com>
Wed, 27 Nov 2024 03:02:25 +0000 (03:02 +0000)
Merge in SNORT/snort3 from ~RISHACHO/snort3:snort_cpu_fix to master

Squashed commit of the following:

commit 18b3cc1bddd7ee90e287dd8c08c1aa5c3388897e
Author: Rishabh Choudhary <rishacho@cisco.com>
Date:   Wed Nov 20 19:02:22 2024 +0530

    main: remove mutex from snort command to show snort cpu

src/main/analyzer_command.cc
src/main/analyzer_command.h

index b595291990d4c71a54aaa7287eff981b469b565b..ef2687d7038fac0ce0c5b591f639df9235093244 100644 (file)
@@ -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<std::mutex> 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<double> (get_data.cpu_usage_percent_30s);
-        double cpu_120s = static_cast<double> (get_data.cpu_usage_percent_120s);
-        double cpu_300s = static_cast<double> (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<double>(get_data.cpu_usage_percent_30s);
+    stat.cpu_usage_120s = static_cast<double>(get_data.cpu_usage_percent_120s);
+    stat.cpu_usage_300s = static_cast<double>(get_data.cpu_usage_percent_300s); 
     return true;
 }
index 45b7e9e58cfa8fba030bb4e3e949c063e1be4894..3bbfe9a82f1123f8b2a75f98809af25babcb46e1 100644 (file)
@@ -27,6 +27,7 @@
 #include <mutex>
 
 #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<CpuUsage> 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