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.
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
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?
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
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.
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
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).
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.
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.

M. 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.