Por que a RAM parcialmente cheia causa atraso?

53

Por que a RAM parcialmente cheia (digamos 80%) faz com que o dispositivo fique muito atrasado, mesmo havendo espaço disponível para armazenar mais dados? O que eu espero é que continue funcionando bem até 99%.

Percebo que, no celular, mais do que no PC, pois possui menor RAM, por exemplo, meu celular tem 2 GB de RAM; quando tenho menos de 1 GB de RAM livre, fica muito tempo! Por que isso acontece, mesmo que ainda tenha ~ 1 GB para usar?

Mohammed Noureldin
fonte
28
Suspeitei que você estivesse assumindo que a RAM disponível não está sendo usada. Então você vê 20% de RAM disponível e pensa que apenas 80% da RAM está sendo usada. Isso está incorreto, a RAM pode ser usada e disponível. (Por exemplo, a máquina que eu estou usando agora tem 32 GB de RAM e 21,1 GB estão disponíveis, mas apenas 1,8 GB estão livres.)
David Schwartz
2
Você quer dizer meu espaço livre no disco rígido com minha RAM? certamente não.
Mohammed Noureldin 28/08
3
Eles podem ser substituídos, com certeza. Mas isso terá um enorme efeito negativo no desempenho - exatamente como você está vendo. Se o conjunto de trabalho exceder a RAM, o desempenho será terrível, independentemente da quantidade de RAM disponível.
David Schwartz
3
O que faz você pensar que é a porcentagem de RAM que atrasa o dispositivo?
enkryptor
4
@MohammedNoureldin Acho que deve haver uma razão pela qual sua RAM está ocupada (vários processos estão funcionando e fazendo alguma coisa). Esse pode ser o mesmo motivo pelo qual o dispositivo está com atraso. O carregamento da RAM pode ser apenas um sintoma, não o motivo em si.
enkryptor

Respostas:

70

Há muita coisa envolvida aqui, mas tentarei explicá-la da maneira mais simples possível e de uma maneira aplicável a praticamente qualquer sistema operacional.

Existem 2 princípios básicos aqui:

  1. A soma total de tudo o que precisa estar na RAM e daquelas coisas que se beneficiariam de estar na RAM é quase sempre maior que o tamanho da RAM. As coisas que se beneficiariam de estar na RAM incluem conjuntos de trabalho de processos e a lista de espera. O último contém dados e código que estavam em uso ativo, mas que entraram em inatividade. Muito disso será usado novamente, alguns deles em breve, portanto, é benéfico mantê-lo na RAM. Essa memória atua como um tipo de cache, mas não é realmente essencial, assim como na categoria de memória disponível. Como a memória livre, ela pode ser entregue rapidamente a qualquer programa que precise. No interesse do desempenho, a memória em espera deve ser grande.

  2. A frequência de uso de blocos de memória está longe de ser aleatória, mas pode ser prevista com considerável precisão. A memória é dividida em blocos, geralmente 4K bytes. Alguns blocos são acessados ​​muitas vezes por segundo, enquanto outros não são acessados ​​por muitos minutos, horas, dias ou até semanas, se o sistema já estiver em funcionamento por tempo suficiente. Há uma ampla gama de uso entre esses dois extremos. O gerenciador de memória sabe quais blocos foram acessados ​​recentemente e aqueles que não foram. É uma suposição razoável de que um bloco de memória acessado recentemente será necessário novamente em breve. A memória que não foi acessada recentemente provavelmente não será necessária tão cedo. A longa experiência provou que este é um princípio válido.

O gerenciador de memória aproveita o segundo princípio para mitigar amplamente as consequências indesejáveis ​​do primeiro. Para fazer isso, é um ato equilibrado de manter os dados acessados ​​recentemente na RAM, enquanto mantém os dados raramente usados ​​nos arquivos originais ou no arquivo de paginação.

Quando a RAM é abundante, esse ato de equilíbrio é fácil. Muitos dos dados usados ​​não tão recentemente podem ser mantidos na RAM. Esta é uma boa situação.

As coisas ficam mais complicadas quando a carga de trabalho aumenta. A soma total de dados e código em uso é maior, mas o tamanho da RAM permanece o mesmo. Isso significa que um subconjunto menor disso pode ser mantido na RAM. Alguns dos dados usados ​​menos recentemente não podem mais estar na RAM, mas devem ser deixados no disco. O gerenciador de memória tenta muito manter um bom equilíbrio entre a memória em uso ativo e a memória disponível. Porém, à medida que a carga de trabalho aumenta, o gerenciador de memória será forçado a fornecer mais memória disponível aos processos em execução. Esta não é uma boa situação, mas o gerenciador de memória não tem escolha.

O problema é que mover dados de e para a RAM à medida que os programas são executados leva tempo. Quando a RAM é abundante, isso não acontece com muita frequência e nem será notado. Mas quando o uso da RAM atingir altos níveis, isso acontecerá com muito mais frequência. A situação pode se tornar tão ruim que se gasta mais tempo movendo dados de e para a RAM do que se gasta realmente usá-los. Isso é impressionante, algo que o gerente de memória tenta evitar, mas com uma carga de trabalho alta, muitas vezes não pode ser evitado.

O gerenciador de memória está do seu lado, sempre tentando o melhor para manter o desempenho ideal, mesmo em condições adversas. Porém, quando a carga de trabalho é grande e a memória disponível é insuficiente, é preciso fazer coisas ruins para continuar funcionando. Essa é de fato a coisa mais importante. A prioridade é primeiro manter as coisas funcionando e torná-las o mais rápido possível.

LMiller7
fonte
11
Sua resposta me ajudou muito, obrigado! Isso memory mangerfaz parte do meu OSdireito? então, se eu estivesse lidando com ponteiros e essas coisas de nível muito baixo, ainda será capaz de fazer paginação?
Mohammed Noureldin 28/08/19
7
O gerenciador de memória faz parte do sistema operacional. A paginação é uma função básica do gerenciador de memória e é tão essencial para a operação quanto a respiração é para você e para mim. Ela não pode ser interrompida.
precisa saber é o seguinte
2
@MohammedNoureldin: Ao escrever aplicativos no espaço do usuário (cujas visualizações de memória são isoladas da do kernel e de outros processos), não é possível acessar diretamente a memória física . Tudo o que você pode acessar é uma visão da memória gerenciada pelo - você adivinhou - gerenciador de memória com todos os seus recursos (provavelmente), incluindo paginação. Ponteiros de memória referem-se apenas a pontos nos espaços de endereço de uma exibição de memória. Eles são um conceito de linguagem usado no código do espaço do usuário e do kernel, mas isso não significa que as duas visualizações de memória sejam idênticas. Não confunda gerenciamento de memória de processo com o kernel MM!
precisa
6
É 'óbvio' ou 'bem conhecido', mas talvez ainda deva ser adicionado a esta resposta: a memória (ram) é da ordem de 1000x mais rápida que um disco rígido (bem, dependendo de muitas coisas, por exemplo ssd / ide / SATA, etc). O sistema operacional executa o código da ram (+ cache), não do disco. Quando a memória fica baixa e o sistema operacional precisa "trocar" partes do código ("não utilizado") da memória para o disco, liberar ram para executar outra coisa, isso levará muito tempo (a troca) e se isso acontecer com frequência (por exemplo: você tem muitos programas, cada um deles precisava de uma troca para que seu código fosse carregado na memória), isso tornaria as coisas mais lentas.
Olivier Dulac
3
Normalmente, não usamos o termo "swap" para nos referir ao carregamento de código na memória. Isso geralmente é chamado de "falha". Normalmente, o termo "troca" é usado apenas para informações que precisam ser gravadas no disco antes que possam ser ejetadas da RAM.
David Schwartz
29

Todos os sistemas operacionais modernos usam memória não utilizada para armazenar dados em cache, para que possam ser acessados ​​a partir de RAM rápida, em vez de armazenamento mais lento. Eles geralmente relatam isso como memória livre, pois os aplicativos podem limpar o cache e usá-lo se necessário, mas ele ainda está sendo usado. Quanto menos houver, menos dados poderão ser armazenados em cache e mais lento será o computador.

Mike Scott
fonte
11
Na verdade, os aplicativos não precisam "limpar" o cache. Eles apenas solicitam RAM do sistema operacional. O sistema operacional, como não possui RAM não utilizada, limpará parte do cache do arquivo e fornecerá a RAM agora zerada para o aplicativo. O aplicativo não pode dizer de onde veio essa RAM.
precisa saber é o seguinte
5
@MSalters Sim, concordo, o aplicativo solicita RAM e o sistema operacional limpa o cache, se necessário. Eu estava tentando manter as coisas simples.
Mike Scott
Isso foi um pouco claro, mas estou um pouco mais ciente dos detalhes; portanto, tenho a sensação de que algo está faltando e preciso de mais detalhes. A resposta do @LMiller me ajudou na verdade, isso será ótimo se você puder revisar o informações nele.
Mohammed Noureldin 28/08/19
4

Essa resposta foi reescrita principalmente para reorganizar a estrutura e tornar a mensagem mais clara. Eu também o abri como uma resposta do wiki da comunidade; Sinta-se livre para editar.

A paginação é um esquema de gerenciamento de memória através do qual blocos de memória de tamanho fixo têm processos atribuídos a eles. Quando o uso da memória aumenta para um nível alto (ou seja, 80% da capacidade), a paginação começa a se estender da RAM para a vRAM (RAM virtual).

O vRAM está localizado no armazenamento do sistema, geralmente em um disco rígido ou em outros locais de armazenamento consideráveis.

Os processos são designados como parte do seu disco rígido para serem executados como memória e tratarão a seção deles como RAM. Esse é um processo perfeitamente normal, no entanto, quando o tempo gasto para transferir dados de e para a vRAM aumenta, o desempenho do sistema diminui.

Enquanto a RAM dedicada é acessada diretamente através da placa-mãe a partir da CPU, que fornece uma conexão rápida, a RAM virtual precisa de cabos transversais entre a placa e o local da vRAM.

No entanto, isso causa apenas um leve impacto no desempenho. Quando a taxa da qual a paginação para o vRAM ocorre aumenta drasticamente (quando a RAM dedicada se aproxima da capacidade), ocorre a debulha.

Thrashing é a prática de transferir rápida e rapidamente páginas de memória para sua memória virtual. Isso causa um enorme impacto no desempenho, pois é necessário mais tempo na busca e tratamento de dados.

Digamos que você queira anotar um número com 30 dígitos. Você pode sentar-se ao lado da tela com o seu bloco de notas e escrevê-lo (usando a memória dedicada) ou se lembrar de partes de 5, correr para a próxima sala e anotá-lo no seu bloco de notas (usando memória virtual). Ambos fazem o trabalho, mas qual será mais rápido?

Saiba mais sobre o thashing aqui !

Muito obrigado aos colaboradores desta resposta, incluindo Daniel B , xenoid e Jon Bentley .

Will
fonte
3
Não é como se surras fossem intencionais. É apenas um efeito colateral da paginação e competição pela memória física. Além disso, a memória virtual não é "criada" movendo as páginas para o disco.
Daniel B
Thrashing é um subproduto, é verdade, mas é imensamente útil nos momentos em que os processos são atropelados, o que ajuda a impedir o bloqueio. E sim, a memória virtual é ocupada e não criada. Vou editar isso em.
Will
8
Não, você está confundindo lixeira e paginação. Lixeira é apenas a paginação se tornando patológica.
xenoid 28/08
@xenoid Paging é um esquema de gerenciamento de memória; É como dizer que estou confundindo acertar um cervo com meu carro e o sistema de rodovias. Thrashing é o processo que causa essa queda no desempenho; No entanto, concordo com você que isso é resultado do sistema de paginação.
Will
11
Os comentários incorporados, inseridos na resposta do wiki, podem ser editados.
Will
1

É porque o sistema operacional precisa fazer muita paginação (carregando partes de programas ativos) e trocando (movendo dados da RAM para HD e vice-versa) para manter o software em execução. Quando novas páginas precisam ser carregadas, o que pode exigir mais espaço do que os 20% disponíveis, o sistema operacional precisará trocar as páginas existentes na RAM, que considera menos provável que sejam usadas em breve. Especialmente no início de outros programas. Trocar e voltar nas páginas leva muito tempo e diminui drasticamente o desempenho do seu PC, porque agora você trabalha na velocidade do HD, não da RAM.

Isso ajuda um pouco em um HDD a criar uma partição especial no seu HD e atribuí-la como espaço dedicado "swap" (não use para arquivos "reais"), para que a troca seja menos afetada pela fragmentação dos HDs.

Gilles Lesire
fonte
A ROM é apenas uma nomenclatura para o HD quando se trata de cache, paginação, etc. Qualquer coisa que não seja a memória de trabalho. E a ROM geralmente é mais lenta que a RAM, quase sempre foi. Os computadores antigos copiaram os dados da ROM para a RAM (ROM Shadowing) durante a inicialização, porque funcionavam mais rapidamente.
Gilles Lesire
11
Claro, mas a ROM e a RAM também são usadas como memória não volátil versus memória volátil? Entre a ROM geralmente é mais lenta, a ROM é copiada para a RAM (ROM Shadowing) na inicialização para obter ganhos de desempenho. Mas com certeza, mudarei a única referência para corrigir sua nitpicking. ;)
Gilles Lesire
1

Lembre-se de que os discos rígidos são uma ordem de magnitude mais lenta que a RAM, e a própria RAM não é tão rápida para começar (na arquitetura geral). Em ordem de velocidade de acesso (onde cada degrau é uma ordem de magnitude mais lenta que a acima), você tem

  1. Registros do processador - Em termos práticos, os registros estão disponíveis em 1 ciclo do processador . Considerando que os processadores realizam bilhões de ciclos por segundo (3 GHz = 3 bilhões de ciclos por segundo), isso é muito rápido.
  2. Cache do processador - Depende do nível, mas ainda é bastante rápido (disponibilidade de 3 a 5 ciclos para o cache L1).
  3. Memória de acesso aleatório (RAM) - A parte aleatória significa que você não sabe em que estado está quando o acessa. Pense em um entregador de pacotes que precisa parar, pegar o pacote, caminhar até a porta e tocar a campainha e esperar por uma resposta. Talvez você não espere nada, ou talvez espere um minuto ou dois para a sra. Smith se arrastar para a porta dos fundos da casa. Em termos práticos, estamos falando de 14 a 27 ciclos (dependendo do estado da RAM quando o acessamos).
  4. Unidade de disco rígido - Há um processo físico aqui agora e enquanto isso acontece o mais rápido possível, você está esperando cabeças se moverem e faixas se moverem sob essas cabeças. Em termos práticos, um HDD de 7.200 RPM pode completar uma revolução em cerca de 4 ms , ou algo em torno de 750.000 ciclos para um processador de 3 GHz . Isso é lento.

O Virtual Memory Manager é um jogador. Está apostando que você não precisa de toda a sua RAM o tempo todo, por isso faz um palpite e lança os dados que o seu programa de documentos (que está em segundo plano nos últimos 10 minutos enquanto você lê isso) não está realmente importante e empurra-o para o disco rígido.

Mas então você clica novamente no documento! Agora o VMM precisa carregar todos esses dados do disco rígido. Pior, se você tem pouca memória RAM, agora ele precisa enviar outros dados (mais jogos) para o HDD para liberar espaço utilizável. O Linux gosta de viver no limite aqui. Ele preencherá a grande maioria da RAM com dados usados ​​com freqüência (ótimo para servidores com poucos processos).

Machavity
fonte
11
Sim, o gerente de memória é um jogador, mas isso pode facilmente ser mal interpretado. Se o acesso à memória fosse realmente aleatório, o gerenciador de memória estaria errado sempre que certo e o sistema inteiro entraria em colapso. Mas os programas tendem a exibir uma forte localidade de referência. Essa é a maioria dos acessos à memória tendem a ser localizados em uma área relativamente pequena da memória. Eles se movimentam, mas são lentos o suficiente para o sistema funcionar. As probabilidades estão empilhadas no favor dos gerentes de memória e os erros são rapidamente corrigidos. Isto foi provado ao longo de décadas de experiência
LMiller7
O Aleatório na Memória de Acesso Aleatório refere-se ao fato de que você pode acessar qualquer um deles aleatoriamente. (Em vez de ter que esperar os dados passarem por baixo das cabeças de leitura como em um disco rígido ou fitas e depois acessar os dados sequencialmente.).
31417 Phil
0

As respostas surradas praticamente acertam em cheio. Se puder, você pode minimizar a rapidez com que isso acontece, reduzindo a troca (quanta memória RAM o sistema permitirá que seja usada antes de mover as coisas para trocar espaço). Eu gosto de configurar os sistemas para ficarem fora de troca até que a ram atinja 99% para aplicativos de servidor, pois o padrão significaria efetivamente que eu precisaria codificar coisas para utilizar apenas 80% da ram para aproveitar o cache sem ser penalizado por empurrar o sistema no espaço de troca.

codykochmann
fonte