Ajustando o comportamento do cache de disco do Linux para obter o máximo rendimento

12

Estou com um problema de taxa de transferência máxima aqui e preciso de alguns conselhos sobre como ajustar meus botões. Estamos executando um servidor de arquivos de 10 Gbit para distribuição de backup. É uma configuração S-ATA2 de dois discos em um controlador LSI MegaRAID. O servidor também tem 24gig de memória.

Precisamos espelhar nosso último backup carregado com a taxa de transferência máxima.

O RAID0 para nossos backups "quentes" fornece cerca de 260 MB / s de gravação e 275 MB / s de leitura. Um tmpfs testado com tamanho de 20 GB nos fornece cerca de 1 GB / s. Esse tipo de taxa de transferência é o que precisamos.

Agora, como posso ajustar o subsistema de memória virtual do Linux para armazenar em cache os últimos arquivos carregados pelo maior tempo possível na memória sem gravá-los no disco (ou melhor ainda: gravar no disco E mantê-los na memória)?

Eu configurei os seguintes sysctls, mas eles não nos fornecem a taxa de transferência esperada:

# VM pressure fixes
vm.swappiness = 20
vm.dirty_ratio = 70
vm.dirty_background_ratio = 30
vm.dirty_writeback_centisecs = 60000

Em teoria, isso deve nos dar 16 GB para armazenar E / S em cache e aguardar alguns minutos até que seja gravado no disco. Ainda assim, quando comparo o servidor com o benchmark, não vejo efeito na gravação, a taxa de transferência não aumenta.

Ajuda ou conselhos necessários.

Peter Meyer
fonte
Não faria mais sentido começar a escrever o mais rápido possível? Caso contrário, ele atinge o tamanho máximo do buffer e de repente pára. Se ele estava escrevendo o tempo todo, isso lhe dá mais tempo.
Zan Lynx
Tenho 20 GB de memória apenas para buffers, já que meus aplicativos (base linux + vsftpd) usam menos de 4 GB (total de 24 GB). Meus backups têm até 20 GB. Se eu conseguir gravá-los no buffer e gravá-los no disco sequencialmente após a execução do backup, isso reduzirá significativamente o tempo de inatividade da minha fonte de backup (servidores virtuais). PS: O servidor pode parar depois, sem problemas. Ele tem 30 minutos para se recuperar :)
Peter Meyer
Parece que qualquer aplicativo que você está usando para transferir os dados pela rede está sincronizando-os com o disco. Você deseja fazer isso para que os dados não fiquem no cache, embora eu pergunte por que você deseja estourar muitos dados dessa maneira mais rapidamente do que os discos conseguem acompanhar. Isso aponta para uma falha de design em algum lugar.
22412 psusi
Parece a falha: sua solução de backup não deve exigir que o servidor seja desligado o tempo todo.
15134 psusi
1
@ PeterMeyer: Mesmo se você tiver muita memória RAM, ainda é um erro esperar o início das gravações. O único momento que faz algum sentido é se você irá editar ou excluir arquivos (como um arquivo temporário) antes que ele chegue ao disco. Um backup não faz isso. Você deseja iniciar gravações em segundo plano o mais rápido possível. Defina seu background_ratio como 1 ou 2.
Zan Lynx

Respostas:

6

Pela análise das variáveis ​​que você definiu, parece que você está mais preocupado com o desempenho de gravação e não se importa com possíveis perdas de dados devido a falta de energia.

Você só terá a opção de gravações lentas e o uso de um cache de write-back com operações de gravação assíncronas. As operações de gravação síncrona exigem confirmação no disco e nunca seriam gravadas com preguiça. Seu sistema de arquivos pode estar causando frequentes descargas de página e gravações síncronas (geralmente devido ao registro no diário, especialmente com ext3 no modo data = journal). Além disso, mesmo as descargas de página "em segundo plano" interferirão nas leituras não armazenadas em cache e nas gravações síncronas , diminuindo a velocidade.

Em geral, você deve tomar algumas métricas para ver o que está acontecendo - você vê seu processo de cópia colocado no estado "D" esperando que o trabalho de E / S seja feito pelo pdflush? Você vê atividade de gravação síncrona pesada em seus discos?

Se tudo mais falhar, você pode optar por configurar um sistema de arquivos tmpfs explícito no qual copia seus backups e apenas sincroniza os dados com seus discos após o fato - mesmo usando automaticamente inotify

Para o cache de leitura, as coisas são significativamente mais simples - existem os fcoretools fadvise utilitário que possui o --willneedparâmetro para aconselhar o kernel a carregar o conteúdo do arquivo no cache do buffer.

Editar:

vm.dirty_ratio = 70

Em teoria, isso deve nos dar 16 GB para armazenar E / S em cache e aguardar alguns minutos até que seja gravado no disco.

Isso não teria influenciado muito seu cenário de teste, mas há um equívoco na sua compreensão. O parâmetro dirty_ratio não é uma porcentagem da memória total do sistema, mas da memória do sistema memória livre .

Há um artigo sobre o ajuste de cargas de gravação pesada com informações mais detalhadas.

o wabbit
fonte
Sim, estou atrás do desempenho de gravação. O tempo que leva para distribuir o backup para os escravos de backup não é uma das minhas preocupações. Também tenho um script para retransmissão, caso o servidor de backup primário falhe e os backups não cheguem aos escravos de backup. PS: Eu já li o link e sintonizei de acordo. Desculpe pelo erro sobre livre versus buffer vs total.
Peter Meyer
3

Ou apenas obtenha mais discos ... A configuração da matriz de unidades que você possui não suporta o tempo todo necessário. É um caso em que a solução deve ser reestruturada para atender às suas reais necessidades. Eu entendo que isso é apenas backup, mas faz sentido evitar uma correção kludgy.

ewwhite
fonte
Acordado. Não há como um par de drives SATA ( SATA ? Sério?) Sustentar 275MB / s, e nem estamos falando das PIOs abismais que você obterá deles.
adaptr
1
Eu posso ver para onde ele está indo - como esse é apenas um destino de backup de dados, ele não se preocupa com a possibilidade de perda ocasional de dados devido a falta de energia. E ele deseja minimizar o tempo necessário para uma janela de backup, fornecendo a taxa de transferência máxima disponível - 20 GB de dados podem ser gravados em menos de 30 segundos dessa maneira. Se os backups envolverem tempo de inatividade ou impacto no serviço por algum motivo, 30 segundos serão certamente mais fáceis de serem superados do que 20 minutos.
o-wabbit
Totalmente certo. Estou sincronizando imagens de máquinas virtuais (muito pequenas para nós de computação) que estão inativas durante a sincronização. O aplicativo funciona como alcatrão | ssh mas usando ftp. E assim, as simulações precisa correr ... :)
Peter Meyer
1
Não importa que raça SATA sejam. Os discos não corporativos do 7200RPM simplesmente não podem garantir taxa de transferência ou latência.
adaptr 15/02/12
1
@adaptr, um backup será gravações seqüenciais.
22412 psusi
1

O uso do cache de memória pode implicar na perda de dados, como se algo desse errado, os dados que estão na memória e não são salvos em discos serão perdidos.

Dito isto, há ajustes a serem feitos no nível do sistema de arquivos.

Por exemplo, se você estivesse usando o ext4, poderia tentar a opção de montagem:

barreira = 0

That: "desabilita o uso de barreiras de gravação no código jbd. As barreiras de gravação impõem a ordem adequada das confirmações de diário no disco, tornando os caches voláteis de gravação em disco seguros para uso, com alguma penalidade de desempenho. Se seus discos tiverem bateria de uma maneira ou outro, desabilitar barreiras pode melhorar com segurança o desempenho. As opções de montagem "barreira" e "nobarrier" também podem ser usadas para habilitar ou desabilitar barreiras, para consistência com outras opções de montagem ext4. "

Mais em: http://www.mjmwired.net/kernel/Documentation/filesystems/ext4.txt

Peter Senna
fonte
Estou usando um XFS fortemente ajustado. Mais informações sobre em que consideram a sua sintonizado no comentário acima :)
Peter Meyer
O sistema de arquivos foi criado com mkfs.xfs -l lazy-count = 1, versão = 2, tamanho = 256m -i attr = 2 -d sunit = 512, swidth = 1024 e é montado com: rw, noatime, logbufs = 8, logbsize = 256k, osyncisdsync, delaylog, attr2, nobarrier, allocsize = 256k
Pedro Meyer