【问题标题】:Docker - cached mounted volume syncing delayDocker - 缓存挂载卷同步延迟
【发布时间】:2017-12-02 22:07:23
【问题描述】:

我正在 macOS 上使用 docker compose 构建本地开发环境。我们有多个用 php 编写并使用 Symfony 运行的应用程序。代码通过卷附加到容器。与 linux 主机相比,我遇到了非常糟糕的性能。

原来问题是由基于 osxfs 的挂载卷引起的,osxfs 是 Docker for Mac 独有的共享文件系统解决方案。

这个问题在这里得到了很好的解释:https://blog.docker.com/2017/05/user-guided-caching-in-docker-for-mac/

引入挂载卷的缓存模式后,性能有了很大的提升。但是,它允许在主机上的更新出现在容器中之前出现一些延迟。文档没有具体说明这种延迟。你知道主机上和容器内的代码同步有多快吗?

volumes:
  - ./php_code:/var/www:cached

【问题讨论】:

    标签: php symfony docker docker-compose containers


    【解决方案1】:
    1. 使用 NFS (不适用于 High Sierra - more details here

    docker-machine-nfs ${DOCKER_MACHINE_NAME} --mount-opts="noacl,async,nolock,vers=3,udp,noatime,actimeo=1"

    1. PHP 缓存保存在容器中 - 例如在 /tmp/app_cache/* - 或者在内存中 /dev/shm/app_cache/*(不推荐)

    将缓存保留在您的 AppKernel.php 中的容器更改(对于 Symfony 4.0 Kernel.php

    ...    
    public function getCacheDir()
    {
        if ($this->environment === 'env') {
            // Store in RAM.
            // return '/dev/shm/symfony_docker_test/cache/'.$this->environment;
    
            // Store in docker container (not docker-machine unless docker-compose volume is mounted).
            return '/tmp/symfony_cache/cache/' . $this->environment;
        }
    
        return dirname(__DIR__).'/var/cache/'.$this->getEnvironment();
    }
    ...
    

    提到解决方案的结果 :cached

    Time taken for tests:   20.396 seconds
    Complete requests:      100
    Failed requests:        0
    Total transferred:      82700 bytes
    HTML transferred:       31900 bytes
    Requests per second:    4.90 [#/sec] (mean)
    Time per request:       203.963 [ms] (mean)
    Time per request:       203.963 [ms] (mean, across all concurrent requests)
    Transfer rate:          3.96 [Kbytes/sec] received
    

    未提及解决方案的结果:cached

    Time taken for tests:   18.911 seconds
    Complete requests:      100
    Failed requests:        0
    Total transferred:      82700 bytes
    HTML transferred:       31900 bytes
    Requests per second:    5.29 [#/sec] (mean)
    Time per request:       189.111 [ms] (mean)
    Time per request:       189.111 [ms] (mean, across all concurrent requests)
    Transfer rate:          4.27 [Kbytes/sec] received
    

    【讨论】:

    • 选项 2 更可取。 Docker 的全部意义在于将构成应用程序的所有内容都包含在版本化映像中。
    • 感谢您,结果非常有趣。你认为它是用温暖的 :cached 来衡量的吗?我会检查我们是否可以将缓存文件夹移动到容器中。 NFS 也可能会有所帮助。另一个选项是 docker-sync docker-sync.io 但是,问题是:使用缓存模式进行卷挂载时,主机上的更新出现在容器中之前的延迟是多少。
    • @Ludek 继续尝试其他解决方案。尽管我知道任何可以显着提高速度而没有缺点的方法。 :chached 正如您所注意到的那样会导致同步延迟。我会坚持以上这些,因为它们不会引起任何重大问题。速度的提高是显着的,足以开发 env。干杯。
    • 使用该选项后如何识别我的卷已缓存?我使用 docker-compose.override.yml ?
    • @Artur79 如果您将它们定义为“:chached”,它们将被缓存。如果你想查看卷使用'docker volumes [cmd]'
    猜你喜欢
    • 2016-08-18
    • 2021-07-16
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 2020-01-20
    • 2016-02-29
    • 2019-07-29
    相关资源
    最近更新 更多