Posso copiar arquivos grandes mais rápido sem usar o cache de arquivos?

17

Depois de adicionar o pacote preload , meus aplicativos parecem acelerar, mas se eu copiar um arquivo grande, o cache de arquivos aumentará em mais que o dobro do tamanho do arquivo.

Ao transferir uma imagem ou arquivo de vídeo virtual de 3-4 GB para uma unidade externa, esse cache enorme parece remover todos os aplicativos pré-carregados da memória, levando a um aumento nos tempos 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 colocar pastas em cache ou listas negras específicas de serem armazenadas em cache?

    
por Veazer 17.04.2012 / 16:37

3 respostas

16

Existe o utilitário nocache , que pode ser anexado a um comando como ionice e nice . Ele funciona pré-carregando uma biblioteca que adiciona posix_fadvise com o sinal POSIX_FADV_DONTNEED a qualquer chamada aberta.

Em termos simples, aconselha o kernel que o armazenamento em cache não é necessário para aquele arquivo em particular; o kernel então normalmente não armazenará em cache o arquivo. Consulte aqui para obter detalhes técnicos.

Faz maravilhas para qualquer grande trabalho de cópia, e. g. Se você quiser fazer backup de um disco de vários terabytes em segundo plano com o menor impacto possível no sistema em execução, poderá fazer algo com 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, você pode instalar o pacote 13.10 ou optar por este backport 12.04 de François Marier.

    
por Gunther Piez 03.07.2012 / 10:55
10

Para arquivos grandes e únicos, use dd com 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 sinalizadores direct informam dd para usar a opção de E / S direta do kernel ( O_DIRECT ) durante a leitura e gravação, ignorando completamente o cache de arquivos.
  • A opção bs blocksize deve ser definida como um valor razoavelmente grande, pois minimizar o número de operações de disco físico que dd deve executar, pois as leituras / gravações não são mais armazenadas em cache e muitas operações diretas pequenas podem resultar em um desaceleração séria.
    • Sinta-se à vontade para experimentar valores de 1 a 32 MB; a configuração acima é de 4 MB ( 4M ).

Para cópias de diretório múltiplas / recursivas , infelizmente, não há ferramentas facilmente disponíveis; o usual cp , etc não suporta E / S direta.

/ e iflags & amp; oflags alteradas para o iflag & amp; correto oflag

    
por ish 26.06.2012 / 02:45
0

Você pode copiar um diretório recursivamente com dd usando find e mkdir

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 cd para o diretório de origem, então find relatará diretórios relativos que podemos manipular facilmente:

cd "$SOURCE"

Duplique a árvore de diretórios de $SOURCE para $TARGET

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

Arquivos duplicados de $SOURCE para $TARGET omitindo o cache de gravação (mas utilizando o cache de leitura!)

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

Por favor, note que isso não preservará os tempos de modificação de arquivos, propriedade e outros atributos.

    
por unfa 26.04.2017 / 16:00