【问题标题】:How to evaluate the CPU and Mem usage for speccific command/docker in linux?如何评估 linux 中特定命令/docker 的 CPU 和内存使用情况?
【发布时间】:2016-04-23 02:55:40
【问题描述】:

我正在为在 docker 中运行并由 kubernetes 编排的脚本编写 yaml 文件。有没有办法评估特定命令或 docker 的资源利用率,或者为 pod 设置 cpu 和 mem 限制的最佳做法是什么?

编辑

这些脚本大部分会在短时间内运行,因此很难获取资源信息。我只是想找一个工具来最大化cpu和mem的使用率,这个工具的作用类似于time,打印出执行时间。

【问题讨论】:

    标签: linux docker resources kubernetes


    【解决方案1】:

    您可以使用docker stats 命令查看容器的统计信息。

    例如;

    docker stats containera containerb
    
    CONTAINER           CPU %               MEM USAGE / LIMIT     MEM %               NET I/O               BLOCK I/O
    containera          0.00%               24.15 MB / 1.041 GB   2.32%               1.8 MB / 79.37 kB     0 B / 81.92 kB
    containerb          0.00%               24.95 MB / 1.041 GB   2.40%               1.798 MB / 80.72 kB   0 B / 81.92 kB
    

    或者,使用docker top <container>查看在容器中运行的进程

    docker top containera
    UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
    root                4558                2850                0                   21:13               ?                   00:00:00            sh -c npm install http-server -g && mkdir -p /public && echo "welcome to containera" > /public/index.html && http-server -a 0.0.0.0 -p 4200
    root                4647                4558                0                   21:13               ?                   00:00:00            node /usr/local/bin/http-server -a 0.0.0.0 -p 4200
    

    限制资源

    Docker compose(类似于 docker 本身)允许您为容器设置资源限制,例如限制使用的最大内存量、cpu-shares 等。

    阅读docker-compose yaml reference 中的此部分,以及"Runtime constraints on resources" 上的 docker run 参考

    【讨论】:

    • 谢谢!大部分 docker 都是在短时间内运行的,我觉得通过 top 或 ps 之类的工具很难监控。
    • 我读过“资源的运行时约束”,它很有用,但我很好奇如何设置适当的限制。提前致谢。
    • docker stats 通过 docker remove API using this endpoint 获取它的数据。如果您正在使事情自动化,您可能能够收集这些统计数据并将它们存储在例如ELK 堆栈中。或使用cAdvisor / Elasticsearch / Grafana / Influxdb
    • > “我很好奇如何设置适当的限制。”这是一个很难回答的问题,因为这实际上取决于您的用例。确实建议总是 在容器上设置内存限制,以防止容器耗尽主机的所有可用内存,并(可能)导致内核“OOM”杀死随机进程。
    【解决方案2】:

    问题中有一些很好的答案:Peak memory usage of a linux/unix process

    TL;DR/usr/bin/time -v <command> 或使用 valgrind

    这应该可以帮助您了解需要分配多少内存作为应用程序的限制,但 CPU 有点不同。如果您的应用程序受 CPU 限制,那么无论您设置什么限制,它都会使用您给它的所有 CPU。此外,在 Kubernetes 中,您将核心(或毫核)分配给应用程序,因此了解任何特定机器上使用的 CPU 百分比并不总是非常有用,因为这不会轻易转换为核心。

    您应该为您的应用提供尽可能多的 CPU 内核,让您的应用在可接受的时间内取得成功。这将取决于成本以及集群中可用的核心数量。它还取决于您的应用程序的架构。例如,如果应用程序不能利用多个内核,那么给它提供超过 1 个内核就没有多大用处。

    如果您有任何不再运行的应用程序,您可以尝试安装Kubedash。如果您安装了 Heapster,那么 Kubedash 使用 Kubernetes 的内置指标来显示平均和最大 CPU/内存利用率。在尝试找出分配给特定应用程序的请求和限制时,它很有帮助。

    希望有帮助!

    【讨论】:

    • 清晰详细,再好不过了!非常非常感谢!
    猜你喜欢
    • 2019-11-05
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 2012-11-09
    相关资源
    最近更新 更多