Какой показатель использует AWS Lambda, особенно для среды выполнения Node.js, чтобы определить максимальный объем используемой памяти? - PullRequest
3 голосов
/ 24 апреля 2019

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

Нет явного окрашивания после проверки process.memoryUsage() до и после настройки массива, а также максимального объема памяти, используемого Lambda.Я не могу найти хороший ресурс, который указывает, как / что Lambda фактически использует для определения используемой памяти.Любая помощь будет оценена?

Ответы [ 3 ]

3 голосов
/ 30 апреля 2019

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

Тест 1 : создать массив из 100 000 элементов впамять

Объем памяти: 128 МБ

exports.handler = async (event) => {
    const arr = [];
    for (let i = 0; i < 100000; i++) {
        arr.push(i);
    }
    console.log(process.memoryUsage());
    return 'done';
};

Результат : 56 МБ

2019-04-30T01:00:59.577Z    cd473d5b-986c-436e-8b36-b114410c84cf    { rss: 35299328,
  heapTotal: 11853824,
  heapUsed: 7590320,
  external: 8224 }
REPORT RequestId: 2a7548f9-5d2f-4060-8f9e-deb228730d8c  Duration: 155.74 ms Billed Duration: 200 ms     Memory Size: 128 MB Max Memory Used: 56 MB  

Тест 2 : создать массивс 1 000 000 элементов в памяти

Объем памяти: 128 МБ

exports.handler = async (event) => {
    const arr = [];
    for (let i = 0; i < 1000000; i++) {
        arr.push(i);
    }
    console.log(process.memoryUsage());
    return 'done';
};

Результат : 99 МБ

2019-04-30T01:03:44.582Z    547a9de8-35f7-48e2-a53f-ab669b188f9a    { rss: 80093184,
  heapTotal: 55263232,
  heapUsed: 52951088,
  external: 8224 }
REPORT RequestId: 547a9de8-35f7-48e2-a53f-ab669b188f9a  Duration: 801.68 ms Billed Duration: 900 ms     Memory Size: 128 MB Max Memory Used: 99 MB  

Тест 3 : Создать массив с 10 000 000 элементов в памяти

Объем памяти: 128 МБ

exports.handler = async (event) => {
    const arr = [];
    for (let i = 0; i < 10000000; i++) {
        arr.push(i);
    }
    console.log(process.memoryUsage());
    return 'done';
};

Результат : 128 МБ

REPORT RequestId: f1df4f39-e0fc-4b44-8f90-c3c0e3d9c12d  Duration: 3001.33 ms    Billed Duration: 3000 ms    Memory Size: 128 MB Max Memory Used: 128 MB 
2019-04-30T00:54:32.970Z f1df4f39-e0fc-4b44-8f90-c3c0e3d9c12d Task timed out after 3.00 seconds

Я думаю, что мымогу с уверенностью сказать, что объем памяти, используемой лямбда-контейнером, увеличивается в зависимости от размера массива в памяти;в нашем третьем тесте мы закончили работу над памятью и тайм-аутом.Мое предположение здесь состоит в том, что процесс, который контролирует выполнение лямбды, также контролирует, сколько памяти получает это выполнение;вероятно на cat /proc/meminfo, как предполагают трогнандеры.

2 голосов
/ 30 апреля 2019

Хорошо, поэтому я использовал следующий код и увеличил количество значений массива, чтобы получить корреляцию.Три теста были выполнены на каждом максимальном значении массива.Лямбда была установлена ​​на 1024MB.Каждый элемент массива имеет длину 10 символов / байт.

const util = require('util');
const exec = util.promisify(require('child_process').exec);


async function GetContainerUsage()
{
     const { stdout, stderr } = await exec('cat /proc/meminfo');
    // console.log(stdout);
    let memInfoSplits = stdout.split(/[\n: ]/).filter( val => val.trim());
    // console.log(memInfoSplits[19]); // This returns the "Active" value which seems to be used
    return Math.round(memInfoSplits[19] / 1024);
}


function GetMemoryUsage()
{
    const used = process.memoryUsage();

    for (let key in used)
        used[key] = Math.round((used[key] / 1024 / 1024));

    return used;
}

exports.handler = async (event, context) => 
{
    let max = event.ArrTotal;
    let arr = [];
    for(let i = 0; i < max; i++)
    {
        arr.push("1234567890"); //10 Bytes
    }

    let csvLine = [];
    let jsMemUsed = GetMemoryUsage(); 
    let containerMemUsed = await GetContainerUsage(); 


    csvLine.push(event.ArrTotal);
    csvLine.push(jsMemUsed.rss);
    csvLine.push(jsMemUsed.heapTotal);
    csvLine.push(jsMemUsed.heapUsed);
    csvLine.push(jsMemUsed.external);
    csvLine.push(containerMemUsed);  

    console.log(csvLine.join(','));
    return true;
};

Это выводит следующие значения, используемые в CSV:

Array Count, JS rss, JS heapTotal, JS heapUsed, external, System Active, Lambda reported usage
1,30,7,5,0,53,54
1,31,7,5,0,53,55
1,30,8,5,0,53,55
1000,30,8,5,0,53,55
1000,30,8,5,0,53,55
1000,30,8,5,0,53,55
10000,30,8,5,0,53,55
10000,31,8,6,0,54,56
10000,33,7,5,0,54,57
100000,32,12,7,0,56,57
100000,34,11,8,0,57,59
100000,36,12,10,0,59,61
1000000,64,42,39,0,88,89
1000000,60,36,34,0,84,89
1000000,60,36,34,0,84,89
10000000,271,248,244,0,294,297
10000000,271,248,244,0,295,297
10000000,271,250,244,0,295,297

Что, если графически становится: enter image description here

Таким образом, при 10 миллионах элементов массив считается равным 10 мил * 10 байтов = 100 МБ.Должны быть некоторые накладные расходы, которые я пропускаю где-то, поскольку в других местах используется около 200 МБ.Но, по крайней мере, существует четкая линейная корреляция, с которой я теперь могу работать.

0 голосов
/ 03 мая 2019

Спецификация мощности для FaaS против PaaS

Вся идея выполнения вычислений с использованием лямбда-функций (FaaS) заключается в том, что меньше всего беспокоит планирование емкости.Теперь, учитывая, что облачный провайдер по умолчанию не может выбрать много вариантов, настройки памяти и тайм-ауты - это некоторые настройки, которые AWS использует для настройки функции.По-видимому, если вы протестируете это, вы можете увидеть, что настройки памяти определяют не только память, но и вычислительную мощность процессора.Это как указано AWS -

Lambda распределяет мощность ЦП линейно пропорционально количеству сконфигурированной памяти.При 1792 МБ функция эквивалентна 1 полному vCPU (одна vCPU-секунда кредитов в секунду)

Ref https://docs.aws.amazon.com/lambda/latest/dg/resource-model.html

Следовательно, этого недостаточно для рассмотренияобъем оперативной памяти, а также скорость процессора, с которой она выполнялась и завершает функцию.AWS не вызывает, какую емкость или процессор / память / тип сервера / IOPS они используют в этих контейнерах, и при этом они не показывают это использование в каких-либо показателях CW, таких как экземпляр EC2.Следовательно, нам нужно выбрать настройки памяти на основе тестирования.

Каждый лямбда (nodejs) будет иметь свой собственный объем памяти и выделенный набор зависимостей модуля узла.Следовательно, каждый из них должен быть протестирован на нагрузку и производительность для настройки памяти и параметров тайм-аута и не может быть спланирован заранее.

Наблюдение за общими исследованиями С любой стандартной лямбда-функцией на основе nodejs, которая имеет регистрацию иделает просто привет мир, развернутый без VPC

  • 128 МБ может показать время выполнения, скажем, 150+ мс, а биллинг 200 мс для 128 МБ
  • 256 МБ может показать исполнениевремя, скажем, 80+ мс и биллинг 100 мс для 256 МБ

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

Атрибуты, такие как тайм-аут, основаны исключительно на том, сколько времени занимает выполнение функции для выполнения операции, которая может быть слишком высокой для операций пакетного задания (скажем, 10 м) по сравнению с веб-сервисом, который ожидает быстрого ответа (скажем, 10 с),Тайм-аут раньше, чем ожидание каких-либо длинных ожидающих зависимостей, важен, чтобы избежать высоких счетов в случае высокопроизводительных API.В случае API медленное время ожидания может привести к тому, что альтернативные контейнеры (функции) будут увеличиваться в масштабе для новых запросов, что также может повлиять на количество IP-адресов, выделяемых в подсети, в которой размещена функция (в случае, если функция выполняется в виртуальном частном процессоре).

Лямбда-ограничения на ENI и IP-адреса или максимальный лямбда-параллелизм внутри учетной записи / региона - важные факторы, которые следует учитывать при планировании емкости.Ref https://docs.aws.amazon.com/lambda/latest/dg/limits.html

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