Posso copiar arquivos grandes mais rapidamente sem usar o cache de arquivos?

19

Depois de adicionar o preloadpacote, meus aplicativos parecem acelerar, mas se eu copiar um arquivo grande, o cache do arquivo aumenta mais que o dobro do tamanho do arquivo.

Ao transferir um único arquivo de imagem ou vídeo de caixa virtual de 3-4 GB para uma unidade externa, esse enorme cache parece remover todos os aplicativos pré-carregados da memória, levando a um aumento do tempo de carregamento e a quedas gerais de desempenho.

Existe uma maneira de copiar arquivos grandes com vários gigabytes sem armazená-los em cache (ou seja, ignorando o cache de arquivos)? Ou uma maneira de impedir que pastas específicas da lista de permissões ou da lista negra sejam armazenadas em cache?

Veazer
fonte

Respostas:

19

Existe o nocacheutilitário, que pode ser anexado a um comando como ionicee nice. Ele funciona pré-carregando uma biblioteca que adiciona posix_fadviseo POSIX_FADV_DONTNEEDsinalizador a qualquer chamada aberta.

Em termos simples, aconselha o kernel que o cache não é necessário para esse arquivo específico; o kernel normalmente não armazenará em cache o arquivo. Veja aqui os detalhes técnicos.

Ele faz maravilhas para quaisquer trabalhos de cópia enormes, por exemplo, se você deseja fazer backup de um disco com vários terabytes em segundo plano com o menor impacto possível no sistema em execução, pode fazer alguma coisa nice -n19 ionice -c3 nocache cp -a /vol /vol2.

Um pacote estará disponível no Ubuntu 13.10 e superior. Se você estiver em uma versão anterior, poderá instalar o pacote 13.10 ou optar por este backport 12.04 de François Marier.

Gunther Piez
fonte
Eu esperava algo que pudesse ser feito via GUI, bem como uma maneira de simplesmente colocar na lista negra as pastas 'sem cache', mas isso terá que ser feito por enquanto.
Veazer
12

Para arquivos grandes únicos, use ddcom E / S direta para ignorar o cache de arquivos:

Se você deseja transferir um (ou alguns) arquivos grandes de vários gigabytes, é fácil fazer isso com dd :

dd if=/path/to/source of=/path/to/destination bs=4M iflag=direct oflag=direct
  • Os directsinalizadores indicam ddpara usar a opção de E / S direta do kernel ( O_DIRECT) durante a leitura e gravação, ignorando completamente o cache do arquivo.
  • o bs opção de tamanho do bloco deve ser configurada com um valor razoavelmente grande, pois para minimizar o número de operações físicas do disco dd, uma vez que as leituras / gravações não são mais armazenadas em cache e muitas operações diretas pequenas podem resultar em uma desaceleração séria.
    • Sinta-se livre para experimentar valores de 1 a 32 MB; a configuração acima é de 4 MB ( 4M).

Para várias cópias de diretório / recursivas , infelizmente, não há ferramentas facilmente disponíveis; o de semprecp , etc , não suporta E / S direta.

/ e iflags & oflags alterado para o iflag e oflag correto

ish
fonte
1
Recursivo pode ser feito com zsho **operador. zshprecisa ser instalado manualmente a partir dos repositórios.
Reinstate Monica - ζ-- 4/12/12
1
Na verdade não. ddA sintaxe esquisita suja o operador **. Você ainda pode usar um shell script que tem argumentos normalmente ( dd.sh in.file out.filecom ** em nomes de arquivos) e deu os nomes de arquivo para ddusar $1, $2etc, que não deve ser derrubado pela sintaxe estranha de dd.
Reintegrar Monica - ζ--
1
As marcas diretas são muito lentas, pois o AFAIK também desativa os caches readahead, o que provavelmente não é o que você deseja e também não é realista em um cenário de benchmarking. Use "iflag = nocache oflag = nocache" em vez disso, que diz exatamente ao sistema operacional que você não precisa do arquivo em cache ou do arquivo externo ou externo.
Stolsvik
1

Você pode copiar um diretório recursivamente ddusando findemkdir

Precisamos solucionar dois problemas:

  1. dd não sabe o que fazer com diretórios
  2. dd só pode copiar um arquivo de cada vez

Primeiro vamos definir os diretórios de entrada e saída:

SOURCE="/media/source-dir"
TARGET="/media/target-dir"

Agora, vamos cdpara o diretório de origem, para findinformar os diretórios relativos que podemos manipular facilmente:

cd "$SOURCE"

Duplique a árvore de diretórios de $SOURCEpara$TARGET

find . -type d -exec mkdir -p "$TARGET{}" \;

Duplicar arquivos de $SOURCEpara $TARGETomitir cache de gravação (mas utilizando cache de leitura!)

find . -type f -exec dd if={} of="$TARGET{}" bs=8M oflag=direct \;

Observe que isso não preservará os tempos de modificação do arquivo, a propriedade e outros atributos.

unfa
fonte