Как ограничить объем памяти для ядра приложения .net в кубере? - PullRequest
2 голосов
/ 06 апреля 2019

У меня есть кластер kubernetes с 16 ГБ ОЗУ на каждом узле

И типичное приложение webnet-интерфейса с ядром dotnet

Я пытался настроить ограничения, как здесь:

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 возвращает MemTotal: 16635172 kB (или может быть что-то из cgroups, я не уверен)

Так .. может быть лимит не работает?

Нет! K8s успешно убивает мой модуль, когда достигает предела памяти

.net ядро ​​имеет интересный режим GC, подробнее здесь . И это хороший режим, но похоже, что он не работает для k8s, потому что приложение получает неверную информацию о памяти. И неограниченное количество модулей может получить всю память хоста. Но с ограничениями - они умрут.

Теперь я вижу два пути:

  1. Использовать рабочую станцию ​​GC
  2. Использовать пределы и датчик готовности k8s : обработчик будет проверяет текущую память на каждой итерации и вызывает GC.Collect (), если текущая используемая память около 80% (я передам ограничение по переменной env)

Как ограничить объем памяти для приложения ядра .net в модуле kubernetes?

Как правильно установить лимиты памяти для стручков в кубернетах?

1 Ответ

1 голос
/ 07 апреля 2019

Вам следует переключиться на рабочую станцию ​​GC для оптимизации использования памяти.Датчик готовности не предназначен для проверки памяти

. Чтобы правильно настроить ограничения ресурсов, вы должны протестировать свое приложение на одном модуле при высоких нагрузках и контролировать его использование (например, Prometheus & Grafana).Более подробные сведения см. В этом сообщении в блоге .Если вы не развернули стек монитора, вы можете, по крайней мере, использовать kubectl top pods.

. Если вы обнаружили точки разрыва одного модуля, вы можете добавить ограничения для конкретного модуля, как показано в следующем примере (см. Документация 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

Датчик готовности на самом деле предназначен для того, чтобы определять, когда Pod готов на первом месте.Полагаю, вы подумали о тесте живучести, но он не подходит для использования, потому что Kubernetes убьет Pod, когда он превысит лимит ресурсов и перенесет его.

...