Сконфигурируйте docker и docker-compose для более параллельного запуска / запуска контейнеров - PullRequest
1 голос
/ 02 октября 2019

TL; DR: При запуске всего двенадцать контейнеров распределяются по четырем приложениям, формирующим докер (для каждого определены три службы) параллельно, независимо от того, насколько сильным является аппаратное обеспечение,возникает эта ошибка:

UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)

Существует ли какая-либо конфигурация, ограничивающая или улучшающая производительность параллельного запуска / запуска докера или производительность чтения сокета докера?

Увеличение времени ожидания чтения (как предлагается на многих форумах)) не похоже на правильный путь решения этой проблемы.

Длинная версия:

Я использую docker-compose для запуска моего тематического приложения для интеграционного тестирования.

Во время этого процесса интеграционного тестирования каждый клиент запускается и тестируется со своими персонализированными тестовыми файлами.

Файл docker-compose состоит из трех служб:

  • PHP
  • MySQL
  • Neo4j

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

С момента примененияНа запуск уходит довольно много времени (поскольку запуск баз данных занимает много времени) Я распараллелил процесс, чтобы три приложения могли работать параллельно.

Упрощенный пример процесса запуска будет выглядеть следующим образом:

#!/bin/bash -e
clients=("a" "b" "c" "d" "e")
declare -A pids
pids=()
for client in "${clients[@]}"; do
    joblist=($(jobs -p))
    while
        ((${#joblist[*]} >= 3))
    do
        sleep 1
        joblist=($(jobs -p))
    done
    {
        docker-compose -f $client/docker-compose.yml up -d
        #wait for mysql
        while ! docker-compose -f $client/docker-compose.yml exec -T mysql isAlive.sh; do
            sleep 1
        done
        #wait for neo4j
        while ! docker-compose -f $client/docker-compose.yml exec -T neo4j isAlive.sh; do
            sleep 1
        done
        #run tests
        for i in $client/tests/*.yml; do
            if ! runTest $i; then
                exit 1
            fi
        done
    } &
    pids["$client"]="$!"
done
for p in "${!pids[@]}"; do
    if ! wait "${pids[$p]}"; then
        echo "error with $p"
        exit 1
    fi
done

При выполнении этих тестов на виртуальной машине (6 виртуальных процессоров, выделенное хранилище SSD и 48 ГБ ОЗУ) распараллеливание в трех тестах было устойчивым. Все вышеперечисленное начало возвращать ошибки, подобные этим

UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)

Я думал, что это связано с производительностью виртуальной машины, а теперь я перешел на «голую железную» машину (2x 8-ядерные процессоры @ over 3GHz / core), 60 ГБ ОЗУ, хранилище SSD), и эта проблема по-прежнему возникает, хотя использование всех компонентов (ЦП, ОЗУ, сеть хранения данных [проверено мной и на моем хосте]) минимально.

Увеличение времени ожидания чтения некажется правильным решением, потому что есть некоторая ошибка в использовании полной производительности, которую может предложить сервер. Это может быть какая-то конфигурация или ограничение докера, я не смог ничего найти по этому поводу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...