Как Openwhisk решает, сколько контейнеров времени выполнения нужно создать?

Я работаю над проектом, использующим Openwhisk. Я создал кластер Kubernetes в облаке Google с 5 узлами и установил на нем OW. Моя бессерверная функция написана на Java. Он выполняет некоторую обработку на основе аргументов, которые я ему передаю. Обработка может длиться до 30 секунд, и я вызываю функцию несколько раз в течение этих 30 секунд, что означает, что я хочу создать большее количество контейнеров (подов) времени выполнения, не дожидаясь завершения предыдущего вызова. В идеале должен существовать контейнер для каждого вызова, пока ресурсы не закончатся.

Теперь происходит следующее: когда я начинаю вызывать функцию, создается первый контейнер, а затем, через несколько секунд, еще один для обслуживания первых двух вызовов. С этого момента я продолжаю вызывать функцию (не более 5 одновременных вызовов), но контейнеры не запускаются. Затем, по прошествии некоторого времени, создается третий контейнер и иногда, но редко, четвертый, но только через долгое время. Что даже странно, так это то, что все контейнеры запускаются на одном узле кластера или иногда на двух узлах (всегда на одних и тех же двух узлах). Остальные узлы не используются. Я тщательно настроил кластер. Каждый узел помечен как вызывающий. Я пробовал поэкспериментировать с памятью, назначенной каждому контейнеру, максимальным количеством контейнеров, я увеличил максимальное количество вызовов, которые я могу иметь в минуту, но, несмотря на все это, я не смог увеличить количество созданных контейнеров. Кроме того, я пробовал использовать разные машины для кластера (разное количество ядер и памяти), но безуспешно.

Поскольку Openwhisk все еще относительно молодой проект, я, к сожалению, не получил достаточно информации из официальной документации. Может кто-нибудь объяснить, как Openwhisk решает, когда запускать новый контейнер? Какие параметры я могу изменить в values.yaml, чтобы получить большее количество контейнеров?


person Nikola Vukovic    schedule 18.04.2020    source источник


Ответы (2)


Причина, по которой было создано очень мало контейнеров, заключается в том, что рабочие узлы не имеют образа среды выполнения Docker Java и его необходимо загрузить на каждый из узлов при первом запросе этой среды. Это изображение весит несколько сотен МБ, и для его загрузки требуется время (пара секунд в кластере Google). Я не знаю, почему контроллер Openwhisk решил подождать, пока будут доступны уже созданные поды, вместо того, чтобы загружать образ на другие узлы. В любом случае, как только я загрузил изображение вручную на каждый из узлов, используя одно и то же приложение с той же частотой запросов, для каждого запроса был создан новый модуль, который нельзя было обслужить с помощью существующего модуля.

person Nikola Vukovic    schedule 20.04.2020

Планировщик OpenWhisk реализует несколько эвристик для сопоставления вызова с контейнером. Это сообщение Маркуса Томмеса https://medium.com/openwhisk/squeezing-the-milliseconds-how-to-make-serverless-platforms-blazing-fast-aea0e9951bd0 объясняет, как работают повторное использование и кеширование контейнеров, и может быть применимо к тому, что вы видите. .

Когда вы проверяете запись активации для вызовов в своем эксперименте, проверьте аннотации в записи активации, чтобы определить, был ли запрос «теплым» или «холодным». Теплый означает, что контейнер был повторно использован для нового вызова. Холодный означает, что контейнер был недавно выделен для обслуживания вызова.

См. Этот документ https://github.com/apache/openwhisk/blob/master/docs/annotations.md#annotations-specific-to-activations, в котором объясняется значение waitTime и initTime. Когда последний украшает аннотацию, активация была «холодной», что означает выделение нового контейнера.

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

Наконец, OpenWhisk - это зрелая бессерверная функциональная платформа. Он работает с 2016 года как IBM Cloud Functions и теперь поддерживает несколько общедоступных бессерверных предложений, в том числе Adobe I / O Runtime и Naver Lambda service.

person user6062970    schedule 18.04.2020
comment
Спасибо за вашу помощь! Я нашел проблему и разместил ее здесь. - person Nikola Vukovic; 20.04.2020