Поддержка Apple Silicon в .NET 6.0: пробуждение силы

image-loader.svg

8 ноября 2021 года вышел релиз .NET 6.0. В нём появилась поддержка архитектуры ARM на MacOS. И этому мы очень рады, потому что давно хотели использовать новые MacBook с процессорами ARM в работе, но не могли, т.к .NET на них сначала вообще не работал, а потом работал очень медленно.

В этой статье я расскажу о том, на каких компьютерах мы программируем сейчас, какие перспективы теперь перед нами открываются, как работать с инструментами в .NET 6 на компьютерах с M1, а перед этим немного погрузимся в историю развития процессоров ARM.

Начнём с истории процессоров x86 и ARM

Семейство процессоров x86 появилось в конце семидесятых и с тех пор надёжно закрепилось как основная архитектура персональных компьютеров. Успех x86 во многом состоялся благодаря компании Intel, которая течение почти 30 лет удерживала первенство в микропроцессорах как в плане технологий, так и в бизнесе. При этом x86 в основном использовался в персональных компьютерах и серверах. Но в середине 2000-х начали появляться новые классы устройств — коммуникаторы, смартфоны, планшеты. Они не могли использовать x86 по ряду причин, вот некоторые из них:

  • в первую очередь Intel сама не хотела, потому что не считала это перспективным;

  • существующие в тот момент процессоры х86 были не энергоэффективные и не подходили под носимую электронику;

  • у процессоров х86 — закрытая архитектура и невозможно вносить изменения без лицензии.

Производители носимой электроники стали использовать процессоры на архитектуре ARM, т.к. её проще лицензировать и можно производить по заказу — в общем, рынок был свободнее. Стали появляться новые игроки, такие как Qualcomm, Samsung, NVIDIA. Появились новые типы устройств (например, в большинстве контроллеров SSD-накопителей есть ARM-чип). И пусть ARM не мог ничего противопоставить Intel x86 на рынке компьютеров и серверов, но в эти процессоры начали вкладывать деньги.

В 2007 компания Apple выпустила первый iPhone с процессором ARM производства Samsung. Уже через три года вышел iPhone 4 с процессором собственной разработки на архитектуре ARM.

Apple купила компанию по проектированию процессоров в 2008 году и с тех пор для своей электроники старалась использовать только свои процессоры. Тогда же начал распространяться слух, что Apple будет переходить на собственные процессоры, в том числе и для ПК.

При сравнении мощности процессоров серии A с процессорами Intel становилось понятно, что Apple продолжит улучшать из года в год производительность и рано или поздно догонит Intel.

Из графика видно, что Apple каждый год увеличивает производительность раза в полтора, тогда как Intel замедляется.Из графика видно, что Apple каждый год увеличивает производительность раза в полтора, тогда как Intel замедляется.

В iPad 2018 года выпуска процессор ARM был схож по производительности с Intel Core i7 — это явно говорило о том, что рано или поздно переход произойдёт.

Apple постепенно начала «ломать» обратную совместимость в операционной системе, как бы подготавливая всех к большим изменениям. Сначала они сделали нотаризацию, затем запретили пользоваться 32-битными приложениями, тем самым заставляя разработчиков постоянно обновлять приложения и работать на новых версиях MacOS. Было очевидно, что сама MacOS приближается к iOS, её смартфоновому брату.

Тут стоит отметить, что у Apple уже был опыт смены архитектуры процессоров: компьютеры Mac до 2006 года использовали PowerPC, а до 1997 — Motorola. Причиной перехода с PowerPC на Intel стала производительность и экономия энергии. Примечательно, что ровно те же причины и являются переходом c Intel на Apple Silicon.

Летом 2020 года Apple объявила о начале перехода, который должен занять около двух лет. Вместе с анонсом был выпущен бесплатный Developer Transition Kit (DTK), чтобы разработчики могли к этому переходу  подготовиться.

В ноябре того же года появились первые компьютеры с процессором Apple M1. Показанные процессоры Apple опережали аналоги от Intel и AMD практически по всем характеристикам:

  • Энергопотребление. При одинаковой мощности, Apple M1 потребляет гораздо меньше энергии. Это прямо влияет на время работы ноутбука от батареи — MacBook Pro с M1 может работать от неё 20 часов.

  • Мощность. До M1 все процессоры делились на десктопные и мобильные серии. Процессоры Intel для настольных компьютеров были мощнее, но потребляли больше энергии (примерно 100Вт). Ноутбучные, наоборот, были гораздо слабее, но и потребляли значительно меньше энергии (5–35Вт). M1 потребляет энергии как мобильный процессор, а работает как десктопный, полностью стирая грань между ними.
    У MacBook Air даже нет вентилятора охлаждения, при этом по разнообразным тестам он работает так же, как десктопные Intel — в компиляции, транскодировании видео и в других задачах. Но через 15–20 минут начинает замедляться, поэтому для продолжительной 100% нагрузки лучше брать MacBook Pro, так как у него есть вентилятор.

  • Цена. Для Apple такой процессор обходится дешевле, следовательно, стоимость компьютера тоже становится ниже.

За что мы любим ноутбуки от Apple

С 2015 года для менеджеров мы закупаем только MacBook Air. Причин для этого несколько:

  • это лучший компьютер за 55–60 тысяч рублей;

  • их практически не надо админить — не надо ничего переустанавливать, вероятность схватить вирус минимальна, сбросить настройки ноутбука может офис-менеджер;

  • их очень удобно закупать и чинить: есть всего одна модель, есть официальная гарантия и авторизованные сервис-центры, для их обслуживания и починки не требуется собственный персонал.

Для программистов закупаем MacBook Pro 16» или 13». И тут есть нюанс. Дело в том, что у нас до сих пор не полностью распилен монолит на .NET Full Framework, и чтобы его разрабатывать, нужен Windows. Осталось всего 14 запускаемых проектов, и мы надеемся, что в первом квартале 2022 года переведём монолит на .NET 6 и сможем разрабатывать и запускать его на Linux и Mac.

Иногда мы покупали ноутбуки с Windows, но это сложный процесс: модели постоянно меняются или их снимают с производства, есть проблемы с доступностью нужных моделей, с качеством и обслуживанием, ремонтом. Мы перепробовали много разных вариантов, такие как Dell XPS, Lenovo ThinkPad, Dell Precision, но со всеми пришли к полному разочарованию и хотели бы полностью перейти только на закупки Mac.

К тому же MacBook Pro 16» с процессорами Intel — не самая удачная модель: она часто перегревается и громко шумит вентиляторами, если подключать внешний монитор.

Всё изменилось с появлением M1. Теперь компьютеры не перегреваются, всё быстро компилируется, вентиляторы не жужжат, ноутбуки долго работают — одно удовольствие. Поэтому мы планируем постепенно перевести всех сотрудников ноутбуки c Apple Silicon — в первую очередь, конечно же, повезёт iOS-разработчикам.

Что с поддержкой Apple Silicon у .NET?

Стоит отметить, что поддержка архитектуры ARM, на которой основан Apple Silicon, появилась в .NET Framework ещё в версии 4.5.2.  Её добавили в 2012 году вместе с версией Windows 8 (RT) для 32-битных ARM-процессоров. Тогда было выпущено несколько устройств на процессорах ARM, но к 2015 году Windows RT загнулась.

В 2014 году Microsoft анонсировала .NET Core, опенсорную и кроссплатформенную версию .NET Framework был приговорён к медленной смерти и не будет развиваться, все новые фичи языка и платформы будут только в .NET Core.

В 2018 году в .NET Core 2.1 появилась поддержка ARM32 для Linux, а в 2.2 — для Windows Nano Server.

Поддержка Apple Silicon в .NET Core оказалась нетривиальной задачей, т.к. Apple предъявляет строгие требования по безопасности и выставляет другие ограничения:

  • Hardened Runtime (поддержка нотаризации);

  • W^X support;

  • Universal Binaries;

  • Big Sur и выше;

  • процесс может быть запущен либо в ARM64, либо Intel.

Из-за этих требований в версии 3.1 и 5.0 решили не добавлять полноценную поддержку Apple Silicon, а сосредоточиться на обратной совместимости через трансляцию ARM на X86 (Rosetta2).

Полноценную поддержку Apple Silicon добавили только в .NET 6.

Как работать с инструментами разработки на новых компьютерах

Стоит отметить, что на М1 Macbook Pro 13» и MacBook Air доступен только один внешний монитор. На M1 Pro & M1 Max доступно три внешних монитора.

.NET 6 можно скачать здесь: get.dot.net

К сожалению, пока невозможно установить X86–64 и ARM64 версии параллельно. Я удалил все X86-версии .NET при помощи .NET Uninstall Tool.

Чтобы запустить какую-нибудь программу в режиме эмуляции Х86, нужно скачать Rosetta (ноутбук сам предложит это сделать при первом запуске), но чтобы запустить через командную строку, нужно ввести команду

 arch -x86_64

Чтобы воспользоваться всеми преимуществами нового компьютера, нужно убедиться, что все программы запущены в нативном режиме. Для этого достаточно открыть активити-монитор и выбрать в нём показ архитектуры.

image-loader.svg

IDE VSCode, Rider

Программировать можно в VSCode и Rider EAP.

Для полноценной работы с .NET потребуется обновить все сервисы и приложения на версию 6.0.

Docker

Docker работает, но есть нюансы:

  • он платный для компании;

  • есть два режима работы: с эмуляцией и без. Эмуляция x86 работает на QEMU и очень медленно. Есть режим без эмуляции, работает быстро, будет использовать ARM64 Linux, контейнеры тоже будут собраны на нём — изменить это нельзя. Если хочется использовать ARM64, придётся всё пересобрать. Например, официальный образ MySQL для ARM64 доступен только для версии 8.0.

Некоторые вещи просто так не получится пересобрать из-за их зависимостей. Тут ничего сделать нельзя. Мы пользуемся GitHub Codespaces для таких приложений.

Python

Тут сложно, потому что многие библиотеки в Python используют нативный код, написанный не на самом Python, и с этим ничего не поделаешь.

Мы, например, напоролись на библиотеку pyodbc — она не работает. То же самое может произойти с любой другой библиотекой.

Пара слов о производительности

Мы сравнили сборку нашего мобильного API (.NET 6) на MacBook Pro 16» 2019 6 core i7 и MacBook Pro 13» M1 (запускали три раза) и увидели следующие цифры:

M1: 20 секунд.

image-loader.svg82c0b1d6ddad2fde0e0f4f7a1cc0aba2.jpeg

i7–9750H: 29 секунд.

image-loader.svg

Кажется, это потрясающий результат, так как Macbook Pro 13» M1 стоит гораздо дешевле 16», дольше работает от батарейки и не перегревается.

Вот ещё три хороших и релевантных для разработки статьи по бенчмаркам процессоров Apple Silicon:

Сравнение M1 Max с 5950X для разных Data Science нагрузок например, перемножение матриц или обучение сетей.

Сравнение скорости компиляции разных Rust-проектов

Сравнение скорости компиляции на server-side в Swift-проекте

Кстати, можно воспользоваться этим инструментом и посчитать, через сколько времени новые компьютеры окупятся с учётом экономии скорости компиляции — подставьте свои данные в жёлтые ячейки.

Ещё раз повторюсь, что мы рады этому событию и собираемся переходить на Apple Silicon.

© Habrahabr.ru