Renotando aplicativos complexos multithread no Linux

3

As aplicações (especialmente as grandes em Java e C ++) geralmente aparecem como múltiplas linhas em htop , cada uma com um PID separado e um nível legal separado. Além disso, o aplicativo pode gerar muitos processos filhos (como em aptitude update ), portanto, preciso afetar pais um (para que novos filhos tenham nova prioridade) e filhos (para trazer o efeito imediatamente, não depois que o filho terminar )

Como posso aplicar "renice" ou "ionice" ou "schedtool" a uma grande aplicação já lançada?

    
por Vi. 04.10.2010 / 15:25

5 respostas

1

1) Obtenha o PID do processo mais importante e lembre-se disso.

2) Obtenha todos os processos com o PPID de um PID lembrado e lembre-se de seus PIDs

3) repita o passo 2 até que não haja novos PIDs.

4) Para cada PID, aplique o comando a esse processo.

Não deve ser muito difícil no seu idioma favorito.

    
por 05.10.2010 / 00:35
1

Eu não tenho uma solução totalmente robusta, mas em muitos casos o conjunto de processos de destino será um grupo de processos. Se $parent for o pid do processo pai, o comando a seguir listará os pids dos processos no grupo:

ps -eo pgrp:1=,pid:1= |sed -n "s/^$parent //p"
    
por 06.10.2010 / 01:14
1

Eu sei que isso é um pouco antigo, mas como isso surgiu quando eu pesquisei a mesma coisa, imaginei que poderia postar minha solução ( também postou nesta essência no caso de eu atualizá-lo )

#!/usr/bin/env bash

# This can be run simply by passing it the outputs from pgrep:
# my_renice $(pgrep application)
#
# You may also want to use pgrep to find more complex 
#    processes based on arguments
# my_renice $(pgrep -f "bash.*$name")

function my_renice(){
  newnice=10
  pid=$1

  # Return if pid not found
  if [ -z $pid ]; then return; fi

  # Renice pid right away in case we spawn more children
  renice $newnice $pid

  # Find children pids
  children=$(pgrep -d ' ' -P $pid)

  # Loop through children
  for i in $children; do my_renice $i; done
}
    
por 09.05.2012 / 19:41
0

Observe que a conveniência da CPU é herdada pelos processos filhos. Então apenas renice o pai (ou inicie usando nice ); os processos filhos terão a mesma gentileza.

Se as crianças já estiverem correndo quando você fizer isso, você terá que renegá-las separadamente. Mas, na prática, descobri que normalmente existem apenas alguns processos que realmente controlam a CPU; Eu recomendo aqueles e o processo pai.

    
por 09.02.2011 / 03:35
-1
sudo renice -n num $(pidof processname)
    
por 29.09.2013 / 16:10

Tags