nice, ionice não são suficientes

5

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

Durante a execução, o restante do sistema é completamente bloqueado. Eu tentei fazer mitigar por $ nice -n10 ionice -c2 ./Script.sh , no entanto, isso não é suficiente - usar o computador é muito lento (acutally isso é desktop de desenvolvimento, mas o problema no servidor designado será o mesmo análogo).

Eu suspeito, que o problema é com processos usando muita memória - tudo acaba trocado e se torna lento.

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

    
por MateuszL 20.02.2015 / 14:53

2 respostas

2

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

1) limites de segurança Limite o uso de memória para o usuário executando 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) Grupos de controle Você pode - com cgroups, criar um grupo e também limitar o uso da 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ê tem que desenvolver seu programa para que ele possa se recuperar da falta de alocação de mais memória.

Caso não seja possível, basta adicionar mais memória ao sistema, para evitar a troca. Uma vez que a troca comece, ela está nas mãos do kernel, e você não pode - por exemplo - diminuir a prioridade do kswapd, e mesmo se você puder - isso não garante que alguns dos programas que você usa ainda não sejam trocados para fora, causando assim uma resposta do sistema ainda mais lenta. Apenas não vá lá.

    
por 20.02.2015 / 15:55
1

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ê deve definir explicitamente o level .

ionice -c2 -n5 ./slowscript.sh

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

Qoute da página manpage ( 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: cada processo recém-iniciado receberá C2 N4, então quando você quiser que o IO seja reduzido ao mínimo possível, vá em modo inativo (C3) ou C2 N7.

    
por 20.02.2015 / 16:12

Tags