【问题标题】:Fast and scalable IO passthrough快速且可扩展的 IO 直通
【发布时间】:2015-05-31 16:13:57
【问题描述】:

原创

我有一个批处理作业,它将从各种 URL 下载的内容传递到 S3 存储。我目前正在使用阻塞 IO,并且由于 IO,我的工作大部分时间都是 IO bound 阻塞的。所以为了加快整个过程,我一直在考虑使用非阻塞 IO。

很遗憾,我找不到用于将内容从一组通道传递到另一组通道的实用程序代码。由于我读到编写正确的非阻塞代码并不容易,因此我更愿意使用现有的实用程序/框架而不是自己编写该代码。

TransferManager 似乎是使用 AWS 开发工具包时提高吞吐量的唯一可能选项,但它仅提供流的使用,并且似乎在后台使用 IO 线程。显然没有开箱即用的非阻塞上传到 S3 的选项。

你会推荐什么?目前我只能想象以下解决方案。

  1. 保持阻塞 IO 并使用我自己的 IO 线程池
  2. 使用非阻塞 IO 将文件下载到本地文件系统,然后使用 TransferManager 上传
  3. 使用非阻塞 IO 进行直通

选项 1 显然无法扩展,而选项 2 可能会工作一段时间,但我真的很想在 EBS 上保持低 IO,所以我宁愿使用 3。

要成功实施选项 3,我想我必须自己实施很多,所以我的最后一个问题是,您是否认为值得,如果是,我可以使用哪些工具来完成这项工作。

编辑 1

澄清说,IO 绑定实际上是指该作业主要是在等待 IO。在这里你可以看到我的带宽并没有真正饱和,但如果可能的话,我希望它是饱和的。

【问题讨论】:

  • 非阻塞上传是什么意思?什么io是绑定的?磁盘读取?写?网络阅读?写?
  • 请看我更正的问题。

标签: java amazon-s3 nio nonblocking aws-sdk


【解决方案1】:

如果您的工作是 I/O 绑定的,那么您已经完成了。您受网络速度的约束,而不是您的代码。使用 NIO 不会让它变得更快。

澄清说,我说的 IO 绑定实际上是指该作业主要是在等待 IO。

是的,这就是“I/O 绑定”的意思。什么都没有改变。

在这里您可以看到我的带宽并没有真正饱和,但如果可能的话,我希望它是。

您可以尝试使用更大的缓冲区,但正如我所说,在我看来您已经完成了。

【讨论】:

  • 我的连接数目前是 2,这就是我的带宽没有饱和的原因。目前一台慢速服务器会减慢我的整个工作,这就是我想使用非阻塞 IO 的原因。此外,我的读取似乎经常失败(HTTP 5xx),我尝试通过等待来处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多