Faz sentido para cache de dados obtidos a partir de um arquivo de memória mapeada?
-
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.
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.