如何防止长寿命的硒进程产生OOM错误?



如何防止使用硒的容器在获得OOM错误并看到Failed to start thread - pthread_create failed (EAGAIN)后"冻结"?问题的根本原因是什么?我该如何解决?此外,如何在本地测试解决方案以及如何在AWS上实现解决方案?

以下是诊断和解决由于长期存在的Selenium实例而出现的OOM问题的指南。具体来说,在AWS上,如果Selenium进程运行的时间足够长,可能会出现Failed to start thread - pthread_create failed (EAGAIN) for attributes: stacksize: 1024k, guardsize: 0k, detached.和可怕的OOM错误。本指南假设你正在使用Docker,并且可以通过docker run <some args if you wish> your_image来运行你的Docker文件。

诊断使用docker run ...运行应用程序。在一个单独的标签做docker ps,找到你的Container ID和做docker container stats CONTAINER_ID。关键是观察PIDS列。现在触发selenium进程运行,最好运行多次(为了测试这一点,您可能希望创建一个for循环来进行测试)。您将注意到pid会无限制地增长。这是因为(参考:Selenium留下正在运行的进程?)会留下僵尸进程。

解决方案

解决方案是剔除僵尸进程。具体来说,每个Selenium留下正在运行的进程?有一个标志--init,这将是解决方案的关键。您需要运行docker run --init ...(注意--init)。根据https://docs.docker.com/engine/reference/run/"您可以使用——init标志来指示应该使用init进程作为容器中的PID 1。指定一个init进程可以确保init系统通常的职责,比如获取僵尸进程,在创建的容器中执行。. 要确信该解决方案适用于您,请使用docker run --init ...运行映像。重新触发对Selenium的调用。这一次,pid可能会增长,但不会没有限制(对我来说,pid的数量从未超过200)。

解决方案- AWS

参考是https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-linuxparameters.html和https://www.ernestchiang.com/en/posts/2021/using-amazon-ecs-exec/在"任务定义"中(搜索"ECS")->点击Task Definitions)选择您的任务定义。然后滚动到底部,点击Configure via JSON。接下来,找到linuxParameters,如果它为null,将null替换为值:

{
"initProcessEnabled": true
}

如果你已经有一个JSON值linuxParameters然后添加"initProcessEnabled": true作为JSON参数。接下来,创建任务定义和部署!

解决方案-其他

我没有使用谷歌云或微软产品,所以我不知道如何添加--init标志。如果有人有这样的经验可以告诉我如何做到这一点,我很乐意更新指南。

最新更新