Назад | Перейти на главную страницу

php memory_limit против ограничения памяти ресурсов kubernetes

Я новичок в Kubernetes и пытаюсь понять, какие ограничения ресурсов я должен установить для своего php webapp.

Мое первое предположение состоит в том, что если я настроил php fpm для использования максимум 256 МБ памяти, тогда я должен настроить kubernetes на ограничение до 256 МБ.

Настройка будет такой:

  1. В Dockerfile, который создает контейнер php, я установил php memory_limit равным 256M:

    sed -i '/^;php_admin_value\[memory_limit\]/cphp_value[memory_limit] = 256M' /usr/local/etc/php-fpm.d/www.conf
    
  2. В моем Kubernetes Deployment Я установил такие ограничения ресурсов для контейнера fpm:

    resources:
      requests:
        cpu: "500m"
        memory: "128Mi"
      limits:
        cpu: "1"
        memory: "256Mi"
    

Что заставляет меня задать вопрос, так это то, что Документация PHP.net говорит:

memory_limit целое число

Это устанавливает максимальный объем памяти в байтах, который разрешено выделить сценарию. Это помогает предотвратить использование плохо написанных сценариев, которые занимают всю доступную память на сервере.

php fpm может обслуживать множество запросов одновременно, и я предполагаю, что каждый запрос запускает сценарий, полностью независимый от других. Они не Поделиться то memory_limit настройка. Если это так, возможно, мой предел контейнера Kubernetes должен быть выше, чем php memory_limit установка?

Хорошо, но насколько выше !? Если я ограничу cpu: 1 Я предполагаю, что это означает, что реальной параллельной обработки не может быть, но все еще может быть много процессов, совместно использующих ЦП, с переключением ОС при блокировании вводом-выводом. Я думаю fpm pm.max_children настройка скажет мне, сколько скриптов можно запустить и сколько памяти можно взять максимум. Но здесь возникает путаница, потому что в нашей настройке, отличной от Kubernetes, мы выбираем max_children в зависимости от объема памяти экземпляра. Мы используем следующую формулу:

max_children = (RAM - 2Gb) / 80Mb

# Where:
#  * We Reserve 2Gb for the system.
#  * We saw that each request needs on average 40Mb of memory, so we chose 80Mb to be safe.

Это уравнение выходит за пределы окна в мире Kubernetes, поскольку оперативная память предписывается во время выполнения, и вам не нужно резервировать ее для системы, потому что контейнер запускает ТОЛЬКО php.

Думаю использовать:

memory_limit = 256M
max_children = 10

resources:
  requests:
    cpu: "500m"
    memory: "512Mi"
  limits:
    cpu: "1"
    memory: "2Gi"

Кажется ли такое мышление разумным? Я не думаю, что это позволит хорошо упаковывать, потому что 10 детям вряд ли когда-нибудь понадобится ограничение в 2Gi. Мы будем использовать HPA для добавления дополнительных модулей, если ресурсы растянуты.

Что вы делали в своей настройке Kubernetes?

Настройка запросов и ограничений ресурсов контейнера - это первый шаг к эффективному использованию ресурсов в вашем кластере Kubernetes. После их настройки убедитесь, что у вас есть мониторинг и предупреждения, чтобы определить, нужно ли вам адаптировать эти значения или обновить кластер. Если ваш контейнер испытывает нехватку памяти, ядро ​​будет агрессивно отбрасывать записи кеша страниц, чтобы удовлетворить спрос, и в конечном итоге может быть уничтожено Linux Out of Memory (OOM) Killer. Поскольку K8s отключает свопинг (передавая Docker memory-swappiness = 0), это довольно жесткая среда для неправильной конфигурации.

Ниже вы можете найти статьи, которые полезно прочитать об ограничениях K8s и требующих понимания: