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
Golang Docker SDK实战: 获取容器进程CPU、内存使用率及RSS和VSZ详解

原文地址: https://www.cveoy.top/t/topic/f2nA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录