2

Я использую множество виртуальных машин VirtualBox с разными ОС на одном хосте Ubuntu Linux для разработки. Иногда мои скрипты ошибаются и начинают загружать 100% виртуальных процессоров. И когда одна виртуальная машина загружает 100% процессора, я даже не могу использовать хост-систему - это медленно!

Затем я должен открыть сверху (очень медленно), увидеть, что процесс VirtualBox использует 240% процессорного времени, затем открыть каждое окно виртуальной машины, пока я не найду виртуальную машину, которая загружает процессор и уничтожает процесс. Я не хочу убивать весь процесс VirtualBox, который использует много процессоров.

Все мои виртуальные машины настроены на использование только одного ядра ЦП с ограничением выполнения 100%. Мой процессор AMD FX 8370 (8 ядер, 16 потоков), мой хост работает на SSD raid 10 с правильно настроенными файловыми системами. Я в среде хоста Windows? Конечно, нет! Так почему я испытываю замедления?

Может быть, потому что все VirtualBox VM получают только первое назначенное ядро (как обычно делают окна)? Как это проверить и как заставить каждую виртуальную машину использовать каждое ядро? Может быть, другие догадки?

Может быть, этот вопрос таков: как назначить какое-либо приложение конкретному ядру в Linux?

2 ответа2

2

У меня нет ответа на ваш вопрос, но, по крайней мере, я могу облегчить вашу боль.

Если вы запускаете каждую виртуальную машину из командной строки, например, как

VBoxManage startvm Name_of_VM --type headless

тогда верхняя команда с опцией -c также отобразит полную команду, которая запустила процесс. Таким образом, вы можете сразу идентифицировать процесс-виновника и уничтожить его с помощью опции k внутри самой top (вам нужно будет указать номер процесса, который вы хотите уничтожить, который вы только что определили).

Хорошо, что это работает, даже если вы запускаете все свои виртуальные машины из GUI, а не из CLI.

РЕДАКТИРОВАТЬ:

Если подумать, возможно, я знаю ответ на ваш вопрос. Я не уверен, что это действительно то, что вы ищете, в этом случае, пожалуйста, просто скажите мне об этом.

Утилита Linux, ограничивающая выполнение процесса предварительно заданным ядром, - это taskset . Вы должны иметь его по умолчанию, если нет, проверьте пакет util-linux . Вы можете отобразить сходство процесса (т. Е. Список процессоров, на которых ему разрешено запускаться) с помощью

      taskset -cp Process_ID

(флаг p указывает, что ниже следует номер процесса, флаг c заменяет строку символов на шестнадцатеричное представление ядер ЦП, которое будет использоваться по умолчанию).

Вы можете назначить уже запущенный процесс для запуска только на ядрах 0 и 1, например, с помощью

     taskset -cp 0,1 Process_ID

или запустить новую программу на ядре 0 только с помощью:

      taskset -c 0 VBoxManage startvm Name_of_VM --type headless

Два предостережения: во-первых, тот факт, что вы ограничили процесс для запуска на одном процессоре, не означает, что он будет единственным процессом, выполняющимся на нем: все процессы, сродство которых включает этот процессор, будут работать в течение некоторой доли времени на Это. Если вы хотите зарезервировать данный ЦП для исключительного использования процесса, который вы установили с taskset набора задач , вам придется использовать параметр isolcpus который изолирует данный ЦП от планировщика ядра. Просто добавьте параметр isolcpus = [cpu_number] в командную строку ядра Linux для загрузчика.

Кроме того, вам следует учесть, что ограничение процесса одним процессором не должно быть total solution о котором вы, похоже, думаете. Процессоры используют периферийные устройства любого рода, и при определенных обстоятельствах они могут застрять, потому что рассматриваемое периферийное устройство становится недоступным, что приводит к тому, что центральный процессор зацикливается в своих запросах, а шина и, возможно, также периферийное устройство перегружаются запросами. Пример? Я использую контроллер Sonos, работающий под Wine; когда я активирую VPN, он отключается от своей домашней базы в Калифорнии и продолжает заполнять мою систему сетевыми запросами. Это не имеет ничего общего с ограничением в одном процессоре.

0

С помощью ответа MariusMatutiae мне наконец-то удалось написать сценарий "spreader", который распределяет все запущенные виртуальные машины виртуальных машин на разные ядра. Кроме того, он делает то же самое с виртуальными машинами VMware.

Чтобы использовать этот сценарий, все ваши виртуальные машины должны быть одноядерными (это можно настроить в настройках). В противном случае вы можете исключить их, изменив 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, удалите [V]irtualBox.*comment\| из шаблона grep. Если вы хотите, чтобы он работал только с виртуальными машинами VMware, удалите \|.*[.]vm[x] из шаблона grep.

Просто после применения этого скрипта вы можете увидеть некоторые лаги во всех виртуальных машинах на несколько секунд. Тогда все становится хорошо и работает как положено.

Теперь виртуальные машины не могут есть мой процессор, даже если они перегружены, и Firefox действительно счастлив съесть все это. Но это другая история ...:/

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .