что происходит в virtualbox, когда вы выделяете более одного виртуального ядра?

#virtualbox

#virtualbox

Вопрос:

Если я использую Oracle virtualbox и назначаю виртуальной машине более одного виртуального ядра, как назначаются фактические ядра? Использует ли он оба реальных ядра в виртуальной машине или использует что-то, что эмулирует ядра?

Комментарии:

1. Ваш вопрос интересен. Я использую VBox 4.0.4 на процессоре AMD x86_64, я активировал два виртуальных ядра для экземпляра виртуальной машины (Linux Red hat 64bit), но активировано только одно виртуальное ядро, из документации «VirtualBox может предоставлять до 32 виртуальных процессоров на каждой виртуальной машине». Я продолжу этот вопрос.

Ответ №1:

Ваш вопрос почти похож на вопрос: как операционная система определяет, на каком ядре запускать данный процесс / поток? Ваш компьютер постоянно принимает такого рода решения — на нем запущено гораздо больше процессов / потоков, чем у вас доступных ядер. Этот конкретный ответ похож по своей природе, но также зависит от того, как настроен гостевой компьютер и какая поддержка доступна вашему оборудованию для ускорения процесса виртуализации — так что этот ответ, безусловно, не окончательный, и я не буду касаться того, как хост планирует выполнение кода, но давайте рассмотрим два относительно простых случая:

Первым будет полностью виртуализированная машина — это будет машина без включенного ускорения или с минимальным ускорением. Оборудование, предоставляемое гостю, полностью виртуализировано, хотя многие инструкции процессора просто передаются и выполняются непосредственно на процессоре. В подобных случаях ваша гостевая виртуальная машина более или менее ведет себя как любой процесс, запущенный на хосте: ресурсы процессора планируются операционной системой (в данном случае, хостом), и процессы / потоки могут выполняться на любых ядрах, доступ к которым им разрешен. Обычно по умолчанию используется любое доступное ядро, хотя могут присутствовать некоторые оптимизации, позволяющие попытаться сохранить процесс на одном ядре, чтобы сделать кэши L1 / L2 более эффективными и минимизировать переключение контекста. Обычно в этих случаях гостевой операционной системе выделяется только один процессор, и это примерно соответствует одному процессу, запущенному на хосте.

В несколько более сложном сценарии виртуальная машина настраивается со всеми доступными параметрами ускорения виртуализации процессора. На языке Intel они называются VT-x, для AMD это AMD-V. В первую очередь они поддерживают привилегированные инструкции, которые обычно требуют некоторой двоичной трансляции / захвата для защиты хоста и гостя. Таким образом, операционная система хоста теряет некоторую видимость. Включите в него поддержку MMU с аппаратным ускорением (чтобы к таблицам страниц памяти можно было обращаться напрямую, не будучи затененным программным обеспечением виртуализации) — и видимость немного снизится. В конечном счете, хотя он по-прежнему в значительной степени ведет себя как первый пример: это процесс, запущенный на хосте и запланированный соответствующим образом — только вы можете думать о потоке, выделяемом для выполнения инструкций (или передачи их через) для каждого виртуального процессора.

Стоит отметить, что, хотя вы можете (при правильной аппаратной поддержке) выделить гостевому серверу больше виртуальных ядер, чем у вас есть в наличии, это не очень хорошая идея. Обычно это приводит к снижению производительности, поскольку гость потенциально перегружает процессор и не может правильно распределить запрашиваемые ресурсы — даже если процессор не загружен полностью. Я рассматриваю это как сценарий, который имеет определенное сходство с многопоточной программой, которая порождает гораздо больше потоков (которые на самом деле заняты), чем свободных ядер процессора, доступных для их запуска. Ваша производительность обычно будет хуже, чем если бы вы использовали меньше потоков для выполнения работы.

В крайнем случае, VirtualBox даже поддерживает горячее подключение ресурсов процессора, хотя только несколько операционных систем поддерживают это должным образом: Windows 2008 Data Center edition и некоторые ядра Linux. Обычно применяются те же правила, когда одно гостевое ядро процессора рассматривается как процесс / поток на логическом ядре хоста, однако на самом деле хост и аппаратное обеспечение сами решают, какое логическое ядро будет использоваться для виртуального ядра.

При всем сказанном — ваш вопрос о том, как VirtualBox фактически распределяет эти ресурсы… ну, я не копался в коде, поэтому, конечно, не могу ответить определенно, но по моему опыту, обычно он ведет себя так, как описано. Если вам действительно интересно, вы могли бы поэкспериментировать с тегированием VirtualBox VBoxSvc.exe и связанные процессы в диспетчере задач и выбираете опцию «Установить соответствие» и ограничиваете их выполнение одним процессором и смотрите, соблюдаются ли эти настройки. Вероятно, это зависит от того, какой уровень поддержки HW у вас доступен, соблюдаются ли эти настройки хостом, поскольку гость, вероятно, на самом деле не выполняется как часть из них.