你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Go 实现上传和下载性能优化

当应用程序使用适用于 Go 的 Azure 存储客户端库传输数据时,多个因素可能会影响请求的速度和内存使用情况,甚至会影响请求是否成功。 若要最大程度提高数据传输的性能和可靠性,必须主动根据应用运行的环境来配置客户端库传输选项。

本文将带你详细了解在优化数据传输选项时的几点注意事项。 正确优化后,客户端库可以有效地跨多个请求分发数据,从而提高操作速度、内存使用率和网络稳定性。

针对上传进行性能优化

合理优化数据传输选项是确保可靠的上传性能的关键。 根据这些属性的值,存储传输可划分为多个子传输。 支持的最大传输大小因操作和服务版本而异,因此请务必查看文档以确定限制。 若要详细了解 Blob 存储的传输大小限制,请参阅 Blob 存储的缩放目标

设置上传的传输选项

如果 Blob 总大小小于或等于 256 MB,则会使用单个 Put Blob 请求上传数据。 如果 blob 大小大于 256 MB,或者 blob 大小未知,则使用一系列 Put Block 调用(后跟 Put Block List)以区块形式上传 blob。

可以根据应用的需求配置和优化以下属性:

  • BlockSize:以区块形式上传块 blob 时传输的最大长度。 默认值为 4 MB。
  • Concurrency:可以并行使用的最大子传输数。 默认值为 5。

使用以下方法上传时,可以使用这些配置选项:

Upload 方法不支持这些选项,并会在单个请求中上传数据。

注意

如果未提供,则客户端库会将默认值用于每个数据传输选项。 这些默认值通常在数据中心环境中表现良好,但不太可能适合家庭使用者环境。 数据传输优化不当可能会导致操作时间过长,甚至请求超时。 最好主动测试这些值,并根据应用程序和环境的需求优化它们。

BlockSize

参数“BlockSize”规定当以区块上传块 blob 时,传输的最大长度(以字节为单位)。

为了保持数据高效移动,客户端库可能并不总是在每次传输时都达到 BlockSize 值。 根据操作的不同,传输大小的最大支持值可能会有所不同。 若要详细了解 Blob 存储的传输大小限制,请参阅 Blob 存储的缩放目标中的图表。

代码示例

下面的代码示例演示了如何定义 UploadFileOptions 实例的值,以及如何将这些配置选项作为参数传递给 UploadFile

此示例中提供的值不作为建议。 若要正确优化这些值,需要考虑应用的特定需求。

func uploadBlobWithTransferOptions(client *azblob.Client, containerName string, blobName string) {
    // Open the file for reading
    file, err := os.OpenFile("path/to/sample/file", os.O_RDONLY, 0)
    handleError(err)

    defer file.Close()

    // Upload the data to a block blob with transfer options
    _, err = client.UploadFile(context.TODO(), containerName, blobName, file,
        &azblob.UploadFileOptions{
            BlockSize:   int64(8 * 1024 * 1024), // 8 MiB
            Concurrency: uint16(2),
        })
    handleError(err)
}

在此示例中,我们使用 Concurrency 字段将并行传输工作线程的数量设置为 2。 此配置最多可同时打开 2 个连接,从而允许并行上传。 如果 blob 大小大于 256 MB,则以区块形式上传 blob,且最大区块大小为 8 MiB(通过 Block_Size 字段设置)。

上传的性能注意事项

在上传期间,存储客户端库会根据客户端配置期间定义的配置选项将给定上传流拆分为多个子上传。 每个子上传都有自己的对 REST 操作的专用调用。 存储客户端库并行管理这些 REST 操作(取决于传输选项),以完成完整上传。

可以在以下部分了解客户端库如何处理缓冲。

注意

块 blob 的最大块计数为 50,000 个块。 那么,块 blob 的最大大小是 Block_Size 的 50,000 倍。

上传期间的缓冲

存储 REST 层不支持从上次中断的位置继续执行 REST 上传操作;单个传输要么完成,要么丢失。 为了确保流上传的复原能力,存储客户端库会在开始上传之前为每个单独的 REST 调用缓冲数据。 除了网络速度限制之外,这种缓冲行为也是考虑较小的 BlockSize 值的原因,即使在按顺序上传时也是如此。 减小 BlockSize 的值会减少每个请求和每次重试失败请求时缓冲的最大数据量。 如果在特定大小的数据传输期间遇到频繁超时,则减小 BlockSize 的值会减少缓冲时间,并可能提高性能。

针对下载进行性能优化

合理优化数据传输选项是确保可靠的下载性能的关键。 根据这些属性的值,存储传输可划分为多个子传输。

设置下载的传输选项

可以根据应用的需求来优化以下属性:

  • BlockSize:用于下载 blob 的最大区块大小。 默认值为 4 MB。
  • Concurrency:可以并行使用的最大子传输数。 默认值为 5。

使用以下方法下载时,可以使用这些选项:

DownloadStream 方法不支持这些选项,并会在单个请求中下载数据。

代码示例

下面的代码示例演示了如何定义 DownloadFileOptions 实例的值,以及如何将这些配置选项作为参数传递给 DownloadFile

此示例中提供的值不作为建议。 若要正确优化这些值,需要考虑应用的特定需求。

func downloadBlobTransferOptions(client *azblob.Client, containerName string, blobName string) {
    // Create or open a local file where we can download the blob
	file, err := os.Create("path/to/sample/file")
	handleError(err)

	// Download the blob to the local file
	_, err = client.DownloadFile(context.TODO(), containerName, blobName, file,
		&azblob.DownloadFileOptions{
			BlockSize:   int64(4 * 1024 * 1024), // 4 MiB
			Concurrency: uint16(2),
		})
	handleError(err)
}

下载的性能注意事项

在下载期间,存储客户端库会根据客户端配置期间定义的配置选项将给定下载请求拆分为多个子下载。 每个子下载都有自己的对 REST 操作的专用调用。 根据传输选项,客户端库会并行管理这些 REST 操作,以完成完整下载。

  • 本文是适用于 Go 的 Blob 存储开发人员指南的一部分。 请参阅构建应用中的开发人员指南文章的完整列表。
  • 若要详细了解可能影响 Azure 存储操作性能的因素,请参阅 Blob 存储中的延迟
  • 若要查看设计注意事项列表来优化使用 Blob 存储的应用的性能,请参阅 Blob 存储的性能和可伸缩性清单