Expand my Community achievements bar.

AIO Runtime action exhausts memory

Avatar

Level 1

Hi.
We are experiencing an issue with an action that exhausts it's memory, when the payload has a string array with ~1000+ values. The values are all 10 characters. The entire payload is roughly 15 kilobytes.
We send the payload to a 3rd party endpoint, and the response is then used to update values in ACS. It seems to fail before even doing the first action of calling the first 3rd party endpoint, pretty much immediately after being invocated. It's pretty basic and should not use much memory, as far as I can tell.

With fewer than 1000 values there is no issue at all.

We are unable to get the console logs from the action container when this happens, making it very difficult to debug.
This error message is pretty much all the information I can get:
{
"error": "The action container exhausted its memory and was killed with 1 in flight activations"
}

From what I understand, we are nowhere near any memory limitations. How do we go about debugging?

Topics

Topics help categorize Community content and increase your ability to discover relevant content.

6 Replies

Avatar

Level 4

On one hand -- I think you could manually up the memory limit for this action to handle your compute loads. https://developer.adobe.com/runtime/docs/guides/using/system_settings/

 

It is weird that a payload that size is exhausted. Do you have a lot of dependencies in your action?

Avatar

Employee

Can you share a brief code sample that demonstrates the issue?

Avatar

Level 1

Yeah, but not so many that it should exceed the memory limit. They total up to ~12 mb and the entire project ~21.2 mb. I can see that the max code size, including dependencies, is 22 mb, which is not much more than what is currently used, but should still not reach that limit.

How do can I tell the current memory limit?

Avatar

Employee

Can you share a brief code sample that demonstrates the issue?

Avatar

Level 1

I can't go into specifics, and can't tell for sure where it breaks as the logs are unavailable when this happens, but I can tell that it breaks pretty early before other APIs are called.

I've obfuscated some logic here, but this is where I believe it fails, as there are no indications of it having fetched results. The large dataset is the "ids".

if (!('data' in params)) {
            return response.error('Data is not present as parameter');
        }
        const data = params.data;

        const validationResult = validate(data, INCOMING_DATA_SCHEMA);

        if (!validationResult.valid) {
            return response.error(validationResult.toString());
        }

        const uniqueIds = data.map(mappedData => mappedData.Id).filter((val, ind, arr) => arr.indexOf(val) === ind);

        let promises = data.map(async(mappedData) => {    
            //maps to request model, which is then used to fetch results from external API.
            let results = await fetchResults({
                ids: mappedData.ids.split(','),
                //other mapping, independent of size of payload
            });
            
        }  


 

Avatar

Employee

Thanks, it seems you are doing some work to get the uniqueIds, but  still iterating over the original data ... not sure if that is the issue, but my approach would be to write some tests make sure fetchResults is called the number of times you expect it to be.

Also, your promises array might not be what you expect, I think you need to wrap that in a Promises.all

 

const resultArray = await Promise.all(inputArray.map(async (i) => someAsyncFunction(i)));