Como tornar os arquivos dentro do TMPFS mais propensos a trocar

7

Estou usando o tmpfs para meu diretório /tmp . Como posso fazer o computador decidir trocar os arquivos dentro do /tmp antes de trocar qualquer coisa que esteja sendo usada por aplicativos?

Basicamente, os arquivos dentro de /tmp devem ter um maior swappiness em comparação com a memória usada pelos processos.

Parece que essa resposta link faz muito sentido, mas você não pode mudar o swappiness por um único diretório. Eu sei sobre os cgroups, mas eu não vejo nenhuma maneira de fazer o tmp em um cgroup?

    
por CMCDragonkai 25.07.2014 / 08:13

2 respostas

6

Se tudo correr bem, o seu kernel deve decidir "fazer a coisa certa" por si só. Ele usa muitas heurísticas sofisticadas para decidir o que trocar e o que manter quando há pressão de memória. Essas heurísticas foram cuidadosamente construídas por pessoas realmente inteligentes, com muita experiência em gerenciamento de memória, e já são boas o suficiente para serem bem difíceis de melhorar.

O kernel usa uma combinação de coisas como essa para decidir o que trocar:

  • Como recentemente a memória foi usada.
  • Se a memória foi modificada desde que foi mapeada. Assim, por exemplo, uma biblioteca compartilhada será enviada à frente da memória heap, porque a memória heap está suja e precisa ser gravada para troca, enquanto a memória mapeada da biblioteca compartilhada pode ser carregada novamente a partir do arquivo original no disco caso seja necessário novamente , então não há necessidade de escrever essas páginas para trocar. Aqui você deve perceber que tmpfs memory está sempre suja (a menos que seja uma página nova cheia de zeros) porque não é apoiada por nada.
  • Sugestões de mprotect() .
  • Provavelmente muito mais.

Resposta curta: não, você não pode substituir diretamente as decisões do kernel sobre como gerenciar a memória.

    
por 25.07.2014 / 08:41
2

Os cgroups são destinados a controlar aplicativos, não sistemas de arquivos. O que você está querendo precisaria ser sysctl ou uma opção de montagem, pois é para um sistema de arquivos inteiro. Infelizmente, não parece que nenhum desses dois recursos tenha sido criado para esse problema. Isso é provavelmente devido ao quão único é um problema como este.

Para contornar isso, você pode tentar escrever um cronjob como:

*/5 * * * * find /tmp -type f -exec cat {} \; >/dev/null 2>&1

Isto deve forçar o kernel a ler todos os arquivos, o que força as páginas a serem novamente colocadas na memória.

Dito isso, os arquivos acessados com frequência por seu aplicativo de carga de trabalho seriam essencialmente os mesmos que estamos fazendo no cronjob (e apenas para os arquivos específicos que ele realmente usou em vez de toda a montagem). Não vejo muita vantagem para fazer isso.

Qual é o objetivo real aqui?

    
por 25.07.2014 / 14:10