【发布时间】:2018-12-21 18:16:15
【问题描述】:
我在部署 docker 堆栈(撰写文件)时遇到了一个奇怪的问题。
我有一个三节点 docker swarm - master 和两个 worker。 所有机器都是 CentOS 7.5,内核 3.10.0 和 docker 18.03.1-ce。
大多数东西都在主服务器上运行,其中之一是 Wildfly (v9.x) 应用服务器。
其中一名工人是一个 postgres 数据库。
部署堆栈后一切正常,但一段时间后(或者可能在 Web 应用程序中的特定操作之后)请求开始挂起。
在 wildfly 容器内运行 netstat -ntp 显示 52 个字节卡在 Send-q 中:
tcp 0 52 10.0.0.72:59338 10.0.0.37:5432 ESTABLISHED -
在 postgres 端,连接也处于ESTABLISHED 状态,但发送和接收队列为 0。
它总是正好是 52 个字节。我在某处读到 ACK 带有时间戳的数据包也是 52 个字节。有什么办法可以验证吗?
我们设置了以下 sysctl 可调参数:
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_timestamps = 0
因为this,所以需要前三个。
堆栈中的所有服务都连接到 docker 创建的同一 default 网络。
现在,如果我将 postgres 服务移动到与 wildfly 服务相同的主机上,问题似乎不会出现,或者如果我为 postgres 声明一个单独的网络并将其仅添加到需要数据库的服务(以及当然)问题似乎也没有显示出来。
有没有人遇到过类似的问题?谁能提供有关如何进一步调试问题的任何指示?
【问题讨论】:
标签: postgresql docker wildfly docker-swarm