Neustrukturierung komplexer Multithread-Anwendungen in Linux

Neustrukturierung komplexer Multithread-Anwendungen in Linux

Anwendungen (insbesondere große Java- und C++-Anwendungen) werden häufig als mehrere Zeilen in angezeigt htop, jede hat eine eigene PID und eine eigene Nice-Ebene. Außerdem kann eine Anwendung viele Kindprozesse erzeugen (wie in aptitude update), sodass ich sowohl den übergeordneten Prozess (damit neue Kinder eine neue Priorität haben) als auch die Kindprozesse (damit der Effekt sofort eintritt, nicht erst, wenn der Kindprozess beendet wurde) beeinflussen muss.

Wie kann ich „renice“ oder „ionice“ oder „schedtool“ auf eine bereits gestartete große Anwendung anwenden?

Antwort1

1) Holen Sie sich die PID des obersten Prozesses und merken Sie sie sich.

2) Alle Prozesse mit PPID einer gespeicherten PID abrufen und deren PIDs speichern

3) Wiederholen Sie Schritt 2, bis keine neuen PIDs mehr vorhanden sind.

4) Wenden Sie für jede PID den Befehl auf diesen Prozess an.

Sollte in Ihrer Lieblingssprache nicht zu schwierig sein.

Antwort2

Ich habe keine wirklich robuste Lösung, aber in vielen Fällen wird die Gruppe der Zielprozesse eine Prozessgruppe sein. Wenn $parentdie PID des übergeordneten Prozesses ist, listet der folgende Befehl die PIDs der Prozesse in der Gruppe auf:

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

Antwort3

Ich weiß, das ist schon etwas älter, aber da dies das Ergebnis ist, das ich gefunden habe, als ich nach dem gleichen gesucht habe, dachte ich, ich poste meine Lösung (wird auch in diesem Gist gepostet, falls ich es aktualisiere)

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

Antwort4

sudo renice -n num $(pidof processname)

verwandte Informationen