A partir da documentação do kernel, em Documentation/x86/x86_64/mm.txt
:
Virtual memory map with 4 level page tables:
0000000000000000 - 00007fffffffffff (=47 bits) user space, different per mm
2 47 bytes = 128TiB
Estou estudando para o RHCSA e estou confuso com uma declaração que me deparei em algum material de treinamento:
There is no practical maximum RAM, as theoretically, you could run 128 TB of RAM on RHEL 6. But that's just theory. The maximum RAM supported by Red Hat on RHEL 6 is 16 GB on 32-bit systems and 2 TB on 64-bit systems.
Alguém por favor pode explicar de onde vem o limite teórico de 128 TB? Estou confuso sobre como o autor sabe que o limite teórico existe se o RHEL 6 definir claramente outros limites máximos. Isso está apenas considerando os limites teóricos da arquitetura de 64 bits? Ou há algum outro motivo aqui?
A partir da documentação do kernel, em Documentation/x86/x86_64/mm.txt
:
Virtual memory map with 4 level page tables:
0000000000000000 - 00007fffffffffff (=47 bits) user space, different per mm
2 47 bytes = 128TiB
Cada processo do Linux pode endereçar no máximo 128 TB de virtual memória . No entanto, isso é mais do que o kernel do Linux pode lidar com fisicamente . Portanto, esse limite é teórico.
Provavelmente foi escolhido arbitrariamente, com base em um suposto cenário de uso supostamente "pior cenário".
Você não pode usar mais RAM do que o seu hardware permite (48 bits = 256 TB é comum atualmente, e então você será limitado pela quantidade de memória física que o kernel do Linux pode manipular.
Por exemplo, na arquitetura Intel x86 64-bit , o Linux não pode usar mais do que 64 TB de memória física (desde a versão 2.6.30 , mas era 16 TB logo antes). Note que o RHEL 6 usa um kernel 2.6.32 .
Na arquitetura s390 de 64 bits , o mesmo limite se aplica (desde 2.6. 28 ). Se você usa 32 bits, o limite é 4 GB , mas usando um estranho truque chamado PAE , você pode ir até 64 GB (geralmente usado em x86).
Acho que outras arquiteturas de 64 bits têm limites menores.
Veja a tabela de limites da Red Hat para mais informações (obrigado Huygens ).
Não se deve misturar memória virtual e memória física volátil. O primeiro é específico da arquitetura da CPU e será mapeado para a memória volátil e não volátil. Este último, também conhecido como RAM, deve ser independente da arquitetura da CPU do ponto de vista do kernel.
A implementação de AMD e Intel x86_64 de hoje em dia apenas suporta 48 bits de memória virtual endereçável. O que significa que o kernel pode endereçar 2 ^ 48 = 256 TiB por VM de processo.
O kernel do Linux na arquitetura x86_64 divide o espaço da VM endereçável em 2, 128 TiB para o espaço do usuário e 128 TiB para o espaço do kernel. Portanto, um processo pode, teoricamente, endereçar um total de 128 TiB de memória virtual.
O máximo de memória física volátil que o kernel pode manipular é um aspecto diferente, mas eu não conheço essa informação.
Com relação à declaração do autor do RHCSA
O autor da declaração "Não há RAM máxima prática, como teoricamente, você poderia executar 128 TB de RAM no RHEL 6." está usando terminologia errada ou incompreendida. Aqui está a tabela do site da Red Hat resumindo as capacidades do RHEL 3, 4, 5 e 6 . E eles afirmam claramente "Máximo x86_64 espaço de endereço virtual por processo [...] 128TB [para RHEL 6]"
A mesma página afirma que o RHEL 6 suporta no máximo 2TB / 64TB de RAM (memória volátil física). Eu acho que isso significa que é certificado para um máximo de 2TB de RAM, e teoricamente poderia ir até 64TB. O SLES é muito mais claro a esse respeito .
A outra razão é teórica é a falta de experiência de implementação.
É comum os programadores dimensionarem as variáveis muito antes do que o hardware é capaz, de modo que o kernel não precise de programação arriscada de rip-and-replace, já que o hardware dessa capacidade aparece uma década ou mais depois.
No entanto, o tamanho variável não é o único limite. Estruturas de dados e seus algoritmos impõem seus próprios limites. Imagine por um momento fazer um passeio linear de uma estrutura de dados descrevendo cada página 4KB daquela 128TB. Existem algumas respostas óbvias: não use páginas de 4KB, não use uma estrutura de dados linear, não acesse essas estruturas de dados com frequência, descarregue o máximo possível no hardware. Mas existem estruturas de dados mais sutis + limitações de algoritmos que não saberemos até encontrá-las.
Sabemos que, se fôssemos magicamente descobrir um PC de 128 TB amanhã e tentarmos inicializar o Linux nele, ele terá um desempenho terrível e, talvez, terrivelmente, para não começar. Mas consertar os algoritmos é trivial, consertar as estruturas de dados é algum trabalho, mas ainda muito menos trabalho do que consertar o tamanho de uma variável amplamente compreendida. Então, veremos mudanças dessa natureza conforme o tamanho da memória aumenta.