首页 > 解决方案 > 使用内存不足的 Lambda 向 SQS 缓慢发送消息

问题描述

我们创建了一些示例 lambda 来测试 SQS 插入性能。起初,我们使用 128MB 的 lambda,平均插入 7KBytes 包的时间为 40ms。当我们将 lambda 升级到 256MB 时,我们得到了 20 毫秒的平均插入时间,当我们升级到 512MB 时,我们甚至得到了 11 毫秒的平均插入时间。

我们想知道为什么 lambda 的更大内存/cpu 会在 SQS 上获得更好的插入速度,因为我们认为 sqs 插入不应该与内存或 CPU 容量相关。综上所述:sqs客户端发送操作里面有没有需要好的CPU/Memory才能更好执行的操作?

谢谢!

这是我们的测试代码: public class Function {

    public async Task<string> FunctionHandler(ILambdaContext context)
    {
        var client = new AmazonSQSClient();

        var request = new SendMessageRequest
        {
            MessageAttributes = new Dictionary<string, MessageAttributeValue>(),

            MessageBody = "7kbyte String here...",
            QueueUrl = "https://our_account/sqs-test-queue  "
        };

       //Just desconsidering the first 2 sent messages, to desconsider the initial connection overhead 
        var elapsed00 = await SendMessageResponse(client, request, -2);
        var elapsed0 = await SendMessageResponse(client, request, -1);

        double totalTime = 0;
        const int totalIterations = 1000;
        for (int j = 0; j < totalIterations; j++)
        {
            var elapsed = await SendMessageResponse(client, request, j);
            totalTime += elapsed;
        }

        Console.WriteLine("$$$$$AVERAGE:" + ((double)(totalTime / totalIterations)));

        return "End test";
    }

    private  async Task<long> SendMessageResponse(AmazonSQSClient client, SendMessageRequest request, int i)
    {
        var stopwatch = new Stopwatch();
        stopwatch.Start();
        var response = await client.SendMessageAsync(request);
        stopwatch.Stop();
        //Console.WriteLine("&&&#####" + i + "Elapsed ms:" + stopwatch.ElapsedMilliseconds + ". For message ID '" +
          //                response.MessageId + "':");
        i++;
        return stopwatch.ElapsedMilliseconds;
    }
}

标签: performanceamazon-web-servicesaws-lambdaamazon-sqs

解决方案


SQS 的行为与您的 lambda 大小没有什么不同,您在 Lambda 中运行的代码正在根据分配的内存/CPU 改变它的性能。


推荐阅读