From: Adrian Mamolea (admamole) Date: Tue, 26 Nov 2024 12:09:54 +0000 (+0000) Subject: Pull request #4523: analyzer: add logging for resource tuning progress X-Git-Tag: 3.6.0.0~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fb6f619280b04eac572cbea1fd42c8aada8663ff;p=thirdparty%2Fsnort3.git Pull request #4523: analyzer: add logging for resource tuning progress Merge in SNORT/snort3 from ~ADMAMOLE/snort3:reload_tuner2 to master Squashed commit of the following: commit 8d93eee846ae6a585cf86db11b5316f35ca5fe27 Author: Adrian Mamolea Date: Tue Nov 19 11:15:03 2024 -0500 analyzer: add logging for resource tuning progress --- diff --git a/src/host_tracker/host_cache_module.h b/src/host_tracker/host_cache_module.h index d004650e8..e9286884f 100644 --- a/src/host_tracker/host_cache_module.h +++ b/src/host_tracker/host_cache_module.h @@ -40,6 +40,10 @@ class HostCacheReloadTuner : public snort::ReloadResourceTuner { public: explicit HostCacheReloadTuner(size_t memcap) : memcap(memcap) { } + + const char* name() const override + { return "HostCacheReloadTuner"; } + bool tinit() override { return host_cache.reload_resize(memcap); } diff --git a/src/latency/latency_module.cc b/src/latency/latency_module.cc index 15d6c83c6..d7d26d174 100644 --- a/src/latency/latency_module.cc +++ b/src/latency/latency_module.cc @@ -182,6 +182,9 @@ public: {} ~LatencyTuner() override = default; + const char* name() const override + { return "LatencyTuner"; } + bool tinit() override { packet_latency::set_force_enable(enable_packet); @@ -260,3 +263,18 @@ const PegInfo* LatencyModule::get_pegs() const PegCount* LatencyModule::get_counts() const { return reinterpret_cast(&latency_stats); } + +#ifdef UNIT_TEST + +#include "catch/snort_catch.h" + +#include + +TEST_CASE("Latency tuner name", "[latency_module]") +{ + LatencyTuner tuner(true, false); + + REQUIRE(strcmp(tuner.name(), "LatencyTuner") == 0); +} + +#endif diff --git a/src/main/analyzer_command.cc b/src/main/analyzer_command.cc index daa5ff03b..b59529199 100644 --- a/src/main/analyzer_command.cc +++ b/src/main/analyzer_command.cc @@ -24,15 +24,17 @@ #include "analyzer_command.h" #include +#include #include "control/control.h" #include "framework/module.h" #include "log/messages.h" #include "managers/module_manager.h" +#include "packet_io/sfdaq_instance.h" #include "protocols/packet_manager.h" #include "target_based/host_attributes.h" +#include "time/packet_time.h" #include "utils/stats.h" -#include "packet_io/sfdaq_instance.h" #include "analyzer.h" #include "reload_tracker.h" @@ -44,6 +46,29 @@ using namespace snort; +static THREAD_LOCAL timeval report_time{}; +static const timeval report_period = {10, 0}; + +static void tuner_next(ReloadResourceTuner* tuner) +{ + LogMessage("ReloadResourceTuner[%u] running %s\n", get_instance_id(), tuner->name()); + + timeval now; + packet_gettimeofday(&now); + timeradd(&now, &report_period, &report_time); +} + +static void tuner_update(ReloadResourceTuner* tuner) +{ + timeval now; + packet_gettimeofday(&now); + if (timercmp(&now, &report_time, >)) + { + timeradd(&now, &report_period, &report_time); + tuner->report_progress(); + } +} + void AnalyzerCommand::log_message(ControlConn* ctrlcon, const char* format, va_list& ap) { if (ctrlcon && !ctrlcon->is_local()) @@ -168,6 +193,7 @@ bool ACSwap::execute(Analyzer& analyzer, void** ac_state) if ( !*ac_state ) { + LogMessage("ReloadResourceTuner[%u] start\n", get_instance_id()); reload_tuners = new std::list(sc->get_reload_resource_tuners()); std::list::iterator rtt = reload_tuners->begin(); while ( rtt != reload_tuners->end() ) @@ -178,6 +204,8 @@ bool ACSwap::execute(Analyzer& analyzer, void** ac_state) rtt = reload_tuners->erase(rtt); } *ac_state = reload_tuners; + if (!reload_tuners->empty()) + tuner_next(reload_tuners->front()); } else reload_tuners = (std::list*)*ac_state; @@ -185,21 +213,21 @@ bool ACSwap::execute(Analyzer& analyzer, void** ac_state) if ( !reload_tuners->empty() ) { auto rrt = reload_tuners->front(); - if ( analyzer.is_idling() ) + bool tuning_complete = analyzer.is_idling() ? rrt->tune_idle_context() : rrt->tune_packet_context(); + if (tuning_complete) { - if ( rrt->tune_idle_context() ) - reload_tuners->pop_front(); + reload_tuners->pop_front(); + if (!reload_tuners->empty()) + tuner_next(reload_tuners->front()); } else - { - if ( rrt->tune_packet_context() ) - reload_tuners->pop_front(); - } + tuner_update(rrt); } // check for empty again and free list instance if we are done if ( reload_tuners->empty() ) { + LogMessage("ReloadResourceTuner[%d] complete\n", get_instance_id()); delete reload_tuners; ps->finish(analyzer); return true; diff --git a/src/main/reload_tuner.h b/src/main/reload_tuner.h index ebae9a8e0..35301c266 100644 --- a/src/main/reload_tuner.h +++ b/src/main/reload_tuner.h @@ -31,6 +31,9 @@ public: virtual ~ReloadResourceTuner() = default; + // returns name of the tuner + virtual const char* name() const = 0; + // returns true if resource tuning required, false otherwise virtual bool tinit() = 0; @@ -38,6 +41,9 @@ public: virtual bool tune_packet_context() = 0; virtual bool tune_idle_context() = 0; + // report progress and/or work left for the tuner + virtual void report_progress() {} + protected: ReloadResourceTuner() = default; @@ -50,6 +56,10 @@ class ReloadSwapper : public ReloadResourceTuner public: virtual ~ReloadSwapper() override = default; + // returns name of the tuner + const char* name() const override + { return "ReloadSwapper"; } + // each of these returns true if resource tuning is complete, false otherwise bool tune_packet_context() override { return true; } diff --git a/src/network_inspectors/appid/appid_module.h b/src/network_inspectors/appid/appid_module.h index 186985538..6fcf5bc20 100644 --- a/src/network_inspectors/appid/appid_module.h +++ b/src/network_inspectors/appid/appid_module.h @@ -53,6 +53,10 @@ public: explicit AppIdReloadTuner(size_t memcap) : memcap(memcap) { } ~AppIdReloadTuner() override = default; + const char* name() const override + { + return "AppIdReloadTuner"; + } bool tinit() override; bool tune_packet_context() override { diff --git a/src/network_inspectors/kaizen/kaizen_engine.cc b/src/network_inspectors/kaizen/kaizen_engine.cc index 38c45106d..ca2e5b824 100644 --- a/src/network_inspectors/kaizen/kaizen_engine.cc +++ b/src/network_inspectors/kaizen/kaizen_engine.cc @@ -80,6 +80,9 @@ public: explicit KaizenReloadTuner(const string& http_param_model) : http_param_model(http_param_model) {} ~KaizenReloadTuner() override = default; + const char* name() const override + { return "KaizenReloadTuner"; } + bool tinit() override { delete classifier; @@ -233,3 +236,19 @@ const BaseApi* nin_kaizen_engine[] = &kaizen_engine_api.base, nullptr }; + +#ifdef UNIT_TEST + +#include "catch/snort_catch.h" + +#include + +TEST_CASE("Kaizen tuner name", "[kaizen_module]") +{ + const string http_param_model("model"); + KaizenReloadTuner tuner(http_param_model); + + REQUIRE(strcmp(tuner.name(), "KaizenReloadTuner") == 0); +} + +#endif diff --git a/src/network_inspectors/perf_monitor/perf_reload_tuner.h b/src/network_inspectors/perf_monitor/perf_reload_tuner.h index 280dcdbfa..4731ce007 100644 --- a/src/network_inspectors/perf_monitor/perf_reload_tuner.h +++ b/src/network_inspectors/perf_monitor/perf_reload_tuner.h @@ -29,6 +29,9 @@ public: explicit PerfMonReloadTuner(size_t memcap) : memcap(memcap) { } ~PerfMonReloadTuner() override = default; + const char* name() const override + { return "PerfMonReloadTuner"; } + bool tinit() override; bool tune_idle_context() override diff --git a/src/network_inspectors/port_scan/ps_module.h b/src/network_inspectors/port_scan/ps_module.h index 5fdc94acb..f7c3bcc8f 100644 --- a/src/network_inspectors/port_scan/ps_module.h +++ b/src/network_inspectors/port_scan/ps_module.h @@ -145,6 +145,9 @@ public: explicit PortScanReloadTuner(size_t memcap) : memcap(memcap) { } ~PortScanReloadTuner() override = default; + const char* name() const override + { return "PortScanReloadTuner"; } + bool tinit() override { return ps_init_hash(memcap); } diff --git a/src/network_inspectors/rna/rna_module.cc b/src/network_inspectors/rna/rna_module.cc index 0ed4d22f9..a82fcd37c 100644 --- a/src/network_inspectors/rna/rna_module.cc +++ b/src/network_inspectors/rna/rna_module.cc @@ -51,6 +51,7 @@ #ifdef UNIT_TEST #include "catch/snort_catch.h" +#include #endif using namespace snort; @@ -710,5 +711,13 @@ TEST_CASE("RNA module", "[rna_module]") } } +TEST_CASE("Fingerprint processors tuner name", "[rna_module]") +{ + RnaModuleConfig mod_conf; + FpProcReloadTuner tuner(mod_conf); + + REQUIRE(strcmp(tuner.name(), "FpProcReloadTuner") == 0); +} + #endif diff --git a/src/network_inspectors/rna/rna_module.h b/src/network_inspectors/rna/rna_module.h index e025f104c..aef417d4b 100644 --- a/src/network_inspectors/rna/rna_module.h +++ b/src/network_inspectors/rna/rna_module.h @@ -73,6 +73,9 @@ public: : mod_conf(mod_conf) { } ~FpProcReloadTuner() override = default; + const char* name() const override + { return "FpProcReloadTuner"; } + bool tinit() override; bool tune_packet_context() override diff --git a/src/profiler/profiler_module.cc b/src/profiler/profiler_module.cc index 526f29b5d..685a2662f 100644 --- a/src/profiler/profiler_module.cc +++ b/src/profiler/profiler_module.cc @@ -462,6 +462,9 @@ public: {} ~ProfilerReloadTuner() override = default; + const char* name() const override + { return "ProfilerReloadTuner"; } + bool tinit() override { RuleContext::set_enabled(enable_rule); @@ -578,3 +581,18 @@ ProfileStats* ProfilerModule::get_profile( } return nullptr; } + +#ifdef UNIT_TEST + +#include "catch/snort_catch.h" + +#include + +TEST_CASE("Profiler reload tuner name", "[profiler_module]") +{ + ProfilerReloadTuner tuner(true, true); + + REQUIRE(strcmp(tuner.name(), "ProfilerReloadTuner") == 0); +} + +#endif diff --git a/src/stream/base/stream_module.cc b/src/stream/base/stream_module.cc index af8bf2506..6a28b957e 100644 --- a/src/stream/base/stream_module.cc +++ b/src/stream/base/stream_module.cc @@ -452,6 +452,14 @@ bool StreamReloadResourceManager::tune_resources(unsigned work_limit) return ( flows_to_delete ) ? false : true; } +void StreamReloadResourceManager::report_progress() +{ + LogMessage("StreamReloadResourceManager[%u] flows allocated %u, max flows %u," + " tuning packets %" PRIu64", tuning idle %" PRIu64"\n", + get_instance_id(), flow_con->get_flows_allocated(), config.flow_cache_cfg.max_flows, + stream_base_stats.reload_tuning_packets, stream_base_stats.reload_tuning_idle); +} + bool StreamUnloadReloadResourceManager::tinit() { unsigned max_flows = flow_con->get_flow_cache_config().max_flows; @@ -490,6 +498,14 @@ bool StreamUnloadReloadResourceManager::tune_resources(unsigned work_limit) return (flows_to_delete) ? false : true; } +void StreamUnloadReloadResourceManager::report_progress() +{ + LogMessage("StreamUnloadReloadResourceManager[%u] flows allocated %u," + " tuning packets %" PRIu64", tuning idle %" PRIu64"\n", + get_instance_id(), flow_con->get_flows_allocated(), + stream_base_stats.reload_tuning_packets, stream_base_stats.reload_tuning_idle); +} + void StreamModuleConfig::show() const { ConfigLogger::log_value("max_flows", flow_cache_cfg.max_flows); diff --git a/src/stream/base/stream_module.h b/src/stream/base/stream_module.h index ab7c4d6ee..2678f5394 100644 --- a/src/stream/base/stream_module.h +++ b/src/stream/base/stream_module.h @@ -134,10 +134,14 @@ class StreamReloadResourceManager : public snort::ReloadResourceTuner public: StreamReloadResourceManager() = default; + const char* name() const override + { return "StreamReloadResourceManager"; } bool tinit() override; bool tune_packet_context() override; bool tune_idle_context() override; + void report_progress() override; + bool initialize(const StreamModuleConfig&); private: @@ -153,6 +157,8 @@ public: explicit HPQReloadTuner(uint32_t packet_timeout) : held_packet_timeout(packet_timeout) { } ~HPQReloadTuner() override = default; + const char* name() const override + { return "HPQReloadTuner"; } bool tinit() override; bool tune_packet_context() override; bool tune_idle_context() override; @@ -166,9 +172,12 @@ class StreamUnloadReloadResourceManager : public snort::ReloadResourceTuner public: StreamUnloadReloadResourceManager() = default; + const char* name() const override + { return "StreamUnloadReloadResourceManager"; } bool tinit() override; bool tune_packet_context() override; bool tune_idle_context() override; + void report_progress() override; private: bool tune_resources(unsigned work_limit); diff --git a/src/target_based/host_attributes.cc b/src/target_based/host_attributes.cc index ca2777752..e854a5cbe 100644 --- a/src/target_based/host_attributes.cc +++ b/src/target_based/host_attributes.cc @@ -61,6 +61,9 @@ class HostAttributesReloadTuner : public snort::ReloadResourceTuner public: HostAttributesReloadTuner() = default; + const char* name() const override + { return "HostAttributesReloadTuner"; } + bool tinit() override { HostAttributesManager::initialize();