【问题标题】:Docker container running fast when connected to localhost db but very slow on external db连接到本地数据库时 Docker 容器运行速度很快,但在外部数据库上运行速度很慢
【发布时间】:2018-01-13 09:34:50
【问题描述】:

我正在一个 docker 容器上运行一个 php 应用程序。当我连接到本地数据库时,响应非常快( 35 秒)。

我已尝试使用我找到的几个链接中描述的 Google 的 DNS,但没有运气。我的 DNS 解析在 docker 容器内非常快,为了连接到 Google Cloud SQL DB,我直接使用 IP 地址。

我已经检查了这个链接web server running inside a docker container running inside an EC2 instance responses very slowly 和这个Docker slow non-local database access。这似乎是相关的,但不确定。

我认为这是一个 Docker 问题,或者与容器有点相关,因为在其他应用程序上使用相同的远程 db(在 google cloud 和 aws 上)并且速度非常快。在我看来,这与容器内的网络有关。

所以,总结一下我用来测试的场景(数据库内容完全相同):

1) 在我的 Mac 上作为本地主机在 Docker 容器中运行我的应用程序:

  • 我的本地主机 (MAMP) 上的数据库:非常快(
  • Google Cloud SQL 上的数据库:非常慢(> 35 秒);
  • Amazon RDS 上的数据库:非常慢(> 35 秒);

2) 在 Google Compute Engine 上,我的应用在 Docker 容器中运行:

  • Google Cloud SQL 上的数据库:非常慢(> 35 秒);
  • Amazon RDS 上的数据库:非常慢(> 35 秒);

3) 在自定义 Google 应用引擎 flex 环境中,我的应用在 Docker 中运行:

  • Google Cloud SQL 上的数据库:非常慢(> 35 秒);
  • Amazon RDS 上的数据库:非常慢(> 35 秒);

4) 在 PHP Google 应用引擎 flex 环境中:

  • Google Cloud SQL 上的数据库:非常慢(> 35 秒);
  • Amazon RDS 上的数据库:非常慢(> 35 秒);

5) 我的应用在 Google Compute Engine 实例(PHP + apache)上的 Docker 之外运行:

  • Google Cloud SQL 上的数据库:非常快(
  • Amazon RDS 上的数据库:非常快(

6) 我的应用程序在本地主机 (Mac) 上的 Docker 之外运行:

  • Google Cloud SQL 上的数据库:非常快(
  • Amazon RDS 上的数据库:非常快(
  • 我的本地主机 (MAMP) 上的数据库:非常快(

有人知道解决或发现问题的方法吗?我知道这是一个可能很难解决的问题。所以,我的问题与我应该如何调试以找到问题更相关。

我的 Dockerfile:

来自 php:7.0.17-apache 运行 apt-get 更新 运行 apt-get install -y apt-utils curl vim 运行 docker-php-ext-install mysqli && docker-php-ext-enable mysqli 运行 docker-php-ext-install pdo pdo_mysql && docker-php-ext-enable pdo_mysql 运行 pecl 安装 xdebug # 基础镜像没有php.ini。 # 复制我们自己的,带有 xdebug 设置 添加 ./php.ini /usr/local/etc/php/ # 配置阿帕奇 运行 a2enmod 重写 运行 a2dissite 000-default.conf # 复制可用站点 添加 ./www.metalar.net.conf /etc/apache2/sites-available/ # 复制端口文件 添加 ./ports.conf /etc/apache2/ # 复制端口文件 添加 ./apache2.conf /etc/apache2/apache2.conf # 复制错误日志 添加 ./error.log /var/log/apache2/error.log # 创建存放项目文件的目录 运行 mkdir -p /srv/www/www.metalar.net # 将 App 复制到正确的目的地 添加 。 /srv/www/www.metalar.net # 启用配置 运行 a2ensite www.metalar.net.conf 曝光 8080

netstat -s

ip: 共收到 187 个数据包 0 转发 0 个传入数据包被丢弃 已发送 187 个传入数据包 已发出 163 个请求 集成电路: 0 收到 ICMP 消息 0 输入 ICMP 消息失败。 ICMP 输入直方图: 0 发送 ICMP 消息 0 ICMP 消息失败 ICMP 输出直方图: 通信协议: 2 个活动连接开口 0 个无源连接开口 0 次失败的连接尝试 收到 0 个连接重置 已建立 0 个连接 收到 181 段 157段发出 0 段重传 收到 0 个坏段。 已发送 0 次重置 UDP: 收到 6 个数据包 收到 0 个到未知端口的数据包。 0 数据包接收错误 已发送 6 个数据包 下载: TcpExt: 2 个 TCP 套接字在快速计时器中完成时间等待 预测 171 个数据包标头 4 个确认不包含接收到的数据有效负载 TCPRcvCoalesce:82 TCPOrigDataSent:4 分机: 八位字节:234466 输出八位字节:7205 InNoECTPkts:187

【问题讨论】:

  • 您是在使用 AWS 上的默认 VPC 还是自定义 VPC?
  • 你检查过DNS吗?在 docker 之外运行时,您是否比较过同一个应用程序?
  • @Stephn_R 我正在使用 Amazon RDS,它可以在 docker 外的应用程序上正常运行。
  • 您是否尝试过使用 IP 而不是 DNS?
  • 在本地 Mac 上运行容器:您是通过 LAN 还是 W-LAN 连接的?在我的 Mac 上,我的问题是 WLAN 开启时启动速度很慢。

标签: docker


【解决方案1】:

首先你使用的是哪个版本的Docker?

因为前段时间我在 Mac 上运行 Docker 时遇到了类似的问题,我发现 Docker for MAC 的一个已知问题也可能与您有关。

此问题已映射到以下问题。

他们提供了workaround,但现在应该足以更新 Docker 以解决性能不佳的问题。

但是,这些已知问题并不能解释行为 #2 和 #3,所以我猜它不相关,但值得我提及。

调试

关键是这不是服务器或应用程序的问题,因此我将专注于调试由于某种原因无法按预期工作的 Docker 的网络部分。

这些只是一般性建议,但您可以找到更多信息,例如 here 或在 Docker 论坛周围。

为了调试,我会打开两个终端,第一个终端我会通过 ssh 进入我的容器,与本地机器并行运行所有命令,以便比较结果。

  • 我会检查来自容器的网络速度是否与存储在谷歌云存储和任何随机网站中的类似下载文件

  • PingMySql 实例并比较延迟。

  • Traceroute 指向 MySql 实例并检查数据包的路径和每一跳的延迟。

  • 尝试通过命令行连接MySql,比较建立连接和执行基本操作(创建、更新、上传、删除、ecc)的时间。

  • 通过tcpdump(仅来自容器),我会检查两个实例之间的流量,在连接到数据库实例和运行应用程序时寻找任何类型或错误、连接重置、数据包格式错误

  • 也尝试执行一些 DNS 查找并比较时间

  • 检查容器端/var/log 下存在的任何类型的日志,以及您是否有权访问 MySql 实例日志

  • 尝试了解哪些操作在容器内实际上需要更长的时间执行(是否只是连接到服务器?是整个过程变慢了吗?是在大数据传输期间?)

  • 我会尝试构建一个显示性能下降的基本示例,我会在 docker 对应的 GitHub repository 中打开一个问题。

如果您发现在 localhost 和容器中运行的命令之间存在任何差异,请更新问题以查看是否有人可以帮助您实际解决问题。

附: 您还可以发现 this 很有趣,基本上是一个人在连接到 MySql 实例并成功调试它时遇到问题

【讨论】:

  • 我将基础镜像更改为 php 7.3.2(来自 php:7.3.2-apache-stretch)并将 Docker 更新到版本 2.1.0.1,问题就消失了。表演很棒。不幸的是,我不知道问题出在哪里。
猜你喜欢
  • 2019-11-18
  • 1970-01-01
  • 2013-10-11
  • 2012-06-13
  • 2021-05-02
  • 2018-11-16
  • 2018-07-31
  • 2014-08-08
  • 1970-01-01
相关资源
最近更新 更多