1

Тема: Memory out when used with docker

Загалом таке:
є 10 docker контейнерів, які запущені на одній машині:
- 1 контейнер - django app connected ( nginx -> guincorn -> django)
- решта 8 - django management command (тобто теж django app). Обробка черг, кастомне рішення, не celery, rq і тд.

Проблема в тому, що контейнери періодично вижирають пам'ять і docker успішно прибиває процеси, коли пам'ять виходить за обмеження (встановлено через docker-compose mem_limit). Все би нічого: нехай перезавантажуються коли треба, але коли docker вбиває, він не шле ані SIGTERM, SIGINT, SIGKILL (?), відповідно не можна прохендлити gracefull shutdown (а ці обробники черг реєструються в redis - ну і відповідно потім каша)

Якщо прогнати процеси з використанням якогось memory_profiler, то жодного скачка па'мяті немає, все в міру потреб 80-120мб, і найголовніше, коли даних для обробки немає пам'ять нормально вивільняється. Але в докері - просто перманентно росте. Звідси висновок, що неправильно налаштовано docker.

Куди копати?

dockerfile
FROM python:3.8

ENV PYTHONUNBUFFERED 1

RUN apt-get update
RUN apt-get install -y build-essential libpoppler-cpp-dev pkg-config python-dev
RUN apt-get install -y binutils libproj-dev gdal-bin

RUN mkdir -p /proj/src/
RUN mkdir /proj/logs/

WORKDIR /proj/src

ADD requirements.txt /proj/src/

ADD libs /proj/libs/

RUN pip install -r /proj/src/requirements.txt

docker-compose
version: '2.2'
services:
  servA:
    build:
      context: .
      dockerfile: Dockerfile
    restart: "on-failure"
    container_name: servA
    command: ["python", "/proj/src/manage.py", "queue_A"]
    volumes:
      - .:/proj/src
      - ../logs/:/proj/logs
      - ../media/:/proj/media
    network_mode: host
    mem_limit: 100m
    stop_signal: SIGINT
    privileged: true

P.S. docker, docker-compose, python, всі лібки на проекті оновив до останньої версії

2

Re: Memory out when used with docker

питання:
- коли контейнер перезавантажується - він  може глянути свій лог . чи це запізно?
- є така  штука https://docs.docker.com/engine/referenc … ne/events/  але я з ними ще справи близько не мав.
```
Use docker events to get real-time events from the server. These events differ per Docker object type.
Object types
Containers

Docker containers report the following events:

    attach
    commit
    copy
    create
    destroy
    detach
    die
    exec_create
    exec_detach
    exec_die
    exec_start
    export
    health_status
    kill
    oom
    pause
    rename
    resize
    restart
    start
    stop
    top
    unpause
    update
```

також - це можна опитувати через API

Подякували: leofun011

3 Востаннє редагувалося Q-bart (20.12.2019 18:10:05)

Re: Memory out when used with docker

- коли контейнер перезавантажується - він  може глянути свій лог . чи це запізно?

Можна зробити, щоб контейнер не перезавантажувався: restart: "no", і потім дивитись на логи. В логах чистих контейнера нема нічого, просто зупинка виконання, тоді як має бути надруковано щось типу "Graceful shutdown start, bla-bla".

Graceful shutdown працює точно, тестив багатьма способами

Коли контейнер вимкнений через нестачу пам'яті, то `docker inspect <container id>` повертає нічого цікавого, лише статистику:

OOMkilled: true
ExitCode: 137

OOM - out of memory

4 Востаннє редагувалося Q-bart (21.12.2019 23:10:53)

Re: Memory out when used with docker

Слухайте, ще з самого початку в мене були підозри на логери. Зараз я видалив файли з логами (к-ка гб), система все рівно показує що це місце використовується (я зараз про місце на харді):

unattende   954     root    3w   REG  202,1        224     0     93 /var/log/unattended-upgrades/unattended-upgrades-shutdown.log.1 (deleted)
gunicorn  11557 www-data    6u   REG   0,50          0     0 260363 /tmp/wgunicorn-g64dxp0t (deleted)
gunicorn  11557 www-data    7u   REG   0,50          0     0 266722 /tmp/wgunicorn-j0lnjdxm (deleted)
gunicorn  11557 www-data    8u   REG   0,50          0     0 271030 /tmp/wgunicorn-ccym6uw3 (deleted)
gunicorn  11557 www-data    9u   REG   0,50          0     0 271050 /tmp/wgunicorn-uql9afcj (deleted)
gunicorn  11557 www-data   10u   REG   0,50          0     0 271942 /tmp/wgunicorn-uri5gn3e (deleted)
gunicorn  11557 www-data   11u   REG   0,50          0     0 316299 /tmp/wgunicorn-2u3z7ndp (deleted)
gunicorn  11559 www-data    6u   REG   0,50          0     0 260363 /tmp/wgunicorn-g64dxp0t (deleted)
gunicorn  11559 www-data   17w   REG  202,1 1960191264     0 535024 /proj/logs/monitoring/purpose.log (deleted)
gunicorn  11560 www-data    7u   REG   0,50          0     0 266722 /tmp/wgunicorn-j0lnjdxm (deleted)

треба процеси прибити, і тоді пам'ять (знову ж таки на харді) вивільняється.

Можливо таке саме з оперативною пам'яттю? Якщо в цьому причина і якщо спробувати запустити процеси без логерів, то має бути все ок, вірно ж?

UPD. ні, не запуск без логування не допоміг

5 Востаннє редагувалося HetmanNet (22.12.2019 17:41:45)

Re: Memory out when used with docker

Q-bart написав:

Слухайте, ще з самого початку в мене були підозри на логери. Зараз я видалив файли з логами (к-ка гб), система все рівно показує що це місце використовується (я зараз про місце на харді):

unattende   954     root    3w   REG  202,1        224     0     93 /var/log/unattended-upgrades/unattended-upgrades-shutdown.log.1 (deleted)
gunicorn  11557 www-data    6u   REG   0,50          0     0 260363 /tmp/wgunicorn-g64dxp0t (deleted)
gunicorn  11557 www-data    7u   REG   0,50          0     0 266722 /tmp/wgunicorn-j0lnjdxm (deleted)
gunicorn  11557 www-data    8u   REG   0,50          0     0 271030 /tmp/wgunicorn-ccym6uw3 (deleted)
gunicorn  11557 www-data    9u   REG   0,50          0     0 271050 /tmp/wgunicorn-uql9afcj (deleted)
gunicorn  11557 www-data   10u   REG   0,50          0     0 271942 /tmp/wgunicorn-uri5gn3e (deleted)
gunicorn  11557 www-data   11u   REG   0,50          0     0 316299 /tmp/wgunicorn-2u3z7ndp (deleted)
gunicorn  11559 www-data    6u   REG   0,50          0     0 260363 /tmp/wgunicorn-g64dxp0t (deleted)
gunicorn  11559 www-data   17w   REG  202,1 1960191264     0 535024 /proj/logs/monitoring/purpose.log (deleted)
gunicorn  11560 www-data    7u   REG   0,50          0     0 266722 /tmp/wgunicorn-j0lnjdxm (deleted)

треба процеси прибити, і тоді пам'ять (знову ж таки на харді) вивільняється.

Можливо таке саме з оперативною пам'яттю? Якщо в цьому причина і якщо спробувати запустити процеси без логерів, то має бути все ок, вірно ж?

UPD. ні, не запуск без логування не допоміг

Найбільш ймовірно ви встановили для контейнера замалий ліміт по пам'яті (мабуть 100М замало).

6

Re: Memory out when used with docker

HetmanNet написав:
Q-bart написав:

Слухайте, ще з самого початку в мене були підозри на логери. Зараз я видалив файли з логами (к-ка гб), система все рівно показує що це місце використовується (я зараз про місце на харді):

unattende   954     root    3w   REG  202,1        224     0     93 /var/log/unattended-upgrades/unattended-upgrades-shutdown.log.1 (deleted)
gunicorn  11557 www-data    6u   REG   0,50          0     0 260363 /tmp/wgunicorn-g64dxp0t (deleted)
gunicorn  11557 www-data    7u   REG   0,50          0     0 266722 /tmp/wgunicorn-j0lnjdxm (deleted)
gunicorn  11557 www-data    8u   REG   0,50          0     0 271030 /tmp/wgunicorn-ccym6uw3 (deleted)
gunicorn  11557 www-data    9u   REG   0,50          0     0 271050 /tmp/wgunicorn-uql9afcj (deleted)
gunicorn  11557 www-data   10u   REG   0,50          0     0 271942 /tmp/wgunicorn-uri5gn3e (deleted)
gunicorn  11557 www-data   11u   REG   0,50          0     0 316299 /tmp/wgunicorn-2u3z7ndp (deleted)
gunicorn  11559 www-data    6u   REG   0,50          0     0 260363 /tmp/wgunicorn-g64dxp0t (deleted)
gunicorn  11559 www-data   17w   REG  202,1 1960191264     0 535024 /proj/logs/monitoring/purpose.log (deleted)
gunicorn  11560 www-data    7u   REG   0,50          0     0 266722 /tmp/wgunicorn-j0lnjdxm (deleted)

треба процеси прибити, і тоді пам'ять (знову ж таки на харді) вивільняється.

Можливо таке саме з оперативною пам'яттю? Якщо в цьому причина і якщо спробувати запустити процеси без логерів, то має бути все ок, вірно ж?

UPD. ні, не запуск без логування не допоміг

Найбільш ймовірно ви встановили для контейнера замалий ліміт по пам'яті (мабуть 100М замало).

Та це було для тесту, щоб симулювати рестарт.
До того на 1000мб було