我有一个 Web 应用程序,将一些资源密集型任务卸载到由 Fargate 支持的 AWS Batch。
这是一个非常简单的设置 - 单个队列、单个作业定义和单个计算环境。计算环境有限制Maximum vCPUs: 128
,没有最低 vCPU。
可以预先估计作业的复杂性,因此在提交作业时,应用程序会覆盖resourceRequirement
参数以满足估计的计算能力需求。等效的 CLI 命令如下:
aws batch submit-job \
--job-name "test-job-1" \
--job-definition "staging-batch" \
--job-queue "staging-normal-priority" \
--container-overrides 'resourceRequirements=[{type=VCPU,value=16},{type=MEMORY,value= 32768}]'
当我在 Web 控制台中查看作业的容器详细信息时,我可以看到请求的值:vCPUs 16.0, Memory 32768
,我认为这意味着命令语法是正确的。
但是,如果我将作业修改command
为 curl,${ECS_CONTAINER_METADATA_URI_V4}
则返回的响应将"Limits"=>{"CPU"=>2}
始终如一。1 CPU = 2 vCPU,所以我希望这是"CPU"=>8
。“Fargate On-Demand vCPU 资源计数”的“应用的账户级配额值”为 4000(AWS 默认值为 6),这意味着没有配额引起的限制。
有没有办法在 Fargate 上获取所需的 vCPU 数量,或者这是否意味着 AWS 没有足够的按需资源可供分配,因此一直给我 2 个 CPU?
编辑:如果我运行 ruby Etc.nprocessors
(基于 sysconf(_SC_NPROCESSORS_ONLN) / sched_getaffinity ),我会得到 16,所以我猜 Fargate 盒子给我的 2 CPU 限制是转移注意力的借口。那么问题来了,为什么它会报告 2 的限制?