กระจาย VirtualBox VM บนแกนกลาง


2

ฉันใช้ VirtualBox VM หลายตัวพร้อมกับระบบปฏิบัติการที่แตกต่างกันบนโฮสต์ Ubuntu Linux หนึ่งตัวเพื่อการพัฒนา บางครั้งสคริปต์ของฉันผิดพลาดและเริ่มโหลด 100% ของ VM cpu และเมื่อ VM หนึ่งโหลด cpu 100% ฉันไม่สามารถใช้ระบบโฮสต์ - มันช้า!

จากนั้นฉันจะต้องเปิดด้านบน (ช้ามาก) ดูว่ากระบวนการ VirtualBox ใช้ CPU 240% จากนั้นเปิดหน้าต่าง VM ทุกหน้าต่างจนกว่าฉันจะพบ VM ที่โหลด cpu และกระบวนการฆ่า ฉันไม่ต้องการที่จะฆ่ากระบวนการ VirtualBox ทั้งหมดที่ใช้ CPU มาก

VMs ของฉันทั้งหมดได้รับการกำหนดค่าให้ใช้ซีพียูแกนเดียวเท่านั้นโดยมีขีด จำกัด การประมวลผล 100% cpu ของฉันคือ AMD FX 8370 (8 คอร์, 16 เธรด), โฮสต์ของฉันทำงานบน SSD raid 10 พร้อมกับจัดระบบไฟล์อย่างถูกต้อง ฉันอยู่ในสภาพแวดล้อมโฮสต์ windows หรือไม่ ไม่แน่นอน! เหตุใดฉันจึงประสบปัญหาการชะลอตัว

อาจเป็นเพราะ VirtualBox VM ทั้งหมดได้รับการกำหนดแกนหลักแรกเท่านั้น (เช่นเดียวกับหน้าต่างปกติ) วิธีตรวจสอบและวิธีการทำให้แต่ละ VM ใช้แต่ละแกน อาจจะเดาอื่น ๆ

บางทีคำถามนี้เป็นเพียงวิธีการกำหนดแอพใด ๆ ให้กับคอร์เฉพาะใน Linux?


ทำไมคุณไม่ให้ VM มากกว่า 1 CPU ในการตั้งค่าล่ะ? ฉันคิดว่านี่ช่วยลดโฮสต์ CPU ตัวเดียวได้เช่นกัน
h0ch5tr4355

@ h0ch5tr4355 ฉันคิดว่าถ้าฉันให้มันแกนทั้งหมดมันจะโหลดแกนทั้งหมดแทนแกนเดียว ....
POMATu

ฉันไม่แน่ใจ 100% แต่ฉันคิดว่าการกำหนดแกนเพิ่มเติมจะกระจายการรับส่งข้อมูลของ VM ไปยังจำนวนคอร์ที่เลือก
h0ch5tr4355

ขออภัยที่โพสต์คำตอบที่ไม่ใช่คำตอบ แต่อย่างน้อยในขณะที่คุณรอคำตอบแบบเต็มฉันสามารถทำให้งานของคุณง่ายขึ้น ไชโย
MariusMatutiae

@ h0ch5tr4355 ฉันจะทดสอบการกำหนดค่านั้น แต่ก่อนหน้านี้ฉันอ่านประสบการณ์ที่กำหนดมากกว่า 1 คอร์ให้กับ guest VM ทำให้แขก VM ช้าลงจริง ๆ ดังนั้นฉันจึงอยากจะแพร่กระจาย VM ของคอร์เดียวผ่านโฮสคอร์แทนการอนุญาตให้วีเอ็มใด ๆ ให้เต็ม 100% ของซีพียูของโฮสต์
POMATu

คำตอบ:


2

ฉันไม่มีคำตอบสำหรับคำถามของคุณ แต่อย่างน้อยฉันก็สามารถบรรเทาความเจ็บปวดของคุณได้

หากคุณเริ่ม VM แต่ละรายการจากบรรทัดคำสั่งเช่น

VBoxManage startvm Name_of_VM --type headless

จากนั้นคำสั่งด้านบนพร้อมตัวเลือก-cจะแสดงคำสั่งเต็มรูปแบบซึ่งเริ่มกระบวนการ วิธีนี้คุณสามารถระบุกระบวนการผู้ร้ายได้ทันทีและฆ่ามันด้วยkตัวเลือกภายในtopตัวเอง (คุณจะต้องระบุจำนวนกระบวนการที่คุณต้องการฆ่าซึ่งคุณเพิ่งระบุ)

สิ่งที่ดีคือมันใช้งานได้แม้ว่าคุณจะเริ่มต้น VM ทั้งหมดของคุณจาก GUI ไม่ใช่จาก CLI

แก้ไข:

ในความคิดที่สองฉันอาจรู้คำตอบสำหรับคำถามของคุณ ฉันไม่แน่ใจว่านี่คือสิ่งที่คุณกำลังค้นหาจริงๆในกรณีนี้กรุณาบอกฉันด้วย

ยูทิลิตี้ลินุกซ์ที่จะ จำกัด tasksetขอบเขตการดำเนินการของกระบวนการที่จะหลักที่กำหนดไว้ล่วงหน้าคือ util-linuxคุณควรจะมีได้โดยเริ่มต้นถ้าไม่ตรวจสอบแพคเกจ คุณสามารถแสดงความสัมพันธ์ของกระบวนการ( เช่นรายการ cpus ที่ได้รับอนุญาตให้เรียกใช้) โดยใช้วิธีการ

      taskset -cp Process_ID

( pแฟล็กระบุว่าสิ่งต่อไปนี้คือหมายเลขกระบวนการcแฟล็กจะแทนที่สตริงอักขระเป็นการแทนเลขฐานสิบหกของแกน CPU ซึ่งจะเป็นค่าเริ่มต้น)

คุณสามารถกำหนดกระบวนการที่รันอยู่แล้วให้รันบนแกน 0 และ 1 เท่านั้นเช่นโดยใช้

     taskset -cp 0,1 Process_ID

หรือเปิดโปรแกรมใหม่บน core 0 เท่านั้นโดย:

      taskset -c 0 VBoxManage startvm Name_of_VM --type headless

ประการที่สอง: ก่อนอื่นความจริงที่ว่าคุณได้ จำกัด กระบวนการให้ทำงานบน CPU เดียวไม่ได้หมายความว่ามันจะเป็นกระบวนการเดียวที่ทำงานบนมัน: กระบวนการทั้งหมดที่ affinity รวมถึง CPU นั้นจะทำงานในบางส่วนของเวลาบน มัน. หากคุณต้องการสำรอง CPU ที่ได้รับสำหรับการใช้งานพิเศษของกระบวนการที่คุณตั้งค่ากับtasksetคุณจะต้องใช้พารามิเตอร์isolcpusซึ่งแยก CPU ที่ได้รับจากการจัดตารางเวลาเคอร์เนล เพียงเพิ่มพารามิเตอร์ isolcpus = [cpu_number] ลงในบรรทัดคำสั่งเคอร์เนล Linux สำหรับบูตโหลดเดอร์

นอกจากนี้คุณควรได้รับคำแนะนำว่าการ จำกัด กระบวนการให้กับ CPU ตัวเดียวไม่จำเป็นต้องเป็นอย่างtotal solutionที่คุณคิด ซีพียูใช้อุปกรณ์ต่อพ่วงทุกชนิดและภายใต้สถานการณ์ที่กำหนดพวกเขาอาจติดขัดเนื่องจากอุปกรณ์ต่อพ่วงที่มีปัญหาไม่สามารถใช้งานได้ซึ่งทำให้ CPU วนซ้ำในการร้องขอและบัสและอาจเป็นอุปกรณ์ต่อพ่วงที่มีการร้องขอมากเกินไป ตัวอย่าง? ฉันใช้คอนโทรลเลอร์ Sonos ทำงานภายใต้ Wine; เมื่อฉันเปิดใช้งาน VPN มันจะถูกตัดการเชื่อมต่อจากฐานบ้านในแคลิฟอร์เนียและทำให้ระบบของฉันเต็มไปด้วยคำขอเครือข่าย สิ่งนี้ไม่เกี่ยวกับการ จำกัด ให้กับ CPU ตัวเดียว


ขอบคุณ! ตอนนี้ชีวิตของฉันง่ายขึ้นมาก! :) จะรอคำตอบจริงตอนนี้เพราะ 1 VM ไม่ควรทำให้ระบบโฮสต์ทั้งหมดช้าลง
POMATu

เคล็ดลับเล็ก ๆ การเพิ่มnohupและ&อนุญาตให้กระบวนการลอยหัวขาดในพื้นหลังอย่างแท้จริง:nohup VBoxManage startvm Name_of_VM --type headless &
JakeGould

ขอบคุณ! ดังนั้นฉันจะเขียนสคริปต์ที่กระจาย VMs ผ่านคอร์ด้วยคำสั่งนี้ จะดูว่าช่วยได้ไหม
POMATu

@MariusMatutiae ฉันทำสคริปต์ตามวิธีแก้ปัญหาของคุณขอบคุณ
POMATu

0

ด้วยความช่วยเหลือของคำตอบของ MariusMatutiae ในที่สุดฉันก็สามารถเขียนสคริปต์ "สเปรดเดอร์" ที่แพร่กระจาย VM เสมือนจริงทั้งหมดที่เปิดตัวไปยังคอร์ที่แตกต่างกัน ยิ่งไปกว่านั้นมันยังทำสิ่งเดียวกันกับ VMware VMs

ในการใช้สคริปต์นี้ VMs ทั้งหมดของคุณควรเป็นแบบ single-cored (ซึ่งสามารถตั้งค่าในการตั้งค่า) มิฉะนั้นคุณสามารถแยกออกได้โดยแก้ไข 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 VMs แล้วลบออก[V]irtualBox.*comment\|จากรูปแบบ grep หากคุณต้องการให้มันทำงานเฉพาะกับ VMware VMs ให้ลบออก\|.*[.]vm[x]จากรูปแบบ grep

หลังจากใช้สคริปต์นี้คุณจะเห็นความล่าช้าใน VMs ทั้งหมดเป็นเวลาหลายวินาที จากนั้นทุกอย่างจะดีและทำงานตามที่คาดไว้

ตอนนี้ VMs ไม่สามารถกินซีพียูของฉันได้แม้ในขณะที่ใช้งานมากเกินไปและ Firefox ก็มีความสุขที่ได้กินมันทั้งหมด แต่นั่นเป็นอีกเรื่อง ... : /

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.