TL; DR: При запуске всего двенадцать контейнеров распределяются по четырем приложениям, формирующим докер (для каждого определены три службы) параллельно, независимо от того, насколько сильным является аппаратное обеспечение,возникает эта ошибка:
UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)
Существует ли какая-либо конфигурация, ограничивающая или улучшающая производительность параллельного запуска / запуска докера или производительность чтения сокета докера?
Увеличение времени ожидания чтения (как предлагается на многих форумах)) не похоже на правильный путь решения этой проблемы.
Длинная версия:
Я использую docker-compose для запуска моего тематического приложения для интеграционного тестирования.
Во время этого процесса интеграционного тестирования каждый клиент запускается и тестируется со своими персонализированными тестовыми файлами.
Файл docker-compose состоит из трех служб:
Все изображения являются просто предварительно заполненными образами публичной библиотеки.
С момента примененияНа запуск уходит довольно много времени (поскольку запуск баз данных занимает много времени) Я распараллелил процесс, чтобы три приложения могли работать параллельно.
Упрощенный пример процесса запуска будет выглядеть следующим образом:
#!/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), и эта проблема по-прежнему возникает, хотя использование всех компонентов (ЦП, ОЗУ, сеть хранения данных [проверено мной и на моем хосте]) минимально.
Увеличение времени ожидания чтения некажется правильным решением, потому что есть некоторая ошибка в использовании полной производительности, которую может предложить сервер. Это может быть какая-то конфигурация или ограничение докера, я не смог ничего найти по этому поводу.