【问题标题】:Slow django model instance creation with Docker使用 Docker 创建缓慢的 django 模型实例
【发布时间】:2017-06-27 10:32:59
【问题描述】:

我有一些模型的 django 应用程序。我有manage.py 命令创建n 模型并将其保存到数据库。它在我的主机上运行速度不错。

但如果我在 docker 中运行它,它运行速度非常慢,在 40-50 秒内创建并保存了 1 个实例。我想我在 Docker 的工作原理上遗漏了一些东西,有人能指出为什么性能低,我能用它做什么吗?

docker-compose.yml:

version: '2'

services:
  db:
    restart: always
    image: "postgres:9.6"
    ports:
      - "5432:5432"
    volumes:
      - /usr/local/var/postgres:/var/lib/postgresql
    environment:
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=my_db
      - POSTGRES_USER=postgres

  web:
    build: .
    command: bash -c "./wait-for-it.sh db:5432 --timeout=15; python manage.py migrate; python manage.py runserver 0.0.0.0:8000; python manage.py mock 5"
    ports:
      - "8000:8000"
    expose:
      - "8000"
    depends_on:
      - db

用于网络服务的dockerfile:

FROM python:3.6
ENV PYTHONBUFFERED 1
ADD . .
WORKDIR .
RUN pip install -r requirements.txt
RUN chmod +x wait-for-it.sh

【问题讨论】:

  • 您是在服务器/VM 上执行此操作吗?试过在没有 docker 的同一台机器上做吗?
  • @lorenzvth7 在本地机器 (mac) 上使用最大计算资源执行此操作。在没有 docker 的情况下执行此操作要快得多。

标签: python django postgresql docker


【解决方案1】:

这里的问题很可能是您在 Mac 上使用的卷 /usr/local/var/postgres:/var/lib/postgresql。据我了解 Docker for Mac 解决方案,它使用文件共享来实现主机卷,这比本地文件系统访问要慢很多。

一种可能的解决方法是使用 docker 卷而不是主机卷。这是一个例子:

version: '2'

volumes:
  postgres_data:

services:
  db:
    restart: always
    image: "postgres:9.6"
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql
    environment:
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=my_db
      - POSTGRES_USER=postgres

  web:
    build: .
    command: bash -c "./wait-for-it.sh db:5432 --timeout=15; python manage.py migrate; python manage.py runserver 0.0.0.0:8000; python manage.py mock 5"
    ports:
      - "8000:8000"
    expose:
      - "8000"
    depends_on:
      - db

请注意,这可能会使 postgres 数据的管理复杂化,因为您不能简单地从 Mac 访问数据。您只能使用 docker CLI 或容器来访问、修改和备份这些数据。另外,我不确定如果你从 Mac 上卸载 Docker 会发生什么,可能是你丢失了这些数据。

【讨论】:

  • 卸载 docker 不会丢失数据。我有一个用于 postgres+django 的音量集,效果很好
【解决方案2】:

两件事,可能是一个可能的原因:

  1. 启动 docker 容器需要一些时间,因此如果您为每个实例启动新容器,这可能会累加。
  2. 您使用什么存储驱动程序? Docker(通常)默认为设备映射器环回存储驱动程序,这是慢。这里是some context。这将是痛苦的,尤其是如果您经常启动此容器。

除此之外,您的配置看起来很合理,并且那里没有明显的原因问题。因此,如果上述两点不适用于您,请添加一些额外的 cmets --- 就像您实际添加这些模型实例的方式一样。

【讨论】:

    猜你喜欢
    • 2021-06-19
    • 2013-02-11
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2021-11-16
    • 2013-03-25
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多