以下是使用 Golang Docker SDK 中的 ContainerTop 方法获取进程号、进程命令、当前 CPU 使用率、当前使用内存和总的内存的示例代码:

package main

import (
	"context"
	"fmt"
	"github.com/docker/docker/api/types"
	"github.com/docker/docker/api/types/container"
	"github.com/docker/docker/client"
	"strings"
)

func main() {
	cli, err := client.NewClientWithOpts(client.FromEnv)
	if err != nil {
		panic(err)
	}

	// 创建一个容器
	resp, err := cli.ContainerCreate(context.Background(), &container.Config{
		Image: "alpine",
		Cmd:   []string{"sleep", "3600"},
	}, nil, nil, "")
	if err != nil {
		panic(err)
	}

	// 启动容器
	if err := cli.ContainerStart(context.Background(), resp.ID, types.ContainerStartOptions{}); err != nil {
		panic(err)
	}

	// 获取容器中的进程信息
	processes, err := cli.ContainerTop(context.Background(), resp.ID, []string{})
	if err != nil {
		panic(err)
	}

	// 获取容器的状态信息
	containerInfo, err := cli.ContainerInspect(context.Background(), resp.ID)
	if err != nil {
		panic(err)
	}

	// 获取容器的 CPU 和内存限制信息
	cpuLimit := containerInfo.HostConfig.Resources.CPUQuota
	memoryLimit := containerInfo.HostConfig.Resources.Memory

	// 遍历进程信息,获取进程号、进程命令、当前 CPU 使用率和当前使用内存
	for i, process := range processes.Processes {
		pid := process[0]
		command := strings.Join(process[1:], " ")
		cpuUsage := containerInfo.HostConfig.Resources.NanoCPUs / 1000000000
		memoryUsage := containerInfo.HostConfig.Resources.MemoryStats.Usage
		fmt.Printf("进程%d:PID=%s,命令=%s,CPU 使用率=%.2f%%,内存使用=%.2fMB/%.2fMB\n",
			i+1, pid, command, float64(cpuUsage)/float64(cpuLimit)*100, float64(memoryUsage)/1024/1024, float64(memoryLimit)/1024/1024)
	}
}

这个示例会创建一个 alpine 容器,并在其中运行一个 sleep 命令。然后使用 ContainerTop 方法获取容器中的进程信息,并遍历输出进程号、进程命令、当前 CPU 使用率和当前使用内存。注意,这个示例中获取的 CPU 使用率和内存使用量是容器的总体限制,而不是单个进程的限制。如果需要获取单个进程的限制,需要使用 ContainerInspect 方法获取容器的详细信息,并从中获取相应的数据。

Golang Docker SDK ContainerTop 方法获取进程信息:PID、命令、CPU 使用率、内存使用

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

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