首页 > 解决方案 > 为更多并行运行/启动容器配置 docker 和 docker-compose

问题描述

TL;DR: 当启动总共分布在四个 docker-compose 应用程序(每个都定义了三个服务)上的 12 个容器时,无论下面的硬件有多强大,都会发生此错误:

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

是否有一些配置会限制或改进 docker 引擎并行运行/启动或 docker 套接字读取性能?

增加读取超时(就像许多论坛上建议的那样)似乎不是解决这个问题的正确方法。

长版:

我正在使用 docker-compose 来启动我的主题应用程序以进行集成测试。

在这个集成测试过程中,每个客户端都使用他们的个性化测试文件启动和测试。

docker-compose 文件包含三个服务:

所有图像都只是预填充的公共库 docker 图像。

由于应用程序需要相当长的时间才能启动(因为数据库需要很长时间才能启动),所以我将进程并行化,以便三个应用程序可以并行运行。

启动过程的简化示例如下所示:

#!/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 个虚拟 CPU、专用 SSD 存储和 48 GB RAM)中运行这些测试时,三个测试的并行化是稳健的。上面的所有内容都开始返回这样的错误

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

我认为这与虚拟机的性能有关,现在我升级到裸机(2x 8 核 CPU @over 3GHz/core,60 GB RAM,SSD 存储),尽管使用所有组件(CPU、RAM、存储网络[我自己和我的主机检查])都是最小的。

提高读取超时似乎不是正确的解决方案,因为在利用服务器必须提供的全部性能时存在一些错误。这可能是一些 docker 配置或限制,我找不到任何有关此的内容。

标签: dockerdocker-compose

解决方案


推荐阅读