title: How to limit memory size for .net core application in pod of kubernetes?
body: <p>I have a kubernetes cluster with 16Gb RAM on each node</p>
  
  <p>And a typical dotnet core webapi application</p>
  
  <p>I tried to configure limits like here:</p>
  
  <pre><code>apiVersion: v1
  kind: LimitRange
  metadata:
    name: mem-limit-range
  spec:
    limits:
    - default:
        memory: 512Mi
      defaultRequest:
        memory: 256Mi
      type: Container
  </code></pre>
  
  <p>But my app believe that can use 16Gb</p>
  
  <p>Because <code>cat /proc/meminfo | head -n 1</code> returns <code>MemTotal: 16635172 kB</code> (or may be something from cgroups, I'm not sure)</p>
  
  <p>So.. may be limit does not work? </p>
  
  <p>No! K8s successfully kills my pod when it's reaches memory limit</p>
  
  <p>.net core have interesting mode of GC, <a href="https://blog.markvincze.com/troubleshooting-high-memory-usage-with-asp-net-core-on-kubernetes/" rel="noreferrer">more details here</a>. And it is a good mode, but looks like it's doesn't work solution for k8s, because application gets wrong info about memory. And unlimited pods could get all host memory. But with limits - they will die.</p>
  
  <p>Now I see two ways:</p>
  
  <ol>
  <li>Use GC Workstation </li>
  <li>Use limits and <a href="https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#define-readiness-probes" rel="noreferrer">k8s readness probe</a>: handler will
  checks current memory on each iteration and call GC.Collect() if
  current used memory near 80% (I'll pass limit by env variable)</li>
  </ol>
  
  <p>How to limit memory size for .net core application in pod of kubernetes?</p>
  
  <p>How to rightly set limits of memory for pods in kubernetes?</p>