ubuntu - 从 Amazon S3 下载文件的速度下降到 <2 kb/s = 下载速度非常慢(在上传文件的机器上)

标签 ubuntu amazon-web-services amazon-s3 kvm libvirt

基本问题:

我们在当前的基础设施设置中遇到了非常奇怪的行为:

  • 如果文件是从与上传文件相同的 IP/机器下载的,则从 Amazon S3 下载文件的速度会降至 <2 kb/s(在下载速度完全正常的约 10 次下载后)
  • 在我们的其他机器上,我们可以下载该文件几千次,但看不到这种行为

其他详细信息:

  • 机器使用 puppet 设置相同
  • 它们都是在 KVM 上运行 ubuntu 12.04.4 的虚拟机,在 ubuntu 12.04.4 和 13.04 主机上运行 libvirtd
  • 每个 VM 都有自己的公共(public) IP,流量源自该 IP
  • 几分钟到几小时后,可以再次以 >5 mb/s 的速度下载文件几次(似乎是 10 次)
  • 使用 fog gem 从 rails 应用程序上传文件

用 wget 测试:

使用 wget,对于我们上传的文件,您会在受影响的机器上看到以下输出:

--2014-07-31 16:33:38--  http://s3-eu-west-1.amazonaws.com/not_the_real_file_url
Resolving s3-eu-west-1.amazonaws.com (s3-eu-west-1.amazonaws.com)... 178.236.6.160
Connecting to s3-eu-west-1.amazonaws.com (s3-eu-west-1.amazonaws.com)|178.236.6.160|:80...      connected.
HTTP request sent, awaiting response... 200 OK
Length: 2801149 (2.7M) [text/plain]
Saving to: `/dev/null'

0% [                                ] 10,111      1.05K/s  eta 68m 26s

68m 就这样! (虽然在那之后它确实完成了下载)

这个由其他人托管在 amazon s3 上的随机文件的输出:

--2014-07-31 16:39:21--  https://s3.amazonaws.com/Minecraft.Download/versions/14w31a/minecraft_server.14w31a.jar
Resolving s3.amazonaws.com (s3.amazonaws.com)... 72.21.211.199
Connecting to s3.amazonaws.com (s3.amazonaws.com)|72.21.211.199|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10342238 (9.9M) [application/octet-stream]
Saving to: `/dev/null'

32% [====================================>    ] 3,370,945    747K/s  eta 12s

我们目前的解决方法

我们目前的解决方案是使用我们的 HAProxy 作为透明的 HTTP 代理。

这意味着我们定义了一个前端“cloud.example.com”,以及一个首先将请求 HOST 替换为“s3-eu-west-1.amazonaws.com”然后使用 s3-eu-west-1 的后端.amazonaws.com:80 作为服务器。对于亚马逊来说,请求似乎来 self 们的代理,我们可以再次下载存储在 S3 上的文件数千次。 :)

[2014-07-31 16:56:57 +0200] RUN[28] AVG: '0.9612743812142854' s, LAST_RUN: '0.711118431' s
--2014-07-31 16:56:57--  https://cloud.example.com/not_the_real_file_url
Resolving cloud.example.com (cloud.example.com)... 1.2.3.4
Connecting to cloud.example.com (cloud.example.com)|1.2.3.4|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2801149 (2.7M) [text/plain]
Saving to: `/dev/null'

100%[====================>] 2,801,149   2.47M/s   in 1.1s

最佳答案

好的,解决了。

我仍在研究为什么这能解决问题,但现在解决问题的方法如下:

如上所述,该行为发生在运行于 Ubuntu 12.04.4 KVM-Host 系统上的 Ubuntu 12.04.5 KVM-Guest 上。我今天看了一下,如果我们在 guest 上使用不同的内核 (linux-image-*)(这仍然会发生,因为我们还没有为它们配置 puppet)。

在我们有奇怪的 <5 KB/s S3 下载行为的 KVM-guests 上,我们使用:

  • Linux 3.8.0-44-通用

在具有 >5 MB/s S3 下载速度的 KVM-guest 上,我们使用:

  • Linux 3.2.0-68-virtual(实际上任何 *-virtual 都可以解决这个问题)

如果您遇到同样的问题,希望这对您有所帮助。如果我真正理解为什么会发生这种情况,我会发布更多内容。

当然:我知道您应该在 VM-guest 上使用 *-virtual 内核。为什么只有 S3 下载速度很慢,虽然我有点困惑。

关于ubuntu - 从 Amazon S3 下载文件的速度下降到 <2 kb/s = 下载速度非常慢(在上传文件的机器上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25062450/

相关文章:

Python:更详细地按日期时间对文件进行排序

c - 内核 Makefile 不会为我的模块创建任何 .ko 文件

amazon-web-services - 对队列的 worker 进行速率限制(例如 : SQS)

amazon-web-services - AWS codebuild 列出其他帐户的 s3 存储桶

ubuntu - 如何在 Ubuntu 10.04 中安装 FORTRAN95?

laravel - 为什么在安装 laravel 时要我一个 token

ios - 从 Google 登录 SDK 获取 AWS 的跨客户端 ID token

php - 在 AWS Elastic Beanstalk Multidocker 容器上使用数据库容器或 RDS 数据库

javascript - WebKitFormBoundary 包含在直接上传到 s3 的文件有效负载中

python-3.x - 使用 SAS token 将文件从 Amazon AWS s3 传输到 Azure Blob 的 python 脚本