php memory_limit vs limite de memória do recurso kubernetes

1

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:

  1. 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
    
  2. 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?

    
por Tom 03.08.2018 / 17:39

1 resposta

2

Configurar solicitações e limites de recursos de contêineres é o primeiro passo para o uso eficiente de recursos em seu cluster do Kubernetes. Depois de configurá-los, certifique-se de ter monitoramento e alertas em vigor para determinar se você precisa adaptar esses valores ou atualizar seu cluster. Se o seu contêiner tiver pressão de memória, o kernel descartará agressivamente as entradas do cache de páginas para satisfazer a demanda e, eventualmente, poderá ser morto pelo Assassino de Memória Inoperante (OOM) do Linux. Como o K8s desabilita o swap (passando o parâmetro passmemory-swappiness = 0 para o Docker), é um ambiente implacável para uma configuração incorreta.

Abaixo, você encontra artigos que são bons para ler para os limites do K8s e exigem compreensão:

por 06.08.2018 / 15:50