Как Openwhisk решает, сколько контейнеров времени выполнения создать? - PullRequest
0 голосов
/ 18 апреля 2020

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

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

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

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

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

0 голосов
/ 18 апреля 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 -specifi c -to-activations , который объясняет значение waitTime и initTime. Когда последний украшает аннотацию, активация была «холодной», что означало, что был выделен контейнер fre sh.

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

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

...