12.06.2017

Расследование зависания cURL при передаче большого файла

Экспозиция
Потребовалось мне как-то с одного сервера на другой заливать файл размером около мегабайта. Вроде бы ничего сложного, используется библиотека cURL, которая позволяет все что хошь, какими хошь методами заливать. Мне принципиально нужен был raw файл методом POST (и да, мы говорим про Ubuntu).  Все шло как по учебнику. 

Завязка
Когда все было протестировано, скрипты уехали в продакшн на облегчённый сервер и тут-то файл перестал заливаться. Заливка отваливалась по тайм-ауту. На приемнике даже создавался файл размером 0 байт, но дальше ничего. Проблема воспроизвелась на всех облегченных серверах, кроме тестового и облегчённого сервера «на выезде». Облегченные серверы немного отличались платформами и имели одну операционку, а вот облегчённый сервер «на выезде», имел операционку другой сборки. 
Нужно было понять в чем проблема. 

Кульминация
Маленькие файлы в несколько байт заливались, проблемы начинались на килобайтах. 
Для того чтобы исключить проблему с библиотекой cURL, была попытка залить файл из консоли и... точно также заливка отваливалась по тайм-ауту. Было выкурено много манов. 

Но ведь не толко cURL умеет заливать файлы? На нем свет клином не сошёлся.
Была попытка залить файл через ssh утилитой scp. Каково же было удивление, когда файл в 600 килобайт завис на середине заливки и скорость начала падать до 0. Тут уже нужно было курить совсем другие маны. 

Штудирование все большей и большей информации начало приводить к советам изменить такие настройки, о существовании которых не знала даже операционная система. 

Развязка
Курение различных манов напомнило о проблеме десятилетней давности - “подбирайте MTU!”

После смены MTU с 1500 на 1400 командой:
Ifconfig eth0 mtu 1400
Данные пошли и, как мне кажется, ещё веселее, чем до этого. 

Эпилог
Вселенная интернета обширна и полна информацией, главное правильно сформулировать вопрос ко вселенной и он будет содержать не только половину ответа, но, того глядишь, и весь ответ.