Carrierwave + S3 Storage + Counter Cache занимает слишком много времени

У меня есть простое приложение, которое получает POST-изображения через API и отправляет их на S3 через Carrierwave. Моя таблица фотографий также имеет counter_cache.

80% времени моей транзакции ОГРОМНО, например 60 секунд или более, и более 90% этого времени тратится на загрузку изображения на S3 и обновление counter_cache.

Кто-нибудь имеет представление о том, почему это время загрузки так велико и почему запросы кэш-кеша занимают так много времени?

Отчет о новой реликвии

Трассировка транзакции

Трассировка SQL

Просто добавил несколько фотографий на http://carrierwave-s3-upload-test.herokuapp.com/

Поведение было похоже:

Только что удалил counter_cache из моего кода и сделал еще несколько загрузок.... снова странное поведение.


РЕДАКТИРОВАТЬ 1

Журналы с последней пакетной загрузки. EXCON_DEBUG имеет значение True: https://gist.github.com/rafaelcgo/561f516a85823e30fbad


РЕДАКТИРОВАТЬ 2

В моих журналах не было никакой информации о выходе EXCON. Я понял, что использую туман 1.3.1. Обновлен до Fog 1.19.0 (который использует более новую версию гема excon), и теперь все работает хорошо.

Советы.. Если вам нужно отладить внешние соединения, используйте более новую версию excon и установите env EXCON_DEBUG=true, чтобы увидеть некоторые подробности, например: https://gist.github.com/geemus/8097874


РЕДАКТИРОВАТЬ 3

Ребята, обновили gem fog а теперь сладко Не знаю, почему старые версии fog и excon имеют такую ​​странную производительность.

1 ответ

Три подсказки, но не вся история:

  1. CarrierWave передает файл на s3 внутри вашей транзакции базы данных. Поскольку обновление counter_cache также происходит внутри транзакции, вполне возможно, что ваш контрольный код думает, что обновление выполняется вечно, тогда как на самом деле передача файлов занимает вечность.

  2. В прошлый раз я проверил, что dyno из приложения heroku не может поддерживать связь, пока вы видите. Вы должны видеть ошибки H12 или H15 в своих журналах, если у вас есть синхронные загрузки продолжительностью около 30 секунд. Подробнее о тайм-аутах героку здесь.

  3. Вы пытались обновить туман? 1.3.1 исполнилось полтора года, и с тех пор они, вероятно, исправили одну или две ошибки.

Помимо этого, единственное, что приходит на ум, это то, что вы загружаете файл эпического масштаба. Я был разочарован как в задержке, так и в пропускной способности, которую я смог достичь от heroku до s3, так что это тоже может быть связано.

Обязательно: вы не разрешаете пользователям загружать файлы прямо в ваш dyno ?

Другие вопросы по тегам