草庐IT

Docker 启用全新功能,文件共享时间大幅减少 98%

Alias_Travis 2023-03-28 原文
近日 Docker 更新了 macOS 端的桌面应用,在新版本中引入了一项名为 VirtioFS 的实验性功能,根据官方介绍,开启这项功能后可以使文件共享所花费的时间大幅减少 98%。

要了解这个功能为何带来了大幅的性能提升,还得先了解常见的开发者工作流程。开发者在使用 Symfony 或 React 等技术时,常见的工作流程是编辑位于 macOS 主机上的源代码,同时在 Docker 容器中运行应用程序本身,源代码通过使用 Docker 数据卷在主机和容器之间共享。

因此对位于主机系统上的文件所做的修改必须快速、可靠地同步到容器文件系统中。当考虑到现代依赖项管理可以很容易地将数以万计的文件带入一个项目时,文件共享性能的优劣将影响整个系统性能的发挥,而目前默认所采用的 gRPC-FUSE 就会导致性能不佳。

最近 Docker Desktop for Mac 的变化,尤其是新增了对 VirtioFS 的支持能够缓解了这个问题,给文件系统性能带来了巨大的改善。具体来说,在 Docker Desktop 4.6 上启用 VirtioFS 之后,开发人员在测试中得出了以下结果:

  • 完成 MariaDB 导入所需的时间缩短了 98% (从 33 分钟降低至 42 秒)
  • 完成 284MB 的 MySQL 导入所需的时间缩短了 90%(从 3 分 16 秒降低至 18 秒);
  • 在一个大型代码库中运行 composer install 所需的时间缩短了 87%(从 1 分 27 秒降低至 11 秒);
  • 启动一个单体 Typescript 应用程序的时间缩短了 80%(从1 分 30 秒降低至 18 秒);
新版本的这个变化使完成文件系统操作的时间最高缩短了 98%,对于开发者来说,速度上的大幅提升意味着减少了等待文件系统操作完成的时间(或建立特定于项目的特殊方法来提高性能),而有更多的时间专注于项目的开发。

如何启用 VirtioFS

注:VirtioFS 仅适用于使用以下 macOS 版本的用户

  • macOS 12.2 及以上版本(M1 系列处理器)
  • macOS 12.3 及以上版本(英特尔处理器)
在 Docker Desktop 中启用 VirtioFS:

  • 将 Docker Desktop 升级至 4.6 版本,可在此下载;
  • 导航到 “偏好” > “实验性功能”
  • 选择 "启用 VirtioFS 加速的目录共享" 选项
  • 点击 "应用和重启" 即可;

VirtioFS 目前还处于实验性阶段,因此在使用过程中难免会遇到一些问题,用户可以将发现的任何问题上报至 Docker Mac 文件系统性能线程中。目前一个已知的问题就是启用了 VirtioFS 的容器在运行时可能会因权限错误而失败。

本文转自OSCHINA

本文标题:Docker 启用全新功能,文件共享时间大幅减少 98%

本文地址:https://www.oschina.net/news/187169/docker-virtiofs

有关Docker 启用全新功能,文件共享时间大幅减少 98%的更多相关文章

  1. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  2. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  3. ruby-on-rails - 启用 Rack::Deflater 时 ETag 发生变化 - 2

    在启用Rack::Deflater来gzip我的响应主体时偶然发现了一些奇怪的东西。也许我遗漏了一些东西,但启用此功能后,响应被压缩,但是资源的ETag在每个请求上都会发生变化。这会强制应用程序每次都响应,而不是发送304。这在没有启用Rack::Deflater的情况下有效,我已经验证页面源没有改变。我正在运行一个使用thin作为Web服务器的Rails应用程序。Gemfile.lockhttps://gist.github.com/2510816有没有什么方法可以让我从Rack中间件获得更多的输出,这样我就可以看到发生了什么?提前致谢。 最佳答案

  4. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  5. ruby - 在模块/类之间共享全局记录器 - 2

    在许多ruby​​类之间共享记录器实例的最佳(正确)方法是什么?现在我只是将记录器创建为全局$logger=Logger.new变量,但我觉得有更好的方法可以在不使用全局变量的情况下执行此操作。如果我有以下内容:moduleFooclassAclassBclassC...classZend在所有类之间共享记录器实例的最佳方式是什么?我是以某种方式在Foo模块中声明/创建记录器还是只是使用全局$logger没问题? 最佳答案 在模块中添加常量:moduleFooLogger=Logger.newclassAclassBclassC..

  6. ruby-on-rails - rails 功能测试 - 2

    在Rails自动生成的功能测试(test/functional/products_controller_test.rb)中,我看到以下代码:classProductsControllerTest我的问题是:方法调用products()在哪里/如何定义?products(:one)到底是什么意思?看代码,大概意思是“创建一个产品”,但是它是如何工作的呢?注意我是Ruby/Rails的新手,如果这些是微不足道的问题,我深表歉意。 最佳答案 如果您查看test/fixtures文件夹,您会看到一个products.yml文件。这是在您创建

  7. ruby-on-rails - 功能测试 Authlogic? - 2

    在我的一些Controller中,我有一个before_filter检查用户是否登录?用于CRUD操作。application.rbdeflogged_in?unlesscurrent_userredirect_toroot_pathendendprivatedefcurrent_user_sessionreturn@current_user_sessionifdefined?(@current_user_session)@current_user_session=UserSession.findenddefcurrent_userreturn@current_userifdefine

  8. ruby - 如何使用 cucumber 在场景之间共享状态 - 2

    我有一个功能“从外部网站导入文章”。在我的第一个场景中,我测试从外部网站导入链接列表。Feature:ImportingarticlesfromexternalwebsiteScenario:Searchingarticlesonexample.comandreturnthelinksGiventhereisanImporterAnditsURLis"http://example.com"Whenwesearchfor"demo"ThentheImportershouldreturn25linksAndoneofthelinksshouldbe"http://example.com/d

  9. ruby - Sinatra 路由中定义的全局变量是否在请求之间共享? - 2

    假设我有:get'/'do$random=Random.rand()response.body=$randomend如果我每秒有数千个请求到达/,$random是否会被共享并“泄漏”到上下文之外,或者它会像getblock的“本地”变量一样?我想如果它是在get'/'do的上下文之外定义的,它确实会被共享,但我想知道在ruby​​中是否有我不知道的$机制。 最佳答案 ThispartoftheSinatraREADMEaboutscopeisalwayshelpfultoread但是,如果您只需要为请求保留变量,那么我认为我建议使用

  10. ruby - 减少数组时使用 Hash.new 作为初始值 - 2

    我有一个这样的数组[1,1,2,3,3,3,4,5,5]我想计算每个数字出现的次数,我正在尝试这样做[1,1,2,3,3,3,4,5,5].reduce(Hash.new(0)){|hash,number|hash[number]+=1}问题是当我尝试运行它时出现以下错误NoMethodError:undefinedmethod`[]='for1:Fixnumfrom(irb):6:in`blockinirb_binding'from(irb):6:in`each'from(irb):6:in`reduce'from(irb):6我能像这样设置初始值吗,还是我弄错了?

随机推荐