Почему включение Hyper-V ускоряет запуск процесса MSYS2?

504
Mehrdad

Когда я запускаю этот цикл в оболочке MSY2 Bash

function test() { bcdedit | grep hypervisorlaunchtype printf "Press ENTER to begin..." 1>&2 read # warm-up for ((i=0; i<"$1"; i++)); do $(:); done  # actual iterations local tstart="$(date "+%s%3N")" iterations=0 local i for ((i=2; i<"$1"; i++)); do $(:); done local tend="$(date "+%s%3N")" # 2 extra spawns here printf "%s ms/spawn" $((("$tend" - "$tstart") / "$i")) 1>&2 read } test 300 

Я получаю около 23 мс / спавн, если hypervisorlaunchtypeесть off, но около 4 мс / спавн, если это так auto.

Вот GIF-файлы, сравнивающие два с одинаковыми итерациями: Hyper-V off против Hyper-V auto .
(Обратите внимание, что статистика времени процессора не остается на нуле из-за поломки - она ​​остается на нуле, потому что на самом деле они слишком малы. Если вы оставите программу работающей достаточно долго, она будет увеличиваться.)

Что вызывает это несоответствие?

3
Странно, но большинство людей сообщают об обратном эффекте. Включение Hyper-V в Windows 8+ фактически превращает его в настоящую операционную систему, в то время как Windows вынуждена работать как виртуальная машина, хотя и со специальными правами доступа к оборудованию, что может снизить производительность. Я мог бы предположить, что одной из причин этого различия может быть то, что Hyper-V предварительно выделяет память не так, как Windows, но это может лучше соответствовать вашему случаю. Не могли бы вы дать более подробную информацию о вашей среде и методе измерения? harrymc 6 лет назад 0
@harrymc: Да, это тоже поражает. Метод измерения - это буквально сам код - он сам рассчитывает время (с помощью команды `date`), просто запустите его. Сначала я заметил это, потому что заметил, что MSYS2 неожиданно запускается быстрее с включенным Hyper-V. (!) Не уверен, что именно ты под моей "средой" конкретно ... это Windows 8.1 x64 с последними обновлениями, если ты это имеешь ввиду. Я воспроизвел это на двух разных ноутбуках, поэтому я не думаю, что это очень специфично для моих ноутбуков. У вас есть Windows 8.1 / вы можете ее воспроизвести? Mehrdad 6 лет назад 0
У меня Windows 10, которая включает в себя более развитый Hyper-V. Я имел в виду то, как вы запускаете программное обеспечение. Если я правильно понимаю, вы запускаете цикл bash (лучше покажите нам сценарий), поэтому, я думаю, вы действительно измеряете время запуска или системные вызовы. Попробуйте запустить Resource Monitor, чтобы увидеть, где разница. В Диспетчере задач можно также отобразить столбцы «Ошибки страниц», «Чтения ввода-вывода», «Прочие операции ввода-вывода», «Ручки и потоки» - различия в профиле выполнения могут помочь. Даже если никаких различий не наблюдается, это полезный факт. harrymc 6 лет назад 0
@harrymc: этот код выше * является * сценарием - я просто копирую и вставляю его в оболочку и наблюдаю за выводом. Я постараюсь выяснить, смогу ли я собрать эту информацию, но, возможно, пройдет немного времени, прежде чем я смогу ее найти. Было бы полезно, если бы вы попытались запустить MSYS2 на своем конце и посмотреть, наблюдаете ли вы такое же поведение на Win10. Mehrdad 6 лет назад 0
@harrymc: На самом деле, чьи * ошибки * страницы и I / O и т. д. вы запрашиваете? Родительский процесс, запускающий детей или самих детей? Я ожидал бы, что это будет более актуально для детей, но я не уверен, как измерить их, так как они, очевидно, прекратили через короткий промежуток времени, и я не могу остановить их до конца. Mehrdad 6 лет назад 0
Измените ваш сценарий так, чтобы он выполнялся в длинном цикле, накапливая разницу мс, чтобы у вас было время наблюдать за поведением. Resource Monitor покажет общее поведение системы. Я не знаю MSYS2 достаточно, чтобы сказать, является ли «дата» дочерним или встроенным. harrymc 6 лет назад 0
@harrymc: О, суть здесь в том, что `date` - это ребенок, и поэтому подоболочка, которая его вызывает (отсюда деление на 2, вы видите в расчете). Вот почему я говорю, что не могу измерить поведение ребенка - оба процесса многократно запускаются и заканчиваются быстро. Я постараюсь увидеть, приносит ли родитель что-нибудь, но я, честно говоря, не ожидаю этого. Mehrdad 6 лет назад 0
Resource Monitor все равно будет полезен. Это можно сделать с помощью бесплатного [Process Hacker] (http://processhacker.sourceforge.net/) - включите Параметры-> Дополнительно-> Включить использование ЦП (и других) дочерних элементов в свернутые процессы, а затем сверните родительский элемент ([подробнее] и снимок экрана] (https://superuser.com/a/1153795/8672)). harrymc 6 лет назад 0
@harrymc: Хорошо, поэтому, когда я оставляю скрипт работающим в течение ~ 10 секунд, я вижу значительную разницу в количестве ошибок ввода-вывода и страниц, а также времени, проведенного в режиме пользователя или ядра в родительском процессе Bash. См. [Hyper-V off] (https://i.stack.imgur.com/WirSR.png) и [Hyper-V auto] (https://i.stack.imgur.com/JZKSp.png). Не уверен, что делать с этим, хотя. Mehrdad 6 лет назад 0
Вы уверены, что рабочий период был примерно одинаковым для обоих? Число «Hyper-V auto» в 2-4 раза больше, чем «Hyper-V off». Вы можете изменить скрипт так, чтобы он останавливался через 10 секунд, а не полагаться на свои часы и делать скриншоты статистики до и после выполнения цикла. А какой у тебя компьютер? harrymc 6 лет назад 0
@harrymc: Да, я определенно уверен, я делал это несколько раз. Они постоянно получаются такими. Кажется, с Hyper-V процессор просто делает больше работы. Компьютер является ThinkPad. Mehrdad 6 лет назад 0
Делать больше работы должно быть медленнее, а не быстрее. В отличие от этого, похоже, что ядро ​​в Hyper-V использует ваше оборудование намного лучше, чем в Windows 8.1 (лучше [HAL] (https://en.wikipedia.org/wiki/Hardware_abstraction)?). Ваш компьютер кажется более быстрым с Hyper-V? harrymc 6 лет назад 0
@harrymc: Нет, совсем нет, иначе я бы заметил это много лет назад. Я только замечаю разницу в скриптах MSYS2. Может быть, ядро ​​использует аппаратное обеспечение «лучше», но я сомневаюсь в этом - несоответствие в циклах делает более вероятным, что предстоит выполнить больше работы, чем та же самая работа, выполняемая быстрее. Я предполагаю, что может быть какая-то искусственная пауза где-то, чего не происходит в системе с поддержкой Hyper-V, но я понятия не имею, что это может быть. Mehrdad 6 лет назад 0
Это повышает вероятность того, что проблема с библиотеками MSYS2. Каким-то образом они неправильно понимают аппаратное обеспечение и медленно выполняют некоторые операции. Под Hyper-V аппаратная идентификация дает лучшие результаты. harrymc 6 лет назад 0
@harrymc: Это кажется маловероятным, хотя возможно. Я уже спрашивал об этом, но вы ничего не сказали - хотите ли вы установить MSYS2 и попытаться воспроизвести его на своем компьютере? Это ничего не загрязняет; насколько я знаю, все находится ниже основной папки \ MSYS2. Кажется, помочь вам понять, что происходит, может быть намного проще, чем просто гадать в темноте. Mehrdad 6 лет назад 0
@ McDonald's: я уже удалил / переустановил Hyper-V; не видел никакой разницы. Как я уже сказал, это происходит на разных моделях ноутбуков - я не думаю, что это проблема с BIOS (и, по крайней мере, хотя бы одна из них является актуальной). И нет, я не использую программное обеспечение для виртуальных машин. Mehrdad 6 лет назад 0
@ McDonald's: я приложил GIF-файлы в вопросах, проверьте это. Надеюсь, это достаточно убедительно, что мне не нужно пересылать почту через мой ноутбук. :-) Mehrdad 6 лет назад 0
@harrymc: я добавил GIF-файлы в вопросы и отредактировал скрипт, чтобы остановить его после определенного количества итераций, проверьте его. С Hyper-V это смехотворно быстрее. Mehrdad 6 лет назад 0
У вас больше нет ответов. Я никогда не сталкивался с таким поведением, как ваше, и мне не нужна ваша крошечная награда. harrymc 6 лет назад 0

0 ответов на вопрос