Зависают контейнеры Docker

У меня большая проблема с докер контейнерами, они зависают, как только начинается нагрузка более чем в 10 запросов в секунду (примерно). И я и мои коллеги уже испробовали много методов диагностики, и не нашли проблему.

Зависает и FastAPI контейнер при нагрузке от юзеров. И Aiogram Python бот, когда начинаю делать рассылку. Такая же проблема есть и на других моих проектах, где совершенно другая архитектура, но так же используется Docker.

Я пытался выделять максимум ресурсов, но докер не использует их все и просто зависает. Я пытался делать репликацию контейнеров, но и это не помогает.

Никаких данных докер в логи не пишет, нигде не отображает, что контейнер завис. Он просто зависает, перестает отвечать на команды, вести логи, приложение падает, а контейнер даже убить нельзя. Приходится перезагружаться systemctl docker на сервере полностью.

Compose file:

version: '3.3'

services:
  bot:
    image: "bot"
    stop_signal: SIGINT
    build:
      context: .
    working_dir: "/usr/src/app/bot"
    volumes:
      - .:/usr/src/app/bot
    command: python3 -m bot
    restart: always
    env_file:
      - ".env"
    logging:
      driver: "json-file"
      options:
        max-size: "200k"
        max-file: "10"

  pg_database:
    image: postgres:13-alpine
    restart: always
    volumes:
      - ./data/db:/var/lib/postgresql/data
    command: "postgres -c max_connections=1500
             -c shared_buffers=768MB -c effective_cache_size=2304MB
             -c maintenance_work_mem=128MB -c checkpoint_completion_target=0.9 -c wal_buffers=16MB
             -c default_statistics_target=100 -c random_page_cost=1.1 -c effective_io_concurrency=200
             -c work_mem=16MB -c min_wal_size=1GB -c max_wal_size=4GB -c max_worker_processes=2
             -c max_parallel_workers_per_gather=2 -c max_parallel_workers=2 -c max_parallel_maintenance_workers=1
             -c log_min_duration_statement=5000 -c log_connections=on -c log_disconnections=on"
    env_file:
      - '.env'
    logging:
      driver: "json-file"
      options:
        max-size: "200k"
        max-file: "10"

  pgbouncer:
    image: edoburu/pgbouncer
    restart: always
    ports:
      - "5432:5432"
    environment:
      - DB_USER=${POSTGRES_USER}
      - DB_PASSWORD=${POSTGRES_PASSWORD}
      - DB_NAME=${POSTGRES_DB}
      - DB_HOST=pg_database
      - MAX_CLIENT_CONN=500
      - DEFAULT_POOL_SIZE=20
    volumes:
      - ./pgbouncer:/etc/pgbouncer
    entrypoint: [ "/usr/bin/pgbouncer", "/etc/pgbouncer/pgbouncer.ini" ]

  redis_cache:
    image: redis:6.2-alpine
    restart: always
    command: redis-server --port $REDIS_PORT --save 20 1 --loglevel warning --requirepass $REDIS_PASSWORD
    env_file:
      - ".env"
    volumes:
      - cache:/data

  api:
    image: "api"
    stop_signal: SIGINT
    build:
      context: ./infrastructure/api
      dockerfile: Dockerfile
    working_dir: "/usr/src/app/api"
    volumes:
      - .:/usr/src/app/api
    command: "uvicorn infrastructure.api.app:app --host 0.0.0.0 --port 8000"
    restart: always
    env_file:
      - ".env"
    deploy:
      replicas: 3
      resources:
        limits:
          cpus: "1.0"
          memory: "700M"
        reservations:
          cpus: "1.0"
          memory: "700M"
    logging:
      driver: "json-file"
      options:
        max-size: "200k"
        max-file: "10"

  nginx:
    build:
      context: ./
      dockerfile: ./Dockerfile.nginx
    stdin_open: true
    tty: true
    restart: always
    ports:
      - "${NGINX_PORT}:80"
    volumes:
      - ./nginx:/etc/nginx
      - ./images:/var/www/html/images
      - ./logs:/var/log/nginx
    depends_on:
      - api
    logging:
      driver: "json-file"
      options:
        max-size: "200k"
        max-file: "10"

volumes:
  pgdata: {}
  cache: {}

Dockerfile:

FROM python:3.11-slim

WORKDIR /usr/src/app/bot

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

FastAPI DockerFile:

FROM python:3.11-slim
WORKDIR /usr/src/app/api
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN chmod +x /usr/src/app/api

Ответы (0 шт):