Реорганизация сложных многопоточных приложений в Linux

Реорганизация сложных многопоточных приложений в Linux

Приложения (особенно большие Java и C++) часто отображаются в виде нескольких строк в htop, каждое из которых имеет отдельный PID и отдельный nice level. Также приложение может порождать множество дочерних процессов (как в aptitude update), поэтому мне нужно повлиять как на родительский (чтобы новые дочерние процессы имели новый приоритет), так и на дочерние (чтобы эффект проявился немедленно, а не после завершения дочернего процесса)

Как применить «renice», «ionice» или «schedtool» к уже запущенному большому приложению?

решение1

1) Получите PID самого верхнего процесса и запомните его.

2) Получить все процессы с PPID запомненного PID и запомнить их PID

3) повторяйте шаг 2 до тех пор, пока не останется новых PID.

4) Для каждого PID примените команду к этому процессу.

На вашем любимом языке это не должно быть слишком сложно.

решение2

У меня нет полностью надежного решения, но во многих случаях набор целевых процессов будет группой процессов. Если $parentэто pid родительского процесса, следующая команда выводит список pid процессов в группе:

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

решение3

Я знаю, что это немного устарело, но поскольку это то, что появилось, когда я искал то же самое, я решил опубликовать свое решение (также опубликовано в этом gist на случай, если я его обновлю)

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

решение4

sudo renice -n num $(pidof processname)

Связанный контент