我正在尝试在AWS Lambda函数中生成同步子进程(运行ffprobe),但它几乎立即(200ms)死于信号SIGSEGV。
我对分段错误的理解是,它是一个尝试访问不允许访问的内存的进程。我尝试将内存增加到1024MB(我使用128MB,因为每次执行仅使用大约56MB),但这并没有改变任何内容。
我知道我不是唯一遇到此问题的人:https://forums.aws.amazon.com/thread.jspa?threadID=229397
任何人都知道如何解决这个问题?
2016年4月25日更新
为清楚起见,我正在运行的代码是:
import { spawnSync } from 'child_process';
exports.handler = (event, context) => {
process.env.PATH = `${process.env.PATH}:${process.env.LAMBDA_TASK_ROOT}`;
const ffprobe = './ffprobe';
const bucket = event.Records[0].s3.bucket.name;
const key = event.Records[0].s3.object.key;
console.log(`bucket: ${bucket}`);
console.log(`key: ${key}`);
const url = 'http://my-clip-url.com'; // An s3 presigned url.
if (!url) {
throw new Error('Clip does not exist.');
}
const command = `-show_format -show_streams -print_format json ${url}`;
try {
const child = spawnSync(ffprobe, command.split(' '));
console.log(`stdout: ${child.stdout.toString()}`)
console.log(`stderr: ${child.stderr.toString()}`)
console.log(`status: ${child.status.toString()}`)
console.log(`signal: ${child.signal.toString()}`)
} catch (exception) {
console.log(`Process crashed! Error: ${exception}`);
}
};
其输出为:
START RequestId: 6d72847 Version: $LATEST
2016-04-25T19:32:26.154Z 6d72847 stdout:
2016-04-25T19:32:26.155Z 6d72847 stderr:
2016-04-25T19:32:26.155Z 6d72847 status: 0
2016-04-25T19:32:26.155Z 6d72847 signal: SIGSEGV
END RequestId: 6d72847
REPORT RequestId: 6d72847 Duration: 4151.10 ms Billed Duration: 4200 ms Memory Size: 256 MB Max Memory Used: 84 MB
我使用无服务器框架来发布和部署我的代码。
注意:我已尝试在EC2(http://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html)上的ami-bff32ccc实例上运行此二进制文件并且它可以正常工作。所以它一定是我正在做的事情(我如何执行ffprobe)。
答案 0 :(得分:3)
我使用的ffprobe版本来自John Van Sickle's site,虽然我在Amazon Linux EC2实例上运行它时工作,但它无法在AWS Lambda上运行。
根据Jeff Learman的建议,我在AWS Lambda this wonderful script使用的当前环境版本上使用as described here构建了自己的版本。然后我用我的Lambda函数部署它,它第一次工作! :)
答案 1 :(得分:2)
<强> Prolegomenom:强>
我想知道我是否应将以下内容发布为评论或答案。我之所以这么想是因为我对你的实际问题感到有些困惑。在第一次阅读时,显然您希望克服错误,但您并没有帮助我们将其置于语境中,例如,向我们展示您的代码。此外,您发布的帖子中讨论的问题是相关的,但作者提出了一个更一般的问题:“如何调试问题”,我有一个答案:
<强>答案强>:
Lambda日志在CloudWatch中可用。当您尝试访问不允许的内容时(如您所指出的那样)会导致SIGSEGV,这可能是因为内存被另一个进程锁定,有时因为您没有权限访问您正在访问的内容,或者可能访问某些内容,以便将某些内容设置为nil,稍后将其用作内存地址等。您可以在代码中添加日志语句,以调查函数中实际发生的情况,并使用CloudWatch读取此类日志:http://docs.aws.amazon.com/lambda/latest/dg/monitoring-functions-logs.html
<强>结论强>:
你的问题无法解决,因为你没有完全解释这个问题,但至少,我指的是你如何调查它:
如果您需要更多帮助,可以发布您的代码。
答案 2 :(得分:2)
试试这个。让你的Lambda函数产生一个执行此操作的bash shell:
ggplotly()
然后检查名为“/ tmp / core”的文件,如果存在,则将其复制到S3存储桶(或其他),并使用gdb在开发系统或EC2主机上对其进行分析。我自己没有验证过,但我知道默认情况下ulimit为零,核心文件将转储到当前目录。请注意,这些细节如有更改,恕不另行通知(如果内存供我使用,最近已更改。)
当然,“cd”可能发生在lambda函数中。如果nodejs提供了设置ulimit的方法,那么它也可能发生在那里。
[编辑:正确的模式是/tmp/core.%e.%p,请参阅“man core”进行解释。]