AWS ECS docker 容器随机崩溃,netcoreapp2.0 的错误代码为 137
AWS ECS docker containers crash randomly with Error code 137 for netcoreapp2.0
我们最近将 .net4.6 WEB API 迁移到了 netcoreapp2.0
我们正在使用 AWS ECS docker 容器来部署我们的服务。
短时负载测试工作正常。
但是长时间的 运行ning 负载测试表明 docker 容器回收错误代码 137。
在整个负载测试期间,内存和 CPU 利用率都是正常的 ~30%。
由于错误 137 与内存相关,已尝试以下修复。
- 更改了垃圾收集模式:
< ServerGarbageCollection>true< /ServerGarbageCollection>
< ConcurrentGarbageCollection>true< /ConcurrentGarbageCollection>
- 迁移到 netcore 2.0.3,因为它有一些内存管理修复。
FROM microsoft/dotnet:2.0.3-runtime
- 已配置cgroup,如下是docker日志中的一些错误
cgroup: docker-runc (3365) created nested cgroup for controller "memory" which has incomplete hierarchy support. Nested cgroups may change behavior in the future.
[ 23.104548] cgroup: "memory" requires setting use_hierarchy to 1 on the root
我们的 ECS 任务配置如下:
- 运行ning 任务数:2 对 2 C4.xlarge EC2 位于 ECS 后面。
- 内存软限制:2 Gb
- 还验证了我们的 Healthcheck 端点,它没有任何问题并且响应速度很快。甚至尝试用 200 Ok
对 healhcheck 进行硬编码
一些 Docker 日志:(注意 OOM killed 是错误的,即使没有内核级日志。)
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 137,
"Error": "",
"StartedAt": "2018-02-12T06:15:00.481719209Z",
"FinishedAt": "2018-02-12T07:13:02.962733905Z"
},
一些奇怪的观察,如果我们 运行 直接在 docker 容器 ip 和端口上加载测试。他们工作得很好。如果我们通过 ALB 运行 它们,就会观察到崩溃行为。
请让我知道任何其他 linux 命令,它可以给我进程终止的实际原因或对上述情况的任何可能的修复。
您对 ALB 请求的 heatlhcheck 响应是否良好?
137 退出代码表示您的容器已被 ECS 代理杀死。
实际问题是由于线程匮乏造成的,因为我们在进行负载测试时,我们的应用程序大量使用线程。随着负载的增加,容器急需线程,新的请求开始排队。 healthcheck 也排在其中。当前正在执行的线程无法完成,因为它们也由于某种原因被阻塞。所以 docker 由于健康检查超时而杀死了我们的容器。
我们在 Startup.cs 中将最小线程数增加到 100 以解决此问题。
我们最近将 .net4.6 WEB API 迁移到了 netcoreapp2.0 我们正在使用 AWS ECS docker 容器来部署我们的服务。
短时负载测试工作正常。 但是长时间的 运行ning 负载测试表明 docker 容器回收错误代码 137。
在整个负载测试期间,内存和 CPU 利用率都是正常的 ~30%。
由于错误 137 与内存相关,已尝试以下修复。
- 更改了垃圾收集模式:
< ServerGarbageCollection>true< /ServerGarbageCollection> < ConcurrentGarbageCollection>true< /ConcurrentGarbageCollection>
- 迁移到 netcore 2.0.3,因为它有一些内存管理修复。
FROM microsoft/dotnet:2.0.3-runtime
- 已配置cgroup,如下是docker日志中的一些错误
cgroup: docker-runc (3365) created nested cgroup for controller "memory" which has incomplete hierarchy support. Nested cgroups may change behavior in the future. [ 23.104548] cgroup: "memory" requires setting use_hierarchy to 1 on the root
我们的 ECS 任务配置如下:
- 运行ning 任务数:2 对 2 C4.xlarge EC2 位于 ECS 后面。
- 内存软限制:2 Gb
- 还验证了我们的 Healthcheck 端点,它没有任何问题并且响应速度很快。甚至尝试用 200 Ok 对 healhcheck 进行硬编码
一些 Docker 日志:(注意 OOM killed 是错误的,即使没有内核级日志。)
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 137,
"Error": "",
"StartedAt": "2018-02-12T06:15:00.481719209Z",
"FinishedAt": "2018-02-12T07:13:02.962733905Z"
},
一些奇怪的观察,如果我们 运行 直接在 docker 容器 ip 和端口上加载测试。他们工作得很好。如果我们通过 ALB 运行 它们,就会观察到崩溃行为。
请让我知道任何其他 linux 命令,它可以给我进程终止的实际原因或对上述情况的任何可能的修复。
您对 ALB 请求的 heatlhcheck 响应是否良好?
137 退出代码表示您的容器已被 ECS 代理杀死。
实际问题是由于线程匮乏造成的,因为我们在进行负载测试时,我们的应用程序大量使用线程。随着负载的增加,容器急需线程,新的请求开始排队。 healthcheck 也排在其中。当前正在执行的线程无法完成,因为它们也由于某种原因被阻塞。所以 docker 由于健康检查超时而杀死了我们的容器。
我们在 Startup.cs 中将最小线程数增加到 100 以解决此问题。