Azure文件存储SMB在列出目录中的文件时速度缓慢

5
我们有一个应用程序,通过Azure Files列出文件夹中的文件。当我们使用C#方法时:
Directory.GetFiles(@"\\account.file.core.windows.net\xyz")

当有2000个文件时,需要大约一分钟的时间。

如果我们使用CloudStorageAccount来完成同样的操作:

  CloudFileClient fileClient = storageAccount.CreateCloudFileClient();
  CloudFileDirectory directory = fileClient.GetShareReference("account").GetRootDirectoryReference().GetDirectoryReference("abc");
  Int64 totalLength = 0;
  foreach (IListFileItem fileAndDirectory in directory.ListFilesAndDirectories())
  {
    CloudFile file = (CloudFile)fileAndDirectory;
    if (file == null) //must be directory if null
      continue;

    totalLength += file.Properties.Length;
  }

它会返回所有文件,但需要大约10秒钟的时间。为什么性能差异这么大?


嗨,我正在尝试使用第一种方法,即system.io命名空间,并使用Directory.GetFiles或Directory.CreateDirectory,但我无法在任何地方找到完整的示例/样本。我们需要在此之前执行任何步骤吗?我们如何验证Azure存储? - Milind Thakkar
@MilindThakkar,关于在Azure文件存储上管理对象,您可能会发现这篇文章有用(“使用.NET为Azure Files开发”)https://learn.microsoft.com/en-us/azure/storage/files/storage-dotnet-how-to-use-files - Eddie Kumar
1个回答

4
使用Directory.GetFiles(System File API)时,实际上是通过SMB协议(v2.1或v3.0取决于客户端操作系统版本)与Azure文件存储进行通信。但是,当切换到CloudStorageAccount时,它会通过REST与文件存储进行通信。如果您使用Wireshark,则会发现SMB协议将在客户端和服务器之间有多次来回请求,这是由于协议的性质所致。Azure文件存储支持SMB和REST访问的原因是为了使您的旧代码/应用程序(曾经访问由文件服务器托管的文件共享)现在可以在不更改代码的情况下访问云中的文件共享。

因此,在您的情况下建议使用REST调用来访问Azure文件存储以获得更好的性能。

唐:你好,我正在尝试使用第一种方法,即system.io命名空间,并使用Directory.GetFiles或Directory.CreateDirectory,但我无法在任何地方找到完整的示例/样本。我们需要在此之前执行任何步骤吗?我们如何验证Azure存储? - Milind Thakkar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接