O que você está se referindo é o processo de verificação. Há algum trabalho nos kernels posteriores para oferecer isso (em conjunto com o freezer cgroup), mas ainda não está pronto.
Na verdade, isso é muito difícil de ser alcançado porque certos recursos compartilhados ficam obsoletos depois de ficarem indisponíveis por um período fixo de tempo (TCP vem à mente, embora isso também possa se aplicar a aplicativos que usam um relógio de parede ou talvez alguma memória compartilhada que muda de estado durante um período de processos off-line).
Quanto a interromper o processo quando ele alcança uma certa utilização de memória, existe um hack que eu posso pensar que vai fazer isso.
- Você cria um cgroup que contém os subsistemas freezer e memory.
- Coloque sua (s) tarefa (s) dentro do cgroup.
- Anexe um processo a
cgroup.event_control
e defina um limite de memória que você não deseja exceder (isso é explicado de alguma forma no documentação do kernel . - Ao exceder o tempo, você congela o cgroup. O kernel deve eventualmente despejar essas páginas para trocar (desde que seu cgroup tenha o suficiente).
Observe que o cgroup "freeze" não despejará páginas em um local persistente de mídia, mas trocará as páginas quando houver tempo suficiente e as páginas forem necessárias para outra coisa.
Mesmo que isso funcione (é bastante hacky se isso acontecer), é necessário considerar se isso realmente está ou não fazendo alguma coisa para resolver seu problema.
- Como você sabe que não seria melhor permitir que um processo usando muita memória fosse mais rápido para concluir rapidamente seu período intensivo de memória e abrir mão da memória?
- Se você tentar despertar os processos de forma justa pelos processos de round-robining, poderá argumentar que está fazendo um trabalho pior do que o que o planejador de CPU já está fazendo por você.
- Se alguns processos são mais importantes do que outros (e devem ser acordados por mais tempo), provavelmente é melhor alocá-los mais tempo de CPU do que manter outros processos completamente congelados.
- Embora seja lento - você pode adicionar muito swap (para que você nunca possa supercomprometer) e reduzir bastante a interatividade do agendador para tentar ajudar a reduzir despejos agressivos de páginas. Isso é feito em
sched_min_granularity_ns
.
Infelizmente, a melhor solução seria a capacidade de verificar suas tarefas. É uma pena que a maioria das implementações não seja tão concreta assim ainda.
Como alternativa, você pode esperar alguns anos para que o ponto de verificação / restauração esteja disponível no kernel!