在下面的示例中,我有一个AWS Lambda函数(用Node编写),其中业务逻辑在60ms内执行,但整个持续时间为794ms。
23:49:19 START RequestId: d1110932-2586-11e8-8d80-f74f5d6cf7b8 Version: $LATEST
23:49:20 2018-03-11T23:49:20.559Z d1110932-2586-11e8-8d80-f74f5d6cf7b8 Start of Lambda: 1520812160559
...
23:49:20 2018-03-11T23:49:20.619Z d1110932-2586-11e8-8d80-f74f5d6cf7b8 End of Lambda 1520812160619
23:49:20 END RequestId: d1110932-2586-11e8-8d80-f74f5d6cf7b8
23:49:20 REPORT RequestId: d1110932-2586-11e8-8d80-f74f5d6cf7b8 Duration: 794.57 ms Billed Duration: 800 ms Memory Size: 128 MB Max Memory Used: 52 MB
我很困惑为什么函数执行这么长时间,因为处理程序中的所有内容都在60ms内执行。
一些注意事项:
context.callbackWaitsForEmptyEventLoop
设置为false
有没有办法调查/缩短这段时间?看到很多Lambda的执行归因于启动时间,即使是在后续的执行中也常见吗?
相关代码:
export const getPublishedLessons = async (event, context, callback) => {
// establish inside of handler to avoid extra db connections
const lessonService = new LessonService()
try {
const results = await lessonService.getLessonsByFilter({ isPublished: true })
console.error('End of Lambda', moment().valueOf())
return respond(callback, results)
} catch(err) {
console.error(`Error in lessonHandler.getManyLessons: [${err}]`)
return fail(callback, err)
}
}
const eventWrapper = async (event, context, callback, eventFunction) => {
console.error('Start of Lambda: ', moment().valueOf())
context.callbackWaitsForEmptyEventLoop = false
if(event.source === 'serverless-plugin-warmup') {
// ensure db connection
await mongoFactory.getConnection(process.env.MONGO_URI, process.env.MONGO_DB_NAME)
const mongoService = new MongoService()
await mongoService.createIndexes('Lessons', [ _idIndex, lessonIdIndex ], indexOptions)
await mongoService.createIndexes('LessonThemes', [ _idIndex ], indexOptions)
await mongoService.createIndexes('LessonMetadata', [ typeIndex ], indexOptions)
await mongoService.createIndexes('Messages', [ _idIndex ], indexOptions)
await mongoService.createIndexes('PasswordRecovery', [ _idIndex ], indexOptions)
await mongoService.createIndexes('Profiles', [ _idIndex ], indexOptions)
await mongoService.createIndexes('UserLessons', [ _idIndex, lessonIdIndex, userIdIndex ], indexOptions)
await mongoService.createIndexes('UserProjects', [ _idIndex, userIdIndex ], indexOptions)
console.log('WarmUP - Lambda is warm!')
return callback(null, 'Lambda is warm!')
}
if(event.body && isString(event.body))
event.body = JSON.parse(event.body)
return await eventFunction(event, context, callback)
}
module.exports.getPublishedLessonsHandler = (...params) => eventWrapper(...params, getPublishedLessons)
答案 0 :(得分:1)
根据找到的信息here回答我自己的问题:
我的Lambda的RAM配置为128mb,我的执行时间在~100ms到~1s之间,即使是重复使用的容器也是如此。
将RAM增加到1536mb后,我的执行时间始终低于100ms。 1536mb显然每毫秒贵得多,但我预计由于执行时间减少,我的整体价格不会大幅提升。