Зависают контейнеры 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