Golang Docker SDK实战: 获取容器进程CPU、内存使用率及RSS和VSZ详解
Golang Docker SDK实战: 获取容器进程CPU、内存使用率及RSS和VSZ详解
本文将介绍如何使用Golang Docker SDK获取Docker容器中进程的详细信息,包括:
- 进程号 (PID)* 进程命令* CPU使用率* 内存使用量 (RSS)* 虚拟内存使用量 (VSZ)
并提供完整的示例代码和解析,帮助你快速上手。
示例代码gopackage main
import ( 'context' 'fmt' 'github.com/docker/docker/api/types' 'github.com/docker/docker/client' 'strings')
func main() { cli, err := client.NewEnvClient() if err != nil { panic(err) }
containerID := 'your_container_id'
ctx := context.Background() top, err := cli.ContainerTop(ctx, containerID, []string{}) if err != nil { panic(err) }
processes := top.Processes
// 获取进程号、进程命令、进程CPU使用率、进程使用内存和进程拥有的总内存 for _, process := range processes { pid := process[0] cmd := strings.Join(process[1:], ' ')
stats, err := cli.ContainerStats(ctx, containerID, false) if err != nil { panic(err) } defer stats.Body.Close()
var memUsage float64 var memLimit float64 var cpuUsage float64
for stats.Next() { var v types.StatsJSON if err := stats.Decode(&v); err != nil { panic(err) }
if v.PidsStats != nil && v.PidsStats.Current != 0 && v.PidsStats.Current == pid { memUsage = float64(v.MemoryStats.Usage) memLimit = float64(v.MemoryStats.Limit) cpuUsage = calculateCPUPercentUnix(v) break } }
fmt.Printf('pid: %s, cmd: %s, cpu: %.2f%%, mem usage: %.2fMB, mem limit: %.2fMB
', pid, cmd, cpuUsage, memUsage/1024/1024, memLimit/1024/1024) }}
// 计算CPU使用率func calculateCPUPercentUnix(stats types.StatsJSON) float64 { cpuPercent := 0.0 cpuDelta := float64(stats.CPUStats.CPUUsage.TotalUsage) - float64(stats.PreCPUStats.CPUUsage.TotalUsage) systemDelta := float64(stats.CPUStats.SystemUsage) - float64(stats.PreCPUStats.SystemUsage)
if systemDelta > 0.0 && cpuDelta > 0.0 { cpuPercent = (cpuDelta / systemDelta) * float64(len(stats.CPUStats.CPUUsage.PercpuUsage)) * 100.0 }
return cpuPercen
原文地址: https://www.cveoy.top/t/topic/f2nA 著作权归作者所有。请勿转载和采集!