Anatomia da Memória Compartilhada do Kernel Linux

Deduplicação da memória do kernel Linux

O Linux® , como hypervisor, inclui uma série de inovações, e uma das mudanças mais interessantes no kernel 2.6.32 é a Kernel Shared Memory (KSM). A KSM permite que o hypervisor aumente o número de máquinas virtuais simultâneas, consolidando páginas de memória idênticas. Explore as ideias por trás da KSM (como deduplicação de armazenamento), sua implementação e como gerenciá-la.

M. Tim Jones, Consultant Engineer, Emulex Corp.

M. Tim JonesM. Tim Jones é arquiteto de firmware integrado e autor de Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming (atualmente em sua segunda edição), AI Application Programming (em sua segunda edição) e BSD Sockets Programming from a Multilanguage Perspective. Seu conhecimento em engenharia varia do desenvolvimento de kernels para naves espaciais geossincrônicas até a arquitetura de sistemas embarcados e o desenvolvimento de protocolos de rede. Tim é Consultor de Engenharia da Emulex Corp. em Longmont, Colorado.



21/Dez/2010

Entre em contato com o Tim

Tim é um dos nossos autores mais populares e prolíficos. Navegue em todos os artigos do Tim no developerWorks. Confira o perfil dele e entre em contato com ele e com outros autores e leitores no My developerWorks.

A engenharia de software tende a ser um processo evolutivo. Os problemas são abordados com soluções que podem criar novos problemas e, consequentemente, novas soluções. De modo ideal, os novos problemas que são criados justificam a solução original. A tecnologia discutida aqui é uma das soluções secundárias para um problema criado pela virtualização do servidor. Antes de nos aprofundarmos na KSM, no entanto, vamos dar uma olhada rápida na solução original e como a KSM é aplicada aqui e em outros locais.

Virtualização do servidor

Consolidação exagerada do servidor

Embora os servidores enterprise possam consolidar 10 ou mais servidores usando virtualização um único servidor BM System z® pode suportar milhares de convidados Linux® em uma única partição lógica.

A virtualização, como tecnologia, começou a aparecer por volta dos anos 1960, popularizada pelo mainframe do IBM® System/360® . Cinco décadas depois, a virtualização explodiu, tornando possível compartilhar um único servidor com vários sistemas operacionais e aplicativos. Esse uso em particular, chamado de virtualização do servidor, está transformando centro de dados, já que uma única máquina física pode ser usada para hospedar normalmente 10 ou mais máquinas virtuais (VMs), como mostrado na figura 1. Essa virtualização permite que a infraestrutura seja muito mais dinâmica, com uso eficiente de energia, e (portanto) mais econômica. Consulte a seção Recursos para obter mais informações sobre virtualização de servidor e seus benefícios.

Figura 1. Consolidação do servidor através de virtualização
Diagram of server consolidation through virtualization, showing physical machines consolidated onto a single physical server

Com apenas 10% a 15% de um servidor típico em uso em um dado momento, consolidar servidores virtuais em um único servidor físico faz muito sentido. Mas, e os recursos? Os principais recursos disponíveis incluem CPU, memória e largura da banda da rede. A CPU e a rede normalmente são subutilizadas, de modo que a questão principal se torna a memória disponível. Cada sistema operacional faz suas próprias demandas exclusivas em relação aos recursos de memória disponíveis. Mas a questão é: o quão exclusivas são essas demandas?


Compartilhamento de memória

Acontece que, se você virtualizar muito os mesmos conjuntos de sistema operacional e aplicativo, muitas páginas de memória serão idênticas. Isso faz sentido, já que o sistema operacional e o código do aplicativo e dados constantes são idênticos entre as VMs. E quando as páginas são exclusivas, elas podem ser consolidadas, o que libera memória para uso em outros aplicativos. A figura 2 ilustra o compartilhamento de memória e mostra o benefício de mais memória livre disponível quando páginas são compartilhadas entre VMs cujo conteúdo é o mesmo.

Figura 2. Compartilhamento de memória nas VMs
Diagram of memory sharing across VMs, showing more free memory when pages are shared among VMs whose contents are the same

Nomenclatura do recurso

O recurso descrito aqui é bem novo; no entanto, o nome passou por várias mudanças. Você localizará esse recurso de kernel Linux chamado Kernel Shared Memory , e também o Kernel Samepage Merging.

O que você descobrirá bem cedo é que, embora o compartilhamento de memória em Linux seja vantajoso em ambientes virtualizadas (a KSM foi projetada originalmente para uso com a máquina virtual baseada em kernel [KVM]); ela também é útil em ambientes não virtualizados. De fato, descobriu-se que a KSM é muito benéfico, mesmo em sistemas Linux integrados, indicando a flexibilidade da abordagem. Agora, vamos explorar a abordagem do Linux em relação ao compartilhamento de memória e como é possível usá-lo para aumentar a densidade da memória de um servidor e, portanto, aumentar sua capacidade de hospedar aplicativos ou VMs adicionais.


Paralelos com outras tecnologias

Um avanço recente em tecnologias de armazenamento chamado deduplicação é um precursor do compartilhamento de memória no Linux e outros hypervisores. A deduplicação é uma tecnologia na qual os dados armazenados são reduzidos removendo-se os dados redundantes ( em uma base de bloco ou em segmentos maiores de dados, como arquivos). Os segmentos comuns são mesclados (na forma copiar ao gravar [CoW]), liberando espaço para outros usos. A deduplicação de armazenamento é uma tecnologia importante que está avançando, já que otimiza a capacidade de armazenamento ao remover dados duplicados. Dessa forma, o armazenamento é mais barato, porque, no final das contas, menos armazenamento é necessário. Dada a taxa de crescimento de dados, essa funcionalidade é bastante relevante.


Operação da KSM

A KSM existe em um daemon no kernel (chamado ksmd), que realiza periodicamente varreduras de páginas para identificar páginas duplicadas e mescla as duplicadas em páginas livres para outros usos. Ele faz isso de uma forma transparente para o usuário. Por exemplo, páginas duplicadas são mescladas (e, consequentemente, marcadas como somente leitura), mas se um dos usuários da página modificá-la por algum motivo, esse usuário receberá sua própria cópia (na forma CoW). É possível encontrar a implementação completa do módulo do kernel da KSM na origem do kernel em ./mm/ksm.c.

A KSM depende de um aplicativo de nível mais alto para fornecer instruções sobre quis regiões da memória são candidatas à mesclagem. Embora seja possível para a KSM simplesmente varrer todas as páginas anônimas no sistema, isso seria desperdício da CPU e da memória (dado o espaço necessário para gerenciar o processo de mesclagem de página). Portanto, os aplicativos podem registrar as áreas virtuais que provavelmente contêm páginas duplicadas.

A interface de programação de aplicativos (API) da KSM é implementada através do chamado de sistema madvise (consulte a listagem 1) e um novo parâmetro de conselho chamado MADV_MERGEABLE (que indica que a região definida é mesclável). Uma região pode ser removida do estado mesclável através do parâmetro MADV_UNMERGEABLE (que imediatamente desfaz a mesclagem de qualquer página dessa região). Observe que remover uma região de páginas através de madvise pode resultar em um erro EAGAIN , já que a operação poderia ficar sem memória durante o processo de desfazer a mesclagem, levando, potencialmente, a um problema ainda maior (condições de falta de memória).

Listagem 1. A chamada de sistema madvise
#include <sys/mman.h>

intmadvise( void *start, size_t length, int advice );

Quando uma região é definida como mesclável, a KSM adiciona essa região à sua lista de memória em funcionamento. Quando a KSM é ativada, ela procura páginas idênticas, mantendo uma página na forma CoW protegida contra gravação e liberando a outra para outros usos.

A KSM usa uma abordagem que é diferente da abordagem usada em deduplicação de armazenamento. Em uma deduplicação tradicional, os objetos estão em hash, e o valor do hash é usado como verificação inicial em relação à similaridade. Quando hashes são idênticos, a próxima etapa é uma comparação dos objetos reais (neste caso, uma comparação de memória) para determinar formalmente se os objetos são idênticos. A KSM usou essa abordagem em sua primeira implementação, mas uma abordagem mais direta foi desenvolvida para simplificá-la.

Na KSM atual, as páginas são gerenciadas por duas árvores vermelhas e pretas, uma das quais é efêmera. A primeira árvore, chamada de árvore instável, é usada para armazenar novas páginas que ainda não são consideradas estáveis. Em outras palavras, as páginas que são candidatas à mesclagem (não modificadas por certo tempo) são armazenadas na árvore instável. As páginas na árvore instável não são protegidas contra gravação. A segunda árvore, chamada de árvore estável, armazena essas páginas que não foram consideradas estáveis e que foram mescladas pela KSM. Para identificar se uma página é volátil ou não volátil, a KSM usa uma soma de verificação simples de 32 bits. Quando uma página é varrida, sua soma de verificação é calculada e armazenada com a página. Em uma varredura subsequente, se uma soma de verificação recém-calculada for diferente da soma de verificação gerada anteriormente, a página está sofrendo mudanças e não é, portanto, uma boa candidata à mesclagem.

A primeira etapa ao lidar com uma única página usando o processo da KSM é ver se a página pode ser encontrada na árvore estável. O processo de procura da árvore é interessante no sentido de que cada página é tratada como um número muito alto (o conteúdo da página). Uma operação memcmp (comparar memória) é realizada na página e na página de nó em consideração. Se memcmp retornar 0, as páginas são iguais e uma correspondência foi localizada. Do contrário, memcmp pode retornar -1 (o que significa que a página candidata é menor do que a página de nó atual) ou 1 (a página candidata é maior que a página de nó atual). Em cada caso, a operação leva à procura na árvore vermelha e preta (para a esquerda, se menor, e para a direita, se maior). Embora comparar páginas de 4 KB pareça bastante pesado, na maioria dos casos, memcmp será encerrada prematuramente quando uma diferença for localizada. O processo em si, portanto, é rápido e eficiente. Consulte a figura 3 para obter uma visualização desse processo.

Figura 3. Processo de procura de uma página na árvore
Search process for a page in the red-black tree, showing a match for the candidate page

Se a página candidata for localizada na árvore estável, então ela está mesclada e a página candidata liberada. Esse código por ser encontrado em ksm.c/stable_tree_search() (que é chamado por ksm.c/cmp_and_merge_page()). Do contrário, se a página candidata não for localizada, continue a procura na árvore instável (consulte ksm.c/unstable_tree_search()).

A primeira etapa da procura em árvore instável é recalcular a soma de verificação da página. Se for diferente da soma de verificação original, a página é descartada da procura nessa varredura (porque se ela mudar, não vale a pena controlar). Se a soma de verificação não foi modificada, a página candidata é procurada na árvore instável. O processamento da árvore instável é um pouco diferente do da árvore estável. Primeiro, se a procura não localizar a página na árvore instável, adiciona-se um novo nó na árvore instável para essa página. Mas, se a página for localizada na árvore instável, as páginas são mescladas e o nó é migrado para a árvore estável.

Quando a varredura estiver concluída (realizada através de ksm.c/ksm_do_scan()), a árvore estável é mantida, mas a árvore instável é removida e reconstruída no momento da próxima varredura. Esse processo simplifica bastante as coisas, já que a organização da árvore instável pode mudar com base nas mudanças das páginas (lembre-se de que as páginas na árvore instável não são protegidas contra gravação). Como todas as páginas na árvore estável são protegidas contra gravação, uma falha de página é gerada quando uma página tenta ser gravada, permitindo que o processo CoW desfaça a mesclagem da página para gravação (consulte ksm.c/break_cow()). As páginas órfãs na árvore estável são, consequentemente, removidas (a menos que existam dois ou mais usuários da página, indicando que a página ainda é compartilhada).

Como discutido, a KSM usa árvores vermelhas e pretas para gerenciar as páginas para uma consulta rápida. O Linux inclui, na verdade, árvores vermelhas e pretas como estrutura de dados reutilizável, e elas podem ser usadas de forma genérica. As árvores vermelhas e pretas também são usadas pelo Completely Fair Scheduler (CFS) para armazenamento de tarefas na ordem de tempo. É possível localizar a implementação de árvores vermelhas e pretas no kernel em ./lib/rbtree.c.


Configuração e monitoramento da KSM

O gerenciamento e monitoramento da KSM ocorrem através de sysfs (na raiz /sys/kernel/mm/ksm). Nesse subdiretório sysfs subdirectory, você encontrará uma coleção de arquivos, alguns usados para controle e outros usados para monitoramento.

O primeiro arquivo, run, é usado para ativar ou desativar a mesclagem de páginas com a KSM. Por padrão, a KSM está desativada (0), mas pode ser ativada gravando-se um 1 no arquivo para ativar o daemon da KSM (por exemplo, echo 1 > sys/kernel/mm/ksm/run). A partir do estado de execução, é possível desativar o daemon (mas mantenha o conjunto atual de páginas mescladas) gravando um 0. Também a partir do estado de execução (1), é possível para a KSM e solicitar que todas as páginas mescladas se tornem não mescladas escrevendo um 2.

Enquanto a KSM é executada, é possível controlá-la com três parâmetros (arquivos dentro do sysfs). O arquivo sleep_millisecs define quantos milissegundos ksmd devem ser aguardados antes da realização de outra varredura de página. O arquivo max_kernel_pages file define o número máximo de páginas ksmd que podem ser usadas (o padrão é 25% da memória disponível, mas é possível gravar um 0 para especificar nenhum limite). Finalmente, o arquivo pages_to_scan define quantas páginas podem ser varridas em uma dada varredura. Qualquer usuário pode visualizar esses arquivos, mas o usuário deve ter privilégios de administrador para modificá-los.

Há também cinco arquivos monitoráveis exportados através do sysfs que indica a operação e eficácia de ksmd(eles são somente leitura). O arquivo full_scans indica o número de varreduras de área completa que foram realizadas. Os quatro arquivos restantes indicam as estatísticas no nível de página da KSM:

  • pages_shared: O número de páginas do kernel que não podem ser trocadas que a KSM está usando
  • pages_sharing: Uma indicação de economia de memória
  • pages_unshared: O número de páginas exclusivas verificadas repetidamente para mesclagem
  • pages_volatile: O número de páginas que estão mudando com muita frequência

Os criadores da KSM definem que uma proporção alta de pages_sharing e pages_shared indica compartilhamento eficiente de páginas (considerando que o reverso é indicativo de esforço desperdiçado).


Um pouco mais

O Linux não está sozinho no uso de compartilhamento de página para melhorar a eficiência da memória, mas é exclusivo em sua implementação como recurso do sistema operacional. O hypervisor do servidor EXS de VMware fornece esse recurso com o nome de Transparent Page Sharing (TPS), enquanto o XEN o chama de Memory CoW. Mas, qualquer que seja o nome ou implementação, o recurso fornece um melhor uso da memória, permitindo que o sistema operacional (ou hypervisor, no caso, KVM) comprometa bastante a memória para suportar números maiores de aplicativos ou VMs. É possível encontrar a KSM—e muitos outros recursos interessantes—no kernel Linux 2.6.32 mais recente.

Recursos

Aprender

  • Os autores de KSM da Red Hat escreveram um grande estudo sobre KSM entitulado "Increasing memory density by using KSM" (PDF). Esse estudo apresenta a KSM e se aprofunda em detalhes de sua implementação.
  • A virtualização está crescendo de forma expressiva como forma de consolidar para obter economias de energia e de custo, mas também como elemento chave das arquiteturas de computação em nuvem. Aprenda sobre virtualização e seu papel na TI verde em "Growing green with virtualization: Virtualization as a backbone of green IT" (developerWorks, agosto de 2009).
  • Esse artigo demonstra uma vantagem de usar o Linux como hypervisor. É possível aprender mais sobre isso e outros tópicos em "Anatomia de um Hypervisor Linux" (developerWorks, maio de 2009), "Discover the Linux Kernel Virtual Machine" (developerWorks, abril de 2007) e "Virtual Linux" (developerWorks, dezembro de 2006). Finalmente, leia sobre outro subsistema de kernel que usa árvores vermelhas e pretas em "Inside the 2.6 Completely Fair Scheduler" (developerWorks, dezembro de 2009).
  • É possível ler mais sobre deduplicação de memória nas notas sobre a liberação do kernel 2.6.32. Essas notas fornecem material útil sobre KSM (incluindo um link para a documentação do kernel), além de várias outras mudanças que foram introduzidas no 2.6.32. Na seção de KSM, você encontrará uma referência interessante sobre executar 52 VMs no Windows® XP em um único servidor com 16 GB de RAM (em que cada uma foi alocada para o seu próprio segmento de RAM de 1GB, mas compartilhadas com KSM).
  • Aprenda mais sobre deduplicação de sistemas de armazenamento e as abordagens no artigo de análise de TI "De-dupe for big storage savings?".
  • A Wikipédia fornece uma ótima introdução à deduplicação, incluindo as várias estratégias de implementação (como origem e destino).
  • Embora o KSM seja um mecanismo automático para reduzir a área de cobertura da memória em servidores virtualizados, os desenvolvedores de aplicativos tiveram uma capacidade manual semelhante por algum tempo. As bibliotecas dinâmicas (ou compartilhadas) do Linux permitem que um binário use um objeto comum de biblioteca, em vez de um compilado estaticamente com o aplicativo. Leia mais sobre bibliotecas compartilhadas em "Anatomy of Linux dynamic libraries" (developerWorks, agosto de 2008).
  • Uma árvore vermelha e preta (ou árvore B binária simétrica) é uma árvore binária autobalanceadora inventada por Rudolf Bayer. É uma representação útil de árvore, que possui bom tempo de pior cenário possível para operações como inserção procura e exclusão. É possível encontrar árvores vermelhas e pretas usadas em uma variedade de aplicativos, incluindo a construção de matrizes associativas.
  • Na zona Linux do developerWorks, você encontra centenas de artigos e tutoriais de instruções, bem como downloads, fóruns de discussão e muitos outros recursos para desenvolvedores e administradores Linux.
  • Fique por dentro dos eventos técnicos e webcasts do developerWorks sobre uma série de produtos IBM e tópicos do segmento de mercado de TI.
  • Participe de briefing ao vivo e gratuito developerWorks para atualizar-se rapidamente sobre produtos e ferramentas IBM e tendências do segmento de mercado de TI.
  • Veja as demos on demand no developerWorks que abrangem desde demos de instalação e configuração de produtos para iniciantes até funcionalidades avançadas para desenvolvedores experientes.
  • Siga o developerWorks no Twitter, ou assine um feed de tweets sobre o Linux no developerWorks.

Obter produtos e tecnologias

  • Avalie os produtos IBM da maneira que for melhor para você: faça download da versão de teste de um produto, avalie um produto on-line, use-o em um ambiente de nuvem ou passe algumas horas na SOA Sandbox aprendendo a implementar a Arquitetura Orientada a Serviços de modo eficiente.

Discutir

  • Participe da comunidade do My developerWorks. Entre em contato com outros usuários do developerWorks e explore os blogs, fóruns, grupos e wikis voltados para desenvolvedores.

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Linux
ArticleID=604412
ArticleTitle=Anatomia da Memória Compartilhada do Kernel Linux
publish-date=12212010