Faz sentido para cache de dados obtidos a partir de um arquivo de memória mapeada?

StackOverflow https://stackoverflow.com/questions/2516443

  •  22-09-2019
  •  | 
  •  

Pergunta

Ou seria mais rápido para re-ler os dados da memória mapeada mais uma vez, o sistema operacional pode implementar seu próprio cache?

A natureza dos dados não é conhecida antecipadamente, presume-se que leituras de arquivo aleatório.

Foi útil?

Solução

eu queria falar algumas coisas que eu li sobre o assunto.A resposta é nenhum, você não quer adivinhar o sistema operacional gerenciador de memória.

A primeira vem da idéia de que você quer que seu programa (por exemplo,MongoDB, o SQL Server) para tentar limitar a sua memória com base em um percentual de memória livre:

Não tente alocar memória até que haja apenas x% gratuito

Ocasionalmente, um cliente que irá pedir uma maneira de projetar o seu programa, por isso continua a consumir RAM até que haja apenas x% gratuito.A idéia é que o programa deve utilizar a RAM de forma agressiva, enquanto ainda deixando RAM suficiente disponível (x%) para outro uso.A menos que você estiver criando um sistema onde você é o único programa em execução no computador, esta é uma má idéia.

(leia o artigo para a explicação de por é ruim, incluindo fotos)

Em seguida, vem a partir de algumas notas do autor de um Verniz, e o proxy reverso:

Varnish Cache - Notas do arquiteto

Então, o que acontece com lulas elaborar o gerenciamento de memória é que ele se mete em brigas com os kernels elaborar o gerenciamento de memória, e como em qualquer guerra civil, que nunca fica nada feito.

O que acontece é isto:Lula cria um objeto HTTP na "memória RAM" e ele é usado algumas vezes rapidamente, após criação.Depois de algum tempo ele começa a não mais hits e o kernel percebe isso.Então alguém tenta obter a memória do kernel para algo e o kernel decide empurrar aqueles não utilizados páginas de memória para o espaço de troca e usar o (cache RAM) mais sensata para alguns dados que é realmente utilizada por um programa.Isso, entretanto, é feito sem o squid saber sobre ele.Lula ainda acha que esses http objetos estão na memória RAM, e eles vão ser, a segunda tenta acessá-los, mas até então, a RAM é usada para algo produtivo.

Imagine que você fazer cache de algo a partir de um arquivo de memória mapeada.Em algum ponto no futuro que a memória holding que "cache" será permutado para o disco.

  • o sistema operacional tem escrito para o disco rígido, algo que já existe na unidade de disco rígido

Em seguida, vem um tempo quando você quiser realizar uma pesquisa a partir do seu "cache" de memória, em vez de "real" de memória.Você tenta acessar o "cache", e desde então ele tem sido trocada de RAM o hardware gera uma PAGE FAULT, e a cache é comutado de volta para a RAM.

  • o cache de memória é tão lento como o "real" de memória, uma vez que ambos não estão mais na memória RAM

Finalmente, você deseja liberar o cache (talvez o seu programa está sendo desligado).Se o "cache" tem sido trocada, o sistema operacional deve primeiro trocá-lo de volta para que ele possa ser libertado.Se em vez disso você só não mapeados seu arquivo de memória mapeada, tudo é passado (não precisa de nada para ser trocado).

  • neste caso, o cache torna as coisas mais lentas

Novamente, de Raymon Chen:Se o seu aplicativo está a fechar - fechar já:

Quando DLL_PROCESS_DETACH informa que o processo está a sair, a sua melhor aposta é para voltar sem fazer nada

Uso regularmente de um programa que não seguem esta regra.O programa atribui uma grande quantidade de memória durante o curso da sua vida, e quando eu sair do programa, ele apenas se senta lá por vários minutos, às vezes girando em 100% de CPU, por vezes, agitando-se a unidade de disco rígido (por vezes em ambos).Quando eu romper com o depurador para ver o que está acontecendo, eu descobrir que o programa não está fazendo nada de produtivo.É só metodicamente, libertando o último byte de memória ele tinha alocado durante seu tempo de vida.

Se o meu computador não estava sob muita pressão de memória, em seguida, a maioria dos memória que o programa tinha atribuído durante a sua vida ainda não foi paginada, assim libertando-a cada última gota de memória é um CPU-bound operação.Por outro lado, se eu tinha começado a construir ou feito outra coisa intensivo de memória, em seguida, a maior parte da memória do programa tinha atribuído durante a sua vida tem sido paginada fora, o que significa que o programa de páginas todos os que a memória volta a partir da unidade de disco rígido, só assim poderia chamar-se grátis sobre ele.Soa meio rancorosa, na verdade."Venha aqui, então eu posso dizer que você vá embora."

Tudo isso anal-rententive de gerenciamento de memória é inútil.O processo está a sair.Tudo que a memória vai ser liberada quando o espaço de endereço é destruído.Pare de perder tempo e só sair já.


A realidade é que os programas já não são executados em "RAM", eles são executados na memória - virtual memória.

Você pode fazer uso de um cache, mas você tem que trabalhar com o sistema operacional do gerenciador de memória virtual:

  • você deseja manter o seu cache dentro como poucos páginas possível
  • você deseja garantir que permanecem na memória RAM, em virtude de eles serem acedidos um monte (i.e.na verdade, sendo um útil cache)

Acesso:

  • mil 1-byte locais em torno de um 400GB arquivo

é muito mais caro do que acessar

  • um único 1000-local de byte em um arquivo de 400GB

Em outras palavras:você realmente não precisa cache de dados, você precisa de um mais localizadas estrutura de dados.

Se você manter seus dados mais importantes, confinadas a uma única página de 4k, você vai jogar muito mais agradável com o VMM;Windows é o seu cache.

Quando você adiciona 64-byte quad-palavra alinhada cache-linhas, há ainda mais incentivo para ajustar a sua estrutura de dados layout.Mas, então, você não quer que ele muito compacto, ou você vai começar a sofrer penalidades de desempenho de liberações de cache de Falso Compartilhamento.

Outras dicas

A resposta é altamente específica do OS. De um modo geral, não haverá sentido em armazenar esses dados. Tanto os dados "em cache" quanto o mapeado da memória podem ser pagos a qualquer momento.

Se houver alguma diferença, será específico para um sistema operacional - a menos que você precise dessa granularidade, não há sentido em armazenar em cache os dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top