Na memória do sistema ... especificamente a diferença entre `tmpfs,` `shm,` e `hugepages…`

16

Ultimamente tenho ficado curioso sobre os vários sistemas de arquivos baseados em memória do kernel Linux.

Note:No que me diz respeito, as perguntas abaixo devem ser consideradas mais ou menos opcionais quando comparadas com uma melhor compreensão daquelas colocadas no título. Peço-lhes abaixo porque acredito que respondê-las pode me ajudar a entender melhor as diferenças, mas como meu entendimento é reconhecidamente limitado, segue-se que outras pessoas podem conhecer melhor. Estou preparado para aceitar qualquer resposta que enriquece meu entendimento das diferenças entre os três sistemas de arquivos mencionados no título.

Por fim, acho que gostaria de montar um sistema de arquivos utilizável, hugepages,embora algumas pesquisas leves (e ainda mais leves) tenham me levado a acreditar que a rewritable hugepage mountnão é uma opção. Estou enganado? Quais são os mecanismos em jogo aqui?

Também sobre hugepages:

     uname -a
3.13.3-1-MANJARO \
#1 SMP PREEMPT \
x86_64 GNU/Linux

    tail -n8 /proc/meminfo
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:     8223772 kB
DirectMap2M:    16924672 kB
DirectMap1G:     2097152 kB

(Aqui estão as versões em texto completo de / proc / meminfo e / proc / cpuinfo )

O que está acontecendo no item acima? Já estou alocando hugepages?Existe uma diferença entre as DirectMappáginas de memória ehugepages?

Atualizar Depois de um empurrãozinho do @Gilles, adicionei mais 4 linhas acima e parece que deve haver uma diferença, embora eu nunca tivesse ouvido falar DirectMapantes de puxar isso tailontem ... talvez DMIou algo assim?

Só um pouco mais ...

Na falta de sucesso no hugepagesempreendimento e na suposição de backups em disco rígido de qualquer arquivo de imagem, quais são os riscos de montar loops de tmpfs?Meu sistema de arquivos está sendo swappedo pior cenário? Entendo que o tmpfscache do sistema de arquivos está montado - meu arquivo de loop montado pode ser pressionado sem memória? Existem ações atenuantes que posso tomar para evitar isso?

Por último - exatamente o que é shm,afinal? Em que difere ou inclui um hugepagesou outrotmpfs?

mikeserv
fonte
11
E as linhas anteriores /proc/meminfoque contêm HugePage(ou a sua versão do kernel não as possui)? Em que arquitetura está (x86_64, suponho)?
Gilles 'SO- stop being evil
Vou adicioná-los. Eu só estava preocupado com isso por muito tempo.
mikeserv
@ Gilles - eu tenho um link para texto simples acima. Espero que esteja tudo bem. Obrigado por perguntar - eu deveria ter incluído em primeiro lugar - não sei como senti falta disso.
mikeserv

Respostas:

13

Não há diferença entre tmpfs e shm. tmpfs é o novo nome para shm. shm significa SHaredMemory.

Veja: Linux tmpfs .

A principal razão pela qual o tmpfs é usado até hoje é esse comentário no meu / etc / fstab na minha caixa do gentoo. O BTW Chromium não será construído com a linha ausente:

# glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for 
# POSIX shared memory (shm_open, shm_unlink). 
shm                     /dev/shm        tmpfs           nodev,nosuid,noexec     0 0 

que saiu da documentação do kernel do linux

Citação:

O tmpfs tem os seguintes usos:

1) Há sempre uma montagem interna do kernel que você não verá
. Isso é usado para mapeamentos anônimos compartilhados e memória compartilhada SYSV
.

Esta montagem não depende de CONFIG_TMPFS. Se CONFIG_TMPFS não estiver definido, a parte visível do usuário do tmpfs não será criada. Mas os
mecanismos internos estão sempre presentes.

2) O glibc 2.2 e superior esperam que os tmpfs sejam montados em / dev / shm para
memória compartilhada POSIX (shm_open, shm_unlink). A adição da seguinte
linha ao / etc / fstab deve cuidar disso:

Padrão tmpfs / dev / shm tmpfs 0 0

Lembre-se de criar o diretório no qual você pretende montar o tmpfs, se necessário.

Esta montagem não é necessária para a memória compartilhada SYSV. A
montagem interna é usada para isso. (Nas versões do kernel 2.3, era
necessário montar o antecessor do tmpfs (shm fs) para usar a memória
compartilhada SYSV )

3) Algumas pessoas (inclusive eu) acham muito conveniente montá-lo,
por exemplo, em / tmp e / var / tmp e possuem uma grande partição de troca. E agora as
montagens em loop dos arquivos tmpfs funcionam, portanto, o mkinitrd enviado pela maioria das
distribuições deve ter sucesso com um tmpfs / tmp.

4) E provavelmente muito mais eu não sei sobre :-)

O tmpfs possui três opções de montagem para dimensionamento:

tamanho: o limite de bytes alocados para esta instância tmpfs. O padrão é metade da sua RAM física sem troca. Se você sobredimensionar suas instâncias tmpfs, a máquina travará, pois o manipulador de OOM não poderá liberar essa memória.
nr_blocks: o mesmo que tamanho, mas em blocos de PAGE_CACHE_SIZE.
nr_inodes: o número máximo de inodes para esta instância. O padrão é metade do número de suas páginas de RAM físicas ou (em uma máquina com memória alta) o número de páginas de memória RAM baixa, o que for menor.

No Documento transparente do kernel Hugepage:

O Suporte a páginas enormes transparentes maximiza a utilidade da memória livre, se comparado à abordagem de reserva do hugetlbfs, permitindo que toda a memória não utilizada seja usada como cache ou outro móvel (ou mesmo entidades móveis). Ele não requer reserva para impedir que falhas de alocação de páginas enormes sejam perceptíveis na área do usuário. Ele permite que a paginação e todos os outros recursos avançados da VM estejam disponíveis nas grandes páginas. Não requer modificações para os aplicativos tirarem vantagem disso.

No entanto, os aplicativos podem ser otimizados ainda mais para aproveitar esse recurso, como por exemplo, eles foram otimizados antes para evitar uma enxurrada de chamadas do sistema mmap para todos os malloc (4k). A otimização da área do usuário não é obrigatória e o khugepaged já pode cuidar de alocações de páginas de longa duração, mesmo para aplicativos desconhecidos de grandes páginas que lidam com grandes quantidades de memória.


Novo comentário depois de fazer alguns cálculos:

HugePage Tamanho: 2MB
HugePages Usado: Nenhum / Desligado, como evidenciado por todos os 0s, mas ativado conforme os 2Mb acima.
DirectMap4k: 8.03Gb
DirectMap2M: 16.5Gb
DirectMap1G: 2Gb

Usando o parágrafo acima sobre otimização no THS, parece que 8 GB de sua memória estão sendo usados ​​por aplicativos que operam usando mallocs de 4k, 16,5Gb, foram solicitados por aplicativos usando mallocs de 2M. Os aplicativos que usam mallocs da 2M estão imitando o HugePage Support, transferindo as seções 2M para o kernel. Este é o método preferido, porque uma vez que o malloc é liberado pelo kernel, a memória é liberada para o sistema, enquanto a montagem de tmpfs usando Hugepage não resultaria em uma limpeza completa até que o sistema fosse reiniciado. Por fim, o mais fácil, você tinha 2 programas abertos / em execução que solicitavam um malloc de 1Gb

Para aqueles de vocês que não conhecem um malloc, é uma estrutura padrão em C que significa ALLOCation de memória. Esses cálculos servem como prova de que a correlação do OP entre o DirectMapping e o THS talvez esteja correta. Observe também que a montagem de um HUGEPAGE ONLY fs resultaria apenas em ganhos de incrementos de 2 MB, enquanto permitir que o sistema gerencie a memória usando THS ocorre principalmente em blocos de 4k, o que significa que, em termos de gerenciamento de memória, cada chamada malloc salva o sistema em 2044k (2048 - 4 ) para algum outro processo usar.

eyoung100
fonte
2
Isso é realmente bom - o THS é o meu DirectMap ?
mikeserv
Que não posso responder enquanto pesquisava no DirectMapping e não encontrei nada relacionado a tmpfs etc. A única coisa que pude encontrar foi como configurar o Suporte HugeMem para bancos de dados Oracle rodando no seu sabor do Linux, o que significa que eles estão usando HugePages em vez do THS Eu me referi. Todos os kernels no ramo 2.6 suportam o THS. Como um palpite, veja meu novo comentário acima.
precisa saber é o seguinte
Sim, eu apareci muito pouco também. Eu fiz algumas leituras sobre HP, THP. Estou bastante intrigado com o seu comentário. Isso está realmente moldando, cara. Esta última parte - somente HP - devo interpretar isso como significando que posso montar um sistema de arquivos de leitura / gravação no topo de uma montagem de páginas enormes? Tipo, um arquivo de imagem montado em loop a partir de uma montagem de página enorme? Gravável?
precisa saber é o seguinte
Sim, e é gravável quando montado corretamente, mas lembre-se: 1. Desde que você o montou, você é responsável pela limpeza 2. É um desperdício: usando seu exemplo, digamos que seu loop continha apenas um arquivo de texto, com os Personagens: Olá, meu nome é Mike. Supondo que cada caractere tenha 1k, esse arquivo será salvo como 23k. Você desperdiçou 2025k porque o Hugepage deu a você 2MB. Esse comportamento desnecessário é o motivo pelo qual o gerenciamento de memória foi incorporado ao kernel. Ele também nos impede de precisar de um wrapper DLL como kernel32
eyoung100
e por último 3. Você perde sua montaria ao reiniciar ou travar.
precisa saber é o seguinte
4

Para resolver o problema "DirectMap": o kernel possui um mapeamento linear ("direto") da memória física , separado dos mapeamentos virtuais alocados a cada processo do usuário.

O kernel usa as maiores páginas possíveis para esse mapeamento para reduzir a pressão TLB.

O DirectMap1G fica visível se sua CPU suportar páginas de 1 GB (Barcelona em diante; alguns ambientes virtuais as desativam) e se ativada no kernel - o padrão é 2.6.29+.

GreenReaper
fonte
3

Não há diferença entre shme tmpfs(na verdade, tmpfsé apenas o novo nome do antigo shmfs). hugetlbfsé um tmpfssistema de arquivos baseado em alocação de espaço a partir de páginas enormes do kernel e precisa de alguma configuração adicional disponível (como usar isso é explicado em Documentação / vm / hugetlbpage.txt ).

Andreas Wiese
fonte
Foi uma boa tentativa, e eu tinha lido esses documentos, é claro. Ou talvez não, é claro - mas acho que vou oferecer isso por uma recompensa de 100rep, mas antes disso, vou oferecer a você se você puder expandir isso. Até agora, você ainda não enriqueceu meu entendimento - eu já sabia a maior parte, exceto que os dois eram apenas sinônimos. De qualquer forma, se você puder fazer uma resposta melhor amanhã de manhã, a recompensa de 100rep é sua. Especialmente interessante para mim é que não encontro menção DirectMapalguma na procfs manpágina. Por quê?
precisa saber é o seguinte
11
@mikeserv - Encontrei este diff que mostra de que função os DirectMaps são calculados: lkml.org/lkml/2008/11/6/163
slm