1

我正在努力提高 .net 应用程序的上传性能,该应用程序将大型(每个约 15mb)文件组上传到 S3。

我已经调整了多部分选项(线程、块大小等),并且我认为我已经尽可能地改进了这一点,但是在密切关注网络利用率的同时,我注意到了一些意想不到的事情。

我遍历目录中的多个文件,然后使用 S3 传输实用程序的实例提交每个文件以供上传,如下所示:

//  prepare the upload
this._transferUtility.S3Client.PutBucket(new PutBucketRequest().WithBucketName(streamingBucket));

 request = new TransferUtilityUploadRequest()
   .WithBucketName(streamingBucket)
   .WithFilePath(streamFile)
   .WithKey(targetFile)
   .WithTimeout(uploadTimeout)
   .WithSubscriber(this.uploadFileProgressCallback);

 //  start the upload
 this._transferUtility.Upload(request);

然后我在上面指定的 uploadFileProgressCallback 中观察这些完成。

但是,当我查看网络接口时,我可以在出站流量图中看到许多明显的“驼峰”,这与我上传到 S3 的文件数量完全一致。

由于这是一个异步调用,我的印象是每次传输都会立即开始,并且随着每次上传完成,我会看到出站数据逐步增加,然后逐步减少。根据我现在看到的情况,我想知道这些请求虽然与调用代码异步,但是否在某处排队,然后连续执行?

如果是这样,我想更改它,以便所有请求都在(接近)同时开始上传,这样我就可以最大化我可用的上传带宽并减少总体执行时间。

我在 S3 .net SDK 文档中四处寻找,但找不到任何提及此排队机制或任何属性/等的内容。这似乎提供了一种增加这些调用的并发性的方法。

任何指针表示赞赏!

4

2 回答 2

2

由于简单性要求,这可能不是 SDK 本质上支持的东西?我根据这篇文章实现了我自己的并发部分上传。 http://aws.typepad.com/aws/2010/11/amazon-s3-multipart-upload.html

一些观察:

  1. 仅当您在内存中拥有完整的内容时,这种方法才有效,因为您必须将其分成块并将其打包成部分上传。在许多情况下,仅仅为了进行并发上传而在内存中存储 GB 的数据顺序可能没有意义。您可能必须在那里评估权衡。

  2. SDK 对 singlePut 上传的最大限制为 16MB,超过此值的任何文件大小都将被分成 5MB 块进行部分上传。不幸的是,这些值是不可配置的。所以我几乎必须编写自己的分段上传逻辑。上面提到的值适用于 java SDK,我希望这些值对于 C# 也是相同的。

  3. 所有操作都是非阻塞的,这很好。

于 2012-07-10T07:57:09.553 回答
0

在 c# 中,您可以尝试手动设置零件大小。

TransferUtilityUploadRequest request =
            new TransferUtilityUploadRequest()
                .WithPartSize(??).

或者

TransferUtilityConfig utilityConfig = new TransferUtilityConfig();
       utilityConfig.MinSizeBeforePartUpload = ??;

但我不知道默认值

于 2012-12-10T14:10:04.627 回答