Não estou preocupado com o uso da RAM (como eu tenho o suficiente) nem com a perda de dados em caso de um desligamento acidental (como minha energia é suportada, o sistema é confiável e os dados não são críticos). Mas eu faço muito processamento de arquivos e poderia usar algum aumento de desempenho.
É por isso que eu gostaria de configurar o sistema para usar mais RAM para o cache de leitura e gravação do sistema de arquivos, para buscar previamente os arquivos de forma agressiva (por exemplo, leia com antecedência o arquivo inteiro acessado por um aplicativo, caso o arquivo seja de tamanho normal ou pelo menos leia antes um grande pedaço) e libere os buffers de gravação com menos frequência. Como conseguir isso (pode ser possível)?
Eu uso sistemas de arquivos ext3 e ntfs (eu uso muito ntfs!) Com o XUbuntu 11.10 x86.
sudo mount -o ro,nobarrier /path/to/mountpoint
ou ajustar/etc/fstab
para incluirnobarrier
qualquer sistema de arquivos que você esteja disposto a sacrificar para melhorar o desempenho. No entanto, se o seu dispositivo de armazenamento tiver bateria interna, como a série SSD Intel 320, o usonobarrier
não causará perda de dados.Respostas:
Melhorar o desempenho do cache de disco em geral é mais do que apenas aumentar o tamanho do cache do sistema de arquivos, a menos que todo o sistema caiba na RAM. Nesse caso, você deve usar a unidade de RAM (
tmpfs
é bom porque permite voltar ao disco, se você precisar da RAM em algum caso) para armazenamento em tempo de execução (e talvez um script initrd para copiar o sistema do armazenamento para a unidade RAM na inicialização).Você não disse se o seu dispositivo de armazenamento é SSD ou HDD. Aqui está o que eu descobri que funciona para mim (no meu caso,
sda
é um HDD montado em/home
esdb
um SSD montado em/
).Primeiro, otimize a parte carregar-coisas-de-armazenamento-para-cache:
Aqui está minha configuração para o HDD (verifique se o AHCI + NCQ está ativado no BIOS se você tiver alternado):
É importante notar que o gabinete do disco rígido é alto
fifo_expire_async
(geralmente gravado) e longoslice_sync
para permitir que um único processo obtenha alto rendimento (definidoslice_sync
como número menor se você encontrar situações em que vários processos aguardam alguns dados do disco em paralelo). Aslice_idle
é sempre um compromisso para HDDs mas defini-lo em algum lugar na faixa de 3-20 deve ser aprovado de acordo com o uso do disco e firmware disco. Prefiro segmentar valores baixos, mas defini-lo muito baixo destruirá sua taxa de transferência. Aquantum
configuração parece afetar muito a taxa de transferência, mas tente manter isso o mais baixo possível para manter a latência em nível sensato. Definirquantum
muito baixo destruirá a taxa de transferência. Os valores no intervalo de 3 a 8 parecem funcionar bem com os HDDs. A pior latência para uma leitura é (quantum
*slice_sync
) + (slice_async_rq
*slice_async
) ms se eu entendi o comportamento do kernel corretamente. O assíncrono é usado principalmente por gravações e, como você deseja adiar a gravação no disco, defina números ambosslice_async_rq
eslice_async
muito baixos. No entanto, definirslice_async_rq
um valor muito baixo pode interromper as leituras, porque as gravações não podem mais ser adiadas após a leitura. Minha configuração vai tentar gravar dados em disco, no máximo, após 10 segundos após os dados terem sido passados ao kernel, mas desde que você pode tolerar a perda de dados sobre a perda de poder também definidosfifo_expire_async
para3600000
dizer que uma hora é bom para o atraso no disco. Apenas mantenha o nívelslice_async
baixo, pois, caso contrário, você poderá obter alta latência de leitura.O
hdparm
comando é necessário para impedir que o AAM destrua grande parte do desempenho que o AHCI + NCQ permite. Se o seu disco emitir muito ruído, pule-o.Aqui está minha configuração para SSD (Intel 320 series):
Aqui vale a pena observar os valores baixos para diferentes configurações de fatia. A configuração mais importante para um SSD é a
slice_idle
que deve ser definida como 0-1. A configuração para zero move todas as decisões de pedido para o NCQ nativo, enquanto a configuração para 1 permite que o kernel solicite solicitações (mas se o NCQ estiver ativo, o hardware poderá substituir parcialmente a solicitação do kernel). Teste os dois valores para ver se você consegue ver a diferença. Para Intel 320 series, parece que a criaçãoslide_idle
de0
dá o melhor rendimento, mas defini-lo como1
dá melhor (menor) latência total.Para mais informações sobre esses ajustáveis, consulte http://www.linux-mag.com/id/7572/ .
Agora que configuramos o kernel para carregar coisas do disco para o cache com desempenho razoável, é hora de ajustar o comportamento do cache:
De acordo com os benchmarks que fiz, não me incomodaria em definir a leitura antecipada
blockdev
. As configurações padrão do kernel estão bem.Defina o sistema para preferir trocar dados do arquivo pelo código do aplicativo (isso não importa se você possui RAM suficiente para manter todo o sistema de arquivos e todo o código do aplicativo e toda a memória virtual alocada pelos aplicativos na RAM). Isso reduz a latência para trocar entre aplicativos diferentes por latência para acessar arquivos grandes a partir de um único aplicativo:
Se você preferir manter os aplicativos quase sempre na RAM, poderá configurá-lo como 1. Se você definir como zero, o kernel não será trocado, a menos que seja absolutamente necessário para evitar o OOM. Se você estava com pouca memória e trabalhando com arquivos grandes (por exemplo, edição de vídeo em HD), pode fazer sentido definir isso próximo a 100.
Hoje em dia (2017) prefiro não ter nenhuma troca se você tiver RAM suficiente. Não ter troca normalmente perderá de 200 a 1000 MB de RAM em uma máquina desktop de longa duração. Estou disposto a sacrificar muito para evitar a latência do pior cenário possível (trocar o código do aplicativo quando a RAM estiver cheia). Na prática, isso significa que prefiro o OOM Killer à troca. Se você permitir / precisar de trocas, também poderá aumentar
/proc/sys/vm/watermark_scale_factor
, para evitar alguma latência. Eu sugeriria valores entre 100 e 500. Você pode considerar essa configuração como negociando o uso da CPU por uma menor latência de troca. O padrão é 10 e o máximo possível é 1000. Um valor mais alto deve (de acordo com a documentação do kernel ) resultar em maior uso da CPU parakswapd
processos e menor latência geral de troca.Em seguida, diga ao kernel para preferir manter a hierarquia de diretórios na memória sobre o conteúdo do arquivo, caso alguma RAM precise ser liberada (novamente, se tudo couber na RAM, essa configuração não faz nada):
Configuração
vfs_cache_pressure
valor baixo faz sentido porque, na maioria dos casos, o kernel precisa conhecer a estrutura de diretórios antes de poder usar o conteúdo do arquivo no cache e liberá-lo muito cedo fará com que o cache de arquivos seja praticamente inútil. Considere descer até 1 com essa configuração se você tiver muitos arquivos pequenos (meu sistema tem fotos com cerca de 150 mil e 10 megapixels e conta como sistema "muitos arquivos pequenos"). Nunca defina como zero ou a estrutura de diretórios será sempre mantida na memória, mesmo que o sistema esteja ficando sem memória. Definir esse valor como grande só é sensato se você tiver apenas alguns arquivos grandes que estão sendo relidos constantemente (novamente, a edição de vídeo em HD sem RAM suficiente seria um exemplo). A documentação oficial do kernel diz que "Exceção: se você possui uma quantidade realmente grande de arquivos e diretórios e raramente toca / lê / lista todos os arquivos com configuração
vfs_cache_pressure
superior a 100 podem ser sábios. Isso se aplica apenas se você não tiver RAM suficiente e não puder manter toda a estrutura de diretórios na RAM e ainda tiver RAM suficiente para processos e cache de arquivos normais (por exemplo, servidor de arquivos para toda a empresa com muito conteúdo de arquivo). Se você sente que precisa aumentarvfs_cache_pressure
acima de 100, está executando sem RAM suficiente. Aumentarvfs_cache_pressure
pode ajudar, mas a única solução real é obter mais RAM. Avfs_cache_pressure
definição de um número alto sacrifica o desempenho médio por ter um desempenho geral mais estável (ou seja, você pode evitar um comportamento realmente ruim no pior dos casos, mas precisa lidar com um desempenho geral pior).Por fim, diga ao kernel para usar até 99% da RAM como cache para gravações e instrua o kernel a usar até 50% da RAM antes de desacelerar o processo que está gravando (o padrão
dirty_background_ratio
é10
). Aviso: eu pessoalmente não faria isso, mas você afirmou ter RAM suficiente e está disposto a perder os dados.E diga que 1h de atraso de gravação é bom mesmo para começar a escrever coisas no disco (novamente, eu não faria isso):
Se você colocar tudo isso
/etc/rc.local
e incluir o seguinte no final, tudo ficará em cache assim que possível após a inicialização (faça isso apenas se o seu sistema de arquivos realmente se encaixar na RAM):Ou uma alternativa um pouco mais simples, que pode funcionar melhor (somente cache
/home
e/usr
, apenas faça isso se você/home
e/usr
realmente couber na RAM):fonte
Em primeiro lugar, NÃO recomendo que você continue usando o NTFS, pois a implementação do NTFS no Linux seria um problema de desempenho e segurança a qualquer momento.
Há várias coisas que você pode fazer:
ext4
oubtrfs
bfq
preload
systemd
pré-carregar durante a inicializaçãoTalvez você queira experimentá-lo :-)
fonte
btrfs
sistema de arquivos tenha sido projetado recentemente, eu evitaria isso se fosse necessário desempenho. Fomos correndo sistemas idênticos combtrfs
eext4
sistemas de arquivos eext4
vitórias no mundo real com uma grande margem (btrfs
parece exigir cerca de tempo de CPU 4x asext4
necessidades para o mesmo nível de desempenho e causa mais operações de disco para um único comando lógico). Dependendo da carga de trabalho, sugiroext4
,jfs
ouxfs
para qualquer trabalho que exija desempenho.Leia adiante:
Em sistemas de 32 bits:
Em sistemas de 64 bits:
Escreva atrás do cache:
Isso utilizará até 100% de sua memória livre como cache de gravação.
Ou você pode usar todos os recursos e usar tmpfs. Isso é relevante apenas se você tiver RAM suficiente. Coloque isso
/etc/fstab
. Substitua 100G pela quantidade de RAM física.Então:
Então use / mnt / tmpfs.
fonte
Você pode definir o tamanho da leitura antecipada com
blockdev --setra sectors /dev/sda1
, em que setores é o tamanho desejado em setores de 512 bytes.fonte
Minha configuração matadora é muito simples e muito eficaz:
A explicação da documentação do kernel :
vfs_cache_pressure
em 2000, faz com que a maior parte da computação ocorra na RAM e em gravações de disco muito tardias.fonte
vfs_cache_pressure
muito alto (eu consideraria2000
muito alto) causará acesso desnecessário ao disco, mesmo para coisas simples, como listagens de diretório que devem caber facilmente no cache. Quanta RAM você tem e o que está fazendo com o sistema? Como escrevi na minha resposta, o uso de alto valor para essa configuração faz sentido, por exemplo, na edição de vídeo HD com RAM limitada.Não relacionado ao cache de gravação, mas relacionado a gravações:
Para um sistema ext4, você pode desativar completamente o registro no diário
Isso reduzirá o número de gravações de disco para qualquer atualização específica, mas pode deixar o sistema de arquivos em um estado inconsistente após um desligamento inesperado, exigindo um fsck ou pior.
Para impedir que as leituras do disco disparem gravações em disco:
Montar com o relatime ou o noatime opção
Quando você lê um arquivo, os metadados "hora do último acesso" para esse arquivo geralmente são atualizados. A
noatime
opção desativará esse comportamento. Isso reduz gravações desnecessárias em disco, mas você não terá mais esses metadados. Algumas distribuições (por exemplo, Manjaro) adotaram isso como padrão em todas as partições (provavelmente para aumentar a vida útil dos SSDs de modelos anteriores).relatime
atualiza o tempo de acesso com menos frequência, de acordo com heurísticas que ajudam a dar suporte a aplicativos que usam o atime. Este é o padrão no Red Hat Enterprise Linux.Outras opções:
fonte