github.com/hernad/nomad@v1.6.112/drivers/docker/util/stats_posix.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: MPL-2.0 3 4 //go:build !windows 5 6 package util 7 8 import ( 9 "runtime" 10 11 docker "github.com/fsouza/go-dockerclient" 12 cstructs "github.com/hernad/nomad/client/structs" 13 "github.com/hernad/nomad/helper/stats" 14 ) 15 16 var ( 17 DockerMeasuredCPUStats = []string{"Throttled Periods", "Throttled Time", "Percent"} 18 19 // cgroup-v2 only exposes a subset of memory stats 20 DockerCgroupV1MeasuredMemStats = []string{"RSS", "Cache", "Swap", "Usage", "Max Usage"} 21 DockerCgroupV2MeasuredMemStats = []string{"Cache", "Swap", "Usage"} 22 ) 23 24 func DockerStatsToTaskResourceUsage(s *docker.Stats) *cstructs.TaskResourceUsage { 25 measuredMems := DockerCgroupV1MeasuredMemStats 26 27 // use a simple heuristic to check if cgroup-v2 is used. 28 // go-dockerclient doesn't distinguish between 0 and not-present value 29 if s.MemoryStats.Stats.Rss == 0 && s.MemoryStats.MaxUsage == 0 && s.MemoryStats.Usage != 0 { 30 measuredMems = DockerCgroupV2MeasuredMemStats 31 } 32 33 ms := &cstructs.MemoryStats{ 34 RSS: s.MemoryStats.Stats.Rss, 35 Cache: s.MemoryStats.Stats.Cache, 36 Swap: s.MemoryStats.Stats.Swap, 37 MappedFile: s.MemoryStats.Stats.MappedFile, 38 Usage: s.MemoryStats.Usage, 39 MaxUsage: s.MemoryStats.MaxUsage, 40 Measured: measuredMems, 41 } 42 43 cs := &cstructs.CpuStats{ 44 ThrottledPeriods: s.CPUStats.ThrottlingData.ThrottledPeriods, 45 ThrottledTime: s.CPUStats.ThrottlingData.ThrottledTime, 46 Measured: DockerMeasuredCPUStats, 47 } 48 49 // Calculate percentage 50 cs.Percent = CalculateCPUPercent( 51 s.CPUStats.CPUUsage.TotalUsage, s.PreCPUStats.CPUUsage.TotalUsage, 52 s.CPUStats.SystemCPUUsage, s.PreCPUStats.SystemCPUUsage, runtime.NumCPU()) 53 cs.SystemMode = CalculateCPUPercent( 54 s.CPUStats.CPUUsage.UsageInKernelmode, s.PreCPUStats.CPUUsage.UsageInKernelmode, 55 s.CPUStats.CPUUsage.TotalUsage, s.PreCPUStats.CPUUsage.TotalUsage, runtime.NumCPU()) 56 cs.UserMode = CalculateCPUPercent( 57 s.CPUStats.CPUUsage.UsageInUsermode, s.PreCPUStats.CPUUsage.UsageInUsermode, 58 s.CPUStats.CPUUsage.TotalUsage, s.PreCPUStats.CPUUsage.TotalUsage, runtime.NumCPU()) 59 cs.TotalTicks = (cs.Percent / 100) * float64(stats.CpuTotalTicks()) / float64(runtime.NumCPU()) 60 61 return &cstructs.TaskResourceUsage{ 62 ResourceUsage: &cstructs.ResourceUsage{ 63 MemoryStats: ms, 64 CpuStats: cs, 65 }, 66 Timestamp: s.Read.UTC().UnixNano(), 67 } 68 }