AWS fargate 的性能问题
Pefromance issue with AWS fargate
我们在 Jboss As 7.1.1 中有一个旧的 Java 应用程序 运行。目前,此应用程序 运行 在 AWS EC2 实例类型 t3.medium 上,即 2 CPU 核和 4GB 内存。
我们正在尝试使用 CI/CD 和 AWS Fargate 使我们的应用程序现代化。我们成功实现了现代化,但没有性能。
Fargate 的任务定义与 EC2 实例具有相同的 CPU 和内存(2048 CPU 和 4096 内存)。 Farget 与 EC2 实例位于同一子网中并链接到同一安全组。我们无法理解性能缓慢的原因。
该应用程序通常会搜索音乐作品的详细信息(创作者、出版商、艺术家等)。如果我们处理一个有大量感兴趣方的音乐作品,在 EC2 实例中它需要不到 20 秒,但在 Fargate 中大约需要 30 分钟。
我在 EC2 实例和相同的 Java 版本上从相同的 Jboss 运行 创建了 docker 图像。
还有一条信息,数据库在不同的(非 AWS)数据中心。
能否指导我如何使用 AWS Fargate 实现与旧设置相同的性能?我在 Fargate 中缺少什么?
任务定义
{
"containerDefinitions": [
{
"name": "CONTAINER_NAME",
"image": "<IMAGE1_NAME>",
"memory": 4096,
"essential": true,
"logConfiguration": {
"logDriver": "awslogs",
"secretOptions": null,
"options": {
"awslogs-group": "/ecs/TaskDefinitionName",
"awslogs-region": "eu-central-1",
"awslogs-stream-prefix": "ecs"
}
},
"portMappings": [
{
"hostPort": 8080,
"containerPort": 8080,
"protocol": "tcp"
}
]
}
],
"compatibilities": [
"EC2",
"FARGATE"
],
"requiresCompatibilities": [
"FARGATE"
],
"networkMode": "awsvpc",
"cpu": "2048",
"memory": "4096",
"family": "TaskDefinitionName",
"taskRoleArn": "arn:aws:iam::accountId:role/ecsTaskExecutionRole",
"executionRoleArn": "arn:aws:iam::accountId:role/ecsTaskExecutionRole"
}
虽然您可以预期 EC2 和 Fargate 之间的性能差异很小,但您看到的增量非常“荒谬”,而且这里肯定有问题。设置是否 100% 相同(唯一的区别是任务运行的位置)?此外,您是否尝试过为了排除故障在更大的资源集(例如 4 个 vCPU / 30GB)上启动 Fargate 任务以查看是否有任何区别?再次只是为了弄清楚“容量”是问题还是其他地方的问题。
监控性能滞后的唯一方法是使用 Container insights。
只有这样,您才能监控 CPU 和内存利用率、网络带宽、性能日志等指标。如果需要,也许然后增加 CPU 限制和内存可能会有所帮助。然而,与性能工具验证的 AWS EC2 相比,Fargate 已被多次报告为更慢。目前AWS还没有给出具体的解决方案。
参考文献 -
- https://discuss.newrelic.com/t/php-agent-on-aws-fargate-performance-issue/124367
- https://filia-aleks.medium.com/ec2-versus-fargate-performance-comparison-34b1002fbbaa
- https://community.cloudonaut.io/t/spring-boot-on-fargate-slow/318
- https://www.reddit.com/r/aws/comments/921szi/migrating_java_applications_from_ec2_to_fargate/
- https://www.reddit.com/r/aws/comments/hqjyqd/ecs_performance_10x_slower_than_ec2_instances/
我从 AWS Support 得到的答复如下。
“ECS Fargate 任务可以放置在任何可用的底层主机上,并且满足任务定义中指定的 CPU 和内存,因此可能具有不同的性能。EC2 实例更适合于某些情况需要控制应用程序性能的地方。"
我对开发人员的建议是,如果网络吞吐量和 IO 性能对您的应用程序很重要,最好使用 EC2。
我们在 Jboss As 7.1.1 中有一个旧的 Java 应用程序 运行。目前,此应用程序 运行 在 AWS EC2 实例类型 t3.medium 上,即 2 CPU 核和 4GB 内存。
我们正在尝试使用 CI/CD 和 AWS Fargate 使我们的应用程序现代化。我们成功实现了现代化,但没有性能。
Fargate 的任务定义与 EC2 实例具有相同的 CPU 和内存(2048 CPU 和 4096 内存)。 Farget 与 EC2 实例位于同一子网中并链接到同一安全组。我们无法理解性能缓慢的原因。
该应用程序通常会搜索音乐作品的详细信息(创作者、出版商、艺术家等)。如果我们处理一个有大量感兴趣方的音乐作品,在 EC2 实例中它需要不到 20 秒,但在 Fargate 中大约需要 30 分钟。
我在 EC2 实例和相同的 Java 版本上从相同的 Jboss 运行 创建了 docker 图像。
还有一条信息,数据库在不同的(非 AWS)数据中心。
能否指导我如何使用 AWS Fargate 实现与旧设置相同的性能?我在 Fargate 中缺少什么?
任务定义
{
"containerDefinitions": [
{
"name": "CONTAINER_NAME",
"image": "<IMAGE1_NAME>",
"memory": 4096,
"essential": true,
"logConfiguration": {
"logDriver": "awslogs",
"secretOptions": null,
"options": {
"awslogs-group": "/ecs/TaskDefinitionName",
"awslogs-region": "eu-central-1",
"awslogs-stream-prefix": "ecs"
}
},
"portMappings": [
{
"hostPort": 8080,
"containerPort": 8080,
"protocol": "tcp"
}
]
}
],
"compatibilities": [
"EC2",
"FARGATE"
],
"requiresCompatibilities": [
"FARGATE"
],
"networkMode": "awsvpc",
"cpu": "2048",
"memory": "4096",
"family": "TaskDefinitionName",
"taskRoleArn": "arn:aws:iam::accountId:role/ecsTaskExecutionRole",
"executionRoleArn": "arn:aws:iam::accountId:role/ecsTaskExecutionRole"
}
虽然您可以预期 EC2 和 Fargate 之间的性能差异很小,但您看到的增量非常“荒谬”,而且这里肯定有问题。设置是否 100% 相同(唯一的区别是任务运行的位置)?此外,您是否尝试过为了排除故障在更大的资源集(例如 4 个 vCPU / 30GB)上启动 Fargate 任务以查看是否有任何区别?再次只是为了弄清楚“容量”是问题还是其他地方的问题。
监控性能滞后的唯一方法是使用 Container insights。 只有这样,您才能监控 CPU 和内存利用率、网络带宽、性能日志等指标。如果需要,也许然后增加 CPU 限制和内存可能会有所帮助。然而,与性能工具验证的 AWS EC2 相比,Fargate 已被多次报告为更慢。目前AWS还没有给出具体的解决方案。
参考文献 -
- https://discuss.newrelic.com/t/php-agent-on-aws-fargate-performance-issue/124367
- https://filia-aleks.medium.com/ec2-versus-fargate-performance-comparison-34b1002fbbaa
- https://community.cloudonaut.io/t/spring-boot-on-fargate-slow/318
- https://www.reddit.com/r/aws/comments/921szi/migrating_java_applications_from_ec2_to_fargate/
- https://www.reddit.com/r/aws/comments/hqjyqd/ecs_performance_10x_slower_than_ec2_instances/
我从 AWS Support 得到的答复如下。
“ECS Fargate 任务可以放置在任何可用的底层主机上,并且满足任务定义中指定的 CPU 和内存,因此可能具有不同的性能。EC2 实例更适合于某些情况需要控制应用程序性能的地方。"
我对开发人员的建议是,如果网络吞吐量和 IO 性能对您的应用程序很重要,最好使用 EC2。