From 33d4ade1d40e265dd0f4d130ea70b46503fbdb18 Mon Sep 17 00:00:00 2001 From: igophper <34326532+igophper@users.noreply.github.com> Date: Mon, 3 Mar 2025 17:38:32 +0800 Subject: [PATCH] refactor(container): optimize memory calculation and concurrent data handling (#8038) * refactor(container): optimize memory calculation and concurrent data handling Refs #8033 * Update container.go --------- Co-authored-by: ssongliu <73214554+ssongliu@users.noreply.github.com> --- backend/app/service/container.go | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/backend/app/service/container.go b/backend/app/service/container.go index a99490a5f..01fb83dcc 100644 --- a/backend/app/service/container.go +++ b/backend/app/service/container.go @@ -255,14 +255,14 @@ func (u *ContainerService) ContainerListStats() ([]dto.ContainerListStats, error if err != nil { return nil, err } - var datas []dto.ContainerListStats + datas := make([]dto.ContainerListStats, len(list)) var wg sync.WaitGroup wg.Add(len(list)) for i := 0; i < len(list); i++ { - go func(item types.Container) { - datas = append(datas, loadCpuAndMem(client, item.ID)) + go func(index int, item types.Container) { + datas[index] = loadCpuAndMem(client, item.ID) wg.Done() - }(list[i]) + }(i, list[i]) } wg.Wait() return datas, nil @@ -937,15 +937,27 @@ func calculateCPUPercentUnix(stats *types.StatsJSON) float64 { } return cpuPercent } + func calculateMemPercentUnix(memStats types.MemoryStats) float64 { memPercent := 0.0 - memUsage := float64(memStats.Usage) + memUsage := calculateMemUsageUnixNoCache(memStats) memLimit := float64(memStats.Limit) if memUsage > 0.0 && memLimit > 0.0 { memPercent = (memUsage / memLimit) * 100.0 } return memPercent } + +func calculateMemUsageUnixNoCache(mem types.MemoryStats) float64 { + if v, isCgroup1 := mem.Stats["total_inactive_file"]; isCgroup1 && v < mem.Usage { + return float64(mem.Usage - v) + } + if v := mem.Stats["inactive_file"]; v < mem.Usage { + return float64(mem.Usage - v) + } + return float64(mem.Usage) +} + func calculateBlockIO(blkio types.BlkioStats) (blkRead float64, blkWrite float64) { for _, bioEntry := range blkio.IoServiceBytesRecursive { switch strings.ToLower(bioEntry.Op) {