
Теоретически, производительность памяти оценить довольно просто. Достаточно знать частоту, которой тактируется DIMM-модуль, и разрядность его шины данных. При оценке пропускной способности модуля ОЗУ в ноутбуке ASUS N750JK, мы получаем предельное значение в 12.8 Гб/сек. Этот произведение частоты в 1600 МГц и разрядности 8 байт (напоминаем, ширина шины данных для модулей DIMM составляет 64 бита; линии ECC не учитываются). Впрочем, это всего лишь верхний предел, да к тому же – одного из двух каналов памяти ноутбука, которому уготована участь стать тестовой платформой для наших экспериментов.
Суть памяти
В чем исследовательский интерес на хорошо изученной и достаточно известной платформе ASUS N750JK? Сегодня мы попытаемся прояснить для себя следующий вопрос: будет ли доступ к памяти в среде виртуальной машины тождественным по производительности к аналогичным характеристикам аппаратной платформы?
Условия эксперимента
Итак, аппаратная платформа – ноутбук ASUS N750JK с процессором Haswell i7-4700HQ 2400MHz (4 ядра, 8 потоков). Установлено 16 гигабайт оперативной памяти DDR3-1600, работающей в двухканальном режиме с симметричным заполнением каналов. Используется 64-битная операционная система Windows 8.1.
Виртуальная машина реализована средствами программного обеспечения Oracle VirtualBox 4.3.16. Так как объем статьи ограничен, мы приводим результаты только для варианта с установкой опций программы Oracle VirtualBox по умолчанию. Гостевая операционная система – 64-битная Windows 7. Конфигурация виртуальной платформы заслуживает особого комментария: виртуализация сделала невозможное возможным: новейший процессор Core i7-4700HQ мирно уживается с набором системной логики Intel 440FX, выпущенным в середине девяностых годов прошлого века для обслуживания процессора Intel Pentium Pro. Обращаем внимание и на то, что из восьми логических процессоров аппаратной платформы, виртуальной машине доступен только один.
Рис 1. Конфигурация виртуальной платформы
Методы измерения
Для проведения исследований был разработан набор утилит измерения производительности операций чтения и записи блоков памяти. В сегодняшнем опыте мы задействуем 8 программных потоков, исходя из количества логических процессоров на аппаратной платформе. Размер блока, разделяемый между восемью потоками – 1 мегабайт. Операция чтения или записи блока повторяется 1000000 раз. В исследуемой платформе, такая операция интенсивно задействует кэш-память второго и третьего уровней (соответственно 256 килобайт на ядро и 6 мегабайт на процессор). Таким образом, оценивается производительность не оперативной памяти, а кэш-памяти, за исключением режима non-temporal, запрещающего кэширование.
Поскольку исследуемая виртуальная машина не поддерживает 256-битную технологию AVX, будем использовать 128-битную технологию SSE.
- Для чтения применяется 128-битная форма SSE-инструкции MOVAPD. Источник – операнд в памяти, получатель – XMM-регистр.
- Для записи применяется 128-битная форма SSE-инструкции MOVAPD. Источник – XMM-регистр, получатель – операнд в памяти. При этом, по умолчанию работает технология Write Allocation, а именно кэширование записываемых данных и данных, находящихся в их 64-байтной окрестности.
- Для записи в режиме non-temporal (без кэширования записываемых данных) применяется 128-битная форма SSE-инструкции MOVNTPD, источник – XMM-регистр, получатель – операнд в памяти. При этом процессор просто записывает данные в память без кэширования.
В режиме по умолчанию, в частности при выполнении инструкции MOVAPD, процессор сначала заполняет строку кэш-памяти (64 байта), читая данные из 64-байтного блока, к которому относится записываемая ячейка. Затем, сама запись выполняется внутри процессора в кэш-памяти. После этого, запись в оперативную память произойдет только при вытеснении строки из кэш-памяти.
В нашем случае, а именно при операциях с блоками, размер которых меньше размера кэш-памяти, технология Write Allocation дает прибавку производительности. Иначе, при операциях с большими блоками, предпочтительнее использовать запись без кэширования.
Описание выводимых параметров
dT(ms) – время выполнения теста в миллисекундах.
dTSC/Sec (MHz) – частота работы счетчика процессорных тактов TSC (Time Stamp Counter) в мегагерцах. Отметим, что процессоры, поддерживающие технологию Intel Turbo Boost, могут находиться в таких ACPI-состояниях, в которых частота TSC не равна тактовой частоте ядра процессора.
dTSC/Pass (Clks) – количество тактов TSC на одну итерацию. Для описываемых тестов, использующих 128-битную форму инструкции MOVAPD, за одну итерацию читается из памяти или пишется в память 256 байт (Шестнадцать 128-битных регистров XMM0-XMM15). При многопоточной реализации теста, данный параметр стал несколько виртуальным: например, если за 40 тактов 8 потоков выполнили одну итерацию, значение этого параметра будет 5 тактов.
Speed (MBPS) – скорость чтения или записи в мегабайтах в секунду; это суммарная скорость для всех потоков и основной результат бенчмарок.
RAX (debug) – отладочный код (содержимое 64-битного x86-регистра RAX); не информативен в данной ревизии программы.
Результаты измерений
Рис 2. Многократное кэшированное чтение блока, размером 1 мегабайт. Физическая платформа (левый скрин) – 214916 мегабайт в секунду, виртуальная платформа (правый скрин) – 51822 мегабайт в секунду. При кэшируемой операции и указанном размере блока измеряется производительность связки L2, L3 cache
Рис 3. Многократная кэшированная запись блока, размером 1 мегабайт. Физическая платформа – 121672 мегабайт в секунду, виртуальная платформа – 29408 мегабайт в секунду. При кэшируемой операции и указанном размере блока измеряется производительность связки L2, L3 cache
Рис 4. Многократная некэшированная запись блока, размером 1 мегабайт. Физическая платформа – 22481 мегабайт в секунду, виртуальная платформа – 18147 мегабайт в секунду. При некэшируемой операции измеряется производительность оперативной памяти. Результат физической платформы довольно близок к теоретическому пределу для DDR3-1600 в двухканальном режиме – 25.6 гигабайт в секунду
Резюме
Цель представленного исследования — получить базовое представление о низкоуровневых характеристиках производительности виртуальной платформы. Мы стремились предложить тестирование, сохраняющее адекватность в условиях «виртуальной реальности», поэтому в нашем исследовании нет раздельного измерения пропускной способности для различных уровней кэш-памяти и оперативной памяти. Эксперимент не претендует на точное сравнение производительности виртуальной и физической платформ при прочих равных условиях. А можно ли говорить о прочих равных условиях при сравнении настолько разных объектов?