Linux で複雑なマルチスレッド アプリケーションを最適化

Linux で複雑なマルチスレッド アプリケーションを最適化

アプリケーション(特に大規模な Java や C++ のもの)は、 では複数の行として表示されることが多くhtop、それぞれに個別の PID と個別の nice レベルがあります。また、アプリケーションは多数の子プロセスを生成する可能性がある( のようにaptitude update)ため、親プロセス(新しい子プロセスに新しい優先度を持たせるため)と子プロセス(子プロセスが終了した後ではなく、すぐに効果をもたらすため)の両方に影響を与える必要があります。

すでに起動されている大きなアプリケーションに「renice」や「ionice」や「schedtool」を適用するにはどうすればよいですか?

答え1

1) 最上位プロセスの PID を取得して記憶します。

2) 記憶されたPIDのPPIDを持つすべてのプロセスを取得し、それらのPIDを記憶する

3) 新しい PID がなくなるまで手順 2 を繰り返します。

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)

関連情報