Golang Docker SDK ContainerTop 方法获取进程信息:PID、命令、CPU 使用率、内存使用
以下是使用 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 方法获取容器的详细信息,并从中获取相应的数据。
原文地址: https://www.cveoy.top/t/topic/f2nm 著作权归作者所有。请勿转载和采集!