
Gostaria de implantar a seguinte política de troca:
- Por padrão, todas as páginas na memória também devem estar no espaço de troca.
- Quando uma página na memória é alterada (isto é, suja), a página deve ser escrita o mais rápido possível, mas com prioridade mais baixa do que outros processos.
- se uma determinada marca d'água configurável for atingida (digamos que 80% das páginas estão sujas), a prioridade será igual a outros processos.
Esse tipo de política de troca é possível com o kernel do Linux? Em caso afirmativo, como defino as configurações do kernel para conseguir isso?
Editar:
Obviamente, a razão para isso é reduzir o número de páginas que precisam ser trocadas. Somente páginas sujas precisam ser gravadas no disco, e isso acontece em segundo plano com o tempo. Portanto, quando ocorrem faltas de páginas (ou seja, a página não está na memória), não há necessidade de gravar nenhuma página da memória para o disco, mas apenas do disco para a memória. Portanto, reduziu a probabilidade de gargalos de E/S porque tanto a troca quanto a troca tentam acessar o disco simultaneamente.
Responder1
Você pode definir o valor de /proc/sys/vm/swappiness
para controlar a proporção de segmentos de dados trocados em relação aos segmentos de dados mantidos na memória. Um valor 0 evita completamente a troca a todo custo.
Isso pode ser feito usando:
echo 0 > /proc/sys/vm/swappiness
sysctl -w vm.swappiness=0
- Armazenando essa configuração em
/etc/sysctl.conf
Geralmente, usar apenas uma pequena troca não é uma coisa ruim. A memória livre pode ser usada para armazenar em cache os dados lidos do disco, e o sistema pode planejar com antecedência uma necessidade repentina de muita memória por um aplicativo.
No entanto, quando muitos programas são trocados, há muita atividade relacionada ao disco durante cada troca de programa, o que realmente torna tudo mais lento. Antes que algo possa ser usado, ele precisa ser carregado de volta na memória.
As leituras dos discos são terrivelmente lentas em comparação com o acesso à memória, pois leva muito mais tempo para os dados chegarem. O sistema tem que agendar a leitura entre as outras solicitações de leitura/gravação, o drive começa a fazer tentativas para encontrar o cilindro correto e, finalmente, começa a entregar dados lentamente.
Portanto, acho que sua lógica é falha. Geralmente, você deseja manter os programas em execução na memória, mantendo espaço suficiente para um crescimento repentino. Não use o swap com muita frequência para "gravar coisas no disco", pois não é um backup nem uma melhoria de desempenho.
Os computadores mais antigos continham menos memória e, como resultado, sofriam de problemas de troca. Quando muitos programas eram abertos ao mesmo tempo, o sistema ficava lento e você podia ouvir o disco lendo e gravando no arquivo de troca.
Responder2
Só porque seu sistema está trocando, não significa que você tenha um problema. Existem aplicativos que são ajustados para aproveitar ao máximo a troca sem prejudicar o desempenho do sistema. A maioria dos sistemas de banco de dados relacionais são ajustados desta forma: IE: Oracle e Cache, provavelmente sendo os dois maiores.
Se você usar a hibernação, ela usará espaço de troca para armazenamento de RAM. Ao reinicializar o sistema, tudo em swap é adicionado de volta à RAM. Dessa forma, você pode desligar o sistema sem consumir a bateria, como no modo de espera, e ainda voltar ao ponto onde parou antes de desligá-lo. Como resultado, sua bateria durará muito mais tempo.
A troca pode ser ótima, porque libera mais RAM ativa para manter alto o desempenho do sistema. Quando sua RAM ativa está cheia E seu swap está cheio, e você ainda precisa de mais espaço, então, e somente então, você terá um problema. Até esse ponto, a troca está aqui para ajudá-lo, não para prejudicá-lo.
Responder3
Somando-se à resposta do vdboor, acho que para conseguir o que deseja, você precisaria modificar mais de swappiness
. Existem mais ajustes de kernel disponíveis que controlam como o swap é usado. O usuário pode acessá-los em tempo de execução por meio /proc/sys/vm/*
de arquivos ou configurá-los permanentemente /etc/sysctl.conf
(pode ser necessário adicionar sysctl
um script de inicialização à sua sequência de inicialização para ter efeito)
As configurações são bem abordadas na documentação do kernel Linux. Você pode encontrá-lo em <your_kernel_sources_path>/Documentation/sysctl/vm.txt
. Você também pode dar uma olhada em alguma documentação onlinecomo este.