【发布时间】:2017-08-31 21:30:30
【问题描述】:
当我在 Docker 容器中运行 Python 脚本时,它会在大约 1 分钟内完成一个执行循环。现在,当我从同一个图像中启动另外 2 个容器并在其中运行 Python 脚本时,一切都会慢下来,并且每个循环开始需要 5-6 分钟。
没有一个脚本是资源绑定的;有大量的 RAM 和 CPU 内核闲置。在 64 核 Xeon Phi 系统上运行 3 个容器时会发生这种情况。
那么 Docker 是否在所有容器之间共享一个通用的 Python GIL 锁?我有哪些选项可以分离 GIL,以便每个进程都以最大的潜在速度运行?
谢谢!
【问题讨论】:
-
如果我对 docker 的工作方式没有大错特错,他们不应该共享 GIL。这并不意味着脚本的不同实例之间不存在对某些其他资源的争用。但是,要提供更多答案,我们需要查看脚本。
-
Docker 不会对 Python 脚本强加任何东西。 Docker 容器只是一个进程集合,对整个系统具有较小的视图,并且该集合具有特定的资源限制。如果您只是在不调用 Docker 的情况下并行运行多个版本的脚本,您能否确认不会发生此问题?
-
@AkshatMahajan 在 localhost 上运行多个 Python 脚本共享一个 GIL 锁,因此运行单线程。我试图通过在其中运行多个带有 Python 脚本的 Docker 容器来克服 GIL 并利用多个内核。
-
@Kingua:运行多个 Python 程序不共享一个 GIL。每个 Python 程序都是一个单独的进程。一个进程有它自己的 Python 解释器。 GIL 只在 threads 上运行——一个进程可能有多个线程,所以如果你运行一个进程,创建多个线程,然后执行 CPU 任务,那么 GIL 才适用,因为所有线程共享进程的解释器。多个进程没有 GIL。您的减速不是因为 GIL,Docker 不会帮助或伤害。
-
@all 感谢您的指点!从昨天开始我一直在调查,我发现内存中有很多软页面错误,所以这似乎是缓存未命中问题。
标签: python python-3.x docker containers virtualization