...

Kernel Samepage Merging: KSM para um melhor desempenho na virtualização

Virtualização KSM reduz a necessidade física de RAM, uma vez que o kernel do Linux agrupa páginas de memória idênticas entre máquinas virtuais e as partilha de forma eficiente através do mecanismo «Copy-on-Write». Desta forma, aumento a densidade das máquinas virtuais, atenuei os estrangulamentos de RAM e mantenho a Desempenho em equilíbrio.

Pontos centrais

As seguintes ideias-chave ajudam-me a compreender rapidamente o KSM e a utilizá-lo de forma específica:

  • Desduplicação A eliminação de páginas de memória idênticas reduz significativamente o consumo de RAM.
  • Copy-on-Write mantém as páginas legíveis em conjunto e só as separa quando são feitas alterações.
  • Ajuste fino Os parâmetros ksmd equilibram a carga da CPU e as poupanças.
  • Localização NUMA evita latências desnecessárias em anfitriões com vários soquetes.
  • Segurança exige uma partilha seletiva em ambientes multi-tenant.

O que é o KSM? Princípios básicos e processo

Com Fusão de páginas iguais do kernel A thread do kernel ksmd analisa regularmente páginas privadas anónimas marcadas como „mergeable“ e agrupa conteúdos com bits idênticos. Beneficio do facto de, frequentemente, muitas máquinas virtuais manterem na memória bibliotecas, códigos de programa ou componentes do sistema operativo idênticos. O KSM marca as páginas agrupadas como Cópia na escrita, o que faz com que todos os utilizadores leiam a mesma página física até que um deles escreva. Só quando ocorre um acesso de escrita é que o kernel cria uma página própria para esse processo, enquanto a página original continua a ser partilhada. Importante: o KSM não desduplica páginas do sistema de ficheiros nem do cache de páginas, e tenho de libertar explicitamente memória para a fusão.

Utilização em ambientes de virtualização

Em hosts com muitas máquinas virtuais semelhantes, ocorre KSM tem o maior impacto, porque as páginas redundantes ocorrem com frequência. Em configurações KVM e na nuvem, a fusão reduz significativamente a carga efetiva de RAM por convidado, aumentando assim a densidade de máquinas virtuais por servidor. Relatos práticos referem até 300 % sistemas convidados adicionais com um ajuste adequado, sem perdas percetíveis no tempo de resposta. Se eu combinar o KSM com Compromisso excessivo de memória, consigo manter os servidores mais bem aproveitados e utilizar a memória disponível de forma mais direcionada. Ao partilhar páginas idênticas, reduzo o risco de picos de swap e obtenho um funcionamento mais suave Curva de potência ao longo de várias instâncias.

Configuração no Linux e no KVM

Eu ativo KSM através do CONFIG_KSM no kernel e controlo o comportamento via Sysfs em /sys/kernel/mm/ksm/. Aí, inicio a verificação (run), defino a intensidade (pages_to_scan, sleep_millisecs) e observo os ganhos de páginas (pages_sharing). Nas distribuições empresariais, utilizo serviços como o ksm e o ksmtuned, que aumentam ou reduzem automaticamente a intensidade com base em limiares de RAM livre. Para um controlo granular, marco áreas de memória como «mergeáveis» de forma específica com madvise(MADV_MERGEABLE) ou prctl(PR_SET_MEMORY_MERGE). Em ambientes dinâmicos, gosto de combinar o KSM com Balão de memóriapara otimizar o Alocação de RAM manter a flexibilidade.

Desempenho e afinação: o equilíbrio certo

O ganho é maior, sobretudo nos casos em que a RAM constitui o verdadeiro gargalo e os núcleos da CPU ficariam sem ser utilizados – é aí que se nota a diferença KSM o desempenho geral, porque tenho mais máquinas virtuais a funcionar em paralelo. No entanto, o thread do ksmd consome tempo de CPU, pelo que parâmetros de análise demasiado agressivos podem reduzir essas vantagens. Começo de forma conservadora, meço os valores de pages_sharing e pages_scanned e observo as latências sob carga, antes de aumentar a taxa de verificação. Se houver RAM livre suficiente, mantenho o ksmd menos ativo e só aperto o cerco quando os hosts começam a escassear. Assim, mantenho um bom equilíbrio entre ganho de memória e sobrecarga da CPU.

Segurança e isolamento numa perspetiva objetiva

Como vários hóspedes partilham um espaço físico, tenho em conta os potenciais Canais laterais, que poderiam extrair informações através do tempo de execução ou de padrões de acesso. Em configurações multi-tenant sensíveis, desativo seletivamente a partilha de páginas para determinadas instâncias ou anfitriões. Por outro lado, para cargas de trabalho menos sensíveis com muitos convidados semelhantes, o KSM é um método fiável para reduzir custos e aumentar a densidade. Documento a decisão por cluster e mantenho uma lista de exceções para máquinas virtuais particularmente críticas. Desta forma, garanto Transparência e reduzir os pontos vulneráveis sem comprometer o ganho de eficiência.

NUMA, páginas enormes e interação

Nos sistemas NUMA, presto atenção a Local de armazenamento e, idealmente, faço com que o KSM seja mesclado apenas dentro de um nó, para que os acessos não sejam encaminhados por percursos lentos. Isto reduz as latências e mantém elevada a largura de banda por socket. Em combinação com as Huge Pages, reduzo as falhas de TLB, mas tenho de ter em conta que as páginas de grande dimensão alteram as probabilidades de conteúdos com bits idênticos. Algumas cargas de trabalho beneficiam mais das Huge Pages, outras beneficiam mais da deduplicação; valido isso através de benchmarks. O objetivo continua a ser maximizar o acesso local e Memória remota a evitar.

Compreender o acompanhamento e os indicadores-chave

Avalio o efeito de KSM com base em alguns indicadores, mas significativos: pages_sharing, pages_shared, pages_scanned, pages_unshared e full_scans. Se o pages_sharing aumentar de forma estável e a carga da CPU se mantiver moderada, significa que a minha configuração está a evoluir na direção desejada. Se os valores permanecerem estáveis, verifico se os convidados marcam a memória como «mergeable». Além disso, observo o Host-Swap, as latências das máquinas virtuais e o IO-Wait, para detetar efeitos secundários atempadamente. Os painéis com séries temporais mostram-me as tendências, para que eu Ajustamentos tomo decisões com base em dados.

Exemplos práticos e potencial de poupança

Em clusters de teste com dezenas de máquinas virtuais Linux semelhantes, pude constatar, graças a KSM em alguns casos, poupanças de RAM na ordem das duas cifras em pontos percentuais e, consequentemente, uma densidade sensivelmente superior. As cargas de trabalho Java com muitas classes e bibliotecas idênticas proporcionaram ganhos particularmente consistentes. Quanto mais homogéneas forem as instâncias, maior será a redução da pegada de memória; pilhas heterogéneas proporcionam resultados menores, mas ainda assim úteis. Em combinação com um overcommit bem configurado, mantenho os custos por instância baixos e opero mais serviços no mesmo hardware. Desta forma, surge uma clara Impacto económico com uma qualidade previsível.

KSM vs. Alternativas: Diferenciação e interação

Apostaria num Carteira técnicas de memória complementares, que funcionam de forma diferente consoante o objetivo. O KSM elimina a redundância no conteúdo da RAM, enquanto o «ballooning» recupera dinamicamente memória para os convidados e as «Huge Pages» aumentam a eficiência da CPU. Nenhuma técnica substitui a outra; combino-as de forma específica, consoante o perfil da carga de trabalho e o objetivo de densidade. Para principiantes, a seguinte visão geral ajuda a fazer a escolha mais rapidamente. Como próximo passo, vale a pena dar uma vista de olhos em KVM e Xen em comparação, para determinar a Escolha da plataforma classificar corretamente.

Tecnologia Tarefa Vantagem Desvantagem Adequado para
KSM Desduplicação de páginas de RAM idênticas Elevado Poupança de RAM no caso de máquinas virtuais semelhantes Carga adicional na CPU devido às verificações Muitos convidados semelhantes, anfitriões KVM
Balão de memória Recuperação dinâmica do armazenamento de gás Melhor Utilização em caso de cargas de trabalho variáveis É necessário um condutor de balão por convidado Perfis de utilização mistos
Páginas enormes Páginas de maior tamanho para reduzir as falhas de TLB Mais alto Eficiência da CPU em aplicações que consomem muita memória Menor probabilidade de deduplicação Bases de dados, JVMs, motores em memória
NUMA-Pinning Ligação de máquinas virtuais a nós de armazenamento locais constante Latência e largura de banda Menos flexibilidade na programação Hosts com vários sockets, cargas de trabalho sensíveis à latência

Ativação prática e guias de procedimentos do anfitrião

Ao nível do host, adoto uma abordagem pragmática: inicio o ksm/ksmtuned e defino valores padrão que se revelaram eficazes em funcionamento. Exemplo:

Ativar os serviços # (dependendo da distribuição)
systemctl enable --now ksm ksmtuned

Ajuste manual do # (entra em vigor imediatamente, até ao reinício)
echo 1 > /sys/kernel/mm/ksm/run
echo 1000 > /sys/kernel/mm/ksm/pages_to_scan
echo 50 > /sys/kernel/mm/ksm/sleep_millisecs

No libvirt, controlo a partilha por cada VM. Por predefinição, o QEMU marca a RAM do convidado como «mergeable». Para VMs particularmente sensíveis, desativo explicitamente a partilha:

 

Assim, mantenho uma linha clara: ativação generalizada em hosts com cargas de trabalho homogéneas e exclusões específicas para exceções.

Ajuste preciso dos parâmetros KSM em pormenor

  • executar: 0 = desativado, 1 = ativado, 2 = desativado e desligar as páginas já mescladas. Utilizo o „2“ apenas para testes específicos ou quando pretendo reverter a partilha de forma segura antes dos períodos de manutenção.
  • páginas_a_digitalizar: O número de páginas verificadas por ciclo. Valores mais elevados aceleram a deteção de páginas idênticas, mas aumentam a carga da CPU.
  • sleep_millisecs: Pausa entre ciclos. Pausas mais longas reduzem a sobrecarga, mas demoram mais tempo a atingir o patamar de poupança.
  • merge_across_nodes: Em hosts NUMA, defino este valor como 0, para que a fusão ocorra apenas dentro de um nó NUMA. Isto preserva a localidade.
  • use_zero_pages: Se esta opção estiver ativada, os processos partilham páginas nulas de forma eficiente com a página nula do kernel. Isto proporciona poupanças „seguras“ sem custos de COW.

Com o ksmtuned, regulo dinamicamente com base em limiares de RAM. Assim que a memória livre começa a escassear, o ksmtuned aumenta a velocidade de varredura (Npagen-Boost); quando a pressão diminui, volta a reduzir essa velocidade. Isto resulta numa configuração adaptativa e „respirante“, sem intervenções manuais.

Interação com o THP, Huge Pages e Ballooning (análise aprofundada)

Páginas enormes transparentes (THP) e Páginas enormes otimizam a eficiência da CPU, enquanto o KSM reduz a redundância na RAM. Para tal, tenho em conta:

  • O KSM funciona com páginas regulares de 4 KB. As páginas THP (na maioria das vezes de 2 MB) não podem ser desduplicadas. Quanto mais o THP for utilizado, menos «matéria-prima» fica disponível para o KSM.
  • Para cargas de trabalho em que a latência é crítica ou que dependem da CPU, opto por utilizar principalmente o THP/Huge Pages. Para hosts com pouca memória RAM e máquinas virtuais homogéneas, dou prioridade ao KSM.
  • O Ballooning complementa o KSM: o controlador Balloon devolve a memória de gás livre ao anfitrião. Paralelamente, o KSM reduz a procura ao consolidar páginas idênticas. Juntos, suavizo os picos de carga e evito o swapping prematuro.

Tomo a minha decisão com base em dados empíricos: os testes de desempenho com e sem THP/Huge Pages, bem como com o KSM ativado, mostram-me qual a combinação que oferece a melhor relação custo-desempenho global.

Modelos de segurança e funcionalidades modernas da CPU

Em ambientes com separação estrita de clientes Desativo sistematicamente a partilha por VM/host. Isso minimiza os canais de informação laterais decorrentes de páginas partilhadas e simplifica as verificações de conformidade. As modernas Encriptação de armazenamento Ao nível do anfitrião/convidado (por exemplo, por chave de VM), isto impede, na prática, que o KSM consiga realizar uma fusão eficaz entre convidados, uma vez que os conteúdos idênticos já não estão presentes na RAM física com idêntica precisão binária. Nesses clusters, evito a análise agressiva e mantenho o ksmd numa atitude mais passiva, para não desperdiçar recursos da CPU.

Para stacks menos sensíveis, mas homogéneos, mantenho o KSM como padrão. Documento a política para cada cluster: „Padrão ativado, exceções através de nosharepages“ ou „Padrão desativado, partilha apenas para pools definidos“ — ambas as opções são válidas, desde que sejam implementadas de forma transparente e reproduzível.

Adequação à carga de trabalho e anti-padrões

O KSM destaca-se em cargas de trabalho uniformes e com muitas bibliotecas (por exemplo, muitos servidores de aplicações idênticos, serviços baseados em JVM, agentes). Os que beneficiam menos:

  • Alocações de curta duração e com grande variabilidade (por exemplo, muitos buffers pequenos que mudam rapidamente), uma vez que a probabilidade de COW é elevada.
  • Dados comprimidos, encriptados ou pseudoaleatórios – raramente surgem páginas idênticas.
  • Grandes bases de dados na memória com reciclagem agressiva de páginas, quando os dados mudam rapidamente. Nestas situações, as vantagens das Huge Pages/THP são frequentemente superiores.

Nas «container farms», o KSM também pode funcionar, desde que os processos marquem as memórias como «mergeable». Na prática, porém, concentro o KSM principalmente nas máquinas virtuais (VMs), porque aí o QEMU já define os sinalizadores madvise necessários.

Resolução de problemas e obstáculos típicos

  • O «pages_sharing» está estagnado: Vou verificar se o QEMU/VMs criam realmente memória «mergeable» (sem a diretiva «nosharepages» no XML do libvirt) e se o ksmd está a funcionar. Se os resultados forem nulos, é provável que a carga de trabalho seja demasiado heterogénea.
  • Carga da CPU demasiado elevada: Aumento o valor de `sleep_millisecs` e/ou reduzo o valor de `pages_to_scan`. Além disso, posso desativar a fusão entre NUMA para reduzir o espaço de pesquisa.
  • Picos de latência inesperados: Verifico se os eventos COW estão correlacionados com picos de carga. Nesses casos, reduzo a frequência de verificação ou excluo temporariamente as máquinas virtuais afetadas da partilha.
  • O overcommit escala para o swap: O KSM não substitui o planeamento de capacidade. Mantenho sempre uma reserva de RAM livre e regulo o ksmd apenas como um amortecedor, não como uma solução de emergência.

Planeamento, dimensionamento e automatização

Para obter resultados previsíveis, defino métricas-alvo para cada host:

  • espaço livre: Uma margem percentual fixa de RAM livre, abaixo da qual o ksmtuned se torna mais agressivo. É assim que eu passo a deduplicação para fases de necessidade real.
  • Equidade: Quando as cargas de trabalho são desiguais, separo os conjuntos (por exemplo, por projeto/ambiente), para que as máquinas virtuais homogéneas beneficiem em conjunto e as heterogéneas não „diluam“ os resultados.
  • Valores-limite: Estabeleço limites para as taxas máximas de análise e verifico regularmente se as poupanças justificam a utilização da CPU.

Na área da automatização, considero o KSM como um manual de procedimentos repetível e com versões (por exemplo, drop-ins do Systemd ou snippets do Cloud-Init). Desta forma, garanto que os novos hosts entrem em funcionamento com um conjunto de parâmetros idêntico e que quaisquer divergências sejam rapidamente detetadas.

Resumo para administradores

Eu uso KSM, quando os anfitriões alojam muitas máquinas virtuais semelhantes e a RAM é o recurso mais escasso. Nesse caso, a deduplicação proporciona o maior impacto, enquanto controlo com precisão os custos de CPU através do ksmtuned e dos parâmetros do sysfs. Em configurações NUMA, mantenho a fusão a nível local, combino o KSM com o «ballooning» e as «Huge Pages» e avalio o impacto através do «pages_sharing» e de métricas de latência. Para máquinas virtuais sensíveis, desativo o partilhamento de forma seletiva e documento as exceções de forma transparente. É assim que aumento densidade, garantir tempos de resposta e reduzir de forma sustentável os custos em euros por instância.

Artigos actuais

Servidor Linux com indicadores visualizados de «Pressure Stall Information» no centro de dados
Administração

Linux PSI para uma análise e monitorização precisas do desempenho

O Linux PSI (Pressure Stall Information) mostra em que medida a CPU, a memória e as E/S estão a limitar o desempenho do teu sistema. Descobre como ativar o PSI e como utilizá-lo para uma monitorização precisa do desempenho.