测量Docker容器的执行时间

10

我有一个名为my_image的Docker镜像,它启动一个命令并关闭。

当使用命令docker run --rm my_image在容器中运行镜像时,是否可以测量容器的执行时间?

编辑:

我需要在容器执行后查看这些时间信息,因此无法使用time命令。

我希望能够找到由Docker保留的一些容器执行历史记录,即使使用了--rm。但如果不存在,则适用@tgogos的答案。

目标是比较几个镜像的执行时间,以得出有关使用不同工具的结论。


墙上时钟,还是 CPU 时间? - Caramiriel
说到挂钟(常规时间) - Matthias Beaupère
2
如果容器完成其任务并退出,则可以只使用“time docker run ...”。 - David Maze
3个回答

20

第一种方法: time

time docker run --rm --name=test alpine ping -c 10 8.8.8.8
...

real    0m10.261s
user    0m0.228s
sys 0m0.044s

但是这还包括创建和删除容器的时间。

第二种方法:容器信息

您要查找的信息由Docker存储,并且可以通过docker container inspect访问。

docker run --name=test alpine ping -c 10 8.8.8.8

* 注意我没有使用 --rm,因为下一步是检查容器。你将不得不在此之后将其删除。你可能感兴趣的时间戳是:

  • "Created": "2018-08-02T10:16:48.59705963Z",
  • "StartedAt": "2018-08-02T10:16:49.187187456Z",
  • "FinishedAt": "2018-08-02T10:16:58.27795818Z"

$ docker container inspect test

[
    {
        "Id": "96e469fdb437814817ee2e9ad2fcdbf468a88694fcc998339edd424f9689f71f",
        "Created": "2018-08-02T10:16:48.59705963Z",
        "Path": "ping",
        "Args": [
            "-c",
            "10",
            "8.8.8.8"
        ],
        "State": {
            "Status": "exited",
            "Running": false,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 0,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2018-08-02T10:16:49.187187456Z",
            "FinishedAt": "2018-08-02T10:16:58.27795818Z"
        }
...

时间计算示例(使用bash):

您可以使用单个命令将这些时间戳放入bash变量中,例如:

START=$(docker inspect --format='{{.State.StartedAt}}' test)
STOP=$(docker inspect --format='{{.State.FinishedAt}}' test)

然后您可以将它们转换为UNIX纪元时间戳(自1970年1月1日起的秒数(UTC))

START_TIMESTAMP=$(date --date=$START +%s)
STOP_TIMESTAMP=$(date --date=$STOP +%s)

如果你将这两个数相减,你会得到以秒为单位的持续时间...

echo $(($STOP_TIMESTAMP-$START_TIMESTAMP)) seconds
9 seconds

1
另一个可能的方法是使用time命令覆盖默认的entrypoint
$ docker run --rm --name=test --entrypoint=time alpine ping -c 10 8.8.8.8

PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=37 time=51.213 ms
64 bytes from 8.8.8.8: seq=1 ttl=37 time=7.844 ms
64 bytes from 8.8.8.8: seq=2 ttl=37 time=8.120 ms
64 bytes from 8.8.8.8: seq=3 ttl=37 time=10.859 ms
64 bytes from 8.8.8.8: seq=4 ttl=37 time=10.975 ms
64 bytes from 8.8.8.8: seq=5 ttl=37 time=12.520 ms
64 bytes from 8.8.8.8: seq=6 ttl=37 time=7.994 ms
64 bytes from 8.8.8.8: seq=7 ttl=37 time=8.904 ms
64 bytes from 8.8.8.8: seq=8 ttl=37 time=6.674 ms
64 bytes from 8.8.8.8: seq=9 ttl=37 time=7.132 ms

--- 8.8.8.8 ping statistics ---
10 packets transmitted, 10 packets received, 0% packet loss
round-trip min/avg/max = 6.674/13.223/51.213 ms
real    0m 9.02s
user    0m 0.00s
sys 0m 0.00s

这样做不包括容器启动时间。你甚至可以执行以下操作:time docker run --rm --name=test --entrypoint=time alpine ping -c 10 8.8.8.8,以查看仅容器启动所需的时间。


1

您需要考虑以下几点:

  1. 如何获取给定PID的进程执行时间。
  2. 执行docker exec指定PID=1,因为容器运行时间=entrypoint运行时间。

将这两个步骤结合起来,您就可以获得docker容器的执行时间:

docker exec -ti <container_id> ps -o etime= -p "1"

它比docker ps命令的状态列提供更精确的信息。
如果您在容器中执行多个进程,并且需要获取其中任何一个进程的执行时间,请将“1”替换为其PID。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接