Ubuntu Docker和OpenStack基准测试

Ubuntu Docker和OpenStack基准测试,ubuntu,docker,benchmarking,openstack,Ubuntu,Docker,Benchmarking,Openstack,我正在和一些朋友为大学做一个项目,我们想比较一下Docker和OpenStack在一个简单脚本的执行时间方面的差异。 然而,我们得到了我们都无法解释的结果,所以我希望有人能解释我们是否做错了事情,或者我们只是缺乏了解发生了什么的知识 下面是简单的“prime.sh”脚本 num=14293; i=2 while [ $i -lt $num ]; do if [ `expr $num % $i` -eq 0 ] then

我正在和一些朋友为大学做一个项目,我们想比较一下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服务器14.04实例、Docker中的Ubuntu服务器14.04以及主机操作系统(也是Ubuntu服务器14.04)本身上使用Unix time命令(如
time./prime.sh
)执行它。在每个系统上,我们执行脚本10次

我们的结果是:

OpenStack     16,48 Sec
Docker:       25,77 Sec
HostOS:       30,45 Sec
有人能帮我解释一下吗? 我们不明白,为什么脚本在主机操作系统上执行的时间几乎是在openstack上执行的两倍,还有为什么openstack比docker快8秒

附言。 在Unix上,“时间”输出real、user和sys时间,而docker和HostOS的sys时间非常短,用户时间(约3秒和1秒)OpenStack的sys时间几乎为16秒。我不知道这是否会改变什么,因为实时应该是最重要的,但也许这有助于理解

编辑:1

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

执行脚本的命令始终是
time./prime.sh
事实上,我们使用了一个简单的for循环
用于序列1中的i
10
;执行time./prime.sh;完成
要得到一些结果

编辑:2 使用$(..)而不是
expr..
的新脚本,执行时间更容易理解。
现在,主机操作系统执行代码的速度最快,其次是docker,OpenStack需要比其他的稍长一点。我要指出的第一件事是,这段代码花费了大量的时间来做一些事情,比如
expr
的子shell扩展,这似乎是离题的。如果使用bash,则对于小素数可以获得更快的结果(无需更改算法):

我的测试使用bash在El Capitan上得出以下结果:

$ ./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的方式将脚本传递给vm,这样可以节省vm大量的处理时间


现在这都是猜测,但是在问题中提供更多的信息,我会把它充实起来。

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

我的测试使用bash在El Capitan上得出以下结果:

$ ./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的方式将脚本传递给vm,这样可以节省vm大量的处理时间


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

您似乎在“do”之后缺少一个分号。那只是一个复制粘贴错误吗?(我在中编辑了它,但要求确定。)我有点怀疑您的代码是否确实运行了您在问题中所写的内容。(首先,存在语法错误的问题。)您的测试在每个系统上实际返回相同的值吗?是的,代码按预期运行,在所有系统上它返回14293是质数,我认为没有问题。由于所有系统都基于Ubuntu14.04,我将用分号OK重新运行测试,请在问题中添加一个描述,说明您是如何调用测试的。越精确越好。您似乎在“do”之后缺少一个分号。那只是一个复制粘贴错误吗?(我在中编辑了它,但要求确定。)我有点怀疑您的代码是否确实运行了您在问题中所写的内容。(首先,存在语法错误的问题。)您的测试在每个系统上实际返回相同的值吗?是的,代码按预期运行,在所有系统上它返回14293是质数,我认为没有问题。由于所有系统都基于Ubuntu14.04,我将用分号OK重新运行测试,请在问题中添加一个描述,说明您是如何调用测试的。越精确越好。我将尝试不使用
expr
子句的测试。但是,我不太明白这个子句如何使主机使用的时间是vm的两倍。这与算法无关,我知道这个算法实际上没有经过优化,我们只需要几秒钟的时间来执行,这就是为什么我们使用这个标准素数calculation@Nymokrit您是否排除了其中一个系统更繁忙的可能性?我们尝试过这样做。所有测试都在同一台笔记本电脑上进行,8GB内存,英特尔i5处理器,Ubuntu服务器14.04作为主机。------在调用docker和主机的测试之前,我们停止了open stack中所有正在运行的进程,并重新启动了computer@Nymokrit请让我知道没有子流程的测试是如何进行的。(问题本身不是
expr
,而是您要求shell fork/exec fo
$ ./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