obtendo um aplicativo para ser executado com a mesma prioridade que o cpu idle

2

Eu tenho um servidor solaris que precisa executar um aplicativo timecritical o mais rápido possível, embora defini-lo para a classe de prioridade RT não parece ser uma boa idéia, pois pode precisar de 100 CPU por períodos prolongados.

Eu gostaria de usar o tempo de CPU ocioso para trabalhar em outros processos, mas este processo não deve receber nenhum tempo de CPU se o tempo-crítico tiver algo a fazer. Como posso conseguir isso, usando nice -19 não aloca 100% cpu para o tempo crítico.

    
por camelccc 16.12.2014 / 15:58

2 respostas

1

Execute seu segundo aplicativo na classe de prioridade fixa e com a menor prioridade possível. Se já estiver em execução, você pode configurá-lo usando seu pid:

priocntl -c FX -m 0 -p 0 -s -i pid <pid>

Ou faça no momento do lançamento:

priocntl -c FX -m 0 -p 0 -e command [arguments ...]

Editar:

Note que a classe de agendamento FX não deve ser confundida com a classe RT. Embora a classe de prioridade RT (Tempo Real) seja também uma classe de prioridade fixa, os processos que receberem uma prioridade RT anteciparão os encadeamentos do sistema (ou seja, o kernel), portanto, devem ser usados somente com processos com períodos de atividade de computação relativamente curtos. A classe RT não é absolutamente recomendada para um processo que requer 100 threads de CPU por um longo período de tempo como o que você descreve. Esse problema não existe com a classe FX, cujo intervalo de prioridades (padrão) é o mesmo que o de compartilhamento de tempo regular.

Como Yedric observou em sua resposta, definir a prioridade do processo de prioridade baixa como 0 não é suficiente para garantir que ela não seja executada quando a prioridade alta estiver ativa.

O motivo é que o último está na classe de compartilhamento de tempo, o agendador notará que um processo está aguardando há algum tempo, então reduzirá a prioridade real do processo crítico para 0, permitindo pequenas explosões de atividade da baixa prioridade processo.

Para evitar essa situação, você pode definir o processo crítico para a classe FX com uma prioridade mediana. Nesse caso, nunca se renderá ao outro:

priocntl -c FX -m 30 -p 30 -c critical_command ...  
    
por 17.12.2014 / 03:08
1

Não é possível, dentro do projeto de planejamento do Solaris, fornecer os limites rígidos que você está procurando. As opções mais próximas são:

  1. RT para o processo crítico; ou,
  2. Encerrar o processo não crítico quando o processo crítico precisar da CPU e reiniciar uma vez que essa necessidade seja satisfeita; ou,
  3. Usando sinais de processo SIGSTOP / SIGCONT para colocar o processo não crítico em suspensão e permitir que ele continue.

A resposta @jlliagre fornecida o aproximará mais do que os padrões do modelo de agendamento padrão, mas ainda assim não impede que o processo não crítico obtenha tempo de CPU.

Se você tiver mais CPUs / núcleos do que o processo crítico tem threads, o RT atenderá às suas necessidades com facilidade. Caso contrário, a menos que você não precise usar o sistema de outra maneira, o RT pode não ser uma boa ideia. Você pode facilmente acabar em uma situação em que você não pode nem mesmo fazer o login devido ao processo crítico que não deixa nenhuma CPU por ele.

    
por 17.12.2014 / 18:57