docker - 为更多并行运行/启动容器配置 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 文件包含三个服务:
- PHP
- MySQL
- Neo4j
所有图像都只是预填充的公共库 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 配置或限制,我找不到任何有关此的内容。
解决方案
推荐阅读
- ios - 在 iOS 14 中复制某些内容时收到消息
- python-3.x - 错误 Django polls app 命令 makemigration polls
- ruby-on-rails - Rubocop Rails/UniqueValidationWithoutIndex 过火
- google-sheets - Google 表格 IMPORTXML 无法获取网址
- python-3.x - 无法使用 seaborn.kdeplot() 绘制 numpy 数据集
- c# - Infragistics ultraoptionset - 如何添加 &(项目快捷方式)
- computer-vision - 如何将带有 grad 的 Torch 张量列表转换为张量
- survey - Microsoft Forms 调查真的是匿名的吗?
- java - 以下 JPQL 查询中有什么错误或不正确的地方?
- javascript - 查找数组中的字符串是否包含在同一数组中的另一个字符串中