AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1166165
Accepted
Grisu47
Grisu47
Asked: 2024-10-05 05:55:14 +0800 CST2024-10-05 05:55:14 +0800 CST 2024-10-05 05:55:14 +0800 CST

Como os limites de memória no Kubernetes funcionam com o cgroup v2 memory.high?

  • 772

Estou tentando entender como as solicitações e limites de memória funcionam com o cgroup v2. No manifesto do Kubernetes, podemos configurar a solicitação e o limite de memória. Esses valores são então usados ​​para configurar a interface do cgroup:

  • memory.min está definido para solicitação de memória
  • memory.max está definido como limite de memória
  • memory.high é definido como limite de memória * 0,8, a menos que a solicitação de memória == limite, caso em que memory.high permanece indefinido
  • memory.low está sempre desmarcado

memory.max é bastante autoexplicativo: quando um processo no cgroup tenta alocar uma página e isso coloca o uso de memória acima de memory.max e não é possível recuperar páginas suficientes do cgroup para satisfazer a solicitação dentro de memory.max, então o OOM killer é invocado para encerrar um processo dentro do cgroup. memory.high é mais difícil de entender: a documentação do kernel diz que o cgroup é colocado sob "alta pressão de recuperação" quando a marca d'água alta é atingida, mas o que isso significa exatamente?

Mais adiante diz:

Quando atingido, ele limita as alocações, forçando-as a uma recuperação direta para eliminar o excesso, mas nunca invoca o assassino OOM.

Estou correto em assumir que isso significa que quando o cgroup tenta alocar uma página além da marca d'água memory.high, ele vai olhar sincronicamente para o lruvecs e tentar recuperar o máximo de páginas do final das listas até que esteja de volta abaixo da marca d'água alta? Ou a "pressão de recuperação" é algo que acontece assincronamente (por meio do kswapd)?

Pergunta 2: Qual é o objetivo de usar memory.high no Kubernetes? Até onde eu sei, os nós do Kubernetes normalmente são executados sem espaço de swap. As únicas páginas que podem ser recuperadas são páginas anônimas (se houver swap suficiente disponível) e cache de página. Como não há swap, isso deixa apenas o cache de página. O problema é que o cache de página também seria recuperado ao atingir memory.max, antes de invocar o OOM killer como último recurso se nada puder ser recuperado. Então memory.high é essencialmente inútil:

  • Enquanto o cache de página for usado, ele sempre pode ser recuperado e memory.max também faria isso. Com memory.high, estamos apenas limitando o aplicativo antes do que precisamos. Poderíamos muito bem definir memory.max mais baixo em primeiro lugar.

  • Se nenhum cache de página significativo for usado (o que provavelmente é o caso da maioria dos aplicativos que executam o Kubernetes hoje), então nada pode ser recuperado, portanto, não há limitação (nenhuma paginação de memória anônima não utilizada, nenhuma thrashing visível nas informações de bloqueio de pressão que nos avisariam) e encontraremos memory.max sem saber. Usar memory.high não tem efeito.

linux
  • 1 1 respostas
  • 73 Views

1 respostas

  • Voted
  1. Best Answer
    Matthew Ife
    2024-10-05T07:31:08+08:002024-10-05T07:31:08+08:00

    Estou correto em assumir que isso significa que quando o cgroup tenta alocar uma página além da marca d'água memory.high, ele vai olhar sincronicamente para o lruvecs e tentar recuperar o máximo de páginas do final das listas até que esteja de volta abaixo da marca d'água alta? Ou a "pressão de recuperação" é algo que acontece assincronamente (por meio do kswapd)?

    Não acho que ele vá imediatamente para a recuperação direta (síncrona, como você chama) naquele ponto, mas não tenho certeza. Na minha experiência, ele acabará atingindo a recuperação direta com a memória. Altas demandas são esticadas demais. Certamente aumentará a pressão da memória de qualquer maneira.

    Pergunta 2: Qual é o objetivo de usar memory.high no Kubernetes? Até onde eu sei, os nós do Kubernetes normalmente são executados sem espaço de swap. As únicas páginas que podem ser recuperadas são páginas anônimas (se houver swap suficiente disponível) e cache de página. Como não há swap, isso deixa apenas o cache de página. O problema é que o cache de página também seria recuperado ao atingir memory.max, antes de invocar o OOM killer como último recurso se nada puder ser recuperado. Então memory.high é essencialmente inútil:

    Executar sem espaço de swap geralmente é estúpido e tem sido assim há muito tempo. Independentemente disso, no entanto, as únicas páginas que são recuperáveis ​​estão, de fato, principalmente no cache de páginas. Existem outras estratégias que podem acontecer.

    • Zpools podem ser usados ​​para compactar o LRU. Se estiver ligado, ele geralmente flutua em torno de 20% da memória disponível.
    • O compactador pode ser executado em uma tentativa de desfragmentar a memória. Isso pode tornar a busca por novas páginas um pouco mais fácil. Provavelmente não é o caso em 99% dos compromissos.

    Mas as opções são escassas.

    Em geral, suas observações correspondem às minhas realidades também quando não há swap para remover páginas anônimas - MemoryHigh torna o thrashing muito pior, pois você mantém o cache da sua página no mínimo absoluto e acaba fazendo muito IO.

    Também o desativamos em instâncias LXD/LXC, pois ele causa sobrecarga desnecessária (é um limite rígido no código que temos que voltar mais tarde para "consertar").

    No entanto, o MemoryLow pode ser útil como um mecanismo de reserva suave para dizer ao kernel "não roube páginas deste grupo de controle abaixo deste intervalo de memória, escolha outra vítima".

    • 2

relate perguntas

  • Como descobrir detalhes sobre hardware na máquina Linux?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve