Kubernetes(AKS)中的CPU利用率未达到预期值

rkue9o1l  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(1)|浏览(116)

我有一个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
js4nwp54

js4nwp541#

默认情况下,Kubernetes将根据需要为pod分配尽可能多的CPU,直到节点的限制。但是,如果您为pod设置了CPU请求和限制,Kubernetes将保证pod至少获得请求的CPU量,但它只能使用限制的CPU量。这有助于确保Pod获得足够的CPU来运行其工作负载。
下面是一个示例YAML文件,用于在AKS上为ASP.NET 8 CPU绑定的Pod实现更高级别的CPU利用率:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: mcr.microsoft.com/dotnet/aspnet:8.0
        resources:
          requests:
            cpu: "16"
          limits:
            cpu: "16"
        affinity:
          podAntiAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchExpressions:
                  - key: app
                    operator: In
                    values:
                    - my-app
                topologyKey: kubernetes.io/hostname

此YAML文件将创建具有一个副本的部署。复制副本的CPU请求为16核,CPU限制为16核。这意味着副本将保证获得至少16个CPU核心,但如果需要,它只能使用最多16个核心。
Pod关联规则将确保副本不会与同一部署的任何其他副本调度到同一节点。这将有助于确保每个副本具有足够的可用CPU资源。从而防止该POD被调度到与具有相同标签的其它POD相同的节点。
创建部署后,您应该看到复制副本开始使用更多的CPU资源。您可以使用kubectl top pods命令监视复制副本的CPU利用率。
参考链接-# Resource Management for Pods and Containers

相关问题