Может ли безсерверная архитектура поддерживать высокую потребность в памяти? - PullRequest
0 голосов
/ 07 февраля 2019

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

Вот мои требования:

  • Запуск 10-15 скриптов Python 3.5 с помощью Cron Scheduler
  • Каждый из этих 10-15 скриптов занимает от 10 секунд до 20 минут для завершения
  • Они запускаются в разные часы дня, некоторые изони запускаются каждые 10 минут, в то время как некоторые запускаются один раз в день
  • Каждый сценарий регистрирует, что он сделал, чтобы я мог посмотреть его позже, если что-то пойдет не так
  • Некоторые из сценариев отправляют e-почта мне и моим товарищам по команде
  • Ни один из сценариев не имеет компонента HTTP / веб-сервера;все они работают по расписанию Cron и не обращены к пользователю
  • Все коды скриптов исходят из моего репозитория Github;когда сценарии просыпаются, они сначала выполняют мастер происхождения git pull, а затем начинают выполняться.Это означает, что нажатие на master приводит к тому, что все скрипты будут в последней версии.

Вот что у меня сейчас есть:

  • В настоящее время яиспользование 3-х серверов Digital Ocean (дроплетов) для этих сценариев
  • Некоторые сценарии требуют большого объема памяти (я получаю ошибку сегментации в каплях с объемом памяти менее 4 ГБ)
  • Я готовввести новый сценарий, который может потребовать еще большего объема памяти (новый сценарий в настоящее время дает сбой в капле объемом 4 ГБ)
  • Настройка капель относительно проста (благодаря Python venv), но не до точки выполненияединственная команда для запуска новой капли и ее установки

Наличие полной выделенной капли 8 ГБ / 16 Б для моего нового скрипта звучит немного неэффективно и дорого.

Что может быть более эффективным способом справиться с этим?

1 Ответ

0 голосов
/ 08 февраля 2019

Что может быть более эффективным способом справиться с этим?

Я отвечу в трех частях:

  1. Варианты уменьшения потребления памяти
  2. Минималистическая архитектура для безсерверных вычислений
  3. Как туда добраться

(I) Сокращение потребления памяти

Некоторыеобрабатывать большие объемы данных

Если вы обнаружите, что сценарии используют больше памяти, чем вы ожидаете, единственный способ уменьшить требования к памяти - это

  1. понять, какие частииспользование сценариями дискового пространства
  2. рефакторинг сценариев для использования меньшего объема памяти

Типичные проблемы, связанные с потреблением памяти:

  • при использованиинеправильная структура данных - например, если у вас есть числовые данные, обычно лучше загружать данные в массив Numpy, а не в массив Python.Если вы создаете много объектов пользовательских классов, это может помочь использовать __slots__

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

  • содержат ссылки на объекты, которые больше не нужны - например, в процессе обработки вы создаете объекты для представления или обработки некоторой части данных.Если скрипт сохраняет ссылку на такой объект, он не будет выпущен до конца программы.Одним из способов решения этой проблемы является использование слабых ссылок , другим является использование del для явного разыменования объектов.Иногда также полезно вызывать сборщик мусора .

  • с использованием автономного алгоритма при наличии онлайн-версии (для машинного обучения) -Например, некоторые из алгоритмов Scikit предоставляют версию для инкрементного обучения , например LinearRegression => SGDRegressior или LogisticRegression => SGDClassifier

некоторые выполняют второстепенные задачи по обработке данных

Некоторые алгоритмы требуют большого объема памяти.Если использование онлайн-алгоритма для инкрементного обучения не является вариантом, следующая лучшая стратегия - использовать сервис, который взимает плату только за фактическое время вычислений / использование памяти.Это то, что обычно называют безсерверными вычислениями - вам не нужно самим управлять серверами (каплями).

Хорошей новостью является то, что в принципе поставщик, которого вы используете, Digital Ocean, предоставляет модель, которая взимает плату только за фактически использованные ресурсы.Однако на самом деле это не безсерверный процесс: ваша задача - создавать, запускать, останавливать и удалять капли, чтобы получить реальные выгоды.Если этот процесс полностью не автоматизирован, весёлый фактор немного низок; -)

(II) Минимальная архитектура для безсерверных вычислений

полностью выделенные 8 ГБКапля / 16B для моего нового скрипта звучит немного неэффективно и дорого

Поскольку ваши скрипты запускаются только по расписанию / по расписанию, ваша капля не должна запускаться или даже существовать постоянно.Таким образом, вы можете установить это следующим образом:

  1. Создайте каплю планирования.Это может быть небольшого размера.Его единственная цель - запустить планировщик и создать новую каплю, когда должен быть выполнен сценарий, а затем отправить задачу для выполнения на этой новой рабочей капле.Рабочая капля может иметь определенный размер для размещения сценария, то есть каждый сценарий может иметь каплю любого требуемого размера.

  2. Создание универсального работника.Это программа, которая запускается при создании новой капли планировщиком.В качестве входных данных он получает URL-адрес хранилища git, в котором хранится фактический скрипт, который нужно запустить, и место для хранения результатов.Затем он извлекает код из хранилища, запускает сценарии и сохраняет результаты.

  3. Как только сценарий завершен, планировщик удаляет рабочую каплю.

При таком подходе для каждого сценария все еще есть полностью выделенные капли, но они стоят только денег, покаскрипт работает.

(III) Как туда добраться

Один из вариантов - построить архитектуру, как описано выше, которая, по сути, будет реализацией минималистической архитектуры для Безсерверные вычисления .Существует несколько библиотек Python для взаимодействия с Digital Ocean API .Вы также можете использовать libcloud в качестве универсального облачного API для нескольких провайдеров, чтобы впоследствии было проще (более) переключать поставщиков.

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

Как всегда с инженерными решениями, существует компромисс между временем /стоимость, необходимая для сборки или размещения самостоятельно, против стоимости использования легкодоступной коммерческой услуги.В конечном итоге это решение может принять только вы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...