Docker 和 OpenStack 基准测试
Docker and OpenStack Benchmarking
我正在和一些朋友一起为大学做一个项目,我们想比较 Docker 和 OpenStack 一个简单脚本的执行时间。
然而,我们得到的结果是我们 none 可以解释的,所以我希望有人可以解释我们是否做错了,或者我们是否只是缺乏知识来理解发生的事情。
这是简单的 '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 "
我们所做的是使用 Unix 时间命令(如 time ./prime.sh
)在 OpenStack 中的 Ubuntu Server 14.04 实例上,在 Ubuntu Server 14.04 上执行它 Docker 和主机 OS(也是 Ubuntu 服务器 14.04)本身。在每个系统上我们执行脚本 10 次。
我们的结果是:
OpenStack 16,48 Sec
Docker: 25,77 Sec
HostOS: 30,45 Sec
有人可以帮忙解释一下吗?
我们不明白,为什么脚本在主机 OS 上执行的时间几乎是在开放堆栈上执行的两倍,而且,为什么 openstack 比 docker.[=19= 快 8 秒]
PS。
在 Unix 上,'time' 输出实际时间、用户时间和系统时间,而 docker 和 HostOS 在系统时间和用户时间上非常短(大约 3 秒和 1 秒)OpenStack 几乎需要系统时间 16 秒。我不知道这是否会改变什么,因为实时应该是重要的,但也许它有助于理解?
编辑:1
为了执行,我们通过 ssh 进入了 OpenStack Ubuntu 实例,访问了那里的脚本,然后从命令行执行了它。
Docker 也是如此,这里我们使用 docker exec -it ourubuntu bash
获取容器并创建并执行脚本。
执行脚本的命令总是
time ./prime.sh
事实上我们使用了一个简单的for循环
for i in
序列 1 10; do time ./prime.sh; done
得到一些结果。
编辑:2
使用 $(( .. )) 而不是 expr ..
的新脚本,执行时间更容易理解。
现在,主机 OS 执行代码最快,其次是 docker,OpenStack 比其他主机
需要更长的时间
我要指出的第一件事是这段代码花费了大量时间来做 expr
的子外壳扩展之类的事情,这似乎与重点无关。如果你使用 bash,你可以更快地得到小素数的结果(不改变算法):
prime1() {
local -i num=""
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 或破折号,则需要以更 POSIXLY_STRICT 的方式编写,如下所示:
prime2() {
local num=""
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
子外壳,这样可以节省虚拟机大量处理时间。
现在都是猜测,但请在问题中提供更多信息,我会充实它。
我正在和一些朋友一起为大学做一个项目,我们想比较 Docker 和 OpenStack 一个简单脚本的执行时间。 然而,我们得到的结果是我们 none 可以解释的,所以我希望有人可以解释我们是否做错了,或者我们是否只是缺乏知识来理解发生的事情。
这是简单的 '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 "
我们所做的是使用 Unix 时间命令(如 time ./prime.sh
)在 OpenStack 中的 Ubuntu Server 14.04 实例上,在 Ubuntu Server 14.04 上执行它 Docker 和主机 OS(也是 Ubuntu 服务器 14.04)本身。在每个系统上我们执行脚本 10 次。
我们的结果是:
OpenStack 16,48 Sec
Docker: 25,77 Sec
HostOS: 30,45 Sec
有人可以帮忙解释一下吗? 我们不明白,为什么脚本在主机 OS 上执行的时间几乎是在开放堆栈上执行的两倍,而且,为什么 openstack 比 docker.[=19= 快 8 秒]
PS。 在 Unix 上,'time' 输出实际时间、用户时间和系统时间,而 docker 和 HostOS 在系统时间和用户时间上非常短(大约 3 秒和 1 秒)OpenStack 几乎需要系统时间 16 秒。我不知道这是否会改变什么,因为实时应该是重要的,但也许它有助于理解?
编辑:1
为了执行,我们通过 ssh 进入了 OpenStack Ubuntu 实例,访问了那里的脚本,然后从命令行执行了它。
Docker 也是如此,这里我们使用 docker exec -it ourubuntu bash
获取容器并创建并执行脚本。
执行脚本的命令总是
time ./prime.sh
事实上我们使用了一个简单的for循环
for i in
序列 1 10; do time ./prime.sh; done
得到一些结果。
编辑:2
使用 $(( .. )) 而不是 expr ..
的新脚本,执行时间更容易理解。
现在,主机 OS 执行代码最快,其次是 docker,OpenStack 比其他主机
我要指出的第一件事是这段代码花费了大量时间来做 expr
的子外壳扩展之类的事情,这似乎与重点无关。如果你使用 bash,你可以更快地得到小素数的结果(不改变算法):
prime1() {
local -i num=""
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 或破折号,则需要以更 POSIXLY_STRICT 的方式编写,如下所示:
prime2() {
local num=""
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
子外壳,这样可以节省虚拟机大量处理时间。
现在都是猜测,但请在问题中提供更多信息,我会充实它。