Как стать автором
Обновить

Почему WSL 2 в 13 раз быстрее, чем WSL: впечатления от Insider Preview

Время на прочтение4 мин
Количество просмотров17K
Всего голосов 21: ↑20 и ↓1+19
Комментарии80

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

Если WSL2 работает как VM, скорее всего на Hyper-V, то, как понимаю, внутри вирутальной машины с Windows 10 ее не запустить?
Ну под Hyper-V можно запускать вложенные VM. Так что в теории работать будет.
Сейчас вложенная виртуализация работает только с Intel. АМД в планах
У меня Ryzen и тоже наткнулся на данную проблему
почему нет, вполне можно запустить.
DNS перестал отваливаться в WSL?

нет, надо перезапускать hyperv адаптер (например после выхода компьютера из сна)

Как же мало надо для счастья…
Написать не «WSL1 в 13 раз тормознее WSL2», а несколько иначе. На тех же фактах.
Эм. Это Вы как раз пытаетесь менять формулировки как Вам удобнее. WSL2 это развитие WSL1, и потому как раз всё логично, что говорится о том, что стало быстрее чем было.
Еще логичнее сравнить linapp@Linux > ...@WSL2 > ...@WSL1 на одной и той же машине.
Как принято сравнивать winapp@wine@Linux > winapp@Windows на одной и той же машине.
Вот так было бы честнее.

А пока это «быстрее в 13 раз» — акробатика с фактами.
А это коим боком? Статья то вообще не про это. О производительности виртуалок под гипервизором и так вполне все известно.
А виртуалки и гипервизоры тут каким боком?
Статья вообще не о них.
Но ведь WSL2 это не развитие WSL1, а решение той же задачи кардинально другим методом.
Практически всю работу по поддержке ELF и транслированию вызовов и просто выбросили и воткнули немного допиленное ядро линукса в виртуалку в HyperV, сделав интерфейсы уже к ней.

В посте отсутствует ответ на вопрос из заголовка.


Дело в том, что запись на диск и системные вызовы Linux обходились достаточно дорого (с точки зрения временных затрат) из-за архитектуры первой версии WSL.

Ну и почему они обходились достаточно дорого? Что конкретно не так с архитектурой WSL1? Что делает трансляцию системных вызовов дорогой? Лично для меня совершенно контринтуитивно, что виртуальная машина должна по какой-то причине работать быстрее чем вайн наоборот. У меня такое чувство, будто в WSL1 просто наговнокодили.

А что, вайн работает со скоростью натуральной винды?

Субъективно, всяко быстрее винды в виртуалке (впрочем, сравнение не совсем честное)

А при чём тут виртуалка?

Вы пост-то читали? WSL2 это виртуалка, вот при чём.

WSL2 — это не виртуалка.
Это слой совместимости.
Но «поручили файловые операции сетевому диску VHD» (со слов автора).
И нет — виртуальный сетевой диск != виртуальная машина.

WSL2 — это именно виртуалка с линуксом:


WSL 2 использует последнюю и самую новую технологию виртуализации для запуска ядра Linux внутри упрощенной служебной виртуальной машины.

Основное отличие лишь в том, что эта виртуалка хорошо интегрирована с виндой.

… и не очень хорошо с собственно Linux'ом.
Ключевое — «упрощенной» и «Ядро Linux в WSL 2 создано собственными силами на основе».
То есть уже не Linux, но еще не Windows. Или наоборот.
И если потери производительности Windows-приложений в Linux (в виртуальной Windows или под Wine) довольно хорошо известны (речь о единицах процентов), то как работает эта стройная система костылей подсистема Windows — реально интересно.

PS. чисто по-женски интересно — какая религия запрещает эффективным манагерам Microsoft сделать нормальный транслятор вызовов абсолютно открытой OS?
Команде Wine не мешает почти полная закрытость Windows — даже глюки недокументированные фичи повторяют.
… и не очень хорошо с собственно Linux'ом.
Ключевое — «упрощенной» и «Ядро Linux в WSL 2 создано собственными силами на основе».

Опять таки вы путаете подход использованный при создании WSL1 и WSL2.


То что вы пишете это именно про WSL1, где действительно кастомное ядро Linux, в котором системные вызовы Linux пробрасываются/транслируются в системные вызовы Windows. Из-за чего в WSL1 получилось много проблем с совместимостью и целый список не работающих фич и софта.


PS. чисто по-женски интересно — какая религия запрещает эффективным манагерам Microsoft сделать нормальный транслятор вызовов абсолютно открытой OS?

Но в Microsoft поняли, что так не пойдёт (трансляцией) и решили переделать всё с нуля используя свою технологию виртуализации Hyper-V (поддерживает аппаратную виртуализацию на базе Intel VT либо AMD SVM). Т.е. WSL2 это уже полноценный образ Linux. Назвали всё это WSL2.


Чисто технически у WSL1 и WSL2 задача одна, а реализация разная. Новая реализация очевидно сильно лучше. Складывается вопрос почему раньше так не сделали, а пошли более жёстким, больным путём.


Чисто теоретически если бы это был не Microsoft вместо Hyper-V мог бы быть и KVM и XEN.

Чисто технически — почему транслировать WinAPI в Linux (и даже в X) получается, а взад — плохо?

Я бы сказал от части криворукость и легаси. Windows 10 это ядро Windows 7 с навешенными брокерами функционала Windows 8 (только того, который решили оставить).

Об этом и речь в моем первом комменте.
Вместо «мы устали топтаться по своим граблям, поэтому по-быстрому слепила из того, что было» пишут «применили экстремально новейшие технологии».
А вместо «теперь WSL тормозит только в 3 раза относительно нативного Linux, а не в 40, как раньше» пишут «ускорилось в 13 раз».
Ализар отдыхает.

"Чисто технически" вся ядра NT принципиально не умеют две вещи:


  • уменьшение размера файла меньше за-mmap-ленного размера (неустранимый баг №902);
  • уведомительную (advisory) блокировку файлов (неустранимый баг №1927);

Теоретически M$ конечно могут это "починить" (сделали же clone/fork), но отказались (видимо) из-за трудоемкости и бесперспективности (всё выходило в разы медленнее чем в Linux).

В данной реализации с ней могут быть проблемы если захочется на том же хосте паралелльно поднять виртуалку на Virtual Box, например.
Ну и пока не работает на хостах с AMD
VirtualBox и Hyper-V уже умеют работать вместе с 6 версии
VirtualBox при этом работает оооочень медленно и печально. Возможно, даже в 13 раз.
WSL2 — это не виртуалка.
Это слой совместимости.

Это вы путаете как раз с WSL1, который по сути и был слоем совместимости (подмена системных вызовов Linux системными вызовами Windows).


А вот WSL2 это именно виртуалка в Hyper-V. С рядом настроек для проброса и шаринга.

Ну ок, не успел за рекламой уследить.
WSL2 — это какбывиртуалка.
Хотя исходной целью был просто слой совместимости.

Именно, точнее она чуть шире чем просто слой совместимости, тут скорее экосистема для разработки. Вот только в WSL1 этот слой был очень корявый и не совместимый как выяснилось.


В WSL2 это виртуалка, в которую ставится дополнительно связующий софт (именно слой совместимости между Windows и Linux). Стоит ещё отметить что дистрибутивы операционок в Microsoft Store распространяются и поддерживаются разработчиками этих операционок. Так например Ubuntu это облачный образ с настройками для лучшей работы именно в Hyper-V.


P.S. Я этим уже пользуюсь пол года и мне нравится реализация именно WSL2. Microsoft так же оставили возможность выбора режима WSL1 или WSL2 как по умолчанию для новых дистрибутивов, так и выбор конкретному дистрибутиву. И ещё пока есть проблема в WSL2, на уровне организации виртуальной сети (пока не умеет в IPv6, с января имеется тикет на решение, но появится это решение скорее всего через несколько релизов после Майского).

> дистрибутивы операционок в Microsoft Store распространяются и поддерживаются разработчиками этих операционок

Если бы… Не операционОК, а операционКИ. 1 шт.
(ну 1.5, если с Kali Linux).
Я вот не увидел как просто взять и поставить кентос. Не надо оптимизировано — просто хоть как-то.
А никак.
Если бы… Не операционОК, а операционКИ. 1 шт.

Почему же, вот открыл Microsoft Store и что я вижу:



Раньше ешё были Fedora официальные, но сейчас их нет.


Остальные/Кастомы:



А ещё можно и самому создавать из tar с командой wsl:


--import <Distro> <InstallLocation> <FileName> [Options]
        Импорт указанного TAR-файла в качестве нового дистрибутива.
        В качестве имени стандартного выходного файла можно указать "-".

        Параметры:
            --version <Version>
                Указание версии, которую нужно использовать для нового дистрибутива.

Я пост читал, если что, и отвечал относительно 1й версии, которая транслирует вызовы, прямо как вайн, но от «криворуких» из МС.

Ну вот и сравниваем вайн и виртуалку по аналогии с WSL1 и WSL2, всё правильно.

В среднем по больнице (если исключить тяжелую графику) — практически да.
Если приложение нормально написано, то разницы нет или нечувствительно.
А многие вещи работают даже быстрее.
Ну и почему они обходились достаточно дорого? Что конкретно не так с архитектурой
WSL1? Что делает трансляцию системных вызовов дорогой?

Возможно сами файловые операции обходились слишком дорого по сравнению с Linux.
Например, мне известно приложение (грубо говоря распаковщик архивов) которое изначально разрабатывалось на Linux, а потом было перенесено на Windows и там работало в несколько раз медленнее. И это исправили, барабанная дробь, пулом потоков для вызова CloseHandle. Потому что антивирус как раз в этот момент подключался в работу, а разработчики не ожидали что операция "закрыть дескриптор файла" может быть медленной и соответственно программа была не рассчитана на "зависание" в этой точке и ждала "закрытия файла" хотя могла бы читать следующий файл из архива использовать ЦПУ для "разжатия" и т.п.


И конечно в чем смысл транслятора системных вызовов если каждое приложение под него нужно адаптировать,
проще запустить в вирт. машине и игнорировать антивирусы.

В WSL 1 была прослойка, которая прокидывала все системные вызовы Linux в Windows API. И понятно, что это приводило к накладным расходам на преобразования всех параметров и структур.

Вы просто перефразировали процитированный мной фрагмент. Ну так почему эти накладные расходы оказались больше накладных расходов на виртуальную машину? На то же хранение файлов в виртуалке тоже неизбежно будут какие-то накладные расходы, виртуальные диски всё равно на тот же NTFS кладутся в итоге.

Потому что в WSL 1 нужно эмулировать все вызовы к системе (к стати так все вызовы и не были реализованы, поэтому не все приложения там работали — WSL vs WSL 2). А в WSL 2 ядро Linux нативно работает с VHD и учитывает особенности этого взаимодействия.
Плюс давно уже виртуалки не уступают в производительности хосту, потому что по сути работают просто рядом с хостовой системой, которая также управляется Hyper-V гипервизром.

Тут где-то в комментариях рассказывали, что тормозят в основном файлы.


Если в виртуалке обычный виртуальный диск с каким-нибудь ext4, то он будет храниться в виде файла на реальном NTFS-диске, а значит будет как минимум два вызова: сперва запись ext4 в виртуалке, потом запись этого ext4 на NTFS, а если диск динамического размера, то добавятся накладные расходы на управление этой динамикой, плюс фрагментацию ФС на хосте никто не отменял.


Если же паравиртуализация, какой-то специальный драйвер ФС или типа того, то это опять же трансляция обращений к драйверу в какие-нибудь вызовы на стороне хоста.


Так что я всё равно не понимаю, почему трансляция системных вызовов должна быть медленнее виртуальной машины.

Есть разница между тем как тупо записать блок данных в NTFS, который был изменен в ext4 в vhd-файле. И совсем другое превратить запрос к ext4 в запрос к NTFS (хотя в WSL 1 используется lxfs). Поднятие дерева файлов, их атрибуты. В этом случае нужно хранить мапинг не просто блок к блоку, а еще и структуру одной файловой системы к структуре другой.
У меня такое чувство, будто в WSL1 просто наговнокодили.

Не в WSL1, а несколько раньше.
И не "наговнокодили", а скорее не решились устранять недостатки дизайна.


Многие вещи в ядре NT начинались с отличного дизайна и были заимплеменчены достаточно хорошо, но некоторые были буквально "назло бабушке уши отморожу": процессы и треды, 1/3 инфраструктуры виртуальной памяти, файловая система — там адовы накладные расходы. Потом дополнительно добавили ведро дёгтя (win32sys), а ради мифа совместимости не стали упрощать IRP-стек.


В результате имеем то что имеем — WSL1 работает со скоростью нативных системных вызовов Windows 10 (затраты на трансляцию там погоды не делают), а WSL2 почти догоняет нативное ядро Linux.


Поэтому вместо сопоставления WSL1/WSL2 корректнее сформулировать "При некоторой усредненно-взвешенной оценке ядро Windows 10 выполняет системные вызовы в 13 раз медленнее Linux" — и это действительно так.

А вот это уже интереснее

Чисто теоретически, возможно ли грузить WSL2 со службами автоматически при запуске системы, иметь доступ по SSH и к иксам по VNC извне?

Думаю можно. Также как можно делать сейчас в первой wsl

Это актуальная информация для тех, кто хотел перейти на ОС Windows, но никак не решался.

Хех забавно, обычно переходят в другую сторону
Как это всё будет работать в виртуальных машинах Windows?
Windows ведь может быть запущена, как под их родным гипервизором HyperV, так и под VirtualBox, QEMU, KVM, VmWare и т.д.
Запустится ли WSL2 под «вторым» слоем виртуализации (nested virtualization), или работоспособной будет только 1ая версия WSL, или версия 2, но только под HyperV с включённой опцией вложенной виртуализации (которую, например хостер может не захотеть включать для вашей… виртуальной машины)
Но зачем? WSL в основном предназначена для разработки и отладки чего-то линуксового не вылезая из винды. Зачем запускать на виртуалке у хостера винду, чтобы в ней запустить WSL, в которой запустить линуксовое приложение? Мне сложно придумать достойное применение такому завороту.

Я с Windows не работаю, но первое что приходит на ум это VDI для разработчиков. Там WSL2 уже будет вторым слоем.

Ну это просто ограничение, задаваемое выбором того что у MS имеется — hyper-v.

микрософту осталось сделать последний шаг — убрать из этого всего Винду и оставить только Линукс.
Когда-то читал статью о разработке первой WSL. Там эмулировались вызовы linux-а через window-ое окружение. Сейчас как я понимаю, всю WSL переписали с нуля, встроив чистый linux. Так был ли в итоге смысл в WSL1? Или она появилась лишь вследствие всем известного «фатального недостатка»?
Так же можно спросить, нужен ли Wine при наличии виртуализации? И идея как раз в том, чтобы отказаться от виртуализации. Но по какой-то не очень понятной мне причине, трансляция вызовов оказалась значительно медленнее.
Возможно wine был бы и не нужен, если бы винда была бесплатная
Добыть винду бесплатно или не очень дорого не проблема, полагаю, все мы знаем как. По мне так проще, чем бороться с Вайном. Гораздо нужнее Вайн становится, когда ты большую часть времени работаешь в линуксе и лишь иногда надо запустить виндовое приложение.
Для меня самый важный вопрос, а что там с докером? В WSL1 мне так и не далось его использовать для работы с рабочим проектом. Я развернул докер по инструкции, через эмуляцию и Docker for Windows, контейнеры даже поднялись, но всё сломалось на монтировании. Как и у многих. Кажется теперь докер должен работать лучше, ведь он не будет эмулироваться отдельно.
В WSL2 докер можно нативно установить прямо в WSL-контейнере (без установки докера на хост систему)
К сожалению, при работающем WSL2 можно попрощаться с VirtualBox и VmWare. Нет, возможно после пары бубнов они и заработают, но в разы медленнее чем без Hyper-V.

С другой стороны, при наличии любой другой VM, WSL2 уже не становится особо нужным — единственная удобная вещь это интеграция, хотя как правило нужен лишь доступ к файлам из хоста в линукс, а это просто делается самбой.

Что же касается тормознутости WSL1 — если добавить его в исключения для антивирусов (включая Defender) — всё очень даже шустро становится. Не без глюков конечно но всё же далеко не как черепаха.
см. ниже мой комментарий.
Это здорово, но непонятно что будет с производительностью. VirtualBox уже разработали, но всё очень тормознуто (видимо за счёт вложенности), поэтому есть подозрения что у vmware лучше не получится.
А тем временем vmware разрабатывает hyper-v совместимый workstation.
Что позволит одновременно пользоваться как и виртуалками на базе hyper-v (WSL2 + эмуляторы android, в моем случае), так и одновременно крутить виртуалки на базе vmware.

Буквально недавно выпустили, работает на вложенной виртуализации (минус AMD) и нет поддержки VT-d. Работать оно работает, но производительность совсем не радует.

Вот бы было решение наоборот, чтобы эффективно винду запускать под GNU/Linux для тяжёлого софта. Да, про KVM с пробросом видео я в курсе. Но это неудобно, т.к. хост лишается мощной карточки да и плюс накладные расходы и ограничения вируальной машины.
Почему никто не пишет, что на локальной ФС ничего стало невозможно собирать с этой WSL2? Я уж думал после появления WSL никогда не вспомню про mingw/cygwin но WSL2 не может работать с ntfs практически совсем никак, все на вид в 13 раз медленней, т.е. проекты больше собирать абсолютно невозможно. Видимо, все бенчмарки как раз эту разницу и измеряют.

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

P. S. Раньше на WSL1 у меня был баш доступен и весь линукс прямо на винде, было может не супер быстро но я особо не замечал, собирал огромные штуки собирал типа всяких бустов. Сейчас это почти невозможно сделать без копирования на виртуальный диск, все тормозит просто неимоверно Лучше бы померили во сколько раз медленнее стало на ntfs, а не во сколько раз быстрее на ext4.

WSL1 для работы с NTFS, он никуда не уходит и останется доступным, а WSL2 для работы с виртуальным диском. Да, сделали неудобно, и возможно в документации нужно было точнее объяснить что для чего.

Еще как уходит. Невозможно иметь WSL1 и WSL2 одновременно в одной системе.

Вы ошибаетесь

Как это сделать-то? Версия wsl переключается глобально командой wsl --set-version которая может часами конвертировать root в другую файловую систему.
Можно поставить больше чем 1 wsl-систему и для каждой установить какая версия wsl будет использоваться (не обязательно устанавливать из Store, можно установить напрямую)

Посмотреть список установленных систем и версий wsl:
wsl --list --verbose

Сменить версию для какой-то конкретной (например Ubuntu-20.04):
wsl --set-version Ubuntu-20.04 2

Для запуска другой версии:
wsl -d Ubuntu-20.04


Что произойдет с подсистемой WSL 1? Будет ли прекращена ее поддержка?
В настоящее время не планируется объявлять подсистему WSL 1 нерекомендуемой. Вы можете запускать дистрибутивы WSL 1 и WSL 2 параллельно, обновлять их и переходить на более раннюю версию дистрибутива в любое время. Добавление WSL 2 в качестве новой архитектуры для команды WSL представляет собой лучшую платформу, которая предоставляет отличные возможности для запуска среды Linux в Windows.

Может потому что Вы конвертируете один и тот же образ между WSL1 и WSL2 а не исопльзуете отдельные дистрибутивы?
WSL по умолчанию всё равно одна, ставится через wsl --setdefault, по другому как я понимаю никак. впрочем такое переключение быстрее чем конвертация диска. но и в целом копировать весь рабочий код на бинарный блоб внутри виртуалки не очень здорово. Сборка на NTFS у WSL2 в десятки раз медленней чем из WSL1. Даже не в 13, а примерно в сто, у меня терпения не хватает дождаться до конца, оно еле шевелится.
Померил время сборки на мелком относительно проекте (все с нуля на холодную):

WSL2/ext4: 9 секунд i.imgur.com/hdZPNbc.jpg
WSL2/ntfs: 14 МИНУТ (в 93 раза медленней) i.imgur.com/5r97IVU.jpg
WSL1: 33 секунды i.imgur.com/2j2m2yU.jpg

Issue с бенчмарками github.com/microsoft/WSL/issues/4197 (без сборки, просто блоками в dd, даже сетевой диск получается в 3 раза быстрее ntfs.

Микрософт напишет, конечно, «вы просто не держите файлы так», но у меня на рабочем ссд разделе нет места под целый дополнительный линукс, там придется резервировать дополнительно гигов десять наверное и перетаскивать туда все проекты.

Upd: да, для запуска баша вместо wsl --setdefault NAME && bash можно использовать и wsl -d NAME, это ни на что особенно не влияет
Не знаю кто минусы проставил и зачем (объяснитесь) но по-моему очевидно, что WSL2 способна заменить WSL1 только для специфических сценариев когда есть возможность все держать внутри виртуальной машины.

На NTFS разделе WSL2 почти в сто раз медленней чем WSL1 а так же MSYS, CYGWIN и полноценно заменить их не может.

Можно частично решить эту проблему, проставив сетевые симлинки с "\\wsl$\" на NTFS, но этот кусок проекта будет все равно физически лежать внутри VM в файле VМDK.

Кроме git clone / git pull и, собственно, сборки, предполагается, что проект еще надо в промежутках как-то разрабатывать, тестировать и отлаживать.
MSYS2: 2 минуты 14 cекунд: i.imgur.com/MnlPKeP.jpg

Brief summary:
image

Ожидаемые цифры:


  • NTFS в разы медленнее EXT4.
  • В WSL1 минимальные накладные расходы при натягивании Linux-операций на NTFS (эмуляция внутри ядра).
  • В MSYS2 накладных расходов больше, т.е. больше системных вызовов, которые отрабатывают со скоростью windows (выполняются ядром Windows и драйвером NTFS).
  • Худший случай при доступе к NTFS из WSL2. Добавляется эмуляция Linux-операций через SMB, и все это обслуживает службой на стороне windows с выполнением в NTFS.

Единственный способ получить скорость достаточно очевиден — избавиться от медленных компонентов (NTFS, ядра и служб Windows).

Ага, а проблеми с VPN так и не пофиксили :(

Это все конечно очень классно, но когда в WSL2 завезут поддержку GPU?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий