当前位置: 首页 > 知识库问答 >
问题:

库伯内特斯CPU节流,CPU使用率远低于请求/限制

申屠俊发
2023-03-14

我对我的pod的所有容器设置了CPU和内存请求=限制,以使其符合有保证的服务质量等级。现在,查看过去6小时内同一Pod的CPU使用率和CPU节流图。

这看起来是不是很正常,也在意料之中?

CPU使用率甚至一次都没有达到设定限制的50%,但有时仍被限制在58%。

还有一个附带的问题,节流图中25%的红线表示什么?

我对这个主题做了一些研究,发现内核中有一个错误Linux可能导致这个问题,它在内核的4.18版本中得到了修复。参考:这个和这个

我们在GKE上运行谷歌的容器优化操作系统。我检查了我们节点上的linux内核版本,它们在4.19.112上,所以我想我们已经有了那个补丁?这种节流模式的原因还有什么?

P、 这个pod(实际上是一个具有自动缩放功能的部署)部署在一个单独的节点池上,该节点池上没有运行我们的其他工作负载。因此,除了此部署之外,在该节点池中的节点上运行的唯一pod是一些度量、日志代理和导出程序。以下是在调度上述pod的同一节点上运行的pod的完整列表。确实有一些吊舱没有设置任何CPU限制。我是否也需要对这些设置CPU限制?

我们的GKE版本是1.16.9-GKE。2.

下面是包含部署、服务和自动缩放器定义的清单文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: endpoints
  labels:
    app: endpoints
spec:
  replicas: 2
  selector:
    matchLabels:
      run: endpoints
  strategy:
    rollingUpdate:
      maxSurge: 2
      maxUnavailable: 0
  template:
    metadata:
      labels:
        run: endpoints
    spec:
      terminationGracePeriodSeconds: 60
      containers:
        - name: endpoints
          image: gcr.io/<PROJECT_ID>/endpoints:<RELEASE_VERSION_PLACEHOLDER>
          livenessProbe:
            httpGet:
              path: /probes/live
              port: 8080
            initialDelaySeconds: 20
            timeoutSeconds: 5
          readinessProbe:
            httpGet:
              path: /probes/ready
              port: 8080
            initialDelaySeconds: 20
            timeoutSeconds: 5
          ports:
            - containerPort: 8080
              protocol: TCP
          env:
            - name: GOOGLE_APPLICATION_CREDENTIALS
              value: "/path/to/secret/gke-endpoints-deployments-access.json"
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: DEPLOYMENT_NAME
              value: "endpoints"
          resources:
            requests:
              memory: "5Gi"
              cpu: 2
            limits:
              memory: "5Gi"
              cpu: 2
          volumeMounts:
            - name: endpoints-gcp-access
              mountPath: /path/to/secret
              readOnly: true
          lifecycle:
            preStop:
              exec:
                # SIGTERM triggers a quick exit; gracefully terminate instead
                command: ["/bin/sh","-c","sleep 3; /usr/sbin/nginx -s quit; sleep 57"]
        # [START proxy_container]
        - name: cloudsql-proxy
          image: gcr.io/cloudsql-docker/gce-proxy:1.16
          command: ["/cloud_sql_proxy",
                    "-instances=<PROJECT_ID>:<ZONE>:prod-db=tcp:3306,<PROJECT_ID>:<ZONE>:prod-db-read-replica=tcp:3307",
                    "-credential_file=/path/to/secret/gke-endpoints-deployments-access.json"]
          # [START cloudsql_security_context]
          securityContext:
            runAsUser: 2  # non-root user
            allowPrivilegeEscalation: false
          # [END cloudsql_security_context]
          resources:
            requests:
              memory: "50Mi"
              cpu: 0.1
            limits:
              memory: "50Mi"
              cpu: 0.1
          volumeMounts:
            - name: endpoints-gcp-access
              mountPath: /path/to/secret
              readOnly: true
        # [END proxy_container]
        # [START nginx-prometheus-exporter container]
        - name: nginx-prometheus-exporter
          image: nginx/nginx-prometheus-exporter:0.7.0
          ports:
            - containerPort: 9113
              protocol: TCP
          env:
            - name: CONST_LABELS
              value: "app=endpoints"
          resources:
            requests:
              memory: "50Mi"
              cpu: 0.1
            limits:
              memory: "50Mi"
              cpu: 0.1
        # [END nginx-prometheus-exporter container]
      tolerations:
        - key: "qosclass"
          operator: "Equal"
          value: "guaranteed"
          effect: "NoSchedule"
      nodeSelector:
        qosclass: guaranteed
      # [START volumes]
      volumes:
        - name: endpoints-gcp-access
          secret:
            secretName: endpoints-gcp-access
      # [END volumes]
---
apiVersion: cloud.google.com/v1beta1
kind: BackendConfig
metadata:
  name: endpoints-backendconfig
spec:
  timeoutSec: 60
  connectionDraining:
    drainingTimeoutSec: 60
---
apiVersion: v1
kind: Service
metadata:
  name: endpoints
  labels:
    app: endpoints
  annotations:
    cloud.google.com/neg: '{"ingress": true}' # Creates a NEG after an Ingress is created
    beta.cloud.google.com/backend-config: '{"ports": {"80":"endpoints-backendconfig"}}'
spec:
  type: NodePort
  selector:
    run: endpoints
  ports:
    - name: endpoints-nginx
      port: 80
      protocol: TCP
      targetPort: 8080
    - name: endpoints-metrics
      port: 81
      protocol: TCP
      targetPort: 9113
---
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: endpoints-autoscaler
spec:
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      targetAverageUtilization: 40
  - type: External
    external:
      metricName: external.googleapis.com|prometheus|nginx_http_requests_total
      metricSelector:
        matchLabels:
          metric.labels.app: endpoints
      targetAverageValue: "5"
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: endpoints
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: endpoints-nginx-monitor
  namespace: monitoring
  labels:
    app: endpoints-nginx-monitor
    chart: prometheus-operator-8.13.7
    release: prom-operator
    heritage: Tiller
spec:
  selector:
    matchLabels:
      app: endpoints
  namespaceSelector:
    any: true
  endpoints:
  - port: endpoints-metrics
    path: "/metrics"

这是部署中使用的唯一自定义容器映像的dockerfile:

# Dockerfile extending the generic PHP image with application files for a
# single application.
FROM gcr.io/google-appengine/php:latest

# The Docker image will configure the document root according to this
# environment variable.
ENV DOCUMENT_ROOT /app

RUN /bin/bash /stackdriver-files/enable_stackdriver_integration.sh

共有2个答案

谭勇
2023-03-14

你们通常会根据你们设定的阈值看到这样的线条,我相信你们可以在设定阈值时选择线条的颜色

姬英武
2023-03-14

我不知道那条红线是什么,所以我将跳过那条红线。不过,很高兴知道您期望CPU节流情况会发生什么。

因此,关于您的CPU使用率和节流,没有迹象表明会出现任何问题。当有大量CPU可用时,任何现代系统都会发生CPU节流。因此,它会减慢时钟,并开始运行较慢(例如,2.3GHz机器切换到2.0GHz)。这就是您不能根据百分比设置CPU限制的原因。

所以,从你的图表中,我推测看到的是CPU时钟下降,自然百分比上升;正如预期的那样。没什么奇怪的。

 类似资料:
  • 我在pod中运行了高视频编码任务。这些任务在接收用户请求时运行,并且CPU密集型非常高。我想确保CPU使用率最低的pod应该在传入请求中接收。库伯内特斯有没有办法根据CPU使用率的百分比来平衡我的负载?

  • 我试图在prometheus中创建一个警报规则,以便当标签为agentpool=“worker”的所有节点在过去3分钟内的平均CPU使用率低于30%时,它会发出警报。

  • 我正在使用库伯内特斯HPA来扩展我的集群。我已经设置了目标CPU利用率为50%。它正在正确扩展。但是,当负载减少并且它扩展得如此之快时。我想设置一个冷却期。例如,即使CPU util低于50%,它也应该在终止节点之前等待60秒。 我查看了这篇文章,但它并不是说我可以更改HPA中的默认值,https://kubernetes.io/docs/concepts/workloads/pods/pod/i

  • 有人可以指导我,如何计算POD的百分比[CPU和内存]的使用情况,并提供以下可用信息 kubectl top pods -n 默认 kubectl描述pod TEST

  • 在Kubernetes中使用CPU请求/限制时,我遇到了一个奇怪的问题。在设置任何CPU请求/限制之前,我的所有服务都执行得很好。我最近开始设定一些资源配额,以避免未来资源匮乏。这些值是根据这些服务的实际使用情况设置的,但令我惊讶的是,在添加这些值之后,一些服务开始大幅增加响应时间。我的第一个猜测是,我可能放置了错误的请求/限制,但查看这些指标发现,事实上,面对这个问题的服务中没有一个接近这些值。

  • 问题内容: 可以说,钱不是限制因素,我想编写一个在一台功能强大的计算机上运行的Java程序。 目的是使Java程序 尽可能快地运行,而不必 为任何事情 交换或进入磁盘 。 假设这台计算机具有: 1 TB RAM(64个16GB DIMM) 64个处理器核心(8个8核处理器) 运行64位Ubuntu 运行在JVM中的Java程序的单个实例能否利用这么多的RAM和处理器? 是否有任何实际的考虑因素可能