Sou novo no Kubernetes e estou tentando descobrir quais limites de recursos devo definir para o meu aplicativo web php.
Meu primeiro palpite é que, se eu tiver configurado o php para usar um máximo de 256M de memória, devo configurar o kubernetes para limitar a 256M também.
A configuração seria assim:
-
No Dockerfile que constrói o contêiner do php, configurei o memory_limit do php para 256M:
sed -i '/^;php_admin_value\[memory_limit\]/cphp_value[memory_limit] = 256M' /usr/local/etc/php-fpm.d/www.conf
-
No meu Kubernetes Deployment
, defino limites de recursos como este no contêiner fpm:
resources:
requests:
cpu: "500m"
memory: "128Mi"
limits:
cpu: "1"
memory: "256Mi"
O que me faz a pergunta é que a documentação do PHP.net diz:
memory_limit
integer
This sets the maximum amount of memory in bytes that a script is allowed to allocate. This helps prevent poorly written scripts for eating up all available memory on a server.
O php fpm pode atender a muitos pedidos ao mesmo tempo e eu acho que cada requisição executa um script completamente independente dos outros. Eles não compartilham a configuração memory_limit
. Se for esse o caso, talvez o limite do meu contêiner do Kubernetes deva ser maior que o do php memory_limit
?
Ok, mas quanto mais alto !? Se eu limitar cpu: 1
, acho que significa que não pode haver processamento paralelo real acontecendo, mas ainda pode haver muitos processos compartilhando a CPU, com a comutação do SO quando bloqueada por E / S. Eu acho que a configuração de fpm pm.max_children
vai me dizer quantos scripts podem ser executados para quanta memória pode ser tirada no máximo. Mas é aí que fica confuso porque na nossa configuração não-Kubernetes escolhemos o max_children
com base na quantidade de memória que a instância tem. A fórmula que usamos é:
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.
Esta equação sai pela janela no mundo do Kubernetes, pois a RAM é prescrita em tempo de execução e você não precisa reservar nenhum para o sistema, porque o contêiner só executa php.
Estou pensando em usar:
memory_limit = 256M
max_children = 10
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "1"
memory: "2Gi"
- Caso normal: 10 crianças usando 40M cada. Uso de memória: 400M
- Alto argumento: 10 crianças usando 80M cada Uso de memória: 800M
- Max case: 10 crianças usando 256M cada Uso da memória: 2560M. É muito improvável que isso aconteça, mas se isso acontecesse, o Kubernetes definiria o Pod como
OOMKilled
, porque é mais do que o limite.
Esse pensamento parece razoável? Eu não acho que isso vai permitir uma boa embalagem porque 10 crianças dificilmente precisarão do limite de 2Gi. Usaremos o HPA para adicionar mais pods se os recursos forem ampliados.
O que você fez na sua configuração do Kubernetes?