使用 NodeJS AWS SDK v3 与 v2 的高 AWS Lambda 执行持续时间
High AWS Lambda Execution Duration with NodeJS AWS SDK v3 vs. v2
我目前正在调查我在我正在处理的 NodeJS Lambda 中发现的一个有趣的问题。要点是,对于我的用例,NodeJS AWS SDK v3 似乎比 SDK v2 慢很多。
我可以改进什么才能使使用 AWS SDK v3 的 Lambda 与使用 AWS SDK v2 的 Lambda 一样“快”。
为了演示这一点,我创建了两个非常相似的 Lambda。两者都有 128MB 内存并使用 NodeJS 14.x 运行时。一个使用 SDK 的 v2,另一个使用 v3。两者都只有最少的代码,但执行时间却大不相同。
由于 SDK 的 v2 在运行时可用,我只需要部署我的 index.js
。对于 v3,我还必须部署 node_modules
,因为 v3 在开箱即用的运行时中不可用。
此外,两者都从同一个 S3 存储桶中获取相同的对象。对象本身是一个简单的文本文件,大小为 43
字节。
时长
v2: ~50-80ms (Duration: 69.80 ms Billed Duration: 70 ms Memory Size: 128 MB Max Memory Used: 90 MB)
v3: ~5500-7000ms (Duration: 6096.98 ms Billed Duration: 6097 ms Memory Size: 128 MB Max Memory Used: 97 MB)
那些时间来自“热门”的 Lambda。
使用 v2 SDK 的代码:
const AWS = require("aws-sdk");
const s3 = new AWS.S3();
exports.handler = async (event, context, callback) => {
const params = {Bucket: "<bucket>", Key: "test.txt"};
const data = await s3.getObject(params).promise();
return callback(null, data.ContentLength);
};
使用 v3 SDK 的代码:
const { S3Client, GetObjectCommand } = require("@aws-sdk/client-s3");
const client = new S3Client();
exports.handler = async (event, context, callback) => {
const command = new GetObjectCommand({Bucket: "<bucket>", Key: "test.txt"});
const data = await client.send(command);
return callback(null, data.ContentLength);
};
由于 v3 版本慢得多,我启用了 X-Ray 并检查了所有时间丢失的地方(见下图)。显然,“开销”是问题所在。
documentation 必须对“开销”说以下内容:
Represents the work done by the Lambda runtime to prepare to handle the next event.
我不知道运行时在这里要做什么。特别是,因为该方法实际上并没有做任何事情。
感谢Samrose Ahmed I got an answer to my question in an Github issue。
我错误地将 callback()
用于 AWS SDK v3。解决方案是简单地 return 一个值或承诺。
const { S3Client, GetObjectCommand } = require("@aws-sdk/client-s3");
const client = new S3Client();
exports.handler = async (event, context) => {
const command = new GetObjectCommand({Bucket: "<bucket>", Key: "test.txt"});
const data = await client.send(command);
return data.ContentLength;
};
我目前正在调查我在我正在处理的 NodeJS Lambda 中发现的一个有趣的问题。要点是,对于我的用例,NodeJS AWS SDK v3 似乎比 SDK v2 慢很多。
我可以改进什么才能使使用 AWS SDK v3 的 Lambda 与使用 AWS SDK v2 的 Lambda 一样“快”。
为了演示这一点,我创建了两个非常相似的 Lambda。两者都有 128MB 内存并使用 NodeJS 14.x 运行时。一个使用 SDK 的 v2,另一个使用 v3。两者都只有最少的代码,但执行时间却大不相同。
由于 SDK 的 v2 在运行时可用,我只需要部署我的 index.js
。对于 v3,我还必须部署 node_modules
,因为 v3 在开箱即用的运行时中不可用。
此外,两者都从同一个 S3 存储桶中获取相同的对象。对象本身是一个简单的文本文件,大小为 43
字节。
时长
v2: ~50-80ms (Duration: 69.80 ms Billed Duration: 70 ms Memory Size: 128 MB Max Memory Used: 90 MB)
v3: ~5500-7000ms (Duration: 6096.98 ms Billed Duration: 6097 ms Memory Size: 128 MB Max Memory Used: 97 MB)
那些时间来自“热门”的 Lambda。
使用 v2 SDK 的代码:
const AWS = require("aws-sdk");
const s3 = new AWS.S3();
exports.handler = async (event, context, callback) => {
const params = {Bucket: "<bucket>", Key: "test.txt"};
const data = await s3.getObject(params).promise();
return callback(null, data.ContentLength);
};
使用 v3 SDK 的代码:
const { S3Client, GetObjectCommand } = require("@aws-sdk/client-s3");
const client = new S3Client();
exports.handler = async (event, context, callback) => {
const command = new GetObjectCommand({Bucket: "<bucket>", Key: "test.txt"});
const data = await client.send(command);
return callback(null, data.ContentLength);
};
由于 v3 版本慢得多,我启用了 X-Ray 并检查了所有时间丢失的地方(见下图)。显然,“开销”是问题所在。
documentation 必须对“开销”说以下内容:
Represents the work done by the Lambda runtime to prepare to handle the next event.
我不知道运行时在这里要做什么。特别是,因为该方法实际上并没有做任何事情。
感谢Samrose Ahmed I got an answer to my question in an Github issue。
我错误地将 callback()
用于 AWS SDK v3。解决方案是简单地 return 一个值或承诺。
const { S3Client, GetObjectCommand } = require("@aws-sdk/client-s3");
const client = new S3Client();
exports.handler = async (event, context) => {
const command = new GetObjectCommand({Bucket: "<bucket>", Key: "test.txt"});
const data = await client.send(command);
return data.ContentLength;
};