python - 使用 pycurl 中断的 S3 上传

标签 python curl tcp upload amazon-s3

我正在使用 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/

相关文章:

python - 在dask中搜索行后获取列值

python - 为什么它说我没有直肠

javascript - 将 json api curl 从 javascript 重写为 php

php - 使用 PHP cURL 时服务器停止运行

java - 需要阻塞直到接收到特定字符序列的 TCPIP 客户端

c++ - 委托(delegate)使用 boost asio TCP/IP 套接字

python - 使用 urllib(2) 获取和放置 json 数据格式的请求

python - Matplotlib svg 作为字符串而不是文件

php - 并行发出 7 个 soap api 请求的最快或最可靠的方法

encryption - 为什么 crypto/rsa 库中的 Go 函数 EncryptOAEP 需要随机 io.Reader?