我正在使用 pycurl 作为 boto
Python 库的后端。它非常快速且用途广泛,但我遇到的问题是大文件的上传经常在连接重置时失败。当我将普通 boto
与普通 httplib
一起使用时,它更加可靠。
我在使用 Wireshark 时发现,一段时间后(或者有时很快),我的机器停止接收来自 S3 的 ACK,因此它会重置连接。似乎 pycurl
速度如此之快以至于它阻塞了连接。如果我限制上传(我使用多接口(interface))或使用较慢的互联网连接,上传运行正常。
我仍然想知道我可能做错了什么。
我还尝试使用 .NET S3 SDK 上传。它慢了大约 3 倍,但成功了。此外,这一切都在 Windows 7 上,同一网络上的 OS X 机器再次上传速度慢得多,但可靠。
最佳答案
既然您提到您在 Windows 7 上遇到过该问题,您能否以管理员身份运行命令提示符并发布 netsh int tcp show global
的结果?您应该会看到如下内容:
TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State : enabled
Chimney Offload State : automatic
NetDMA State : enabled
Direct Cache Acess (DCA) : disabled
Receive Window Auto-Tuning Level : normal
Add-On Congestion Control Provider : none
ECN Capability : disabled
RFC 1323 Timestamps : disabled
我建议您将结果复制/粘贴到 .txt 文件以记录您当前的设置。您感兴趣的设置是 Chimney Offload、Receive-Side Scaling (RSS) 和 NetDMA。这些都是试图从/向 NIC 或 CPU 卸载处理的功能,它们有时会导致出现与您描述的症状类似的问题。
在使用 RSS 或 NetDMA 之前,我会尝试通过运行 netsh int tcp set global chimney=disabled
来禁用 Chimney Offload,并在 Device Manager > Network Adapters > Advanced 选项卡下禁用 TCP offload
.
如果这不能解决您的问题,您可能需要尝试其他两个选项。这是一个 Microsoft KB article以及修改所有这些的详细信息。
关于python - 使用 pycurl 中断的 S3 上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14699158/