下面的小代码片段显示了一串数字相加所需的时间.
import gc
from time import process_time_ns
gc.disable() # disable garbage collection
for func in [
process_time_ns,
]:
pre = func()
s = 0
for a in range(100000):
for b in range(100):
s += b
print(f"sum: {s}")
post = func()
delta_s = (post - pre) / 1e9 # difference in seconds
print(f"{func}: {delta_s}")
令我惊讶的是,在停靠容器中运行时(~1.6s)比在主机上直接运行时(~0.8s)花费的时间要长得多.
经过一番挖掘,我发现docker的一些安全功能可能会导致速度变慢(https://betterprogramming.pub/faster-python-in-docker-d1a71a9b9917,https://pythonspeed.com/articles/docker-performance-overhead/).实际上,添加docker参数--privileged
只会使它的运行时间减少约0.9s.
然而,我仍然对我观察到的这个~0.1s的差距感到困惑,这一差距没有在文章中体现出来.
我已经将我的CPU频率设置为3000 MHz,并修复了在内核0上运行的python执行.
每项测量30次的统计数据:
local | docker --privileged | docker | |
---|---|---|---|
avg | 0.79917586 | 0.904496884 | 1.61980727 |
std | 0.02433539 | 0.031948695 | 0.04034594 |
min | 0.78087375 | 0.867265714 | 1.56995282 |
q1 | 0.78211388 | 0.880717119 | 1.58672566 |
q2 | 0.79006154 | 0.895180195 | 1.61322376 |
q3 | 0.80732969 | 0.916945585 | 1.64363027 |
max | 0.89824817 | 1.012580084 | 1.72252714 |
对于测量,使用了以下命令:
- 本地:
taskset -c 0 python3 main.py
- docker --特权:
taskset -c 0 docker run --privileged --rm -w /data -v /home/slammer/Projects/timing-python-inside-docker:/data -it python:3 python main.py
- docker :
taskset -c 0 docker run --rm -w /data -v /home/slammer/Projects/timing-python-inside-docker:/data -it python:3 python main.py
人
是什么原因导致头顶上有剩余的 docker ? 可以减轻它以实现裸机性能吗?
编辑:在Linux MINT 20.3主机(内核:x86_64 Linux 5.4.0-117-通用)上进行测量;扩展坞版本:20.10.17