Eu sei que posso eliminar tudo do cache do sistema de arquivos Linux , mas existe uma maneira de eliminar apenas um arquivo específico? Ou impedir que um arquivo seja armazenado em cache? Ou diga a um processo para não armazenar em cache nenhum arquivo que ele gravar?
Eu tenho um processo que lê muitos arquivos pequenos e grava um arquivo grande. Quero manter os pequenos arquivos em cache para evitar buscas no disco e não me importo com o cache do arquivo grande.
linux
files
filesystems
cache
Jay Hacker
fonte
fonte
Respostas:
Método potencial # 1 - F_DROP_CACHES
Eu encontrei um método a partir de 2012 que discute um patch proposto para o kernel Linux neste segmento de e-mail intitulado: Re: [RFC Patch] fs: implemente caches de descarte por arquivo .
excertoO encadeamento inclui um testcase e o patch real em vários arquivos no kernel do Linux, o que adiciona uma função adicional ao
fs/drop_caches.c
chamadodrop_pagecache_file(struct file *filp)
. Esta função é, então, acessível através da ferramenta frontend,fnctl.c
através do comandoF_DROP_CACHES
. Este caso chama esta função:Que lida com a eliminação de todos os caches associados ao arquivo especificado. Do arquivo
Então isso pode ser usado?include/linux/mm.h
:Não encontrei nenhuma evidência de que esse patch já tenha chegado ao repositório principal de códigos do kernel do Linux; portanto, essa opção parece estar disponível apenas se você estiver disposto a recompilar o kernel do Linux.
Método potencial # 2 - Usando dd
Nesse mesmo segmento, outro usuário menciona uma metodologia completamente diferente que utiliza
A seguir, trecho desse email Testandodd
.Eu não estava 100% positivo em como testar isso, mas criei a seguinte abordagem.
faça um arquivo de 100MB
arquivo de rastreio acessa usando
fatrace
execute
top
para que possamos monitorar o uso da memória, observe a quantidade grátis.abra o arquivo, observe a quantidade de memória livre agora. Observe
fatrace
o arquivosample.txt
.solte o arquivo da memória, observe a quantidade de memória livre agora. Observe a saída de
fatrace
.Exemplo
No terminal # 1: No terminal 2: No terminal # 3: Agora abra o arquivosample.txt
,, e observe a quantidade de RAM. No terminal # 1. No terminal 2: Observe a saída dofatrace
terminal # 3: Agora remova o arquivo da RAM, no terminal # 4: Observe a saída dofatrace
terminal # 2: Observe a RAM no terminal # 3:Portanto, parece que tudo o que foi consumido pelo arquivo na RAM é liberado.
Método potencial # 3 - python-fadvise
Graças a um comentário de @frostchutz, existe outra ferramenta, um script Python, nomeado
Exemplo[pyadvise][4]
que fornece uma interface muito mais simples do que osdd
métodos acima . Este script utiliza a mesmaposix_fadvise(2)
interface.E se repetirmos o teste acima e usarmos
pyadvise
no lugar dedd
:Notei uma queda idêntica na RAM sendo consumida como antes quando eu usei
dd
.fonte
dd
funciona para mim. Acabei com chris-lamb.co.uk/projects/python-fadvise-me, que é a mesma coisa em um comando mais óbvio.python-fadvise
é muito mais fácil, adicionei um exemplo mostrandodd
.os.posix_fadvise()
na biblioteca padrão do Python.Expandindo a resposta do @ geekosaur, você pode forçar o uso
O_DIRECT
usando LD_PRELOAD e o programa aqui: http://arighi.blogspot.com/2007/04/how-to-bypass-buffer-cache-in-linux.htmlEsse código força
O_DIRECT
para todos os arquivos. No entanto, simplesmente adicionando mais lógica strncmp,__do_wrap_open
você pode aplicar seletivamente O_DIRECT.Disclaimer: Eu não testei isso.
fonte
Você pode abrir arquivos individuais com o
O_DIRECT
sinalizador (consulteman 2 open
) - leia a seção NOTAS dessa página de manual com cuidado e considere se também deseja / precisaO_SYNC
.fonte
cat
e eu prefiro não reescrevê-lo. :) Eu esperava uma ferramenta de linha de comando ou um/proc/sys
botão.open
bandeira; você realmente precisaria escrever um programa para fazê-lo. (cat -u
Única desativastdio
o buffer, não OS buffering.)Se você deseja forçar um arquivo a sempre usar O_SYNC, é possível marcá-lo nos atributos estendidos com
chattr +S $file
:homem chattr:
O_SYNC força os dados + metadados a serem gravados nos buffers de disco, mas ainda passa pelo cache da página. O_DIRECT ignora o cache da página.
Mas esteja ciente de que abri-lo com O_DIRECT seria prejudicial ao desempenho, se o arquivo grande que está sendo anexado, a diferença pode ser pequena. Mas se o arquivo grande foi reescrito em locais aleatórios, o O_DIRECT será um grande sucesso no desempenho, mesmo levando em conta que tê-lo em cache pode expulsar do cache alguns dos pequenos arquivos de leitura.
Se você tiver o carneiro para manter todos os arquivos pequenos, poderá abordar o problema de outra maneira. Certifique-se de que os arquivos pequenos estejam sempre em ram, então sugiro copiá-los para tmpfs :
fonte
chattr +S
não é a mesma coisa queO_DIRECT
, é a mesma coisa queO_SYNC
.O_DIRECT
faz com que as leituras não sejam armazenadas em cache (que é essa a questão) e as gravações não devem ser armazenadas em buffer, sem garantia.O_SYNC
faz com que apenas as gravações não sejam armazenadas em buffer.O_DIRECT
paraO_SYNC
tornaria sua resposta consistente internamente, mas ainda errada ao considerar a pergunta.