
개발을 위해 하나의 Ubuntu Linux 호스트에서 서로 다른 OS를 사용하는 여러 VirtualBox VM을 사용하고 있습니다. 때때로 내 스크립트가 잘못되어 VM CPU를 100% 로드하기 시작합니다. 그리고 하나의 VM이 100% CPU를 로드하면 호스트 시스템을 사용할 수도 없습니다. 속도가 느려집니다!
그런 다음 상단을 매우 천천히 열어서 VirtualBox 프로세스가 CPU의 240%를 사용하고 있는지 확인한 다음 CPU를 로드하고 프로세스를 종료하는 VM을 찾을 때까지 모든 VM 창을 열어야 합니다. 많은 CPU를 사용하는 전체 VirtualBox 프로세스를 종료하고 싶지 않습니다.
내 모든 VM은 실행 한도가 100%인 하나의 CPU 코어만 사용하도록 구성되었습니다. 내 CPU는 AMD FX 8370(8코어, 16스레드)이고 호스트는 파일 시스템이 올바르게 정렬된 SSD raid 10에서 실행됩니다. Windows 호스트 환경에 있습니까? 당연히 아니지! 그러면 속도가 느려지는 이유는 무엇입니까?
아마도 모든 VirtualBox VM이 첫 번째 코어만 할당되기 때문일까요(창이 일반적으로 하는 것처럼)? 이를 확인하는 방법과 각 VM이 각 코어를 사용하도록 만드는 방법은 무엇입니까? 어쩌면 다른 추측이 있을까요?
아마도 이 질문은 다음과 같습니다. Linux의 특정 코어에 앱을 할당하는 방법은 무엇입니까?
답변1
귀하의 질문에 대한 답변은 없지만 적어도 귀하의 고통을 덜어드릴 수는 있습니다.
예를 들어 다음과 같이 명령줄에서 각 VM을 시작하는 경우
VBoxManage startvm Name_of_VM --type headless
옵션이 포함된 최상위 명령은 -c
프로세스를 시작한 전체 명령도 표시합니다. 이렇게 하면 범인 프로세스를 즉시 식별하고 k
자체 옵션 으로 해당 프로세스를 종료할 수 top
있습니다(방금 식별한 종료하려는 프로세스의 번호를 제공해야 합니다).
좋은 점은, 이는 CLI가 아닌 GUI에서 모든 VM을 시작하는 경우에도 작동합니다.
편집하다:
다시 생각해 보면 아마도 나는 당신의 질문에 대한 답을 알고 있을 것입니다. 이것이 실제로 당신이 찾고 있는 것인지 잘 모르겠습니다. 이 경우에는 그냥 그렇게 말씀해 주세요.
프로세스 실행을 미리 지정된 코어로 제한하는 Linux 유틸리티는 taskset
. 기본적으로 포함되어 있어야 합니다. 그렇지 않은 경우 패키지를 확인하세요 util-linux
. 과정을 표시할 수 있습니다.유연(즉, 실행이 허용되는 CPU 목록)을 통해
taskset -cp Process_ID
( p
플래그는 뒤에 오는 프로세스 번호를 지정하고, c
플래그는 기본값인 CPU 코어의 16진수 표현을 문자열로 대체합니다.)
예를 들어 다음을 통해 이미 실행 중인 프로세스를 코어 0과 1에서만 실행하도록 할당할 수 있습니다.
taskset -cp 0,1 Process_ID
또는 다음을 통해서만 코어 0에서 새 프로그램을 시작하십시오.
taskset -c 0 VBoxManage startvm Name_of_VM --type headless
두 가지 주의 사항: 첫째, 단일 CPU에서 실행되도록 프로세스를 제한했다는 사실이 해당 프로세스가 단일 CPU에서 실행되는 유일한 프로세스라는 의미는 아닙니다. 해당 CPU를 포함하는 선호도를 가진 모든 프로세스는 일정 시간 동안 실행됩니다. 그것. 로 설정한 프로세스의 독점적 사용을 위해 특정 CPU를 예약하려면 매개 변수 taskset
를 사용해야 합니다.isolcpus
커널 스케줄러에서 지정된 CPU를 분리합니다.. 부트로더의 Linux 커널 명령줄에 isolcpus=[cpu_number] 매개변수를 추가하기만 하면 됩니다.
total solution
또한 프로세스를 단일 CPU로 제한하는 것이 생각처럼 그럴 필요는 없다는 점을 알아야 합니다 . CPU는 모든 종류의 주변 장치를 사용하며 주어진 상황에서 문제의 주변 장치를 사용할 수 없게 되어 CPU가 요청 루프를 일으키고 버스와 주변 장치가 요청으로 과부하되기 때문에 작동이 중단될 수 있습니다. 예? 저는 Wine에서 실행되는 Sonos 컨트롤러를 사용합니다. VPN을 활성화하면 캘리포니아에 있는 본거지와의 연결이 끊어지고 시스템에 네트워크 요청이 계속해서 넘쳐납니다. 이는 단일 CPU에 국한되는 것과는 아무런 관련이 없습니다.
답변2
MariusMatutiae의 답변 덕분에 마침내 시작된 모든 virtualbox VM을 다른 코어로 확산시키는 "스프레더" 스크립트를 작성할 수 있었습니다. 또한 VMware VM에서도 동일한 작업을 수행합니다.
이 스크립트를 사용하려면 모든 VM이 단일 코어여야 합니다(설정에서 설정할 수 있음). 그렇지 않으면 grep regexp를 수정하여 제외할 수 있습니다.
#!/bin/bash
#getting possible affinity lists
AFFINITY=($(taskset -cp 1 | sed 's/.*\([0-9]\)\+[-]\([0-9]\+\).*/\1 \2/'))
echo Detected min_cpu: ${AFFINITY[0]}, max_cpu: ${AFFINITY[1]}.
CURRENT_AFFINITY=${AFFINITY[1]};
ps -Af | grep -i "[V]irtualBox.*comment\|.*[.]vm[x]" | awk -F" " '{ print $2}' |
# Iterating backwards because I think that farther cpus are less loaded. Maybe I am wrong
while read pid
do
echo Setting $pid to cpu $CURRENT_AFFINITY
taskset -cp $CURRENT_AFFINITY $pid
#loop stuff
let CURRENT_AFFINITY=CURRENT_AFFINITY-1;
if [[ "$CURRENT_AFFINITY" -lt ${AFFINITY[0]} ]];
then
CURRENT_AFFINITY=${AFFINITY[1]};
fi
done
VirutalBox VM에서만 작동하게 하려면 [V]irtualBox.*comment\|
grep 패턴에서 제거하십시오. VMware VM에서만 작동하게 하려면 \|.*[.]vm[x]
grep 패턴에서 제거하세요.
이 스크립트를 적용한 직후 몇 초 동안 모든 VM에서 약간의 지연이 나타날 수 있습니다. 그러면 모든 것이 좋아지고 예상대로 작동합니다.
이제 VM은 과부하가 걸려도 내 CPU를 먹어치울 수 없으며, Firefox는 그 CPU를 모두 먹어치워서 정말 행복합니다. 하지만 그것은 또 다른 이야기입니다... :/