From e2c244e2cba89e403caabe50587bb3fa3d160191 Mon Sep 17 00:00:00 2001 From: Zexi Li Date: Mon, 25 Nov 2024 20:57:08 +0800 Subject: [PATCH] optimized(host): use goroutine to start ContainerStatsProvider (#21683) --- pkg/hostman/host_services.go | 2 +- pkg/hostman/hostinfo/hostinfo.go | 10 ++++--- pkg/hostman/hostmetrics/hostmetrics.go | 37 ++++++++++++++++---------- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/pkg/hostman/host_services.go b/pkg/hostman/host_services.go index ef56e6ad6c..1413705fec 100644 --- a/pkg/hostman/host_services.go +++ b/pkg/hostman/host_services.go @@ -112,7 +112,7 @@ func (host *SHostService) RunService() { log.Fatalf("Guest manager Bootstrap %s", err) } // hostmetrics after guestmanager bootstrap - hostmetrics.Init(hostInstance.GetContainerStatsProvider()) + hostmetrics.Init(hostInstance) hostmetrics.Start() fsdriver.Init("") diff --git a/pkg/hostman/hostinfo/hostinfo.go b/pkg/hostman/hostinfo/hostinfo.go index 022d5418e9..e3e5c63b9a 100644 --- a/pkg/hostman/hostinfo/hostinfo.go +++ b/pkg/hostman/hostinfo/hostinfo.go @@ -240,9 +240,13 @@ func (h *SHostInfo) Init(ctx context.Context) error { if err := h.initContainerCPUMap(h.sysinfo.Topology); err != nil { return errors.Wrap(err, "init container cpu map") } - if err := h.startContainerStatsProvider(h.cri); err != nil { - return errors.Wrap(err, "start container stats provider") - } + go func() { + if err := h.startContainerStatsProvider(h.cri); err != nil { + log.Warningf("start container stats provider error: %v", err) + } else { + log.Infof("container stats provider started") + } + }() if fileutils2.Exists(options.HostOptions.ContainerSystemCpufreqSimulateConfigFile) { if err := h.getContainerCpufreqSimulateConfig(); err != nil { return errors.Wrap(err, "getContainerCpuSimulateConfig") diff --git a/pkg/hostman/hostmetrics/hostmetrics.go b/pkg/hostman/hostmetrics/hostmetrics.go index 21ba65c73e..8a1de631f8 100644 --- a/pkg/hostman/hostmetrics/hostmetrics.go +++ b/pkg/hostman/hostmetrics/hostmetrics.go @@ -55,9 +55,13 @@ type SHostMetricsCollector struct { var hostMetricsCollector *SHostMetricsCollector -func Init(csp stats.ContainerStatsProvider) { +type IHostInfo interface { + GetContainerStatsProvider() stats.ContainerStatsProvider +} + +func Init(hostInfo IHostInfo) { if hostMetricsCollector == nil { - hostMetricsCollector = NewHostMetricsCollector(csp) + hostMetricsCollector = NewHostMetricsCollector(hostInfo) } } @@ -143,27 +147,27 @@ func (m *SHostMetricsCollector) collectReportData() string { return m.guestMonitor.CollectReportData() } -func NewHostMetricsCollector(csp stats.ContainerStatsProvider) *SHostMetricsCollector { +func NewHostMetricsCollector(hostInfo IHostInfo) *SHostMetricsCollector { return &SHostMetricsCollector{ ReportInterval: options.HostOptions.ReportInterval, waitingReportData: make([]string, 0), - guestMonitor: NewGuestMonitorCollector(csp), + guestMonitor: NewGuestMonitorCollector(hostInfo), } } type SGuestMonitorCollector struct { - monitors map[string]*SGuestMonitor - prevPids map[string]int - prevReportData map[string]*GuestMetrics - containerStatsProvider stats.ContainerStatsProvider + monitors map[string]*SGuestMonitor + prevPids map[string]int + prevReportData map[string]*GuestMetrics + hostInfo IHostInfo } -func NewGuestMonitorCollector(csp stats.ContainerStatsProvider) *SGuestMonitorCollector { +func NewGuestMonitorCollector(hostInfo IHostInfo) *SGuestMonitorCollector { return &SGuestMonitorCollector{ - monitors: make(map[string]*SGuestMonitor, 0), - prevPids: make(map[string]int, 0), - prevReportData: make(map[string]*GuestMetrics, 0), - containerStatsProvider: csp, + monitors: make(map[string]*SGuestMonitor, 0), + prevPids: make(map[string]int, 0), + prevReportData: make(map[string]*GuestMetrics, 0), + hostInfo: hostInfo, } } @@ -219,7 +223,12 @@ func (s *SGuestMonitorCollector) GetGuests() map[string]*SGuestMonitor { case compute.HYPERVISOR_POD: if podStats == nil { var err error - podStats, err = s.containerStatsProvider.ListPodCPUAndMemoryStats() + csp := s.hostInfo.GetContainerStatsProvider() + if csp == nil { + log.Warningf("container stats provider is not ready") + return true + } + podStats, err = csp.ListPodCPUAndMemoryStats() if err != nil { log.Errorf("ListPodCPUAndMemoryStats: %s", err) return true