【问题标题】:Docker and OpenStack BenchmarkingDocker 和 OpenStack 基准测试
【发布时间】:2016-01-24 19:32:51
【问题描述】:

我和一些朋友正在为大学做一个项目,我们想比较 Docker 和 OpenStack 的简单脚本的执行时间。 但是,我们得到的结果是我们都无法解释的,所以我希望有人能解释我们是否做错了事,或者我们只是缺乏了解发生了什么的知识。

这是简单的“prime.sh”脚本

   num=14293;
    i=2
    while [ $i -lt $num ]; do
        if [ `expr $num % $i` -eq 0 ]
        then
            echo "Divisible by $i"
            exit
        fi
        i=`expr $i + 1`
    done
    echo "$num is a prime number "

我们所做的是在 OpenStack 中的 Ubuntu Server 14.04 实例、Docker 中的 Ubuntu Server 14.04 和主机操作系统(也是 Ubuntu Server 14.04)本身上使用 Unix 时间命令(如 time ./prime.sh)执行它。在每个系统上,我们执行了 10 次脚本。

我们的结果是:

OpenStack     16,48 Sec
Docker:       25,77 Sec
HostOS:       30,45 Sec

有人可以帮忙解释一下吗? 我们不明白,为什么脚本在主机操作系统上的执行时间几乎是在开放堆栈上的两倍,以及为什么 openstack 比 docker 快 8 秒。

PS。 在 Unix 上,'time' 输出真实时间、用户时间和系统时间,而 docker 和 HostOS 的系统时间和用户时间非常短(大约 3 秒和 1 秒,两者),OpenStack 需要将近 16 秒的系统时间。我不知道这是否会改变什么,因为实时应该是重要的,但也许它有助于理解?

编辑:1

为了执行,我们通过 ssh'ed 进入 OpenStack Ubuntu 实例,触摸那里的脚本,然后从命令行执行它。 Docker 也是如此,这里我们使用docker exec -it ourubuntu bash 来获取容器并在那里创建并执行脚本。

执行脚本的命令总是 time ./prime.sh 实际上我们使用了一个简单的 for 循环 for i inseq 1 10; do time ./prime.sh; done 得到一些结果。

编辑:2 使用 $(( .. )) 而不是 expr .. 的新脚本,执行时间更容易理解。 现在,Host OS 执行代码的速度最快,其次是 docker,OpenStack 比其他的需要更长的时间

【问题讨论】:

  • 您似乎在“do”之后缺少了一个分号。这只是一个复制粘贴错字吗? (我编辑了它,但要求确定。)
  • 我有点怀疑您的代码实际上是否完全按照您在问题中编写的那样运行。 (一方面,存在语法错误的问题。)您的测试实际上是否在每个系统上返回相同的 value
  • 是的,代码按预期运行,在所有系统上它返回 14293 是一个素数,我认为这不是问题所在。由于所有系统均基于 Ubuntu 14.04,我将使用分号重新运行测试
  • 好的,请在问题中添加关于您如何调用测试的描述。越精确越好。

标签: ubuntu docker benchmarking openstack


【解决方案1】:

我要指出的第一件事是,这段代码花费了大量时间来处理expr 的子shell 扩展之类的事情,这似乎不是重点。如果使用 bash,对于小素数,您可以获得更快的结果(无需更改算法):

prime1() { 
  local -i num="$1"
  local -i i=1 
  while (( i++ < num )); do
    (( num % i )) && continue
    printf '%d is divisible by %d\n' "$num" "$i"
    return
  done
  printf '%d is a prime number\n' "$num"
}

(如果您的目标是 /bin/sh 或 dash,则需要以更 POSIXLY_STRICT 的方式编写它,如下所示:

prime2() {
  local num="$1"
  local i=2
  local cur
  while [ $i -lt $num ]; do
    cur=$(( $num % $i ))
    if [ $cur -eq 0 ]; then
      printf '%d is divisible by %d\n' "$num" "$i"
      return
    fi
    i=$(( i + 1 ))
  done
  printf '%d is a prime number\n' "$num"
}   

我的测试在 El Capitan 上使用 bash 产生了这些结果:

$ ./prime 
Running prime1
14293 is a prime number

real    0m0.168s
user    0m0.160s
sys 0m0.006s
Running prime2
14293 is a prime number

real    0m0.323s
user    0m0.303s
sys 0m0.019s
Running prime_orig
14293 is a prime number 

real    0m46.016s
user    0m19.682s
sys 0m25.132s

因此,仅作为比较,您在与主要比较无关的调用中损失了超过 46 秒。这让我怀疑你的调用方法本身有些奇怪。例如,您可以通过让主机负责扩展expr 子shell 的方式将脚本传递给虚拟机,这样可以为虚拟机节省大量处理时间。

现在都是猜测,但请在问题中提供更多信息,我会充实它。

【讨论】:

  • 我将尝试不带expr 子句的测试。但是,我不太明白这个条款应该如何让主机使用两倍于 vm 的时间。这与算法无关,我知道这个确实没有优化,我们只是需要一些需要几秒钟来执行的东西,这就是我们使用这个标准素数计算的原因
  • @Nymokrit 你有没有排除其中一个系统更忙?
  • 我们试图这样做。所有测试都在同一台笔记本电脑、8GB RAM、Intel i5 处理器、Ubuntu Server 14.04 作为主机上进行。 ------ 在调用 docker 和仅限主机的测试之前,我们从开放堆栈停止所有正在运行的进程并重新启动计算机
  • @Nymokrit 请让我知道在没有子流程的测试中它是如何进行的。 (这不是expr 的问题本身,而是您要求shell fork/exec 一个子进程的事实,这使得这些调用在循环中进行非常昂贵。)
  • 我正在努力在开放堆栈上运行更新后的脚本,这需要一段时间,但现在我可以告诉你,使用素数 500009 的 docker 容器需要大约 6 秒,主机本身大约需要 8 秒
猜你喜欢
  • 2012-10-13
  • 2016-06-02
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
相关资源
最近更新 更多