Lambda持续时间>比预期长10倍

时间:2018-03-12 01:35:41

标签: amazon-web-services aws-lambda

在下面的示例中,我有一个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
  • 在此示例中,容器正在从先前的执行中重用。
  • 持续时间似乎变化很大。有时它<100ms,有时> 1s。

有没有办法调查/缩短这段时间?看到很多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)

1 个答案:

答案 0 :(得分:1)

根据找到的信息here回答我自己的问题:

我的Lambda的RAM配置为128mb,我的执行时间在~100ms到~1s之间,即使是重复使用的容器也是如此。

将RAM增加到1536mb后,我的执行时间始终低于100ms。 1536mb显然每毫秒贵得多,但我预计由于执行时间减少,我的整体价格不会大幅提升。