[英]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 可以獲得所有主機內存。 但是有限制——他們會死。
現在我看到兩種方法:
如何在 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
並注意:您應該使用十六進制值
這意味着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.