Renovando aplicativos multithread complexos no Linux

Renovando aplicativos multithread complexos no Linux

Aplicativos (especialmente os grandes Java e C++) geralmente aparecem como várias linhas htop, cada um com PID separado e nível agradável separado. Além disso, o aplicativo pode gerar muitos processos filhos (como em aptitude update), então preciso afetar tanto o pai (para fazer com que os novos filhos tenham nova prioridade) quanto os filhos (para trazer o efeito imediatamente, não depois que o filho terminar)

Como posso aplicar "renice" ou "ionice" ou "schedtool" a um grande aplicativo já lançado?

Responder1

1) Obtenha o PID do processo superior e lembre-se dele.

2) Obtenha todos os processos com 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.

Responder2

Não tenho uma solução totalmente robusta, mas em muitos casos o conjunto de processos alvo será um grupo de processos. Se $parentfor o pid do processo pai, o comando a seguir lista os pids dos processos no grupo:

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

Responder3

Eu sei que isso é um pouco antigo, mas como foi isso que surgiu quando procurei a mesma coisa, resolvi postar minha solução (também postado nesta essência caso eu atualize)

#!/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
}

Responder4

sudo renice -n num $(pidof processname)

informação relacionada