Облачные функции для Firebase отключены из-за превышения лимита памяти

Я продолжаю получать спорадические ошибки от Cloud Functions for Firebase при преобразовании относительно небольшого изображения (2 МБ). В случае успеха функция занимает около 2000 мс или меньше, и, согласно документации Image Magick, я не должен видеть никаких проблем.

Я попытался увеличить размер буфера для команды, что невозможно из Firebase, и попытался найти альтернативы .spawn(), так как это могло быть перегружено мусором и замедлило работу. Ничего не работает.


person Kirill    schedule 10.04.2017    source источник
comment
Вся информация находится здесь: функции управления.   -  person rockpowwer    schedule 23.06.2019
comment
В частности, здесь: #set_timeout_and_memory_allocation   -  person Blundering Philosopher    schedule 01.01.2021


Ответы (10)


Вы можете установить это из файла облачной функции в Firebase.

const runtimeOpts = {
  timeoutSeconds: 300,
  memory: '1GB'
}

exports.myStorageFunction = functions
  .runWith(runtimeOpts)
  .storage
  .object()
  .onFinalize((object) = > {
    // do some complicated things that take a lot of memory and time
  });

Взять из документации здесь: https://firebase.google.com/docs/functions/manage-functions#set_timeout_and_memory_allocation

Не забудьте затем запустить firebase deploy со своего терминала.

person Michael Giovanni Pumo    schedule 27.11.2018
comment
Должен быть принятый ответ для последовательности. Люди отвечают с помощью командной строки, что нехорошо, если вы работаете в групповом проекте или проект сдвигается. - person Oliver Dixon; 20.12.2018
comment
импортировать {VALID_MEMORY_OPTIONS} из 'firebase-functions'; VALID_MEMORY_OPTIONS['1GB'] для машинописного текста - person Ruben; 28.07.2019
comment
это должен быть лучший ответ, это самый простой, ориентированный на будущее, не требует обслуживания, подход «сделай и забудь» - person tylim; 21.11.2020

Я потерялся в пользовательском интерфейсе, не мог найти никакой возможности изменить память, но наконец нашел его:

  1. Перейдите в консоль Google Cloud Platform (не в консоль Firebase).
  2. В меню выберите Cloud Functions.
  3. Теперь вы видите здесь свою функцию firebase, если она верна. В противном случае проверьте, правильно ли вы выбрали проект.
  4. Игнорируйте все флажки, кнопки и пункты меню, просто нажмите на название функции.
  5. Нажмите на «Редактировать» (верхнее меню), измените только выделенную память и нажмите «Сохранить».
person p3sn    schedule 12.06.2017
comment
Какое верхнее меню? Я вижу только «Создать функцию», «Обновить», «Удалить» и «Копировать». Может, это должен быть платный аккаунт? - person CodyBugstein; 24.08.2018
comment
Вы спасатель! Эта функциональная консоль в облаке Google просто супер! - person Kushagra Gour; 30.03.2019
comment
Будьте осторожны, эти настройки будут сбрасываться каждый раз, когда вы развертываете свои функции. Используйте functions.runWith ({}). firebase.google.com/docs/functions/ - person Yair Levi; 31.07.2020
comment
Затем он заставляет меня щелкнуть «Далее», а затем я должен указать исходный код. Для меня это не имеет смысла. Я уже загрузил исходный код для этой функции. Почему я должен указывать еще один, и какой из них говорит ему просто использовать то, что было изначально? - person pete; 02.08.2020

[обновление] Как предположил один из комментаторов, это больше не должно быть проблемой, поскольку функции firebase теперь сохраняют свои настройки при повторном развертывании. Спасибо, firebase!

Оказывается, и это не очевидно и не задокументировано, вы можете увеличить выделение памяти для своих функций в консоли функций Google.. Вы также можете увеличить время ожидания для длительно выполняющихся функций. Решил проблему с перегрузкой памяти и теперь все работает отлично.

Изменить: обратите внимание, что Firebase сбросит значения по умолчанию при развертывании, поэтому вы должны не забыть войти в консоль и сразу же обновить их. Я все еще ищу способ обновить эти настройки через CLI, обновлю, когда найду.

person Kirill    schedule 10.04.2017
comment
Я не мог найти место, чтобы увеличить выделение памяти для моих функций. Куда мне перейти в консоли функций? спасибо! - person Walucas; 20.06.2017
comment
@Walucas Cloud Functions ›{name of your function}› Нажмите «Изменить» ›и измените номер в распределении памяти. - person Kirill; 25.06.2017
comment
Для меня снова сбрасываются настройки функций. - person El Yobo; 21.11.2017
comment
Как добавление памяти влияет на цену? - person Pier; 26.02.2018
comment
Вы также можете установить время ожидания и память программно. - person opyate; 02.08.2018

Последняя команда развертывания firebase перезаписывает выделенную память до 256 МБ по умолчанию и тайм-аут до 60 секунд.

В качестве альтернативы, чтобы указать желаемое распределение памяти и максимальный тайм-аут, я использую команду gcloud, например:

Развертывание бета-функций gcloud YourFunctionName --memory = 2048MB --timeout = 540s

Другие варианты, пожалуйста, обратитесь к:

https://cloud.google.com/sdk/gcloud/reference/beta/functions/deploy

person Fan Kam Thong    schedule 19.11.2017

Вы можете настроить свою память здесь:

введите описание изображения здесь

person ravo10    schedule 05.11.2019
comment
Это единственное решение, которое действительно работает! Пользовательский интерфейс больше не позволяет менять память. Кажется, что это так, но тогда вам потребуется нажать следующую кнопку вместо кнопки сохранения. Единственный способ сохранить изменения в памяти - это загрузить новый исходный код для вашей функции, что, конечно же, не имеет смысла, поскольку исходный код вашей функции уже существует, иначе функция вообще не была бы в таблице. - person pete; 02.08.2020
comment
Это единственное и лучшее решение в 2020 году. - person Hoon; 03.09.2020

Вывод из пользовательского интерфейса немного сложен, поэтому вот несколько снимков экрана с инструкциями:
Перейдите по ссылке https://console.cloud.google.com/functions/list

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь


Вы также можете увеличить тайм-аут по умолчанию на 60 секунд.

введите описание изображения здесь

введите описание изображения здесь

person GorvGoyl    schedule 11.05.2020
comment
Это больше не работает, так как он просит снова загрузить исходный код! - person Ayyappa; 21.07.2020
comment
да, почему он запрашивает и требует другой исходный код только для изменения использования памяти; разве у него еще нет исходного кода, загруженного из развертывания firebase ??? Это не имеет никакого смысла! - person pete; 02.08.2020

Обновление: похоже, теперь они сохраняют настройки при повторном развертывании, поэтому вы можете безопасно изменить выделение памяти в облачной консоли!

person ovaris    schedule 16.05.2017
comment
О, хорошие новости! Я не переделывала какое-то время, чтобы ничего не сломалось. Попробую на тестовом проекте. Здорово, если снова заработает! - person Kirill; 18.05.2017
comment
Обновление: он сбрасывает их каждый раз для меня (и не может развернуть, потому что предел памяти превышен во время развертывания, что создает неудобную проблему с курицей и яйцом). - person El Yobo; 21.11.2017
comment
По состоянию на январь 2020 года настройки все еще сохраняются при повторном развертывании. - person omeanwell; 21.01.2021

вы можете добавить конфигурации в определения функций firebase, например:

functions.runWith({memory: '2GB', timeoutSeconds: '360'})
person Siddhant    schedule 07.05.2020

Кажется, что конфигурация ресурса ImageMagick по умолчанию в Firebase Cloud Functions не соответствует фактической памяти, выделенной для функции.

Запуск identify -list resource в контексте облачной функции Firebase дает:

File       Area         Memory        Map       Disk   Thread  Throttle       Time
--------------------------------------------------------------------------------
 18750    4.295GB       2GiB       4GiB  unlimited        8         0   unlimited  

Память по умолчанию, выделенная для FCF, составляет 256 МБ - экземпляр ImageMagick по умолчанию считает, что у него 2 ГБ, и поэтому не выделяет буфер с диска и может легко попытаться перераспределить память, что приведет к сбою функции на Error: memory limit exceeded. Function killed.

Один из способов - увеличить требуемую память, как было предложено выше, хотя все еще существует риск, что IM попытается перераспределить в зависимости от вашего варианта использования и выбросов.

Еще безопаснее было бы установить правильный предел памяти для IM как часть процесса обработки изображений с помощью -limit memory [your limit]. Вы можете определить приблизительное использование памяти, запустив свою логику обмена мгновенными сообщениями с помощью «-debug Cache» - он покажет вам все выделенные буферы, их размеры и то, были ли они памятью или диском.

Если IM достигает предела памяти, он начнет выделять буферы на диске (отображаемую память, а затем обычные дисковые буферы. Вам нужно будет учитывать ваш конкретный баланс между производительностью ввода-вывода и стоимостью памяти. Цена каждого дополнительного байта памяти, который вы выделяете ваш FCF умножается на 100 мс использования - так что он может быстро расти.

person Shai Ben-Tovim    schedule 12.09.2017

Другой вариант - вообще отказаться от использования .spawn().

Существует отличный пакет обработки изображений для узла под названием Sharp, который использует библиотеку с малым объемом памяти. libvips. Вы можете проверить образец облачной функции на Github.

В качестве альтернативы существует оболочка узла для ImageMagick (и GraphicsMagick) под названием gm. Он даже поддерживает параметр -limit для сообщения об ограничениях ресурсов в IM.

person Kiana    schedule 28.09.2017
comment
Интересно. Даст резкий выстрел. Проблема с Google Cloud заключается в том, что вы не можете действительно протестировать что-либо локально, и для этого требуется проталкивать каждое изменение через фрагмент облачного кода. Таким образом, стоимость переключения высока, даже если это лучшее решение. - person Kirill; 30.09.2017
comment
Вам следует ознакомиться с некоторыми новыми функциями локального тестирования, которые были только что добавлены. Теперь вы тестируете запускаемые функции локально и запускаете для них модульный тест. firebase.google.com/docs/functions/ - person Kiana; 01.10.2017
comment
Эмуляторы пока не поддерживают API хранилища - person K20GH; 16.08.2019