S3 Загрузка с прерываниями pycurl

Я использую pycurl в качестве back-end для библиотеки boto Python. Он очень быстрый и универсальный, но у меня проблема с тем, что при загрузке больших файлов очень часто происходит сбой при подключении reset. Когда я использую простой boto с простым httplib, он намного надежнее.

То, что я нашел с помощью Wireshark, заключается в том, что через некоторое время (а иногда и довольно скоро) моя машина перестает принимать ACK с S3, поэтому сбрасывает соединение. Похоже, что pycurl настолько быстр, что он задевает соединение. И если я активирую загрузку (я использую мультиинтерфейс) или использую более медленное подключение к Интернету, загрузка выполняется нормально.

Мне все еще интересно, что я мог сделать неправильно.

Я также пытался загрузить с помощью SDK.NET S3. Это примерно в 3 раза медленнее, но преуспевает. Кроме того, все это на Windows 7, машина OS X в той же сети снова загружается намного медленнее, но надежно.

Ответ 1

Поскольку вы упомянули, что у вас возникла проблема с 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, чтобы отметить ваши текущие настройки. Установки, которые вас интересуют, - это выхлопная система дымохода, масштабирование при получении (RSS) и NetDMA. Это все функции, которые пытаются выгрузить обработку с/на NIC или CPU, и иногда они могут вызывать проблемы с симптомами, аналогичными тем, которые вы описали.

Прежде чем возиться с RSS или NetDMA, я бы попытался отключить Chimney Offload, запустив netsh int tcp set global chimney=disabled и отключив разгрузку TCP в Device Manager > Network Adapters > Advanced tab.

Если это не решит вашу проблему, вам может потребоваться поэкспериментировать с двумя другими вариантами. Ниже приведена статья Microsoft KB с подробными сведениями об их изменении.