【问题标题】:Docker slow non-local database accessDocker 减缓非本地数据库访问
【发布时间】:2017-03-09 11:19:51
【问题描述】:

我们将 Docker 用于本地开发环境,并部署到 Google Cloud Container Engine 进行生产。我们的生产 SQL 服务器也在 Google Cloud 上。

当我们的容器在 Container Engine 上运行时,数据库访问速度快如闪电,但在我们的本地机器上运行时却非常慢。一些在生产环境中通常需要 1.9 秒的页面加载时间在我们的本地用户上达到了 25.0 秒以上。

我认为接近可能是个问题,所以我尝试在本地机器上启动 MySQL Docker 容器,然后将本地 Dockerized Web 服务器连接到该容器,速度很快。生产环境中 1.9 秒的页面加载现在在我的本地设备上徘徊在 1.8 秒左右。

我决定在我们办公室的一台服务器上运行一个 MySQL Docker 实例,但是当我这样做时,这些页面负载飙升至 25.0 秒并再次上升。

当 Docker 需要连接到不在我本地机器上的任何资源时,似乎有什么东西正在减慢连接速度。

如果有帮助,我的docker info 输出:

Containers: 4
 Running: 2
 Paused: 0
 Stopped: 2
Images: 203
Server Version: 1.12.2
Storage Driver: aufs
 Root Dir: /mnt/sda1/var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 209
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: null bridge host overlay
Kernel Version: 4.4.24-boot2docker
Operating System: Boot2Docker 1.12.2 (TCL 7.2); HEAD : 9d8e41b - Tue Oct 11 23:40:08 UTC 2016
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 3.858 GiB
Name: dev
ID: AYO6:TL7P:XSST:VI5T:HKCC:QTOZ:HP3X:NKYQ:YCWT:THV2:AQM2:5XER
Docker Root Dir: /mnt/sda1/var/lib/docker
Debug mode (client): false
Debug mode (server): true
 File Descriptors: 32
 Goroutines: 58
 System Time: 2016-10-26T22:46:19.218543394Z
 EventsListeners: 1
Registry: https://index.docker.io/v1/
Labels:
 provider=virtualbox

编辑:在尝试缩小问题范围时,我在我的 Macbook 上设置了 MySQL Docker 容器,然后在另一台机器上设置了我们的 Dockerized Web 服务器(运行 Ubuntu 14.04)。数据库访问速度很快,但是当我将其反转(Ubuntu 机器上的 MySQL,Macbook 上的 Web 服务器)时,它又慢得可怕。奇怪的。我还尝试将我的 Macbook 上的 Docker 更新到 1.12,这从等式中删除了 VirtualBox,但这也没有解决问题。似乎 Docker 的网络适配器出现了问题?我被难住了。

【问题讨论】:

  • 您可以尝试让 Web 应用程序通过 IP 地址而不是主机名连接到数据库服务器。这将从可能的原因中消除主机名解析或 DNS。
  • 也试过了。我在早期版本的 Docker 中读到过慢 DNS 解析,但在这种情况下似乎不是问题。
  • 我遇到了完全相同的问题。在 localhost 上快速连接,但在远程 mysql 主机上连接时需要 30 秒以上(尝试过 google cloud sql 和 amazon aws)@Justin Doyle

标签: php mysql docker


【解决方案1】:

您使用的是哪个版本的 Docker for Mac? 因为以前我遇到过类似的问题,现在我发现了一个已知的 Docker for MAC 问题,可能与您有关。

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

他们还提供了workaround,但现在更新 Docker 版本应该足够了。

【讨论】:

    【解决方案2】:

    并不是我真正希望的解决方案,但以防万一其他人遇到这种情况并撞到墙上。

    我们的解决方案是将 MySQL 的本地副本作为 Docker 服务在我们的本地机器上运行,并将我们的数据库克隆到其中。这不是一个理想的解决方案,但它消除了每个网络请求 10-30 多秒的响应时间。

    我还发现,在 Linux VM 中运行 Docker 容器并使用仅主机适配器也有很大的不同(不幸的是 macOS 的 Docker 不支持仅主机适配器)。

    【讨论】:

      【解决方案3】:

      尝试在单个表上运行 OPTIMIZE,或者如果您想在数据库中修复所有这些表,请参阅 answer

      【讨论】:

        猜你喜欢
        • 2019-12-05
        • 2015-06-01
        • 2021-07-12
        • 2019-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-07
        • 2020-10-05
        相关资源
        最近更新 更多