Quando o uso de memória de um memcg atinge o limite, o kernel aciona a reclamação direta de memória. Essa operação síncrona ocorre no caminho de alocação e bloqueia o processo atual. Para eliminar essa latência, o Alibaba Cloud Linux oferece a reclamação assíncrona de backend para memcgs. O kernel recupera memória em segundo plano antes que o uso atinja o limite rígido; assim, os processos não ficam bloqueados aguardando a conclusão da reclamação.
Este recurso está disponível nas seguintes versões:
Alibaba Cloud Linux 2 com versão de kernel
4.19.81-17.al7ou posteriorAlibaba Cloud Linux 3 com versão de kernel
5.10.134-12.al8ou posterior
Considere os seguintes comportamentos antes de ativar este recurso:
A alocação de memória em um memcg existente pode acionar recursivamente a reclamação assíncrona de backend no cgroup pai.
A reclamação começa no memcg onde foi acionada e prossegue de cima para baixo na hierarquia do cgroup.
Se
memory.highfor definido com um valor menor quememory.limit_in_bytes, os valores dememory.wmark_highememory.wmark_lowserão calculados com base emmemory.highem vez dememory.limit_in_bytes.
Como funciona
O recurso introduz um mecanismo baseado em marcas d'água. Defina memory.wmark_ratio como uma porcentagem do limite do memcg para estabelecer uma marca d'água alta (memory.wmark_high). Quando o uso de memória ultrapassa essa marca, o kernel inicia a reclamação assíncrona de memória em segundo plano. A reclamação é interrompida quando o uso cai abaixo de uma marca d'água baixa (memory.wmark_low), derivada de memory.wmark_high com um deslocamento definido por um fator de escala configurável.
Isso cria uma zona de buffer: a reclamação ocorre em segundo plano antes que o limite rígido seja atingido, evitando as paralisações abruptas causadas pela reclamação direta.
Referência da interface
memory.wmark_ratio
Leitura e gravação. Ative o recurso e defina a marca d'água alta como uma porcentagem do limite do memcg.
Valores válidos: 0–100
Padrão: 0 (recurso desativado)
Ao definir um valor diferente de zero, você ativa o recurso e recalcula
memory.wmark_high.
memory.wmark_high
Somente leitura. Limiar de uso de memória que aciona a reclamação assíncrona de backend.
Fórmula:
memory.wmark_high = memory.limit_in_bytes x memory.wmark_ratio / 100Quando o recurso está desativado (
memory.wmark_ratio = 0), este valor assume o máximo possível para evitar acionamentos.Não presente no diretório raiz do memcg.
memory.wmark_low
Somente leitura. Limiar de uso de memória no qual a reclamação assíncrona de backend é interrompida.
Fórmula:
memory.wmark_low = memory.wmark_high - memory.limit_in_bytes x memory.wmark_scale_factor / 10000Não presente no diretório raiz do memcg.
memory.wmark_scale_factor
Leitura e gravação. Controla a diferença entre memory.wmark_high e memory.wmark_low.
Unidade: 0,01% do limite do memcg
Valores válidos: 1–1000
Padrão: 50 (0,50% do limite do memcg), herdado do cgroup pai durante a criação do memcg
Não presente no diretório raiz do memcg.
Ative a reclamação assíncrona de backend
O exemplo a seguir cria um memcg de teste, define um limite de memória de 1 GB, ativa o recurso com uma marca d'água de 95% e verifica os valores resultantes da interface.
-
Crie um memcg de teste.
sudo mkdir /sys/fs/cgroup/memory/test/ -
Defina o limite de memória como 1 GB.
sudo sh -c 'echo 1G > /sys/fs/cgroup/memory/test/memory.limit_in_bytes' -
Ative a reclamação assíncrona de backend definindo
memory.wmark_ratiocomo 95. Isso configuramemory.wmark_highpara 95% do limite do memcg.sudo sh -c 'echo 95 > /sys/fs/cgroup/memory/test/memory.wmark_ratio' -
Verifique os valores da interface para confirmar a configuração.
Leia
memory.wmark_scale_factor. O valor padrão herdado é 50, o que representa 0,50% do limite do memcg.cat /sys/fs/cgroup/memory/test/memory.wmark_scale_factorLeia
memory.wmark_highpara confirmar a marca d'água alta.cat /sys/fs/cgroup/memory/test/memory.wmark_highLeia
memory.wmark_lowpara confirmar a marca d'água baixa.cat /sys/fs/cgroup/memory/test/memory.wmark_low