我有用 NodeJS 编写的 Lambda。我注意到需要几秒钟才能完成。我添加了日志,发现 bcrypt 很慢。
套餐:
"dependencies": {
"bcryptjs": "^2.4.3",
源代码:
const bcrypt = require('bcryptjs');
console.log("User was found"); // following part takes more than 1 second!
if (bcrypt.compareSync(password, user.password)) {
console.log("Password verified"); //
这是来自 AWS LogWatch 的日志:
2020-01-13T20:25:30.951 User was found
2020-01-13T20:25:32.670 Password verified
和
2020-01-13T20:31:20.192 User was found
2020-01-13T20:31:21.550 Password verified
所以需要1.7秒。我在机器上的 docker 中运行了相同的代码
2020-01-13T20:09:48.109 User was found
2020-01-13T20:09:48.211 Password verified
在本地只需要 120 毫秒。 AWS 使用 NodeJS 10.x,本地 docker 镜像可能是 8.x。我不知道如何告诉 docker 反射(reflect)
packaged.yaml
中的更改.这是 NodeJS 回归吗?还是 AWS 配置上的一些问题?
最佳答案
加密性能通常受 CPU 限制。 AWS Lambda CPU 与 RAM 成正比,因此您应该选择最大的(3008 MB)并重新测试。
当我在 us-east-1 的 3008 MB RAM Lambda 上的 Lambda 函数处理程序中运行它时,compareSync 调用始终需要 90-100 毫秒。使用 128 MB Lambda,需要 1 秒多一点的时间。
与此相关的是,了解选择最低 (128 MB) RAM 选项(仅仅因为每 GB-s 更便宜)并不总是最好的做法是有帮助的。虽然最高 RAM 选项(具有成比例更高的 CPU 和网络)每 GB-s 肯定更昂贵,但它也可以更快地完成 Lambda 功能。因此,例如,您可能只需 1.75 倍的成本即可在 1/10 的时间内完成任务。在很多情况下,这可能是非常有值(value)的。
有一个项目可以帮助您调整 Lambda 的性价比:alexcasalboni/aws-lambda-power-tuning
关于node.js - 为什么 bcryptjs 在 AWS Lambda 上比在本地 docker 上慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59723906/