我有一个 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,这是我正在尝试执行的操作。
--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 区域吗?
如果不是,那么将一个移动到另一个可能只会将性能提高到可接受的水平。
如果您想测试预览版高级文件共享,请点击此处的注册公共预览版链接:
总而言之,正确的解决方案可能包括不再使用网络上的文件。您可以考虑使用数据库。我知道有很多工作要做。