使用pycurl上传S3中断

11 投票
1 回答
568 浏览
提问于 2025-04-17 14:46

我在用pycurl作为boto这个Python库的后端。它速度很快,功能也很强大,但我遇到一个问题,就是上传大文件时经常会因为连接重置而失败。当我用普通的boto配合普通的httplib时,上传就要可靠得多。

我用Wireshark这个工具观察到,过了一段时间后(有时候甚至很快),我的电脑就收不到来自S3的确认信号(ACK),所以它就重置了连接。感觉pycurl的速度太快,反而让连接卡住了。如果我限制上传速度(我用的是多线程接口)或者用更慢的网络连接,上传就能顺利进行。

我还是在想,我可能哪里做错了。

我还尝试过用.NET的S3 SDK来上传。虽然速度慢了大约三倍,但上传成功了。而且,我在Windows 7上测试,OS X的机器在同一网络下上传速度也慢,但很稳定。

1 个回答

3

既然你提到在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、接收端缩放(RSS)和NetDMA。这些都是尝试将处理任务转移到网络接口卡(NIC)或中央处理器(CPU)的功能,有时候会导致你描述的那种问题。

在调整RSS或NetDMA之前,我建议先尝试禁用Chimney Offload,可以通过运行命令netsh int tcp set global chimney=disabled来实现,同时在设备管理器 > 网络适配器 > 高级选项卡中禁用TCP卸载。

如果这样还不能解决你的问题,你可能需要尝试另外两个选项。这里有一篇微软的知识库文章,里面有关于如何修改这些设置的详细信息。

撰写回答