Existe uma maneira de dizer ao kernel do Linux para usar apenas uma certa porcentagem de memória para o cache do buffer? Sei que /proc/sys/vm/drop_caches
pode ser usado para limpar o cache temporariamente, mas há alguma configuração permanente que impeça que ele cresça para mais de, por exemplo, 50% da memória principal?
A razão pela qual desejo fazer isso é que tenho um servidor executando um Ceph OSD que constantemente fornece dados do disco e consegue usar toda a memória física como cache de buffer dentro de algumas horas. Ao mesmo tempo, preciso executar aplicativos que aloquem uma grande quantidade (vários 10s de GB) de memória física. Ao contrário da crença popular (consulte os conselhos de quase todas as perguntas relacionadas ao cache do buffer), a liberação automática da memória descartando entradas limpas do cache não é instantânea: iniciar meu aplicativo pode levar até um minuto quando o cache do buffer estiver cheio ( *), depois de limpar o cache (usando echo 3 > /proc/sys/vm/drop_caches
) o mesmo aplicativo inicia quase instantaneamente.
(*) Durante esse minuto de tempo de inicialização, o aplicativo está com falha na nova memória, mas gasta 100% de seu tempo no kernel, de acordo com o Vtune em uma função chamada pageblock_pfn_to_page
. Essa função parece estar relacionada à compactação de memória necessária para encontrar páginas enormes, o que me leva a acreditar que realmente a fragmentação é o problema.
fonte
Respostas:
Se você não deseja um limite absoluto, mas apenas pressiona o kernel para liberar os buffers mais rapidamente, consulte
vm.vfs_cache_pressure
Varia de 0 a 200. Mova-o para 200 para aumentar a pressão. O padrão é definido como 100. Você também pode analisar o uso da memória usando o
slabtop
comando No seu caso, os valoresdentry
e*_inode_cache
devem ser altos.Se você deseja um limite absoluto, deve procurar
cgroups
. Coloque o servidor Ceph OSD dentro de um cgroup e limite a memória máxima que ele pode usar configurando omemory.limit_in_bytes
parâmetro para o cgroup.Referências:
[1] - Ajuste do kernel do GlusterFS Linux
[2] - Guia de Gerenciamento de Recursos RHEL 6
fonte
limit_in_bytes
set parece fazer isso. Obrigado!vfs_cache_pressure
apenas limpa caches de dentry e inode, e não tem nada a ver com cache de buffer.vfs_cache_pressure
acima100
pode ajudar caso você não tenha RAM suficiente para sua carga de trabalho. Reduzirá o uso da RAM, mas causará um desempenho geral de E / S inferior.Não sei sobre A%, mas você pode definir um limite de tempo para que ele caia após x minutos.
Primeiro em um terminal
Para limpar caches atuais.
Torne-o um
cron-job
Pressione Alt-F2, digitegksudo gedit /etc/crontab
, Em seguida , adicione esta linha perto da parte inferior.Isso limpa a cada 15 minutos. Você pode definir para 1 ou 5 minutos, se realmente desejar, alterando o primeiro parâmetro para * ou * / 5 em vez de * / 15
Para ver sua RAM livre, exceto o cache:
fonte
3 > drop_caches
inclui o comportamento desync
Acho que seu palpite no final da sua pergunta está no caminho certo. Eu suspeitaria que A, alocação de memória compatível com NUMA migrasse páginas entre CPUs ou B, mais provavelmente, o código de desfragmentação de grandes páginas transparentes tentando encontrar regiões alinhadas e contíguas.
Páginas enormes e páginas enormes transparentes foram identificadas para melhorias de desempenho marcantes em determinadas cargas de trabalho e responsáveis por consumir enormes quantidades de tempo da CPU sem fornecer muitos benefícios.
Seria útil saber em qual kernel você está executando, o conteúdo de / proc / meminfo (ou pelo menos os valores HugePages_ *.) E, se possível, mais informações sobre o calltraph do gerador de perfil vtune referenciando pageblock_pfn_to_page ().
Além disso, se você concordar com o meu palpite, tente desativar o Hugepage desfragmentar com:
(pode ser isso, dependendo do seu kernel :)
Por fim, este aplicativo está usando muitas dezenas de shows de RAM algo que você escreveu? Que lingua?
Desde que você usou o termo "falha nas páginas de memória", suponho que você esteja familiarizado o suficiente com design operacional e memória virtual. Eu luto para imaginar uma situação / aplicativo que falharia de forma tão agressiva que não esteja lendo muitas E / S - quase sempre do cache do buffer que você está tentando limitar.
(Se você estiver curioso, confira sinalizadores mmap (2) como MAP_ANONYMOUS e MAP_POPULATE e mincore (2), que podem ser usados para ver quais páginas virtuais realmente têm uma página física mapeada.)
Boa sorte!
fonte
Se o Ceph OSD for um processo separado, você poderá usar o cgroups para controlar os recursos utilizados pelo processo:
Crie um cgroup nomeado como group1 com um limite de memória (de 50 GB, por exemplo, outros limites como CPU são suportados, por exemplo, CPU também é mencionada):
Então, se o aplicativo já estiver em execução, leve o aplicativo para este cgroup:
Ou execute seu aplicativo dentro deste cgroup:
fonte
sintonizado é um daemon de ajuste do sistema adaptativo dinâmico que ajusta as configurações do sistema dinamicamente, dependendo do uso.
Consulte a documentação relacionada e os arquivos de configuração.
Informação adicional
O comando sync libera o buffer, ou seja, força todos os dados não gravados a serem gravados no disco e pode ser usado quando se quer ter certeza de que tudo está gravado com segurança. Nos sistemas UNIX tradicionais, há um programa chamado update em execução em segundo plano, que faz uma sincronização a cada 30 segundos; portanto, geralmente não é necessário usar a sincronização. O Linux possui um daemon adicional, bdflush , que faz uma sincronização mais imperfeita com mais frequência para evitar o congelamento repentino devido à E / S de disco pesada que sincronização às vezes causa.
No Linux, o bdflush é iniciado pela atualização. Normalmente não há motivo para se preocupar com isso, mas se o bdflush morrer por algum motivo, o kernel avisará sobre isso, e você deve iniciá-lo manualmente ( / sbin / update ).
fonte