我在 Linux (Ubuntu 10) 64 位服务器上使用 Java 从 Amazon S3 流式传输文件。
我为每个文件使用一个单独的线程,每个文件打开一个 HttpURLConnection
,它同时下载和处理每个文件。
在我达到一定数量的流(通常大约 2-300 个并发流)之前,一切都运行良好。在此之后的不规则点,多个(比如 10 个)线程将开始java.net.IOException: Connection reset
错误同时。
我正在限制下载速度,远远低于 m1.large 实例的 250mbit/s 限制。所有其他服务器方面的负载也微不足道(例如 CPU、平均负载和内存使用都很好)。
可能是什么原因造成的,或者我该如何追踪?
最佳答案
猜测可能会发生什么并不容易,但这是一些提示,可能有些可能适用于您的上下文:
- 你能检查你的 shell(linux bash/zsh 或任何其他)看看你是否提高了限制文件描述符数量的标准限制(但也包括套接字), 使用 bash shell 的 man ulimit
- 您是否在 Java 代码中明确关闭了流?不关闭流可能会导致这种聪明的问题
- 尝试谷歌 Linux TCP 内核调整,看看您的 ubuntu 服务器是否有适合此类负载上下文的堆栈...
HTH 杰罗姆
关于Java UrlConnection 在高负载下触发 "Connection reset"异常。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9116977/