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

완전히 강력한 솔루션은 없지만 대부분의 경우 대상 프로세스 집합은 프로세스 그룹이 됩니다. 가 상위 프로세스의 pid인 경우 $parent다음 명령은 그룹에 있는 프로세스의 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)

관련 정보