Como o FreeBSD aloca memória?

9

Estou ciente de que este é simplificada / explicação generalizada, mas top(1)de memória divide utilidade no FreeBSD em seis piscinas de Active, Inactive, Wired, Cache, Bufferse Free. Exemplo da top(1)saída:

Mem: 130M Active, 42M Inact, 51M Wired, 14M Cache, 34M Buf, 648K Free
Swap: 512M Total, 512M Free

Activeé usado pela execução de processos e Wiredé usado principalmente para o kernel. Inactiveé a memória de processos fechados que ainda é armazenada em cache, caso precise ser reutilizada, Cachesão dados armazenados em cache, Bufferssão buffers de disco (acho que é semelhante à saída do cachedLinux free(1)(?)) e Freeé uma memória completamente não utilizada. Estou correto que o kernel do FreeBSD aloca automaticamente espaço de Inactive, Cachee Buffersagrupa para Activeou Wiredse necessário?

Martin
fonte

Respostas:

13

Para torná-lo curto, ativo e com fio é usada a memória que não deve ou não pode ser trocada para liberar memória. Embora inativo possa ser trocado adequadamente, mas ainda é de propriedade (não liberado) de um processo ou do kernel, portanto, essa não é uma memória muito usada, mas ainda usada.

O novo é a lavanderia, que é uma lista de páginas de memória sujas, que talvez precisem ser gravadas no dispositivo de troca. Se a memória suja precisar ser trocada ou não, ela será adicionada novamente na fila inativa.

A memória com fio não deve ser trocada, por segurança (no caso do kernel) ou por otimização do processo da terra do usuário (como o ZFS). A memória com fio é usada para caches de sistemas de arquivos, que podem ser liberados pelo kernel. Pelo menos para o ZFS, isso pode ser visto como principalmente memória livre.

A memória livre é definitivamente livre.

O cache (agora descontinuado, eu acho) está pronto para ser liberado, já que ele já foi trocado e só existe para possível realocação.

O buffer é usado como cache pela maioria dos sistemas de arquivos (UFS, FAT, ...) e é a quantidade de memória usada pelos sistemas de arquivos. Pode ser actice, inativo ou com fio.

ARC (Adaptive Replacement Cache) é o cache usado pelo ZFS e é a memória que pode ser liberada quando necessário.

Do Wiki do FreeBSD sobre Memória

Classes de memória

Ativo

  • Contém páginas "ativamente" (recentemente) referenciadas por userland
  • Contém uma mistura de páginas limpas e sujas
  • As páginas são digitalizadas regularmente pelo daemon da página (cada página é visitada uma vez a cada vm.pageout_update_period segundos)
  • As verificações verificam se a página foi referenciada desde a última verificação
  • Se varreduras suficientes forem concluídas sem ver uma referência, a página será movida para a fila inativa
  • Implementa pseudo-LRU

Inativo

  • Contém páginas com idade fora da fila ativa
  • Contém páginas removidas do cache do buffer
  • Contém uma mistura de páginas limpas e sujas
  • As páginas são digitalizadas pelo daemon de páginas (iniciando no início da fila) quando há uma falta de memória:
    • As páginas que foram referenciadas são movidas de volta para a fila ativa ou no final da fila inativa
    • As páginas sujas são movidas para o final da fila de lavanderia
    • Páginas limpas e não referenciadas podem ser liberadas e reutilizadas imediatamente
  • Implementa LRU de segunda chance

Lavanderia

  • Fila para gerenciar páginas inativas sujas, que devem ser limpas ("lavadas") antes que possam ser reutilizadas
  • Gerenciado por um encadeamento separado, o encadeamento de lavanderia, em vez do daemon da página
  • A linha de lavanderia lava um pequeno número de páginas para equilibrar as filas inativas e de lavanderia
  • A frequência da lavagem depende de:
    • Quantas páginas limpas o daemon de página está liberando; mais libras contribui para uma maior frequência de lavagem
    • O tamanho da fila de lavanderia em relação à fila inativa; se a fila de lavanderia estiver crescendo, lavaremos com mais frequência
  • As páginas são digitalizadas pelo encadeamento de roupas (a partir do início da fila):
    • As páginas que foram referenciadas são movidas de volta para a fila ativa ou no final da fila de lavanderia
    • Páginas sujas são lavadas e movidas para perto da cabeça da fila inativa

Livre

  • Memória disponível para uso pelo restante do sistema.

Com fio

  • Memória não paginável: não pode ser liberada até que seja liberada explicitamente pelo proprietário
  • A memória do usuário pode ser conectada por mlock (2) (sujeito aos limites do sistema e por usuário)
  • Alocadores de memória do kernel retornam memória com fio
  • O conteúdo do ARC e o cache do buffer são conectados
  • Alguma memória está permanentemente conectada e nunca é liberada (por exemplo, o próprio arquivo do kernel)

De O projeto e implementação do sistema operacional FreeBSD, capítulo 6.12, Substituição de página (Não é mais totalmente exato, mas aqui está para referência da pergunta antiga):

O kernel divide a memória principal em cinco listas:

  1. Com fio : as páginas com fio estão bloqueadas na memória e não podem ser paginadas. Normalmente, essas páginas estão sendo usadas pelo kernel ou pelo pager da memória física ou foram bloqueadas com o mlock . Além disso, todas as páginas que estão sendo usadas para armazenar as pilhas de processos carregados (ou seja, não trocados) também são conectadas.
  2. Ativo : as páginas ativas estão sendo usadas por uma ou mais regiões da memória virtual. Embora o kernel possa paginá-los, é provável que isso faça com que um processo ativo os culpe novamente.
  3. Inativo : as páginas inativas podem estar sujas e ter conteúdo ainda conhecido, mas geralmente não fazem parte de nenhuma região ativa. Se o conteúdo da página estiver sujo, ele deverá ser gravado no armazenamento de backup antes que a página possa ser reutilizada. Depois que a página é limpa, ela é movida para a lista de cache. Se o sistema ficar com pouca memória, o daemon de saída de página pode tentar mover as páginas ativas para a lista inativa na esperança de encontrar páginas que não estão realmente em uso. Os critérios de seleção usados ​​pelo daemon de saída de página para selecionar as páginas a serem movidas da lista ativa para a lista inativa são descritos mais adiante nesta seção. Quando as listas de memória livre e cache caem para baixo, o daemon de saída de página percorre a lista inativa para criar mais cache e páginas livres.
  4. Cache : as páginas de cache têm conteúdo ainda conhecido, mas não fazem parte de um mapeamento. Se estiverem com falha na região ativa, não farão parte de nenhum mapeamento. Se houver falha em uma região ativa, eles serão movidos da lista de cache para a lista ativa. Se eles forem usados ​​para leitura ou gravação, eles serão movidos da lista de cache primeiro para o cache do buffer e eventualmente liberados para a lista inativa. Uma chamada do sistema mlock pode recuperar uma página da lista de cache e conectá-la. As páginas na lista de cache são semelhantes às páginas inativas, exceto que elas não estão sujas, porque não foram modificadas desde que foram paginadas ou porque foram gravadas no armazenamento de backup. Eles podem ser reivindicados para um novo uso quando uma página é necessária.
  5. Livre : As páginas gratuitas não têm conteúdo útil e serão usadas para atender a novas solicitações de falha de página.

Para responder sua pergunta original

Estou correto que o kernel do FreeBSD aloca automaticamente espaço dos pools Inativo, Cache e Buffers para Ativo ou Com Fio, se necessário?

As páginas ativas podem ficar inativas se não forem usadas por algum tempo. Se o kernel trocar uma página inativa , essa página será movida para a lista de cache . As páginas da lista de cache não fazem parte do mapeamento virtual de nenhum processo, mas podem ser facilmente recuperadas, como ativas ou conectadas . Ou quando necessário para E / S como um cache de buffer .

A memória com fio não pode ser trocada pela memória principal. Se for conectado por um processo, ele precisará ser desconectado da munlockchamada para tornar a memória ativa novamente.

A memória ativa , inativa e com fio pode ser liberada pelo processo ou kernel e adicionada à lista gratuita .

Raphael Ahrens
fonte
Acabei de perceber um erro na minha pergunta inicial. Eu perguntei "Am I corrigir este kernel FreeBSD automaticamente aloca espaço de Inactive, Wired, Cachee Bufferspiscinas para Activeou Wired, se necessário?" enquanto eu pretendia perguntar "Estou correto que o kernel do FreeBSD aloca automaticamente espaço de Inactive, Cachee Buffersagrupa para Activeou Wiredse necessário?". Eu atualizei minha pergunta inicial. Assim, em poucas palavras, a memória usada no FreeBSD é Wired+ Activee se essas duas piscinas precisa de uma quantidade adicional de memória, então este é retirado Inacative, Cached, Buffersou Freepiscinas?
Martin
@ Martin sim, isso soa certo. Atualizei minha resposta para sua pergunta.
Raphael Ahrens