我有一个ASP.NET 8 CPU绑定的进程。此过程的范围是解析大量数据并对其进行计算。工作流是高度并行化的,因此为了获得最大的性能,我利用了异步计算和并行处理。
使用的语言是F#,并行化是基于异步计算和异步。没有节流的并行(最大并行度)。
出于测试目的,我使用了一台16核、64G RAM和Windows 10的笔记本电脑。正如预期的那样,当进程运行时,所有16个内核的利用率都飙升至100%。
相反,生产环境是一个AKS Linux节点(同样是16个内核和64 G RAM)。docker镜像基于标准的mcr.microsoft.com/dotnet/aspnet:8.0。至于部署,pod是在没有资源限制的情况下创建的,根据k8s文档,这应该使pod使用节点中的所有资源。
相反,我发现节点CPU利用率很少超过20%。此外,kubectl top pod仅显示pod的CPU使用率为2693m(我预计为16)。
我想实现的是更高水平的CPU利用率,以减少执行时间(笔记本电脑中的小时数)。
由于代码相同,我怀疑我没有正确设置pod。
有人能帮帮忙吗
更新
根据评论请求,在pod下面描述输出
Name: yatp-maintenance-train-study-8mvwd
Namespace: yatp
Priority: 0
Service Account: default
Node: aks-studypool-35366450-vmss000000/10.224.0.8
Start Time: Thu, 05 Oct 2023 10:47:17 +1100
Labels: controller-uid=d6ea910b-67fb-43fb-b168-a8ccfa4c920c
job-name=yatp-maintenance-train-study
Annotations: <none>
Status: Running
IP: 10.244.3.6
IPs:
IP: 10.244.3.6
Controlled By: Job/yatp-maintenance-train-study
Containers:
yatp-maintenance-train-study:
Container ID: containerd://95cea040177e3b1593e6e593f979c448af783d678032a78e742aff500e5f452c
Image: yapdemocontainerregistry.azurecr.io/yatp-maintenance:0.0.5
Image ID: yapdemocontainerregistry.azurecr.io/yatp-maintenance@sha256:8a8c2f02c8106417ffd0d025a2831b142294237b9764d30a34bfa6a9648a1872
Port: 8080/TCP
Host Port: 0/TCP
Args:
train-study
--product
GCA@650
--def
Pmap@Pete_0.0.4
State: Running
Started: Thu, 05 Oct 2023 10:47:18 +1100
Ready: True
Restart Count: 0
Requests:
cpu: 80
memory: 350Gi
Environment:
ASPNETCORE_URLS: http://+:8080
YATP_ENVIRONMENT: AKS
YATP_AZURE_STORAGE_CONNECTION_STRING: DefaultEndpointsProtocol=https;AccountName=yatpdemo1storageaccount;AccountKey=XzsajB+bBSls5+017BCMgLkLhVCwpVlksRi9P7iJTFDlG4PlrOuHN3yDtXfv5q+FfImoH+FinWlj+AStCaC35A==;EndpointSuffix=core.windows.net
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-jhmkk (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-jhmkk:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: Burstable
Node-Selectors: scope=study
Tolerations: kubernetes.azure.com/scalesetpriority=spot:NoSchedule
node.kubernetes.io/memory-pressure:NoSchedule op=Exists
node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
yatp=yatp:NoSchedule
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 24m default-scheduler Successfully assigned yatp/yatp-maintenance-train-study-8mvwd to aks-studypool-35366450-vmss000000
Normal Pulling 24m kubelet Pulling image "yapdemocontainerregistry.azurecr.io/yatp-maintenance:0.0.5"
Normal Pulled 24m kubelet Successfully pulled image "yapdemocontainerregistry.azurecr.io/yatp-maintenance:0.0.5" in 956.43429ms (956.443792ms including waiting)
Normal Created 24m kubelet Created container yatp-maintenance-train-study
Normal Started 24m kubelet Started container yatp-maintenance-train-study
1条答案
按热度按时间js4nwp541#
默认情况下,Kubernetes将根据需要为pod分配尽可能多的CPU,直到节点的限制。但是,如果您为pod设置了CPU请求和限制,Kubernetes将保证pod至少获得请求的CPU量,但它只能使用限制的CPU量。这有助于确保Pod获得足够的CPU来运行其工作负载。
下面是一个示例YAML文件,用于在AKS上为ASP.NET 8 CPU绑定的Pod实现更高级别的CPU利用率:
此YAML文件将创建具有一个副本的部署。复制副本的CPU请求为16核,CPU限制为16核。这意味着副本将保证获得至少16个CPU核心,但如果需要,它只能使用最多16个核心。
Pod关联规则将确保副本不会与同一部署的任何其他副本调度到同一节点。这将有助于确保每个副本具有足够的可用CPU资源。从而防止该POD被调度到与具有相同标签的其它POD相同的节点。
创建部署后,您应该看到复制副本开始使用更多的CPU资源。您可以使用
kubectl top pods
命令监视复制副本的CPU利用率。参考链接-# Resource Management for Pods and Containers