在 Linux 中重新优化复杂的多线程应用程序

在 Linux 中重新优化复杂的多线程应用程序

应用程序(尤其是大型 Java 和 C++ 应用程序)通常会在 中显示为多行htop,每行都有单独的 PID 和单独的优先级。此外,应用程序可以生成许多子进程(如 中所示aptitude update),因此我需要同时影响父进程(以使新子进程具有新优先级)和子进程(以立即产生效果,而不是在子进程终止后)

如何将“renice”或“ionice”或“schedtool”应用于已启动的大型应用程序?

答案1

1)获取最顶层进程的PID,并记住它。

2)获取所有具有已记住 PID 的 PPID 的进程,并记住它们的 PID

3)重复步骤2,直到没有新的PID。

4)对于每个 PID,将命令应用于该进程。

用你喜欢的语言来说应该不会太难。

答案2

我没有一个完全可靠的解决方案,但在许多情况下,目标进程集将是一个进程组。如果$parent是父进程的 pid,则以下命令列出组中进程的 pid:

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

答案3

我知道这有点老了,但是因为这是我在搜索同样的东西时出现的结果,所以我想我会发布我的解决方案(也发布在这个要点中以便我更新它

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

相关内容