---
# System prepended metadata

title: Как выглядела схема

---

# Как выглядела схема

![](https://i.imgur.com/NwIBvOp.png)

> Вот так


## Оглавление
[1. Brief](#1-Brief)
[2. Building](#2-Building)
[3. Описание этапов для docker-compose](#3-Описание-этапов-для-docker-compose)
[4. Конфигурирование планировщика](#4-Конфигурирование-планировщика)
[5. Запуск](#5-Запуск)
[2nd version](#2nd-version)

## 1. Brief

```
/--
    pris-db-test/
    protosphere-scheduler/
    sfid/
        0a54a4cd-f400-582a-a08d-2c813cd97430.zip
        0b62a75f-1958-5dba-bee4-50eaa2d324f8.zip
        ...
    Dockerfile
    docker-compose.yml
    docker-compose.yml.1
    first.sh
    second.sh
```

Директория `pris-db-test` содержит исходный код Протосферы.
Директория `protosphere-scheduler` содержит исходный код планировщика запуска Протосферы.

Директория `sfid` содержит входные данные. Изначально для примера они заданы, но их можно заменить другими.

Файл `Dockerfile` необходим для построения образа контейнера. Во время построения удовлетворяются все зависимости и происходит сначала сборка Протосферы, затем планировщика.

Файлы `docker-compose.yml` и `docker-compose.yml.1` содержат описание для запуска построенного образа. Для упрощения их запуска были написаны скрипты `first.sh` и `second.sh`.

Перед самым первым запуском любого этапа образ контейнера будет построен автоматически.

На первом этапе (запуск `first.sh`) происходит разбор входных данных из папки `sfid` посредством ограниченного набора модулей и занесение результатов разбора в базу.

На втором этапе (запуск `second.sh`) происходит извлечение отдельных элементов результатов разбора с прошлого этапа и разбор этих элементов посредством расширенного набора модулей, также с занесением результатов в базу.

В схеме предполагается, что база данных находится за пределами описываемой схемы.

## 2. Building

Dockerfile:

```lang=Dockerfile
FROM alpine:latest

RUN apk add g++ make cmake ragel automake libtool bison flex
RUN apk add libpcap-dev qt5-qtbase-dev qt5-qtxmlpatterns-dev openssl-dev

RUN apk add zlib git python3 py-pip

RUN git clone https://github.com/kuba--/zip.git
WORKDIR /zip
RUN cmake . && cmake --build .
RUN make install

WORKDIR /
COPY pris-db_test /src
WORKDIR /src

RUN mkdir build
WORKDIR /src/build
RUN qmake-qt5 ../protosphere_online.pro -spec linux-g++ CONFIG+=release DEFINES+=CORE_LITE
RUN make

RUN cp -r /src/Config .
RUN apk add postgresql-dev gcc python3-dev musl-dev
RUN pip3 install -U pip
COPY protosphere-scheduler scheduler
WORKDIR scheduler

RUN pip3 install --no-cache-dir -e .

VOLUME /sfid

CMD ["python3", "-m", "scheduler"]
```

Образ основан на образе `alpine:latest`.

Среди зависимостей как стандартные пакеты, доступные в репозитории alpine (такие пакеты устанавливаются посредством запуска `RUN apk add`), так и кастромные, к которым относится libzip, собираемый из [репозитория https://github.com/kuba--/zip.git](https://github.com/kuba--/zip.git).

После разрешения зависимостей для Протосферы происходит копирование исходного кода из host-системы в образ (команда `COPY pris-db_test /src`), а затем и сборка (команды `RUN qmake-qt5 ...` и `RUN make`)

Все конфигурации и получаемые в результате сборки бинарные данные размещаются в папке `build` внутри контейнера, т.е. по пути `/src/build`.

После разрешения зависемостей для планировщика, аналогично, его исходный код копируется в папку `/src/build/scheduler`. После чего происходит установка python пакета в систему (команда `RUN pip3 install --no-cache-dir -e .
`)

Папка `/sfid` помечатся как точка для монтирования.

Команда для запуска сохраняется в виде `python3 -m scheduler`. Рабочей директорией при этом назначается `/src/build/scheduler`.

## 3. Описание этапов для docker-compose
Каждый файл docker-compose в данной схеме описывает свой этап запуска, т.е. содержит изменяемые параметры запуска контейнера.

docker-compose файл для первого этапа:
```lang=docker-compose
version: '3'

services:
  protosphere:
    build:
      context: .
    volumes:
      - ./sfid:/sfid
    environment:
      # при необходимости изменить
      - SCHEDULER_DB_TYPE=postgresql
      - SCHEDULER_DB_URL=172.17.0.1
      - SCHEDULER_DB_USER=postgres
      - SCHEDULER_DB_PASSWORD=example
      - SCHEDULER_DB_NAME=test
      # значени ниже менять только если вы знаете, что делаете
      - CHEDULER_CREATE_CONFIG=True
      - SCHEDULER_IDLE_RUN=True
      - SCHEDULER_BASE_DIR=/src/build/
      - SCHEDULER_CONFIG_PRODUCER_FILE=/sfid
      - SCHEDULER_CONFIG_MODULES_PARSERS=["ip4", "tcp", "udp", "streamv2", "sfid"]
```

В данном случае используется 3я версия синтаксиса docker-compose. С одним серивисом-контейнером `protosphere`.
Dockerfile для этого сервиса назван стандартно и расположен в той же директории, что и файл docker-compose `build: context: .`  
Монтируется папка `sfid` расположенная в той же директории, откуда запускается docker-compose.

Всё остальное конфигурирование касается планировщика напрямую и содержит описание в следующем пункте.

Однако приведённые в docker-compose значения были разделены на описание интерфейса подключения к база данных и на остальные. При необходимости первые следует заменить.  
В примере предполагается, что база данных содержится в host-системе на стандартном для postgresql порту `5432`. Логин/пароль для БД при этом `postgres/example`. А название базы данных - `test`

Стоит упомянуть, что для изменения порта необходимо добавить значение через двоеточие в переменную `SCHEDULER_DB_URL`.

Вторые же менять не рекомендуется, но истолковать их можно таким образом:
* `CHEDULER_CREATE_CONFIG=True` - обновить конфигурацию Протосферы
* `SCHEDULER_IDLE_RUN=True` - Запустить Протосферу (разумеется, после конфигурации)  
* `SCHEDULER_BASE_DIR=/src/build/` - указывает путь к "базовой" директории протосферы, т.е. директории, содержащей конфигурационные и бинарные файлы в окружении контейнера.  
* `SCHEDULER_CONFIG_PRODUCER_FILE=/sfid` - файл (в данном случае директория), где содержатся входные данные для работы Протосферы в окружении контейнера. Данное значение заносится в конфигурационные файлы Протосферы.  
* `SCHEDULER_CONFIG_MODULES_PARSERS` - задаёт список задействованых модулей для работы Протосферы. Это значение также заносится в конфигурационные файлы.

docker-compose файл для второго этапа имеет очень похожий вид:

```lang=docker-compose
version: '3'

services:
  protosphere:
    build:
      context: .
    volumes:
      - ./sfid:/sfid
    environment:
      # при необходимости изменить
      - SCHEDULER_DB_TYPE=postgresql
      - SCHEDULER_DB_URL=172.17.0.1
      - SCHEDULER_DB_USER=postgres
      - SCHEDULER_DB_PASSWORD=example
      - SCHEDULER_DB_NAME=test
      # значени ниже менять только если вы знаете, что делаете
      - SCHEDULER_CREATE_CONFIG=True
      - SCHEDULER_IDLE_RUN=True
      - SCHEDULER_BASE_DIR=/src/build/
      - SCHEDULER_CONFIG_PRODUCER_FILE=/sfid
      - SCHEDULER_CONFIG_PRODUCER_STREAM_ID=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40]
      - SCHEDULER_CONFIG_PRODUCER_TYPE=db

```

К переменным окружения контейнера добавились:
* `SCHEDULER_CONFIG_PRODUCER_TYPE=db` - задаёт тип входных данных, т.е. откуда их брать. По умолчанию этот параметр равняется значению `sfid`, что справедливо для певого этапа, поэтому там он был опущен.
* `SCHEDULER_CONFIG_PRODUCER_STREAM_ID` - задаёт список `stream_id` в терминологии БД для повторного разбора.

Стоит оговориться, что `SCHEDULER_CONFIG_PRODUCER_FILE` тут излишен, однако благодаря изменению `SCHEDULER_CONFIG_PRODUCER_TYPE` он в работе не учитывается.

## 4. Конфигурирование планировщика

Лучше всего описывает конфигурируемые параметры справка по планировщику:
```
optional arguments:
  -h, --help            show this help message and exit
  --verbose VERBOSE     more logs [env var: SCHEDULER_VERBOSE] (default: None)

DB Options:
  For PostgrreSQL, greenplum connect via 'type://username:password@url/name'
  For SQLite connect via 'type:///name'

  --db-type {postgresql,greenplum,sqlite}
                        database type [env var: SCHEDULER_DB_TYPE] (default:
                        postgresql)
  --db-url DB_URL       database url [env var: SCHEDULER_DB_URL] (default:
                        localhost)
  --db-user DB_USER     database username [env var: SCHEDULER_DB_USER]
                        (default: postgres)
  --db-password DB_PASSWORD
                        database password [env var: SCHEDULER_DB_PASSWORD]
                        (default: example)
  --db-name DB_NAME     database [env var: SCHEDULER_DB_NAME] (default: test)

Run Protosphere:
  --base-dir BASE_DIR   base protosphere's dir with "Config", "Parsers" and
                        "PsLite" [env var: SCHEDULER_BASE_DIR] (default:
                        ./pris/)
  --create-config       [env var: SCHEDULER_CREATE_CONFIG] (default: False)

  --idle-run            [env var: SCHEDULER_IDLE_RUN] (default: False)

Protosphere's config:
  --default-proto-config
                        reset config to default [env var:
                        SCHEDULER_DEFAULT_PROTO_CONFIG] (default: False)
  --config-logging-file CONFIG_LOGGING_FILE
                        Logging file [env var: SCHEDULER_CONFIG_LOGGING_FILE]
                        (default: )
  --config-ringbuffer-chunks CONFIG_RINGBUFFER_CHUNKS
                        Ring buffer: max chunks count [env var:
                        SCHEDULER_CONFIG_RINGBUFFER_CHUNKS] (default: 1)
  --config-ringbuffer-chunksizemb CONFIG_RINGBUFFER_CHUNKSIZEMB
                        Ring buffer: max chunk size in Mb [env var:
                        SCHEDULER_CONFIG_RINGBUFFER_CHUNKSIZEMB] (default:
                        200)
  --config-producer-type {sfid,pcap,db,online}
                        protosphere's input type [env var:
                        SCHEDULER_CONFIG_PRODUCER_TYPE] (default: sfid)
  --config-producer-file CONFIG_PRODUCER_FILE
                        protosphere's input file (for "sfid" and "pcap" type
                        only) [env var: SCHEDULER_CONFIG_PRODUCER_FILE]
                        (default: None)
  --config-producer-network-interface CONFIG_PRODUCER_NETWORK_INTERFACE
                        network interface (for "online" type only) [env var:
                        SCHEDULER_CONFIG_PRODUCER_NETWORK_INTERFACE] (default:
                        None)
  --config-producer-stream-id CONFIG_PRODUCER_STREAM_ID
                        stream ids (for "db" type only), examples: "[1, 2, 3,
                        4]", "[0]" [env var:
                        SCHEDULER_CONFIG_PRODUCER_STREAM_ID] (default: None)
  --config-producer-buildtype CONFIG_PRODUCER_BUILDTYPE
                        build type [env var:
                        SCHEDULER_CONFIG_PRODUCER_BUILDTYPE] (default:
                        Tcp:Tcp)
  --config-producer-parsetype CONFIG_PRODUCER_PARSETYPE
                        parse type [env var:
                        SCHEDULER_CONFIG_PRODUCER_PARSETYPE] (default:
                        Base:Undefined)
  --config-producer-restorecontext CONFIG_PRODUCER_RESTORECONTEXT
                        restore context [env var:
                        SCHEDULER_CONFIG_PRODUCER_RESTORECONTEXT] (default:
                        true)
  --config-consumer-packet-type CONFIG_CONSUMER_PACKET_TYPE
                        packet type [env var:
                        SCHEDULER_CONFIG_CONSUMER_PACKET_TYPE] (default:
                        Eth:Eth)
  --config-consumer-hints-file-path CONFIG_CONSUMER_HINTS_FILE_PATH
                        hints file [env var:
                        SCHEDULER_CONFIG_CONSUMER_HINTS_FILE_PATH] (default: )
  --config-statsprinter-time-interval-ms CONFIG_STATSPRINTER_TIME_INTERVAL_MS
                        Pretty printer: time interval in ms [env var:
                        SCHEDULER_CONFIG_STATSPRINTER_TIME_INTERVAL_MS]
                        (default: 2000)
  --config-memorymanager-storagecap CONFIG_MEMORYMANAGER_STORAGECAP
                        Memory manager: storage capacity [env var:
                        SCHEDULER_CONFIG_MEMORYMANAGER_STORAGECAP] (default:
                        100000)
  --config-modules-builders CONFIG_MODULES_BUILDERS
                        Builders list [env var:
                        SCHEDULER_CONFIG_MODULES_BUILDERS] (default: None)
  --config-modules-parsers CONFIG_MODULES_PARSERS
                        Parsers list example: "[ "ah", "arp", "tcp"]" [env
                        var: SCHEDULER_CONFIG_MODULES_PARSERS] (default: None)

CMDs:
  --cmd CMD             execute command, example: "show BLOB Ip4:Ip4 STREAM
                        TCP fin == 1" [env var: SCHEDULER_CMD] (default: None)

```

Соответственно, значения в квадратных скобках с `env var: ` показывают какими переменными окружения конфигурируются те или иные параметры.

## 5. Запуск
Для избежание путаницы и упрощения запуска были написаны элементарные скрипты для запуска первого и второго этапов соответственно:
`first.sh`:
```lang=shell
#!/bin/sh
docker-compose up
```
`second.sh`:
```lang=shell
#!/bin/sh
docker-compose -f docker-compose.yml.1 up
```

# 2nd version

1. [Containerization](#Containerization)
2. [Docker](#Docker)
3. [Test](#Test)
4. [Double run](#Double-run)

### Containerization

Для изолирования каждого разработанного приложения была применена технология контейнеризации, которая позволяет распространять приложение вместе с рабочим окружением, требуемым ему для работы, без каких-либо конфликтов с окружением системы, где контейнер будет запускаеться, или с другими приложениями. Изоляция рабочего окружения также позволяет легко производить миграцию при смене систем, где контейнеры размещаются. Помимо изолирования контейнерная архитектура позволяет производить горизонтальное масштабирование посредтвом запуска нескольких контейнеров.

### Docker

Для проверки работоспособности подхода было задействовано ПО Docker, которое является средством для автоматизации развёртывания приложений в контейнерах.

При использовании Docker, для запуска приложения нужно создать 2 сущности - сначала образ контейнера, а затем на его основе - контейнер. При этом предполагается, что образ контейнера сущность постоянная, т.е. создаётся один раз и затем, в процессе работы приложения (контейнера) не должна изменяться. Изменению в этой системе должен быть подвержен только контейнер: во время запуска можно изменить некоторые элементы окружения, а также во время работы приложение может изменять окружение точно также, как если бы оно работало вне контейнера. Также нужно понимать что контейнер идеологически по своей структуре - stateless сервис, т.е. он не должен сохранять состояние работы приложения. Этим должен заниматься либо отдельный сервис, либо система, где запускается контейнер.

Другим идеологическим ограничением контейнеров, создаваемых Docker является ограничение в одно приложение на один контейнер. В процессе работы контейнера отслеживается состояние запускаемого приложения и эта система будет работать некорректно, если в одном контейнере будет запускаться более чем одно приложение. Под отслеживанием состояния подразумевается сбор логов, а также периодические проверки работоспособности и перезапуск при необходимости, что обеспечивает отказоустойчивость приложения.
Однако допускается запуск одним приложением другого, при этом запускаемый процесс не отслеживается контейнером и эту задачу на себя должно брать запускающее приложение.

### Test

В рамках первого тестирования разрабатываемой системы с использованием технологии контейнеризации был создан образ, содержащий в себе помимо Протосферы конфигуратор, который формирует конфигурационные файлы для запуска Протосферы. Таким образом в контейнере сначала запускается конфигуратор, а затем, после подготовки конфигурационных файлов, конфигуратор запускает Протосферу.

Для описания процесса построения образа контейнера в Docker используется специальный синтаксис - Dockerfile.

При создании образа за основу был взят образ alpine linux, в нём были разрешены все необходимые зависимости (как для конфигуратора, так и для Протосферы), произведена сборка Протосферы из исходного кода, установка конфигуратора, объявлена точка для монтирования входных данных и описана команда для запуска.
Сборка из исходного кода даёт дополнительную гарантию работоспособности Протосферы в окружении, создаваемом контейром. Точка монтирования входных данных представляет из себя папку, куда можно сложить любое число входных файлом, что исключает необходимость любой дополнительной подготовки входных данных по сравнению с запуском Протосферы вне контейнера. А тот факт, что монтирование происходит в момент запуска контейнера и источник для монтирования задаётся именно в этот момент позволяет упростить конфигурирование Протосферы. (т.к. внутри контейнера путь к входным данным меняться не будет)

Т.к. команда для запуска описывается при построении образа контейнера и не подлежит изменению, конфигуратор был разработан таким образом, чтобы все параметры его работы можно было задать как ключами при запуске, так и через переменные окружения. В результате косметически работа конфигуратора в контейнере ничем не отличается от работы его вне контейнера, т.к. переменные окружения в контейнере возможно изменять ключами запуска контейнера.

Для упрощения конфигурирования контейнера при запуске была задействована подсистема Docker-compose. Она позволяет при помощи декларативного описания окружения контейнера в формате YAML производить запуск одного или сразу нескольких контейнеров. В случае запуска нескольких контейнеров сразу создавать необходимые для их совместной работы связи.

В тестируемой системе есть необходимость конфигурировать только переменные окружения, для управлением конфигуратором, и источник для монтирования входных данных, что и было описано в файлах docker-compose.yml.

### Double run

Процесс тестирования был разделён на 2 этапа: в первом происходит предварительный разбор входных данных, во втором происходит полный разбор потоков, которые не были до конца разобраны на первом этапе. Под предварительным разбором подразумевается запуск протосферы для разбора входных данных при использовании ограниченного количества модулей разбора (протоколы до 4го уровня модели OSI включительно). Под полным разбором, соотвественно, запуск Протосферы с полным набором подключенных модулей. Однако если в первом этапе ожидаются входные данные в формате sfid, то во втором происходит взаимодействие с базой данных, т.е. сначала средствами конфигуратора происходит выделение потоков по условию, а затем конфигурирование Протосферы для использования данных из БД в качестве входных.

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

При проведении тестирования использовалось оборудование с CPU Intel Xeon E3-1240 V2 @ 3.40GHz, 4х ОЗУ без дополнительного раздела или файла подкачки DDR3 1333 MT/s работающих в 2хканальном режиме общим объёмом 16Гб и ПЗУ в виде INTEL SSD SC2BW24.

В качестве базы данных использовался Postgresql 10, запущенный в отдельном контейнере.

Тестирование проводилось на 68ми различных файлах формата sfid общим объёмом 523Мб.

#### Первый этап

Время работы контейнера с конфигуратором и Протосферой составило 35 секунды.

За это время удалось произвести 62 измерений использования ОЗУ и ЦПУ:

<details>
<summary>Статистика для копирования</summary>  

protos

0167c6c25d68 0B / 0B 0.00% 0.00%
0167c6c25d68 21.2MiB / 15.62GiB 0.13% 0.00%
0167c6c25d68 21.2MiB / 15.62GiB 0.13% 0.00%
0167c6c25d68 117MiB / 15.62GiB 0.73% 54.93%
0167c6c25d68 117MiB / 15.62GiB 0.73% 54.93%
0167c6c25d68 308.2MiB / 15.62GiB 1.93% 104.14%
0167c6c25d68 308.2MiB / 15.62GiB 1.93% 104.14%
0167c6c25d68 457.8MiB / 15.62GiB 2.86% 103.30%
0167c6c25d68 457.8MiB / 15.62GiB 2.86% 103.30%
0167c6c25d68 555.9MiB / 15.62GiB 3.48% 103.52%
0167c6c25d68 555.9MiB / 15.62GiB 3.48% 103.52%
0167c6c25d68 651.8MiB / 15.62GiB 4.08% 103.84%
0167c6c25d68 651.8MiB / 15.62GiB 4.08% 103.84%
0167c6c25d68 780.2MiB / 15.62GiB 4.88% 103.41%
0167c6c25d68 780.2MiB / 15.62GiB 4.88% 103.41%
0167c6c25d68 843MiB / 15.62GiB 5.27% 28.43%
0167c6c25d68 843MiB / 15.62GiB 5.27% 28.43%
0167c6c25d68 848.6MiB / 15.62GiB 5.31% 21.67%
0167c6c25d68 848.6MiB / 15.62GiB 5.31% 21.67%
0167c6c25d68 873.5MiB / 15.62GiB 5.46% 34.72%
0167c6c25d68 873.5MiB / 15.62GiB 5.46% 34.72%
0167c6c25d68 860MiB / 15.62GiB 5.38% 22.81%
0167c6c25d68 860MiB / 15.62GiB 5.38% 22.81%
0167c6c25d68 773.2MiB / 15.62GiB 4.84% 22.19%
0167c6c25d68 773.2MiB / 15.62GiB 4.84% 22.19%
0167c6c25d68 845.9MiB / 15.62GiB 5.29% 27.24%
0167c6c25d68 845.9MiB / 15.62GiB 5.29% 27.24%
0167c6c25d68 871.8MiB / 15.62GiB 5.45% 32.70%
0167c6c25d68 871.8MiB / 15.62GiB 5.45% 32.70%
0167c6c25d68 854.1MiB / 15.62GiB 5.34% 23.24%
0167c6c25d68 854.1MiB / 15.62GiB 5.34% 23.24%
0167c6c25d68 815.2MiB / 15.62GiB 5.10% 26.08%
0167c6c25d68 815.2MiB / 15.62GiB 5.10% 26.08%
0167c6c25d68 779.9MiB / 15.62GiB 4.88% 25.93%
0167c6c25d68 779.9MiB / 15.62GiB 4.88% 25.93%
0167c6c25d68 863.9MiB / 15.62GiB 5.40% 31.96%
0167c6c25d68 863.9MiB / 15.62GiB 5.40% 31.96%
0167c6c25d68 839.9MiB / 15.62GiB 5.25% 26.13%
0167c6c25d68 839.9MiB / 15.62GiB 5.25% 26.13%
0167c6c25d68 809.1MiB / 15.62GiB 5.06% 26.02%
0167c6c25d68 809.1MiB / 15.62GiB 5.06% 26.02%
0167c6c25d68 847.8MiB / 15.62GiB 5.30% 24.98%
0167c6c25d68 847.8MiB / 15.62GiB 5.30% 24.98%
0167c6c25d68 849.5MiB / 15.62GiB 5.31% 30.36%
0167c6c25d68 849.5MiB / 15.62GiB 5.31% 30.36%
0167c6c25d68 839.8MiB / 15.62GiB 5.25% 25.89%
0167c6c25d68 839.8MiB / 15.62GiB 5.25% 25.89%
0167c6c25d68 773.4MiB / 15.62GiB 4.84% 23.71%
0167c6c25d68 773.4MiB / 15.62GiB 4.84% 23.71%
0167c6c25d68 838.7MiB / 15.62GiB 5.25% 27.59%
0167c6c25d68 838.7MiB / 15.62GiB 5.25% 27.59%
0167c6c25d68 790.7MiB / 15.62GiB 4.94% 26.30%
0167c6c25d68 790.7MiB / 15.62GiB 4.94% 26.30%
0167c6c25d68 847.2MiB / 15.62GiB 5.30% 29.33%
0167c6c25d68 847.2MiB / 15.62GiB 5.30% 29.33%
0167c6c25d68 822.2MiB / 15.62GiB 5.14% 26.54%
0167c6c25d68 822.2MiB / 15.62GiB 5.14% 26.54%
0167c6c25d68 863.4MiB / 15.62GiB 5.40% 30.16%
0167c6c25d68 863.4MiB / 15.62GiB 5.40% 30.16%
0167c6c25d68 869.8MiB / 15.62GiB 5.44% 21.22%
0167c6c25d68 869.8MiB / 15.62GiB 5.44% 21.22%
0167c6c25d68 861MiB / 15.62GiB 5.38% 32.05%

postgres

42b827d013d6 182.7MiB / 15.62GiB 1.14% 0.94%
42b827d013d6 182.7MiB / 15.62GiB 1.14% 0.94%
42b827d013d6 183.2MiB / 15.62GiB 1.15% 6.36%
42b827d013d6 183.2MiB / 15.62GiB 1.15% 6.36%
42b827d013d6 183.1MiB / 15.62GiB 1.15% 0.04%
42b827d013d6 183.1MiB / 15.62GiB 1.15% 0.04%
42b827d013d6 183.1MiB / 15.62GiB 1.15% 0.04%
42b827d013d6 183.1MiB / 15.62GiB 1.15% 0.04%
42b827d013d6 183.1MiB / 15.62GiB 1.15% 0.04%
42b827d013d6 183.1MiB / 15.62GiB 1.15% 0.04%
42b827d013d6 183.1MiB / 15.62GiB 1.15% 0.04%
42b827d013d6 183.1MiB / 15.62GiB 1.15% 0.04%
42b827d013d6 183.2MiB / 15.62GiB 1.15% 0.20%
42b827d013d6 183.2MiB / 15.62GiB 1.15% 0.20%
42b827d013d6 243.9MiB / 15.62GiB 1.53% 75.61%
42b827d013d6 243.9MiB / 15.62GiB 1.53% 75.61%
42b827d013d6 268.5MiB / 15.62GiB 1.68% 77.02%
42b827d013d6 268.5MiB / 15.62GiB 1.68% 77.02%
42b827d013d6 226.7MiB / 15.62GiB 1.42% 64.36%
42b827d013d6 226.7MiB / 15.62GiB 1.42% 64.36%
42b827d013d6 273MiB / 15.62GiB 1.71% 74.46%
42b827d013d6 273MiB / 15.62GiB 1.71% 74.46%
42b827d013d6 192.5MiB / 15.62GiB 1.20% 71.54%
42b827d013d6 192.5MiB / 15.62GiB 1.20% 71.54%
42b827d013d6 265.4MiB / 15.62GiB 1.66% 74.33%
42b827d013d6 265.4MiB / 15.62GiB 1.66% 74.33%
42b827d013d6 217.8MiB / 15.62GiB 1.36% 62.22%
42b827d013d6 217.8MiB / 15.62GiB 1.36% 62.22%
42b827d013d6 283.8MiB / 15.62GiB 1.78% 80.43%
42b827d013d6 283.8MiB / 15.62GiB 1.78% 80.43%
42b827d013d6 199.8MiB / 15.62GiB 1.25% 76.49%
42b827d013d6 199.8MiB / 15.62GiB 1.25% 76.49%
42b827d013d6 199.8MiB / 15.62GiB 1.25% 75.76%
42b827d013d6 199.8MiB / 15.62GiB 1.25% 75.76%
42b827d013d6 277.2MiB / 15.62GiB 1.73% 73.90%
42b827d013d6 277.2MiB / 15.62GiB 1.73% 73.90%
42b827d013d6 254.3MiB / 15.62GiB 1.59% 72.18%
42b827d013d6 254.3MiB / 15.62GiB 1.59% 72.18%
42b827d013d6 200MiB / 15.62GiB 1.25% 77.52%
42b827d013d6 200MiB / 15.62GiB 1.25% 77.52%
42b827d013d6 264.9MiB / 15.62GiB 1.66% 77.89%
42b827d013d6 264.9MiB / 15.62GiB 1.66% 77.89%
42b827d013d6 237.7MiB / 15.62GiB 1.49% 70.19%
42b827d013d6 237.7MiB / 15.62GiB 1.49% 70.19%
42b827d013d6 224.3MiB / 15.62GiB 1.40% 71.66%
42b827d013d6 224.3MiB / 15.62GiB 1.40% 71.66%
42b827d013d6 184.2MiB / 15.62GiB 1.15% 76.36%
42b827d013d6 184.2MiB / 15.62GiB 1.15% 76.36%
42b827d013d6 260.2MiB / 15.62GiB 1.63% 75.07%
42b827d013d6 260.2MiB / 15.62GiB 1.63% 75.07%
42b827d013d6 183.9MiB / 15.62GiB 1.15% 76.26%
42b827d013d6 183.9MiB / 15.62GiB 1.15% 76.26%
42b827d013d6 236.4MiB / 15.62GiB 1.48% 70.88%
42b827d013d6 236.4MiB / 15.62GiB 1.48% 70.88%
42b827d013d6 184MiB / 15.62GiB 1.15% 76.02%
42b827d013d6 184MiB / 15.62GiB 1.15% 76.02%
42b827d013d6 220.4MiB / 15.62GiB 1.38% 72.58%
42b827d013d6 220.4MiB / 15.62GiB 1.38% 72.58%
42b827d013d6 287.9MiB / 15.62GiB 1.80% 81.94%
42b827d013d6 287.9MiB / 15.62GiB 1.80% 81.94%
42b827d013d6 219.5MiB / 15.62GiB 1.37% 69.89%
42b827d013d6 219.5MiB / 15.62GiB 1.37% 69.89%
  
</details>  

|      protos         |  ОЗУ  |   ЦПУ   |          db         |  ОЗУ  |   ЦПУ  |
|---------------------|-------|---------|---------------------|-------|--------|
| 0B        / 0B      | 0.00% | 0.00%   | 182.7MiB / 15.62GiB | 1.14% | 0.94%  |
| 21.2MiB  / 15.62GiB | 0.13% | 0.00%   | 182.7MiB / 15.62GiB | 1.14% | 0.94%  |
| 21.2MiB  / 15.62GiB | 0.13% | 0.00%   | 183.2MiB / 15.62GiB | 1.15% | 6.36%  |
| 117MiB   / 15.62GiB | 0.73% | 54.93%  | 183.2MiB / 15.62GiB | 1.15% | 6.36%  |
| 117MiB   / 15.62GiB | 0.73% | 54.93%  | 183.1MiB / 15.62GiB | 1.15% | 0.04%  |
| 308.2MiB / 15.62GiB | 1.93% | 104.14% | 183.1MiB / 15.62GiB | 1.15% | 0.04%  |
| 308.2MiB / 15.62GiB | 1.93% | 104.14% | 183.1MiB / 15.62GiB | 1.15% | 0.04%  |
| 457.8MiB / 15.62GiB | 2.86% | 103.30% | 183.1MiB / 15.62GiB | 1.15% | 0.04%  |
| 457.8MiB / 15.62GiB | 2.86% | 103.30% | 183.1MiB / 15.62GiB | 1.15% | 0.04%  |
| 555.9MiB / 15.62GiB | 3.48% | 103.52% | 183.1MiB / 15.62GiB | 1.15% | 0.04%  |
| 555.9MiB / 15.62GiB | 3.48% | 103.52% | 183.1MiB / 15.62GiB | 1.15% | 0.04%  |
| 651.8MiB / 15.62GiB | 4.08% | 103.84% | 183.1MiB / 15.62GiB | 1.15% | 0.04%  |
| 651.8MiB / 15.62GiB | 4.08% | 103.84% | 183.2MiB / 15.62GiB | 1.15% | 0.20%  |
| 780.2MiB / 15.62GiB | 4.88% | 103.41% | 183.2MiB / 15.62GiB | 1.15% | 0.20%  |
| 780.2MiB / 15.62GiB | 4.88% | 103.41% | 243.9MiB / 15.62GiB | 1.53% | 75.61% |
| 843MiB   / 15.62GiB | 5.27% | 28.43%  | 243.9MiB / 15.62GiB | 1.53% | 75.61% |
| 843MiB   / 15.62GiB | 5.27% | 28.43%  | 268.5MiB / 15.62GiB | 1.68% | 77.02% |
| 848.6MiB / 15.62GiB | 5.31% | 21.67%  | 268.5MiB / 15.62GiB | 1.68% | 77.02% |
| 848.6MiB / 15.62GiB | 5.31% | 21.67%  | 226.7MiB / 15.62GiB | 1.42% | 64.36% |
| 873.5MiB / 15.62GiB | 5.46% | 34.72%  | 226.7MiB / 15.62GiB | 1.42% | 64.36% |
| 873.5MiB / 15.62GiB | 5.46% | 34.72%  | 273MiB   / 15.62GiB | 1.71% | 74.46% |
| 860MiB   / 15.62GiB | 5.38% | 22.81%  | 273MiB   / 15.62GiB | 1.71% | 74.46% |
| 860MiB   / 15.62GiB | 5.38% | 22.81%  | 192.5MiB / 15.62GiB | 1.20% | 71.54% |
| 773.2MiB / 15.62GiB | 4.84% | 22.19%  | 192.5MiB / 15.62GiB | 1.20% | 71.54% |
| 773.2MiB / 15.62GiB | 4.84% | 22.19%  | 265.4MiB / 15.62GiB | 1.66% | 74.33% |
| 845.9MiB / 15.62GiB | 5.29% | 27.24%  | 265.4MiB / 15.62GiB | 1.66% | 74.33% |
| 845.9MiB / 15.62GiB | 5.29% | 27.24%  | 217.8MiB / 15.62GiB | 1.36% | 62.22% |
| 871.8MiB / 15.62GiB | 5.45% | 32.70%  | 217.8MiB / 15.62GiB | 1.36% | 62.22% |
| 871.8MiB / 15.62GiB | 5.45% | 32.70%  | 283.8MiB / 15.62GiB | 1.78% | 80.43% |
| 854.1MiB / 15.62GiB | 5.34% | 23.24%  | 283.8MiB / 15.62GiB | 1.78% | 80.43% |
| 854.1MiB / 15.62GiB | 5.34% | 23.24%  | 199.8MiB / 15.62GiB | 1.25% | 76.49% |
| 815.2MiB / 15.62GiB | 5.10% | 26.08%  | 199.8MiB / 15.62GiB | 1.25% | 76.49% |
| 815.2MiB / 15.62GiB | 5.10% | 26.08%  | 199.8MiB / 15.62GiB | 1.25% | 75.76% |
| 779.9MiB / 15.62GiB | 4.88% | 25.93%  | 199.8MiB / 15.62GiB | 1.25% | 75.76% |
| 779.9MiB / 15.62GiB | 4.88% | 25.93%  | 277.2MiB / 15.62GiB | 1.73% | 73.90% |
| 863.9MiB / 15.62GiB | 5.40% | 31.96%  | 277.2MiB / 15.62GiB | 1.73% | 73.90% |
| 863.9MiB / 15.62GiB | 5.40% | 31.96%  | 254.3MiB / 15.62GiB | 1.59% | 72.18% |
| 839.9MiB / 15.62GiB | 5.25% | 26.13%  | 254.3MiB / 15.62GiB | 1.59% | 72.18% |
| 839.9MiB / 15.62GiB | 5.25% | 26.13%  | 200MiB   / 15.62GiB | 1.25% | 77.52% |
| 809.1MiB / 15.62GiB | 5.06% | 26.02%  | 200MiB   / 15.62GiB | 1.25% | 77.52% |
| 809.1MiB / 15.62GiB | 5.06% | 26.02%  | 264.9MiB / 15.62GiB | 1.66% | 77.89% |
| 847.8MiB / 15.62GiB | 5.30% | 24.98%  | 264.9MiB / 15.62GiB | 1.66% | 77.89% |
| 847.8MiB / 15.62GiB | 5.30% | 24.98%  | 237.7MiB / 15.62GiB | 1.49% | 70.19% |
| 849.5MiB / 15.62GiB | 5.31% | 30.36%  | 237.7MiB / 15.62GiB | 1.49% | 70.19% |
| 849.5MiB / 15.62GiB | 5.31% | 30.36%  | 224.3MiB / 15.62GiB | 1.40% | 71.66% |
| 839.8MiB / 15.62GiB | 5.25% | 25.89%  | 224.3MiB / 15.62GiB | 1.40% | 71.66% |
| 839.8MiB / 15.62GiB | 5.25% | 25.89%  | 184.2MiB / 15.62GiB | 1.15% | 76.36% |
| 773.4MiB / 15.62GiB | 4.84% | 23.71%  | 184.2MiB / 15.62GiB | 1.15% | 76.36% |
| 773.4MiB / 15.62GiB | 4.84% | 23.71%  | 260.2MiB / 15.62GiB | 1.63% | 75.07% |
| 838.7MiB / 15.62GiB | 5.25% | 27.59%  | 260.2MiB / 15.62GiB | 1.63% | 75.07% |
| 838.7MiB / 15.62GiB | 5.25% | 27.59%  | 183.9MiB / 15.62GiB | 1.15% | 76.26% |
| 790.7MiB / 15.62GiB | 4.94% | 26.30%  | 183.9MiB / 15.62GiB | 1.15% | 76.26% |
| 790.7MiB / 15.62GiB | 4.94% | 26.30%  | 236.4MiB / 15.62GiB | 1.48% | 70.88% |
| 847.2MiB / 15.62GiB | 5.30% | 29.33%  | 236.4MiB / 15.62GiB | 1.48% | 70.88% |
| 847.2MiB / 15.62GiB | 5.30% | 29.33%  | 184MiB   / 15.62GiB | 1.15% | 76.02% |
| 822.2MiB / 15.62GiB | 5.14% | 26.54%  | 184MiB   / 15.62GiB | 1.15% | 76.02% |
| 822.2MiB / 15.62GiB | 5.14% | 26.54%  | 220.4MiB / 15.62GiB | 1.38% | 72.58% |
| 863.4MiB / 15.62GiB | 5.40% | 30.16%  | 220.4MiB / 15.62GiB | 1.38% | 72.58% |
| 863.4MiB / 15.62GiB | 5.40% | 30.16%  | 287.9MiB / 15.62GiB | 1.80% | 81.94% |
| 869.8MiB / 15.62GiB | 5.44% | 21.22%  | 287.9MiB / 15.62GiB | 1.80% | 81.94% |
| 869.8MiB / 15.62GiB | 5.44% | 21.22%  | 219.5MiB / 15.62GiB | 1.37% | 69.89% |
| 861MiB   / 15.62GiB | 5.38% | 32.05%  | 219.5MiB / 15.62GiB | 1.37% | 69.89% |


#### Второй этап

Время работы второго этапа составило 4 секунды.

<details>
<summary>Статистика для копирования</summary>

e75424a47f0f 0B / 0B 0.00% 0.00%  
e75424a47f0f 0B / 0B 0.00% 0.00%  
e75424a47f0f 80.15MiB / 15.62GiB 0.50% 0.00%  


42b827d013d6 183.9MiB / 15.62GiB 1.15% 0.00%
42b827d013d6 219.3MiB / 15.62GiB 1.37% 27.18%
42b827d013d6 219.3MiB / 15.62GiB 1.37% 27.18%
</details>

|   protos            |  ОЗУ  |  ЦПУ  |   DB               | ОЗУ   |  ЦПУ   |
|---------------------|-------|-------|--------------------|-------|--------|
| 0B       / 0B       | 0.00% | 0.00% |183.9MiB / 15.62GiB | 1.15% | 0.00%  |
| 0B       / 0B       | 0.00% | 0.00% |219.3MiB / 15.62GiB | 1.37% | 27.18% |
| 80.15MiB / 15.62GiB | 0.50% | 0.00% |219.3MiB / 15.62GiB | 1.37% | 27.18% |