Docker可以减慢您的代码并扭曲您的基准测试

2021-05-13 05:11:13

容器在虚拟机上的一个好处是,在没有虚拟化的性能开销或失真的情况下获得一些隔离衡量标准。因此,Docker图像似乎是获得用于测量代码的CPU性能的可再现环境的好方法。

但是,并发症。有时,在Docker下运行实际上可以减慢代码并扭曲您的性能测量。

例如,在MacOS和Windows上,标准的基于Linux的Docker容器实际上并不直接在OS上运行,因为OS不是Linux。来自容器本身的图像文件系统通常使用某种覆盖文件系统,这可以减慢速度,因此对于您想要使用绑定安装的卷的任何I / O键。

但即使在Linux上,只有CPU的工作负载,Docker可以扭曲Runtime Performance.let,看看为什么,以及一些解决方法。

我正在测试的电脑正在运行Fedora 33,并具有Docker 20.10.6;我已经禁用了一些操作系统和CPU功能,可以使基准变得不那么一致(ASLR和Turboboost).i'm将在我的机器上运行一些代码,以便在容器内的代码,因此对于我要去的最大现实主义使用fedora:33图像。

首先,让我们测试一个微小的铁锈程序,只有一些浮点计算:

一些跑步较慢;我挑选了最快的。似乎表现的第一个近似值是相同的码头。

接下来,让我们尝试一个Python程序,只有一些计算。我选择了最快的运行:

$ python3.9 pystone.py pystone(1.2)50000通过的时间= 0.248776这款机床基准测试200984 Pystones /秒$ Docker Run -V $ PWD:/代码Fedora:33 Python3.9 / Code/pystone.py pystone(1.2 )50000通行证的时间= 0.297675这款机床基准167968码头/秒

更糟糕的是,我们可以看到绩效命中是不一致的:我们的小小的铁锈基准不受Docker的影响,但Python基准测试速度慢。如果放缓始终一致,则在Docker中运行所有内容将至少让我们可靠地衡量相对性能,例如,在一些代码的两个版本之间。不一致的减速速度意味着码头扭曲了我们的结果。

现在,容器并非本质上具有性能开销:整个点是除了网络或用户ID等内容中具有不同的命名空间,容器中的进程只是其他任何进程。

因此,绩效袭击来自哪里?Aras Abbasi建议的一个合理的理论是它是Docker的安全功能。

Docker起源于平台和A-A-Service的世界,其中来自不同用户的应用程序暴露于World.so Docker还会增加其他安全性层,以防止程序从容器转到主机到主机。

这些安全机制之一是SECCOMP,Docker用于约束系统调用容器可以运行的系统。

当然可能有其他SECCOMP性能问题导致问题,或者码头使用的其他安全机制之一,但我们至少可以通过在特权模式下运行我们的Docker容器来测试这一普遍理论。这会禁用所有安全功能,所以如果那些负责减速,我们应该得到我们的速度:

$ Docker Run - 专项-V $ PWD:/代码Fedora:33 Python3.9 /code/Pystone.py Pystone(1.2)50000通行证的时间= 0.239254这款机床基准208983 Pystones /秒

它的工作!代码不再慢于主机。是的,是的,我已经多次运行了两个变体:在使用时始终始终恢复正常。

那么,你应该用 - 专项运行基准,假设你相信你正在运行的代码以root身份运行?

如果您在集装箱平台上运行代码,则默认的Docker配置实际上可能更好地匹配现实。然后,它可能不是,它可能不是。例如,船坞的Podman重新实现Docker没有这个问题,Kubernetes使用不同的容器运行。

您最好的投注:比较不同环境的测量,解决差异,旨在实现特定情况的最大现实主义。

在那里'总是在Python世界中学习,它很容易让你的技能滑倒。了解如何升级您的团队的技能 - 以及我的培训课程更快地发货。

注册我的时事通讯,加入超过2800多个Python开发人员和数据科学家学习实用工具和技术,从Docker包装到测试到Python最佳实践,每周在您的收件箱中有一个免费的新文章。