Я новичок в Kubernetes и пытаюсь понять, какие ограничения ресурсов я должен установить для своего php webapp.
Мое первое предположение состоит в том, что если я настроил php fpm для использования максимум 256 МБ памяти, тогда я должен настроить kubernetes на ограничение до 256 МБ.
Настройка будет такой:
В 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
В моем 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"
OOMKilled
Думаю, потому что это больше, чем предел.Кажется ли такое мышление разумным? Я не думаю, что это позволит хорошо упаковывать, потому что 10 детям вряд ли когда-нибудь понадобится ограничение в 2Gi. Мы будем использовать HPA для добавления дополнительных модулей, если ресурсы растянуты.
Что вы делали в своей настройке Kubernetes?
Настройка запросов и ограничений ресурсов контейнера - это первый шаг к эффективному использованию ресурсов в вашем кластере Kubernetes. После их настройки убедитесь, что у вас есть мониторинг и предупреждения, чтобы определить, нужно ли вам адаптировать эти значения или обновить кластер. Если ваш контейнер испытывает нехватку памяти, ядро будет агрессивно отбрасывать записи кеша страниц, чтобы удовлетворить спрос, и в конечном итоге может быть уничтожено Linux Out of Memory (OOM) Killer. Поскольку K8s отключает свопинг (передавая Docker memory-swappiness = 0), это довольно жесткая среда для неправильной конфигурации.
Ниже вы можете найти статьи, которые полезно прочитать об ограничениях K8s и требующих понимания: