【问题标题】:Do Docker containers share a single Python GIL?Docker 容器是否共享一个 Python GIL?
【发布时间】: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


【解决方案1】:

那么 Docker 会在所有容器之间共享一个通用的 Python GIL 锁吗?

没有。

GIL 是每个 Python 进程的,一个 Docker 容器可能有 1 个或多个 Python 进程,每个都有自己的 GIL。

如果你不是多线程,你甚至不应该知道 GIL。你在使用线程吗?

【讨论】:

  • 我有使用 job-lib 的多线程 FOR 循环,但是我也尝试过具有相同结果的单线程 FOR 循环。
  • @Kingua 这些进程之间有什么争用吗?他们在做任何类型的 IO 吗?数据库查询?如果您有安静的内核,那么还有其他原因导致它们相互阻挡。当你在 docker 容器之外运行它们时会发生什么?
  • 脚本不受 I/O 限制,因为它加载单个图像并在 10 秒内对其进行一大堆图像处理。从昨天开始我一直在调查这个问题,我发现内存中有很多软页面错误,所以这似乎是一个缓存未命中问题。
猜你喜欢
  • 2014-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 2022-12-05
相关资源
最近更新 更多