Перейти к:
Виртуализация ОС «Эльбрус»
https://doi.org/10.38013/2542-0542-2021-4-67-75
Аннотация
Важнейшим шагом на пути к высокопроизводительным и безопасным системам виртуализации является добавление аппаратной поддержки этой технологии в микропроцессорах. В статье представлен обзор адаптированных для архитектуры «Эльбрус» методов виртуализации с учетом аппаратной поддержки, добавленной в микропроцессорах нового поколения «Эльбрус-16С».
Ключевые слова
Для цитирования:
Рыбаков С.А. Виртуализация ОС «Эльбрус». Вестник Концерна ВКО «Алмаз – Антей». 2021;(4):67-75. https://doi.org/10.38013/2542-0542-2021-4-67-75
For citation:
Rybakov S.A. Elbrus OS Virtualization. Journal of «Almaz – Antey» Air and Space Defence Corporation. 2021;(4):67-75. https://doi.org/10.38013/2542-0542-2021-4-67-75
Введение
Виртуализация - это технология предоставления абстрагированного от аппаратного обеспечения набора вычислительных ресурсов, памяти и ресурсов ввода-вывода логически изолированным вычислительным процессам. Слой программного обеспечения, обеспечивающий параллельное исполнение и изоляцию вычислительных процессов, а также эмуляцию для них аппаратных ресурсов, называется гипервизором. Технология виртуализации позволяет запустить на одном сервере несколько независимых операционных систем (ОС), повышая таким образом степень утилизации вычислительных ресурсов этого сервера. Легкость масштабирования виртуальной инфраструктуры привела к широкому применению этой технологии при организации облачных вычислений. В статье приведено описание основных программных и аппаратных средств поддержки виртуализации архитектуры «Эльбрус».
Паравиртуализация и полная виртуализация
Паравиртуализация - это техника виртуализации, при которой гостевая ОС подготавливается к исполнению в виртуализированной среде, для чего ее ядро незначительно модифицируется. При паравиртуализации привилегированные инструкции, исполнение которых запрещено в гостевом режиме, подменяются на гипервызовы - прямые передачи управления гипервизору. Достойной производительности гостевых систем позволяет добиться характерная паравиртуализации оптимизация: замена одним гипервызовом нескольких последовательных привилегированных инструкций. Однако применение паравиртуализации ограничивается возможностью модификации кодов ОС.
Полной виртуализацией называется техника виртуализации, при которой гостевые ОС запускаются без изменений. При этом запрещенные для гостя привилегированные инструкции гипервизор обязан либо подменить с помощью двоичной трансляции, либо прервать и эмулировать. По производительности полная виртуализация уступает паравиртуализации, особенно в области виртуализации ввода-вывода. Этот недостаток часто компенсируется установкой дополнительных, пара-виртуализированных драйверов устройств в гостевые ОС.
Гипервизор QEMU-KVM
В ОС «Эльбрус» в роли гипервизора выступает связка пользовательского приложения QEMU (Quick Emulator) [1] и модулей ядра ОС Linux KVM (Kernel Virtual Machine) [2]. При этом QEMU отвечает в основном за начальную настройку ВМ и эмуляцию ввода-вывода, а KVM - за предоставление ВМ вычислительных ресурсов и эмуляцию гостевой виртуальной памяти (поддержание актуальности таблиц страниц). Для передачи управления в KVM QEMU использует специальные системные вызовы IOCTL (Input/Output Control).
Каждый процесс QEMU эмулирует одну виртуальную машину. Гостевые вычислительные ядра (vCPU) и виртуальные устройства ввода-вывода эмулируются отдельными потоками процесса QEMU, исполняющимися параллельно. Оперативная память ВМ эмулируется с помощью виртуальной памяти процесса QEMU.
В отличие от автономных гипервизоров типа 1, запускаемых непосредственно на аппаратном обеспечении, приложение QEMU, запускаемое поверх ОС (называемой хостовой), является гипервизором 2-го типа. Однако благодаря модулям KVM, имеющим прямой доступ к оборудованию, достигается высокий уровень производительности виртуализации, не уступающий гипервизорам 1-го типа.
Аппаратная поддержка виртуализации в микропроцессорах «Эльбрус»
Добавленная в микропроцессорах «Эльбрус-16C» нового поколения аппаратная поддержка виртуализации [3] позволяет достичь полной виртуализации системы и запускать ОС «Эльбрус» без изменений. Добавление слоя динамической двоичной трансляции между QEMU и гостевой ОС позволяет запускать в ВМ ОС Linux или Windows архитектуры Intel x86. Аппаратная поддержка также улучшает защиту и производительность режима паравиртуализации. Рассмотрим подробнее три области, в которых были проведены аппаратные доработки: средства виртуализации вычислительных ресурсов, памяти и ввода-вывода.
Виртуализация вычислительных ресурсов
Основной цикл запуска ВМ гипервизором изображен на рисунке 1.
Рис. 1. Цикл запуска ВМ гипервизором QEMU-KVM
После начальной настройки ВМ QEMU передает управление в KVM, где программно переключается часть рабочего состояния (пассивный контекст) гипервизор-гость. Переключение оставшегося и наиболее критичного активного контекста производится атомарно, при выполнении новой инструкции запуска гостя glaunch. Атомарность переключения контекста достигается за счет введения дублирующего комплекта регистров (теневого контекста) и аппаратного переключения ролей активного и теневого контекста при входе и выходе из гостевого режима. В активный контекст входят регистры, необходимые для работы гипервизора во время запуска гостя, например указатели на стеки и таблицы страниц. Реализация переключений контекстов «Эльбрус» ближе к варианту MIPS VM [4], чем вариантам Intel [5] и AMD [6], производящим атомарное переключение при помощи структуры данных в памяти.
В предыдущих поколениях микропроцессоров «Эльбрус» были определены два режима исполнения: привилегированный (для ядра ОС) и пользовательский (для прикладных программ). В микропроцессорах «Эльбрус-16C» поддержано два новых режима: гостевой привилегированный и гостевой пользовательский. И если отличий гостевого пользовательского режима от обычного практически нет, то на гостевой привилегированный режим накладываются дополнительные ограничения: ряд действий в этом режиме приводит к принудительному возврату в гипервизор, перехвату (аналог VM-Exit в Intel VMX [5], VMEXIT в AMD SVM [6] и Hypervisor trap в ARM [7]).
Перехваты возникают при попытке гостя выполнить привилегированное действие (например, доступ к устройству ввода-вывода), при возникновении некоторых особых ситуаций на стороне гипервизора (например, прерывание или отказ страницы), а также при доступе гостя к ресурсам виртуализации (вложенная виртуализация не поддерживается). Главной задачей гипервизора является устранение причины перехвата и перезапуск гостя - для этого причина всегда сохраняется на специально введенных регистрах intc_info.
В качестве оптимизации при входе в перехват пассивный контекст переключается лишь частично. И если причину удается устранить в KVM, то после обратного переключения контекста гость перезапускается. Если же при обработке перехвата требуется выход в QEMU (для эмуляции ввода-вывода), то переключается и оставшаяся часть пассивного контекста. Таким образом, с точки зрения производительности перехваты с выходом в QEMU являются значительно более тяжеловесными.
Механизм паравиртуальных гипервызовов был также поддержан аппаратно командами hcall (аналог VMMCALL в AMD [6]) и hret. Использование новых команд вместо системных вызовов для явного вызова гипервизора из гостевой ОС позволяет полноценно использовать новые гостевые режимы исполнения и повысить защиту паравиртуализации, а также сэкономить на переключении контекстов.
Виртуализация подсистемы памяти
Физическая память виртуальной машины эмулируется гипервизором с помощью виртуальной памяти QEMU. Таким образом, при виртуализации можно различить четыре основных типа адресов: системные физические HPA (Host Physical Address), системные виртуальные HVA (Host Virtual Address), гостевые физические GPA (Guest Physical Address) и гостевые виртуальные GVA (Guest Virtual Address). В новом поколении процессоров «Эльбрус» поддержаны два механизма трансляции гостевых адресов в системные физические: теневой и двухуровневый.
При трансляции гостевых адресов в теневом режиме (рис. 2) не используется формируемая гостевой ОС таблица страниц (ТС): вместо нее работает формируемая гипервизором теневая таблица страниц. Поскольку процесс поиска изменений в гостевой ТС может быть достаточно долгим, гостевая ТС полностью закрывается по записи, каждое изменение ТС гостем (запись элемента ТС PTE, Page Table Entry) перехватывается и отображается в теневой таблице. Программный механизм теневой трансляции используется для паравиртуализации на многих архитектурах (например, Intel Virtual TLB [5]), но в архитектуре «Эльбрус» этот механизм поддержан и аппаратно. Это позволяет кэшировать промежуточные и конечные результаты гостевых трансляций, увеличивая производительность паравиртуализации.
Рис. 2. Трансляция адресов по теневым таблицам страниц
При полной виртуализации гипервизор не должен вмешиваться в организацию гостевой ТС. Механизм двухуровневой трансляции адресов (Two-Dimensional Paging, TDP) позволяет транслировать гостевые адреса в два независимых этапа: трансляция GVA-GPA производится по гостевым таблицам, а трансляция GPA-HPA - по таблицам гипервизора (рис. 3). Аналогичные механизмы двухуровневой трансляции есть и на других архитектурах: EPT [5], Nested Paging [6] и Two-Stage Address Translation [7]. Главным недостатком этого механизма по сравнению с теневыми таблицами является введение дополнительных ступеней трансляции для каждого уровня таблиц гостя, что значительно увеличивает суммарное число шагов трансляции адреса.
Рис. 3. Двухуровневая трансляция адресов
Виртуализация подсистемы ввода-вывода
Большинство устройств, предоставляемых гипервизором в пользование виртуальным машинам, являются программными моделями, независимыми от реального аппаратного обеспечения сервера. Подход, при котором виртуальный ввод-вывод полностью отделяется от физического, называется интерпозицией ввода-вывода [8].
При интерпозиции гипервизор получает возможность гибкой настройки ввода-вывода ВМ с точностью до конкретных моделей и свойств каждого отдельного устройства. При этом для эмуляции нескольких виртуальных устройств можно использовать одно физическое, консолидируя таким образом физический ввод-вывод. И наоборот, одна модель с лучшими характеристиками производительности и отказоустойчивости может обслуживаться несколькими реальными устройствами. Наконец, состояние программной модели устройства, доступное гипервизору в произвольный момент времени, может быть легко сохранено в виде файла и позднее восстановлено при перезапуске ВМ.
Эмуляция ввода-вывода
Эмулятор QEMU содержит большое число моделей устройств ввода-вывода, доступных для использования в виртуальных машинах. При этом доступ драйверов гостевой ОС к регистрам устройства обеспечивается через перехваты, доставка прерываний гостю осуществляется через KVM, а механизм DMA (Direct Memory access) эмулируется благодаря тому, что модель и гостевая ОС работают на общей виртуальной памяти процесса QEMU. Однако из-за частых тяжеловесных перехватов с выходом в QEMU производительность работы с эмулируемым устройством часто оказывается неоптимальной.
Virtio - паравиртуализация ввода-вывода
Вместо эмуляции реальных устройств гипервизор QEMU-KVM позволяет гостям работать со специальными виртуальными устройствами, предназначенными для эффективной виртуализации, - virtio [9]. Использование virtio позволяет значительно уменьшить число перехватов и гостевых прерываний, однако требует установки дополнительных, паравиртуальных драйверов в гостевые системы. Для поддержки virtio в ОС Эльбрус были включены и адаптированы соответствующие драйверы диска, сетевого адаптера и серийного порта.
Прямое назначение (проброс) устройства
Наибольшей производительности ввода-вывода в ВМ можно добиться, передав гостю в монопольное пользование физическое устройство. При этом приходится отказаться от всех преимуществ интерпозиции. В частности, метод прямого назначения устройства плохо масштабируется: в отличие от виртуальных устройств, генерируемых гипервизором по необходимости, реальных устройств на любом сервере может быть лишь ограниченное количество.
Для обеспечения безопасного проброса устройства гостю необходима аппаратная поддержка виртуализации. Во-первых, работать с устройством ВМ будет по гостевым адресам (GVA/GPA), которые необходимо транслировать в системные (HPA). Во-вторых, гость получает возможность, по ошибке либо намеренно, работать с чужой памятью по DMA либо генерировать некорректные М57-прерывания (Message Signaled Interrupts).
Функциональность и безопасность про-броса в проектах «Эльбрус» обеспечиваются блоком IOMMU (Input/Output Memory Management Unit) и контроллером прерываний EPIC (Elbrus Programmable Interrupt Controller) [10]. По аналогии с MMU (Memory Management Unit), IOMMU поддерживает режим двухмерной трансляции DMA адресов с трансляцией GVA-GPA по гостевым таблицам, а GPA-HPA - по гипервизорным. Защита от вредоносного поведения проброшенного устройства осуществляется за счет использования для каждого PCI (Peripheral Component Interconnect) устройства отдельной таблицы страниц. EPIC осуществляет изоляцию, маршрутизацию и прямую доставку прерываний от устройства гостевой ОС.
Работа с устройством по гостевым адресам DMA порождает еще одну проблему. Во избежание отказов страниц при DMA драйвер устройства подкачивает и фиксирует в памяти (резидентирует) все страницы выделяемого буфера. Таким образом, при пробросе гипервизору необходимо резидентировать всю гостевую физическую память, которая может быть использована для DMA. Другими словами, вместе с устройством гипервизор передает гостю в монопольное пользование часть своей оперативной памяти и теряет возможность оптимизации этой памяти.
Механизм трансляции DMA адресов в IOMMU «Эльбрус» в целом схож с аналогом AMD [11], однако имеется и несколько отличий. Во-первых, на «Эльбрусе» доступно только 3 фиксированных размера страниц: 4 Кб, 2 Мб и 1 Гб, в отличие от произвольного (кратного 4 Кб) размера страниц на AMD. Во-вторых, на «Эльбрусе» не поддержан интерфейс PASID PCI Express (Process Address Space ID, идентификаторы адресного пространства процесса). Таким образом, трансляция DMA от нескольких устройств, проброшенных одной ВМ, будет производиться по единой ТС, без изоляции этих устройств друг от друга.
Сравнение всех трех рассмотренных методов виртуализации ввода-вывода приведено в таблице.
Таблица
Сравнение методов виртуализации ввода-вывода
Виртуализация прерываний
Независимо от выбранного метода виртуализации ввода-вывода гипервизор обязан доставлять гостевой ОС прерывания от предоставленных ей устройств. Однако в отсутствие аппаратной поддержки программная доставка гостевых прерываний приводит к значительным потерям производительности ВМ. Во-первых, для доставки прерывания гостевому vCPU гипервизор обязан снять его с исполнения. Во-вторых, при обработке прерывания гостевая ОС неоднократно обращается к контроллеру прерываний (в частности, для определения вектора прерывания и для сигнала об окончании обработки прерывания), что также приводит к перехвату или гипервызову. По аналогии с многими другими архитектурами, в ОС «Эльбрус» применяется программная оптимизация: модель контроллера прерываний реализована в модулях KVM во избежание тяжеловесного переключения контекста при выходе в QEMU. В то же время аппаратная поддержка позволяет еще сильнее увеличить производительность гостевой системы.
В микропроцессорах «Эльбрус» нового поколения регистры контроллера прерываний EPIC были продублированы на каждом вычислительном ядре [12], что позволило разрешить гостю работать с копиями регистров напрямую, без перехватов. При снятии гостя с исполнения (выходе в QEMU либо смене процесса планировщиком) гипервизор сохраняет контекст EPIC в память. При этом атомарность переключения гостевого контекста EPIC поддержана аппаратно. Гостевые прерывания также отличаются от гипервизорных на аппаратном уровне, и если прерывания гипервизора могут прервать исполнение гостя (вызвать перехват), то гостевые прерывания никак не влияют на работу гипервизора. Если при доставке гостевого прерывания целевой vCPU оказывается снят с исполнения, то прерывание сохраняется в оперативную память и доставляется в момент постановки vCPU на физическое ядро.
Механизм виртуализации прерываний с полным дублированием регистров контроллера «Эльбрус» отличается от аналога в архитектуре Intel [13], где гостевые запросы к регистрам контроллера сводятся к обращениям в оперативную память с аппаратной эмуляцией побочных эффектов для отдельных регистров.
Сравнение показателей производительности
Для оценки производительности ВМ использовался бенчмарк UnixBench версии 5.1.2. Тесты были запущены дважды: внутри ВМ и напрямую на сервере, без слоя виртуализации. Каждый тест UnixBench запускался в 16 экземплярах, равномерно загружая таким образом всю машину. Сервер и ВМ были сконфигурированы идентично с точки зрения как аппаратного, так и программного обеспечения. При этом каждое из 16 ядер ВМ было привязано к соответствующему реальному ядру микропроцессора «Эльбрус-16С». Ввод-вывод на ВМ осуществлялся через virtio. Версия гипервизора QEMU 2.8.0, Linux/KVM 5.4.143-rt63. Результаты замеров изображены на рисунке 4.
Рис. 4. Понижение показателей производительности тестов UnixBench в ВМ
Ожидаемо вычислительные тесты Dhrystone 2 и Whetstone не показали значимого понижения производительности в ВМ. Худшие результаты показали тесты скорости копирования файлов: замедление при работе с virtio достигло 13 %. Тесты производительности ядра ОС показали замедление от 4 до 11 % в зависимости от числа необходимых перехватов. Понижение общего индекса производительности системы составило 7,8 %.
Выводы
В статье представлены программные решения, основанные на гипервизоре QEMU-KVM, а также аппаратные доработки архитектуры «Эльбрус», направленные на поддержку режима полной виртуализации, улучшение защиты режима паравиртуализации и повышение производительности обоих режимов. Аппаратные решения включают: новые режимы исполнения и переходы между ними, механизмы теневой и двухуровневой трансляции виртуальных адресов, двухуровневую трансляцию DMA адресов, изоляцию устройств ввода-вывода друг от друга, а также изоляцию, маршрутизацию и доставку гостевых прерываний. Совокупный результат представленных новаций соответствует уровню передовых разработок архитектур x86 (Intel и AMD), MIPS и ARM.
Список литературы
1. Bellard F. QEMU, a Fast and Portable Dynamic Translator // Proceedings of the FREENIX Track: 2005 USENIX Annual Technical Conference. P. 41-46.
2. Kivity A., Kamay Y., Laor D. et al. KVM: The Linux virtual machine monitor // Proceedings of the 2007 Ottawa Linux Symposium (OLS). 2007. P. 225-230.
3. Знаменский Д. В., Блинников А. В. Аппаратная поддержка виртуализации архитектуры «Эльбрус» // ЭЛЕКТРОНИКА: Наука, Технология, Бизнес. 2020. № 5. С. 60-66.
4. MIPS64® Architecture for Programmers Volume IV-i: Virtualization Module of the MIPS64® Architecture, Document Number: MD00847 Revision 1.06, December 10, 2013. URL: https://www.mips.com/?do-download=vi-rtualization-module-of-the-mips64-architecture (дата обращения: 27.02.2021).
5. Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3C: System Programming Guide, Part 3, Order Number: 326019-060US, September 2016. URL: https://www.intel.ru/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-soft-ware-developer-vol-3c-part-3-manual.pdf (дата обращения: 27.02.2021).
6. AMD64® Architecture Programmer's Manual Volume 2: System Progamming, rev.3.33, AMD Corp., 2020. URL: https://www.amd.com/system/files/TechDocs/24593.pdf (дата обращения: 27.02.2021).
7. Arm® Instruction Set Version 1.0 Reference Guide, Issue 0100-00, 25 October 2018. URL: https://static.docs.arm.com/100076/0100/arm_instruction_set_reference_guide_100076_0100_00_en.pdf (дата обращения: 27.02.2021).
8. Bugnion, E., Nieh, J., Tsafrir, D. Hardware and Software Support for Virtualization. Synthesis Lectures on Computer Architecture. 2017.
9. Russell R. Virtio: towards a de-facto standard for virtual I/O devices // ACM SIGOPS Operating Systems Review 42, 5. 2008. P. 95-103.
10. Рыбаков С. А., Поляков Н. Ю. Виртуализация подсистемы ввода-вывода микропроцессоров «Эльбрус» // Радиопромышленность. 2020. Т. 30, № 3. С. 34-39.
11. AMD I/O Virtualization Technology (IOMMU) Specification Revision 2.0. 2011. URL: http://developer.amd.com/wordpress/media/2012/10/48882.pdf (дата обращения: 27.02.2021).
12. Рыбаков С. А., Деменко Р. В. Виртуализация подсистемы прерываний микропроцессоров «Эльбрус» // ЭЛЕКТРОНИКА: Наука, Технология, Бизнес. 2020. № 5. С. 68-72.
13. Intel Virtualization Technology for Directed I/O (VT-d) Architecture Specification. October 2014. URL: http://www.intel.com/content/dam/www/public/us/en/documents/product-specifications/vt-directed-io-spec.pdf (дата обращения: 27.02.2021).
Об авторе
С. А. РыбаковРоссия
Рыбаков Степан Андреевич - аспирант РТУ МИРЭА, старший программист акционерного общества «МЦСТ».
Москва.
Рецензия
Для цитирования:
Рыбаков С.А. Виртуализация ОС «Эльбрус». Вестник Концерна ВКО «Алмаз – Антей». 2021;(4):67-75. https://doi.org/10.38013/2542-0542-2021-4-67-75
For citation:
Rybakov S.A. Elbrus OS Virtualization. Journal of «Almaz – Antey» Air and Space Defence Corporation. 2021;(4):67-75. https://doi.org/10.38013/2542-0542-2021-4-67-75