legal, ionice não é suficiente

legal, ionice não é suficiente

Eu tenho um script que inicia uma grande árvore de processos que consome CPU e memória. Há Python e executáveis ​​lá embaixo, mas tudo começa com um único script bash e subprocessos python.

Durante a execução, o resto do sistema é completamente bloqueado. Tentei mitigar $ nice -n10 ionice -c2 ./Script.sh, mas isso não é suficiente - o uso do computador é muito lento (na verdade, este é um desktop de desenvolvimento, mas o problema no servidor designado será o mesmo).

Eu suspeito que o problema esteja nos processos que usam muita memória - tudo acaba sendo trocado e fica lento.

Existe uma maneira de diminuir a prioridade de um processo (e de seus filhos recursivos) no acesso à memória física? Prefiro que seja feito mais lentamente em segundo plano, com influência limitada em outras tarefas.

Responder1

Você não pode limitar o "ritmo" de consumo de memória, mas pode limitar o uso total da memória por meio de vários mecanismos diferentes.

1) limites de segurança Limite o uso de memória para o usuário que executa o processo via /etc/security/limits.conf. Isso pode não funcionar no seu caso se você estiver executando esse processo como o mesmo usuário trabalhando em coisas diferentes.

Exemplo:

username hard as 1000000

2) Controlar grupos Você pode - com cgroups, criar um grupo e também limitar o uso de memória. Basta criar o cgroup, assim:

# cat >> /etc/cgconfig.conf << EOF
group memlimit {
    memory {
        memory.limit_in_bytes = 1073741824;
    }
}
EOF

# cat >> /etc/cgrules.conf <<EOF
username memory   memlimit/
EOF

Claro - em ambos os casos, você precisa desenvolver seu programa para que ele possa se recuperar da falha na alocação de mais memória.

Caso não consiga, basta adicionar mais memória ao seu sistema, para evitar trocas. Uma vez iniciada a troca, ela está nas mãos do kernel, e você não pode - por exemplo - diminuir a prioridade do kswapd, e mesmo que pudesse - isso não garante que alguns dos programas que você usa ainda não seriam trocados fora, causando assim uma resposta do sistema ainda mais lenta. Só não vá lá.

Responder2

Embora o próximo não o ajude na troca de memória, ele deve ajudá-lo no impacto de IO do seu processo.

Parece que você leveltambém deveria definir explicitamente.

ionice -c2 -n5 ./slowscript.sh

C2 sozinho pode não ser suficiente, dependendo do seu kernel.

Citação da página de manual ( man ionice)

          Note that before kernel 2.6.26 a process that has not asked for an I/O priority formally uses "none" as scheduling class, but the I/O scheduler will  treat  such
          processes  as if it were in the best-effort class.  The priority within the best-effort class will be dynamically derived from the CPU nice level of the process:
          io_priority = (cpu_nice + 20) / 5.

          For kernels after 2.6.26 with the CFQ I/O scheduler, a process that has not asked for an I/O priority inherits its CPU scheduling class.   The  I/O  priority  is
          derived from the CPU nice level of the process (same as before kernel 2.6.26).

Basicamente: todo processo recém-iniciado receberá C2 N4 , então quando você quiser que o IO seja reduzido ao mínimo possível, fique apenas em modo inativo (C3) ou C2 N7.

informação relacionada