Por que RAM parcialmente cheia causa atraso?

52

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

Eu noto que no celular mais do que no PC, como tem menor RAM, por exemplo meu celular tem 2 GB de RAM; quando eu tenho menos de 1 GB de RAM livre, ele fica muito atrasado! Por que isso acontece, mesmo que ainda tenha ~ 1 GB para usar?

    
por Mohammed Noureldin 28.08.2017 / 11:56

6 respostas

70

Há muito envolvido aqui, mas tentarei explicá-lo da maneira mais simples possível e de uma maneira aplicável a qualquer sistema operacional.

Existem dois princípios básicos aqui:

  1. A soma total de tudo que precisa estar na RAM e as 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 processo e a lista de espera. Este último contém dados e códigos que já estiveram em uso ativo, mas que, desde então, se tornaram inativos. Muito disso será usado novamente, alguns em breve, por isso é benéfico manter isso na RAM. Essa memória funciona como um tipo de cache, mas não é realmente essencial, portanto, está na categoria de memória disponível. Como a memória livre, ela pode ser dada rapidamente a qualquer programa que precise dela. No interesse da performance, a memória standby deve ser grande.

  2. A frequência de uso dos 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, muitas vezes 4K bytes. Alguns blocos são acessados muitas vezes por segundo, enquanto outros não são acessados por muitos minutos, horas, dias ou mesmo semanas, se o sistema estiver funcionando por tempo suficiente. Existe uma ampla gama de uso entre esses dois extremos. O gerenciador de memória sabe quais blocos foram acessados recentemente e quais não foram. É uma suposição razoável que um bloco de memória que tenha sido acessado recentemente será necessário novamente em breve. A memória que não foi acessada recentemente provavelmente não será necessária em breve. 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 conseqüências indesejáveis do primeiro. Para fazer isso, ele faz um ato de balanceamento de manter os dados acessados recentemente na RAM enquanto mantém 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 não usados 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ódigos 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 menos usados recentemente não podem mais estar na RAM, mas devem ser deixados no disco. O gerenciador de memória tenta manter um bom equilíbrio entre a memória em uso ativo e a memória disponível. Mas à medida que a carga de trabalho aumenta, o gerenciador de memória será forçado a fornecer mais memória disponível para os 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 enquanto 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 de RAM atinge altos níveis, isso acontece com muito mais frequência. A situação pode se tornar tão ruim que gasta-se mais tempo transferindo dados de e para a RAM do que o gasto na sua utilização real. Isso é uma surra, algo que o gerenciador de memória tenta evitar muito, mas com uma alta carga de trabalho, muitas vezes não pode ser evitado.

O gerenciador de memória está do seu lado, sempre tentando manter o melhor desempenho, mesmo sob condições adversas. Mas quando a carga de trabalho é ótima e a memória disponível fica curta, ela deve fazer coisas ruins para continuar funcionando. Isso é de fato o mais importante. A prioridade é a primeira a manter as coisas funcionando, então faça o mais rápido possível.

    
por 28.08.2017 / 16:43
30

Todos os sistemas operacionais modernos usam memória de outra forma não utilizada para armazenar dados em cache, de modo que possam ser acessados a partir da RAM rápida em vez de armazenamento mais lento. Eles geralmente relatam isso como memória livre, já que 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.

    
por 28.08.2017 / 13:12
4

This answer has been mostly rewritten to reorganise the structure and make the message clearer. I have also opened it as a community wiki answer; Feel free to edit.

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 sobe para um nível alto (ou seja, 80% da capacidade), a paginação começa a se estender da RAM para a RAM virtual (RAM virtual).

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

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

Enquanto RAM dedicada é acessada diretamente através da placa-mãe a partir da CPU, que fornece uma conexão rápida, a RAM virtual deve atravessar o cabeamento entre a placa e a localização da vRAM.

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

Debater é a prática de transferir rapidamente e rapidamente páginas de memória para a sua memória virtual. Isso prejudica muito o desempenho, à medida que mais tempo é gasto na busca e no endereçamento de dados.

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

Saiba mais sobre o que está aqui !

A big thanks to the contributors of this answer including Daniel B, xenoid and Jon Bentley.

    
por 28.08.2017 / 15:40
1

É porque o SO precisa fazer muita paginação (carregar partes de programas ativos) e trocar (mover dados em RAM para HD e vice-versa) para manter seu software em execução. Quando novas páginas precisam ser carregadas, o que pode precisar de mais espaço do que os 20% disponíveis, o sistema operacional terá que trocar as páginas existentes na RAM, o que considera menos provável de ser usado em breve. Especialmente no arranque de outros programas. A troca e a troca de páginas leva muito tempo e reduz drasticamente o desempenho de seus PCs, pois agora você está trabalhando na velocidade do HD, não da RAM.

Ajuda um pouco em um disco rígido a criar uma partição especial no seu HD e designe-o como espaço "swap" dedicado (não o use para arquivos "reais") para que a troca seja menos afetada pela fragmentação dos HDs.

    
por 29.08.2017 / 11:29
1

Lembre-se, os discos rígidos são uma ordem de magnitude mais lenta do que a RAM, e a RAM em si 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. Registradores do processador - Em termos práticos, os registros estão disponíveis dentro de um processador ciclo . Considerando que os processadores fazem bilhões de ciclos por segundo (3 GHz = 3 bilhões de ciclos por segundo), isso é uma loucura rápida.
  2. Cache do processador - Depende do nível, mas estes ainda são bastante rápidos (3-5 ciclos de disponibilidade 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 a acessa. Pense em um entregador de pacotes que precisa parar, pegar o pacote, ir até a porta, 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 até a porta dos fundos da casa. Em termos práticos, estamos falando de 14 a 27 ciclos (dependendo do estado da RAM quando a acessamos).
  4. Drive de Disco Rígido - Há um processo físico aqui agora e, embora isso aconteça o mais rápido possível, você está aguardando que as cabeças se movam e que as faixas se movam 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 Gerenciador de Memória Virtual é um jogador. Está apostando que você não precisa de toda a sua memória RAM o tempo todo, por isso faz um palpite e joga os dados que o seu programa de documentos (que ficou em segundo plano nos últimos 10 minutos enquanto você lê isso) não é realmente importante e o empurra para o disco rígido.

Mas você clica novamente no documento! Agora o VMM precisa carregar todos esses dados de volta do HDD. Pior, se você está com pouca memória RAM, agora tem que empurrar outros dados (mais jogos) para o disco rígido 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).

    
por 30.08.2017 / 16:53
0

A surra responde muito bem. Se você puder, você pode minimizar a rapidez com que isso acontece, reduzindo o swappiness (quanto ram o sistema permitirá que seja usado antes de mover as coisas para trocar espaço). Eu gosto de configurar sistemas para ficarem fora do swap até que o ram atinja 99% para aplicativos de servidor, já que o padrão significaria efetivamente que eu precisaria codificar para que as coisas usem apenas 80% do RAM para aproveitar o cache sem ser penalizado por pressionar o sistema no espaço de troca.

    
por 28.08.2017 / 13:59

Tags