Как VirtualBox РАСЧЕТА, сколько виртуальных процессоров доступно?
Я попытался получить ответ на этот вопрос в канале VB IRC, я просмотрел stackexchange, stackru, superuser и другие. Ответы подходят близко, но не то, что я хочу знать.
Это только вопрос любопытства, а не необходимости. Я просто хочу знать, как все работает. Это не имеет никакого отношения к какой-либо ошибке, запросу расширения или проблеме безопасности. Если вы чувствуете, что этот форум не место, чтобы получить ответ на этот вопрос, пожалуйста, направьте меня в соответствующее место. Благодарю. (Хотя трудно представить, что собственный форум VBox может быть неправильным местом, я не нашел ответа на мой конкретный вопрос или места для публикации в соответствующей категории.) Что бы ни случилось, пожалуйста, не закрывайте мой вопрос по крайней мере, не указывая на лучший ресурс (я ненавижу, когда это происходит!). Еще раз спасибо.
Теперь вопрос: как драйвер хоста virtualbox вычисляет общее количество предоставляемых виртуальных процессоров?
(Обратите внимание, что я не буду отвечать на вопросы от людей, которые действительно не читали вопрос, или, по крайней мере, сначала попросят разъяснений. Я думаю, что это ОЧЕНЬ простой вопрос.)
Позвольте мне разбить вопрос так, чтобы он был как можно более точным и лаконичным в отношении того, что я действительно спрашиваю. Мне любопытно узнать, как программное обеспечение VirtualBox HOST (какой бы ни была его часть) определяет, сколько виртуальных процессоров появляется в интерфейсе конфигурации, где пользователь выбирает, сколько виртуальных ЦП они хотели бы применить к конкретной виртуальной машине.
Чего я НЕ спрашиваю: я НЕ спрашиваю о чуде аппаратного обеспечения виртуализации и т. Д. В целом; Я понимаю несколько ядер и несколько потоков, VTx и т. Д. Я НЕ спрашиваю, сколько я должен использовать для конкретной ВМ или приложения. Я НЕ прошу помощи в настройке какой-либо конкретной виртуальной машины в моем вопросе. Я не прошу никого спрашивать меня, почему я должен знать - я уже говорил вам; Мне просто любопытно. Если мой конкретный вопрос вас не интересует, это нормально. Опять же, это простой, простой вопрос: как VBox получает номер?
Что я уже знаю: это правда, что, по крайней мере, в общем, ответ в два раза больше, чем физические процессоры; Хорошо, если так, то почему 2х, а не 3х или какой-то другой множитель? (Я знаю, что дробные количества не будут работать для нечетного числа ядер или потоков; я просто стараюсь быть как можно более общим.) Например, на моем Phenom II X6 VirtualBox предоставляет мне до 12 VCPU. Если ответ - темы, ну, это не может быть, так как мой конкретный Thuban не имеет потоков (некоторые Thubans есть, некоторые нет). Однако мой Thuban имеет гипертранспорт, но не гиперпоточность. Кроме того, мой старый Phenom II X2 позволит использовать 4 виртуальных ЦП в Virtualbox.
Я уже читал многочисленные ответы на сайтах, упомянутых выше, с указанием пользователям НЕ использовать более одного VCPU на виртуальную машину, потому что это увеличивает издержки (во-первых, вы должны запустить IOAPIC, что приводит к снижению производительности). Я также читал посты, где вопрос звучит как мой, но в конечном итоге они не дают ответа на этот вопрос.
Является ли ответ своего рода сигма-суммой или логарифмической формулой? Достаточно ли сложно превзойти возможности форматирования этого форума? Трудно представить, почему так трудно получить ответ на этот вопрос, который, как я полагаю, был бы задан много раз. Я действительно хочу знать, почему обычно это в 2 раза больше; почему это "магическое" число. Если я прочитаю исходный код (при условии, что он доступен), объяснят ли комментарии почему?
Я действительно буду ценить и восхищаться душой (ами), которые читают и отвечают на этот вопрос, а не какой-то другой вопрос, который не задают. Я также надеюсь, что вы не будете перенаправлять меня на темные и враждебные каналы IRC; В IRC есть несколько очень социопатических организаций, чьи замечания напоминают мне о некоторых субъектах криминального мышления. Обратите внимание, что я сказал "некоторые" - там тоже есть полезные люди. Не имеет смысла противодействовать; Я просто больше не хочу ходить в IRC. Если вы знаете конкретный полезный ник на IRC с этим, я был бы признателен также за это.
Кстати, я искал ответы на этот и другие вопросы и читал доски SO, SE и SU, и я вижу, что некоторые люди отвечают с ответами, которые абсолютно не имеют значения. Вот причина, по которой я могу звучать как грубый тон. Это мой первый пост, и я надеюсь, что ответ будет более положительным, чем некоторые из моих опытов в IRC.
1 ответ
Кажется, вы спрашиваете: "Как графический интерфейс VirtualBox вычисляет доступный диапазон для ползунка Процессор (ы) в настройках системы?"
Поскольку VirtualBox является открытым исходным кодом (и очень чистым, хорошо написанным исходным кодом), нетрудно разобраться в коде и найти ответ. Копаясь в папку /src/VBox/Frontends/VirtualBox/src/settings/machine, вы можете увидеть все файлы пользовательского интерфейса *, которые содержат элементы пользовательского интерфейса настроек. Конкретный файл, который будет иметь ваш ответ, является UIMachineSettingsSystem.cpp. Начиная примерно со строки 45 ( начиная с версии 43459), вы можете увидеть следующий код:
/* Setup constants */
CSystemProperties properties = vboxGlobal().virtualBox().GetSystemProperties();
uint hostCPUs = vboxGlobal().host().GetProcessorCount();
mMinGuestCPU = properties.GetMinGuestCPUCount();
mMaxGuestCPU = RT_MIN (2 * hostCPUs, properties.GetMaxGuestCPUCount());
mMinGuestCPU
переменная и связанная GetMinGuestCPUCount()
метод (и mMaxGuestCPU
/ GetMaxGuestCPUCount()
) должно быть относительно простым - как правило, это будет 1 в течение минимума, а максимальным будет количество физических / логических ядер, доступных на хосте.
Таким образом, чтобы ответить на ваш вопрос - масштаб для слайдера обычно в 1–2 раза превышает количество доступных ядер. Я настоятельно рекомендую вам скачать исходный код и покопаться в методах, которые рассчитывают эти числа, и посмотреть, как они рассчитываются и какие нюансы связаны с этим. В частности, vboxGlobal().host().GetProcessorCount()
метод.