如何在Azure容器实例中挂载虚拟磁盘?

问题描述 投票:0回答:1

我有一个 Azure SMB 文件共享,它安装在我的 Azure 容器实例内。在文件共享中,有一个我要挂载的虚拟磁盘文件 VHD.img。

我的容器实例 Dockerfile 以此命令结束以挂载 VHD 并启动我的应用程序:

CMD ["/bin/bash", "-c", "sudo mount -t auto -o loop /mnt/fileshare/VHD.img /home/user/users/; gunicorn ... [redacted]"]

但是,我在日志中收到此消息:

mount: /home/user/users/: mount failed: Operation not permitted.

当我连接到我的容器实例时,无论如何我也无法挂载该 VHD,即使作为 root 也无法挂载,它总是说不允许操作。

我的容器实例是使用 --privileged 和 --add-capability ALL 部署的,所以我应该能够挂载,对吗?

现在一些关于我为什么要尝试这样做的背景:

我的应用程序处理读取和写入大量小文件。我注意到它的执行速度太慢(例如将 5MB 目录的内容加载到内存需要 10 秒,而在本地它需要 <0.01 seconds). The Azure Storage diagnostics said my application was indeed too slow and linked me to this 文档,该文档告诉我要挂载 VHD,这是我正在尝试执行的操作。

azure docker containers instance azure-file-share
1个回答
0
投票

--privileged
参数不适用于 Azure 容器实例。 ACI 不会向容器公开任何底层基础设施。由于 VHD 被视为块设备(就好像它们是物理磁盘一样),您将无法在容器内挂载 VHD。

话虽这么说,使用 VHD 可能无法带来阅读该文档所期望的性能改进。这确实取决于很多因素。

通过 SMB 处理大量小文件时,您应该关心的主要问题是容器实例和存储帐户之间的网络延迟水平。

让我们想象一个场景,您在英国南部有 ACI,在美国东部有存储帐户。尽管 Microsoft Azure 在区域之间拥有强大的主干/全球网络,但仍然存在延迟。我们假设这个假想场景中的延迟为 10 毫秒。您有一个包含 5000 个文件的文件夹,每个文件 1KB,总共不到 5MB。对于您的应用程序请求的每个文件:-

客户要求:

  • 客户端向服务器发送读取文件的请求,并指定文件名和路径。

服务器响应(文件元数据):

  • 服务器使用文件元数据响应客户端的请求,例如文件大小、权限和属性。

客户确认:

  • 客户端确认从服务器接收到的文件元数据。

数据传输(文件内容):

  • 服务器开始通过一个或多个数据包将文件内容传输到客户端。

客户确认:

  • 文件内容传输完成后,客户端会向服务器发送确认消息,确认已成功收到文件数据。

服务器确认:

  • 服务器确认客户端的确认,表示文件读取操作完成。

这至少是来回 6 条消息,并且不包括其他网络开销。因此检索一个文件至少需要 60 毫秒。将其乘以 5000,整个操作突然需要 30 秒。

即使您要访问支持元数据缓存的当前预览版 Azure 高级文件,除非延迟的很大一部分是由存储服务(Azure 端)引起的,否则您只会看到性能提升大概15%左右;使用 VHD 并不能解决全部问题。当通过 VPN 连接迁移包含 600 万个文件的文件服务器时,我必须自己解决这个问题。就我而言,我可以通过将文件压缩到 Zip 存档中以减少文件数量,然后在另一端解压它们来减少时间。我认为你没有这种奢侈。

所以,首先要检查的是:

我的存储帐户与我的容器实例位于同一 Azure 区域吗?

如果不是,那么将一个移动到另一个可能只会将性能提高到可接受的水平。

如果您想测试预览版高级文件共享,请点击此处的注册公共预览版链接:

https://learn.microsoft.com/en-us/azure/storage/files/smb-performance#metadata-caching-for-premium-smb-file-shares

总而言之,正确的解决方案可能包括不再使用网络上的文件。您可以考虑使用数据库。我知道有很多工作要做。

© www.soinside.com 2019 - 2024. All rights reserved.