簡體   English   中英

如何在 Kubernetes 的 pod 中限制 .net core 應用程序的內存大小?

[英]How to limit memory size for .net core application in pod of kubernetes?

我有一個 kubernetes 集群,每個節點上有 16Gb RAM

以及一個典型的 dotnet core webapi 應用程序

我嘗試像這樣配置限制:

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container

但我的應用程序相信可以使用 16Gb

因為cat /proc/meminfo | head -n 1 cat /proc/meminfo | head -n 1返回MemTotal: 16635172 kB (或者可能來自 cgroups,我不確定)

所以..可能是限制不起作用?

不! K8s 在達到內存限制時成功殺死了我的 pod

.net core 有有趣的 GC 模式, 更多細節在這里 這是一個很好的模式,但看起來它對 k8s 不起作用,因為應用程序獲得了錯誤的內存信息。 無限的 Pod 可以獲得所有主機內存。 但是有限制——他們會死。

現在我看到兩種方法:

  1. 使用 GC 工作站
  2. 使用限制和k8s 就緒探針:處理程序將在每次迭代時檢查當前內存,如果當前使用的內存接近 80%,則調用 GC.Collect()(我將通過 env 變量傳遞限制)

如何在 Kubernetes 的 pod 中限制 .net core 應用程序的內存大小?

如何在 kubernetes 中正確設置 pod 的內存限制?

您應該切換到 Workstation GC 以進行優化以降低內存使用率。 就緒探針不用於檢查內存

為了正確配置資源限制,您應該在重負載下在單個 pod 上測試您的應用程序並監控(例如 Prometheus 和 Grafana)使用情況。 有關更深入的詳細信息,請參閱此博客文章 如果您還沒有部署監視器堆棧,您至少可以使用kubectl top pods

如果您發現了單個 pod 的斷點,您可以像下面的示例一樣將限制添加到特定的 pod(有關更多示例和詳細信息,請參閱Kubernetes 文檔

apiVersion: v1
kind: Pod
metadata:
  name: exmple-pod
spec:
  containers:
  - name: net-core-app
    image: net-code-image
    resources:
      requests:
        memory: 64Mi
        cpu: 250m
      limits:
        memory: 128Mi
        cpu: 500m

readiness 探針實際上是用來判斷 Pod 何時准備就緒的。 我猜你想到了活性探測,但這還不夠使用,因為當 Pod 超出資源限制並重新調度時,Kubernetes 會殺死它。

使用環境變量COMPlus_GCHeapHardLimit

文檔https://docs.microsoft.com/en-us/dotnet/api/system.gcmemoryinfo.totalavailablememorybytes?view=net-5.0

並注意:您應該使用十六進制值

這意味着10000000的值是 256MB!

我使用 docker run 命令參數(可以通過部署 yaml 傳遞)來指定容器的內存大小:

args:
  - "--memory=124m --memory-swap=124m"

這樣 .net GC“看到”只有 124MB 可用。

args 說明符與容器說明符下的端口和名稱處於同一級別:

  containers:
    - name: xxx
      ports:
      ....
      args:
        - "--memory=124m --memory-swap=124m"

關於參數“--memory”和“--memory-swap”的描述可以在這里找到https://docs.docker.com/config/containers/resource_constraints/

-m 或 --memory= 容器可以使用的最大內存量。 如果設置此選項,則最小允許值為 6m(6 兆字節)。

--memory-swap* 允許此容器交換到磁盤的內存量。 請參閱 --memory-swap 詳細信息。

可以在此處找到有關將參數傳遞給 run 命令的更多詳細信息: How to pass docker run flags via kubernetes pod

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM