Инструменты для высокоточных измерений времени в компьютерных системах

Инструменты для высокоточных измерений времени в компьютерных системах

Ключевые слова: HPET, TSC, InvariantTSC, clock.__gettime, измерение времени, таймер, источник времени, разрешающая способность, стоимость измерения времени.

Работа посвящена экспериментальному сравнению временных характеристик различных систем таймеров персональных компьютеров — в частности НРЕТ, ТБС,а также таймера основанного на вызове стандартной библиотеки С с!оск_деЖте, под операционной системой Ьпих В ходе исследования были выявлены преимущества и недостатки этих систем, пригодность к применению в различных прикладных задачах. Предлагается метод определения стоимости замеров для систем таймеров с точностью до десятков наносекунд (ТБС), показано преимущество виртуального системного вызова над реальным и освещены особенности использования каждого из таймеров. В процессе экспериментов определялась длительность запроса для каждого из таймеров, что позволило судить об адекватности их использования в различных задачах. Эксперименты были проведены на персональных компьютерах с различными центральными процессорами от производителей 1Пе! и ДМЭ. В первом разделе содержится информация показывающая необходимость точных измерений в компьютерной технике. Второй и третий разделы содержат описание двух аппаратных таймеров ТБС и НРЕТ. Четвертый и пятый разделы посвящены системным вызовам в целом и виртуальному системному вызову с!оск_деЖте, в частности. Шестой раздел содержит подробную информацию об эксперименте. В седьмом содержатся графики и анализ полученных результатов. В восьмом разделе сформулированы рекомендации по проведению высокоточных измерений, а девятый содержит перечень задач, которые требуется решить в ближайшей перспективе.

Качан Дмитрий,

Аспирант Сибирского государственного университета телекоммуникаций и информатики (СибГУТИ),

Кафедра ПДСиМ (передача дискретных сообщений и

метрологии),

dskachan@gmail.com

Сименс Эдуард,

ПрофессорAnhaltUniversity of Applied Sciences, Германия, Fachbereich Elektrotechnik, Maschinenbau und Wirtschaftsingenieurwesen,

E.Siemens@emw.hs-anhalt.de

Ху Хао,

Бакалавр, Anhalt University of Applied Sciences, Германия,

Fachbereich Elektrotechnik, Maschinenbau und Wirtschaftsingenieurwesen,

Hao.Hu@student.emw.hs-anhalt.de

Введение

Высокоточное измерение временных интервалов в современных вычислительных системах зачастую является ключевым фактором высокопроизводительной работы программных приложений и коммуникационных процессов. Работа многих сервисов, корректное выполнение алгоритмов зависит от точности замера временных интервалов. Наглядно можно показать потребность в достоверном источнике времени в контексте телекоммуникационных протоколов. При этом важную роль играет не просто время, а точность его измерения, разрешающая способность источника времени (измерение происходит с точностью, например, до микросекунд, сотен или десятков наносекунд), а также так называемая стоимость замера времени (сколько циклов центрального процессора или времени отделяет запрос на измерение, от получения замера). Необходимость столь точного измерения может быть проиллюстрирована на примере передачи данных в сети 10 G-Ethernet. Для этого протокола, при скорости передачи 5 Гбит/с и загрузкой MTU в 9 Кбайт inter packet gap (расстояние между концом одного кадра и началом следующего) будет составлять приблизительно 7,2 мкс[1], а с загрузкой MTU 1,5 КБайт — приблизительно 1,2 мкс. Следует также иметь в виду, что на каждый посылаемый кадр может потребоваться несколько из-

мерений времени. Отсюда становится понятно, что для достижения скорости 10 Гбит/с требуется источник времени, стоимость измерения которого составляет сотни и десятки наносекунд, а общее количество измерений может составить несколько миллионов в секунду.

В настоящее время существует несколько вариантов исполнения таймеров в виде аппаратной части обычных ПК. Наиболее популярные из них — это Time Stamp Counter (TSC) [2] и High Precision Event Timer (HPET) [3].

1. Таймер TSC

Таймер TSC впервые появился вместе с процессорами пятого поколения (Pentium) и представляет собой 64-х битный счетчик циклов CPU, который начинает заполняться в момент включения машины. Аппаратно этот таймер реализован непосредственно в процессоре. Так как частота CPU в современных компьютерах намного больше, чем в других аппаратных счетчиках, то TSC обеспечивает очень высокую разрешающую способность измерения. Информация из счетчика может быть считана с помощью инструкции процессора RDTSC (Read time stamp counter) или же с помощью прямого чтения из регистра в зависимости от спецификации конкретной модели процессора. Оба метода очень быстрые (данные можно получить в течение нескольких десятков циклов процессора потому, что счетчик реализован непосредственно в CPU), что позволяет использовать этот таймер для измерения экстремально малых промежутков времени при сравнительно низких затратах процессорных ресурсов. Значение разрешающей способности TSC напрямую зависит от тактовой частоты центрального процессора. Так у процессора с частотой 1,5 ГГц длительность одного цикла приблизительно равна

0,67 нс. Время до обнуления счетчика — 2й4 цикла CPU, измеряется в реальном времени сотнями лет (для того же процессора 1,5 ГГц счетчик обнулится примерно через 390 лет), а значит это не может исказить результаты измерения. Однако чтобы измерять время с помощью TSC, предварительно необходимо произвести манипуляции по определению реальной текущей частоты процессора, и опираясь на эти измерения, можно будет переводить процессорные циклы в реальное время.

Проблемы с TSC появились с началом эры многоядерных процессоров, потому что производитель не дает гарантий, что процессорные циклы на всех ядрах одной системы будут синхронизированы. Другая проблема возникла, когда производители процессоров

начали вводить технологии экономии энергии, такие как Speedstep [4] (Intel) или Cool'n'Quiet [5] (AMD), которые могут изменять частоту процессора, в зависимости от загрузки системы. Другими словами: частота процессора перестала быть величиной постоянной, а значит, таймер TSC не может выступать в качестве эталона измерения промежутков времени. Полученные с его помощью результаты на таких машинах могут привести к непредсказуемому результату

В последние годы проблема измерения с помощью TSC была решена путем разработки так называемого Invariant TSC, счетчика, который уже не так жестко привязан к процессорным ядрам и их циклам, и, как заявлено в документации Intel [2] имеет постоянную скорость. Кроме этого, производитель указывает в документации, что все процессоры из семейства Intel в будущем будут иметь возможность использовать это свойство. Убедиться, обладает ли процессор Invariant TSC можно, запросив идентификатор процессора, и если флаг "InvariantTSC" равен 1, то можно использовать TSC, в противном случае, лучше поискать другое решение. Однако, часто, вслед за измерением времени необходимо заставить систему ожидать в течение определенного времени, прежде чем продолжить выполнение программы. Каждый запрос на ожидание (например, команда sleep) это всегда прерывание. Технология TSC не обладает функциональной возможностью делать прерывания, но такой возможностью обладает HPET.

2. Таймер HPET

Таймер HPET [3] активно используется производителями чипсетов с 2004 года. Он был разработан совместными усилиями компаний Intel и Microsoft. Основной мотивацией к его созданию стала необходимость в замене медленного, и очень старого таймера PIT, частота которого (1,19 МГц), уже не отвечала современным потребностям. Основным компонентом HPET является 32-х или 64-х битный регистр, который заполняется с частотой не менее 10 МГц (обычно 14,318 или 25 МГц). Несмотря на это, как будет продемонстрировано далее, время на получение информации из HPET может составлять более чем 1 мкс. Блок HPET обычно состоит из независимых счетчиков (от 3 до 32 в блоке), каждый из которых, в свою очередь состоит из компаратора и регистра с пороговым значением. Каждый компаратор может вызывать прерывание в момент достижения счетчиком заранее заданного значения. Этот таймер реализован на материнской плате компьютера и, как гарантируется стандартом, он имеет постоянную скорость и неизменный источник времени. Доступ к нему, с предварительным отображением в память (memory-mapped I/O) составляет до 1,5 мкс. Это удобно, потому что для наших целей измерения времени необходимо знать только значение основного счетчика (main counter) HPET и его частоту. К недостаткам HPET можно отнести то, что он не доступен из большинства операционных систем вынтущенных до 2004 года.

3. Системные вызовы

Реализация часов в компьютерной технике носит аппаратный характер. Когда возникает необходимость измерить время, необходимо обратиться к устройству. Как известно все устройства в компьютере используются с помощью специальных программ — драйверов (driver), и доступны только из ядра (kernel) операционной системы. Прямая связь приложения пользовательского пространства (userspace) с пространством ядра (kernelspace) в общем случае невозможна или нежелательна из соображений безопасности и надежности. Таким образом, обращение к часам системы проводится в общем случае путём обращения к ядру через системные вызовы. Системные вызовы — это обращения к функциям ядра из пользовательского пространства для коммуникации с аппаратными устройствами. Основной недостаток такого подхода заключается в том, что выполнение системного вызова занимает до 2 мкс [6]. Причина за-

держки в том, что процессор должен полностью переключить свой контекст в соответствии с обработкой системного вызова. Когда приложение выполняет запрос на системный вызов, происходит программное прерывание. При этом процессор должен сохранить весь контекст процессов (содержимое регистров, очереди команд, счетчики и тд.). Далее параметры системного вызова копируются из пользовательского пространства в пространство ядра. И только после этих двух операций происходит вызов функции из пространства ядра. По завершении системного вызова, окружение процессора должно быть восстановлено для продолжения выполнения программы.

4. Виртуальный системный вызов dock_gettime

Для большинства приложений, определение и отсчет времени возможен путем использования системного вызова dock_gettime, который на некоторых системах может быть виртуальным. Виртуальный системный вызов — это особенность Linux, которая позволяет в определённых случаях избежать переключения контекста для ограниченного набора функций. Clock_gettime заполняет структуру time-spec и потенциально может давать разрешение до наносекунд. Однако необходимо с осторожностью использовать этот инструмент, ведь в качестве источника для него может выступать лишь один из двух аппаратных источников — HPET либо TSC. Какой из таймеров используется в конкретном случае, можно узнать при загрузке машины или запросить напрямую систему. Если TSC стабилен (частота его не изменяется со временем для всех ядер процессора), то в качестве источника автоматически выбирается он, а если нет — HPET. Если clock_gettime виртуальный системный вызов, то с помощью него обеспечивается существенное уменьшение длительности получения информации, потому что в этом случае не происходит переключения контекста процесса программного приложения. При этом обеспечивается большая точность получения времени. Однако то, что заранее не известен источник времени, а так же, будет ли вызов виртуальным или нет, делает использование clock_gettime для высокоточных измерений довольно проблематичным.

5. Эксперимент

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

Эксперимент был спланирован следующим образом: Сравниваются результаты замера таймерами HPET, TSC и функцией clock_gettime. Последовательно считываются по два значения для каждого из таймеров, и вычисляется разность этих значений At, которая отображает длительность вызова. Измерения, чтобы исключить статистическую погрешность, производятся один миллион раз. Строится график, на котором отображено значение Д t для каждого измерения и для каждого из источников времени. Измерения проводились на процессорах: Intel Xeon X5690, 6 cores @ 3,47 ГГц; AMD Athlon IIX2 255, 2 cores @ 3.1 ГГц; Intel Pentium Dual-Core 2 cores @ 2,8 ГГЦ AMD Athlon X2 Dual-Core BE-2350 2 cores @ 2100 ГГц и в качестве представителя более старого поколения процессоров использовался Intel Pentium 4, 1 core @ 2,8 ГГц.

Для эксперимента был подготовлен программный код, написанный в C++, в котором:

1. Запрашивается текущая реальная частота источника времени. Это необходимо для таймеров TSC и HPET, чтобы перевести значения счётчиков таймеров в значения времени.

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

• Для HPET: для получения как можно более быстрого отклика

будет использован доступ к нему с предварительным отображением в память при помощи функции mmap. Это даёт в Linux возможность избежать системного вызова.

• Для TSC: Вызов значения TSC может изменяться в зависимости от конкретного типа процессора. Для процессоров Intel и AMD, если в их cpuid есть флаг rdtscp необходимо вызвать инструкцию для запроса на ассемблере rdtscp, если флага нет—то rdtsc. Разница заключается в том, что rdtsc это, так называемая команда, выполняемая вне очереди (out-of-order-execution). Ее выполнение может, как опережать свою очередь в коде, так и выполняться с задержкой, а rdtscp нет.

• clock_gettime это стандартный вызов C, и никаких дополнительных действий перед его вызовом производить не надо.

3. Для значений, собранных с регистров TSC и HPET проводятся манипуляции по переводу их в значения времени.

4. Вычисляются значения At для каждого из таймеров

5. Заполняется таблица значений.

6. Результаты измерений

На рисунке 1 изображены значения длительности вызова для каждого измерения времени для таймера HPET.

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

Рисунок 2 позволяет сравнить поведение обоих таймеров и вызова clock_gettime. Стоит отметить, что фильтрации подвергались все результаты, так как переключение контекста, затрагивает полностью всю деятельность компьютера. Из графика понятно, что TSC выступает источником для clock_gettime, и вызывается он быстрее, чем clock_gettime примерно на 30 нс. HPETпоказыlвает значительно худший результат, и длительность вызова его на два порядка больше чем у TSC. Анализируя полученные результаты, можно утверждать, что вызов TSCне превышает значения в 20 нс, для clock_gettime значения в основном не больше чем 60 нс, а значения для HPET меньше 3 мкс.

Характеристики на протяжении всего времени измерения имеют однородный характер, поэтому, для наглядности, далее будем рассматривать графики для 100000 замеров.

Рисунок 3, так же иллюстрирует поведение таймеров, но для ПК с процессором AthlonII.

Здесь, так же как и у процессора Xeon, источником времени для

Й)00М 40000П 600000 800000 1Й+06

Номер замера

Рис. 2. Длительности вызовов для НРЕТ, ТБС и с!оск_деШте для ПК с процессором 1п1е!Хеоп

Рис. 3. Длительности вызовов для НРЕТ, ЇБС, сіоск_деІІіте для ПК с процессором АіЬіоп II Х2 255

сіоск_деІІіте выступает ТБС. Однако же, сам ТБС показывает худший результат, в сравнении с ТБС на рис. 2. А длительность вызовов для НРЕТ в большинстве своем превышают значения в 1 мкс. Характерно, что оба процессора (Хеоп и АіЬіопіі) имеют іпуагіапіТБС. Из графика видно, что значения для ТБС в основном не превышают 40 нс, для сіоск_деІІіте -не больше 100 нс, а значения для НРЕТ лишь в единичных случаях превышают значение в 2 мкс.

Рисунок 4 отображает временные характеристики таймеров для компьютера с уже устаревшим процессором Репііит 4. У этого процессора отсутствует технология іпуагіапіТБС, а так же нет команды гвівср. Источником времени для сіоск_деІІіте выступает ТБС,но он показывает результат худший, даже чем НРЕТ. Это вызвано тем, что сіоск_деІІіте в этом случае использует не виртуальный, а реальный системный вызов, что стоит времени. В данном случае длительность вызовов дляТБС в среднем не превышают 40 нс., а для НРЕТ и

II мм of) замсрн

Рис. 1. Временные характеристики HPET для ПК с процессором Intel Xeon

Номер замера

Рис. 4. Длительности вызовов для НРЕТ, ТБС, сіоск_деІІіте для ПК с процессором іпІеіРепІіит4

Таблица 1

Значения порогового времени, не дольше которого длится замер в мкс.

HPF.T clock gettiine TSC

InlelXeon 3 0.06 0.02

AMD Athlon 11 1 0,1 0,04

Intel Pentium 4 0,9 0,9 0,04

Intel Pentium Dual-core 1 0.4 0.02

AMD Athlon 2.2 2,2 0,03

с!оск_де111те в целом редко превышают значение 0,9 мкс.

Сравнивая результаты для процессора Хеоп и для процессора Репйит 4 можно сказать, что разработка аппаратных средств более чем за 8 лет, не привнесла значительных изменений во временные зависимости таймеров НРЕТи ТБС. Стоимость вызова НРЕТ все так же высока, а разница между стоимостью вызовов НРЕТи ТБСтолько возросла.

В ходе исследования были проведены измерения с 5 ПК. Не представленные здесь графики имеют схожий характер с теми, которые представлены выше. В таблицу 1 сведены значения порогового времени, не дольше которого длится замер для каждого исследованного ПК. Подробная информация об исследованных процессорах содержится в разделе 6.

7. Заключение

Результаты исследований позволяют сделать вывод, что использование НРЕТ подходит для приложений, где достаточной будет точность до единиц микросекунд. Несмотря на то, что этот таймер показал худший результат, несомненным преимуществом его является возможность делать прерывания и отдавать инструкции процессору в момент достижения основным счетчиком порогового значения. Однако использование этого таймера, например, в сетевых протоколах нецелесообразно в виду высокой дороговизны вызова.

Очевидным преимуществом системного вызова с!оск_де111те является простота его вызова и отсутствие необходимости определения частоты счётчика, однако эта простота скрывает под собой подводные камни. Метод дает неплохой результат, если он может быть вызван виртуально. В случае его использования остается неопределенность в выборе для него источника времени. В виду этого, таймер можно использовать в измерениях лишь заранее проверив возможности ПК.

Наиболее высокоточные результаты можно получить с помощью непосредственного запроса значения счетчика ТБС. Его разрешающая способность зависит от производительности используемого центрального процессора. Частота современных процессоров значительно больше, чем у других таймеров, и учитывая, что стоимость вызова ТБС самая низкая, несмотря на зависимость от процессора, он все равно будет давать самые точные измерения. Причем, как видно из таблицы 1 стоимость вызова у процессоров Пе! ниже, чем у процессоров ДМР. Такие точные измерения могут быть востребованы для телекоммуникационных протоколов, например протокола !МТР [7]. В работе [8] авторы предлагают на основе тайме-

ра TSC методику измерения сетевых задержек в высокоточном диапазоне. Так же таймер TSC можно применять для многих других целей связанных с измерениями времени в наносекундном диапазоне (обработка видео, механизмы контроля выюокоточных приложений и т.п.). Недостатком данного метода измерений можно считать отсутствие встроенной технологии вызова прерываний. Для использования этого таймера необходимо также заранее проверить возможности используемого процессора, его текущую частоту и возможность перевести полученное время во время глобальное (например, от рождества Христова или от начала эры Unix). Но основываясь на информации, о том, что технология InvariantTSC будет включена во все новые системы [2], можно сказать, что и в будущем можно будет проводить высокоточные измерения с помощью TSC.

8. Последующие шаги

Технология InvariantTSC появилась сравнительно недавно, поэтому, интерес представляет исследование, которое сравнивает между собой обычный, ConstantTSC и InvariantTSC. Интересно проследить, не увеличилась ли разрешающая способность таймера InvariantTSC после того, как он больше не привязан жёстко к конкретному ядру, и как изменилась стоимость его вызова. Так же интерес представляет расширение экспериментальной базы, сравнение стоимости вызовов для таймеров на большем количестве различных систем, с такими процессорами как VIA, Transmeta, Atom и т.п. Это поможет вынести более точные суждения и рекомендации по использованию таймеров.

Литература

1. TakanoH^ R. High-resolution Timer-based Packet Pacing Mechanism on the Linux Operating System. б.м : internet conference, 2010.

2. Intel.64 and IA-32 Architectures Volume 3B:System Programming Guide, Part 2. 2011.

3. Intel. IA-PC HPET High Precision Event Timers. URL: http://www.intel.com/hardwaredesign/hpetspec_1.pdf.October 2004

4. Intel. SpeedStep Technology for the Intel Pentium M Processor. URL:ftp://download.intel.com/design/network/papers/30117401.pdf. March 2004.

5. Sadowy D. New Microprocessor Features for Lower Power and Increased Performance: Doing "Moore's" with Less. Proceedings of the 2005 IEEE International Symposium on Electronics and the Environment and Electronics Recycling Summit.2005.

6. Somayaji Anil, Forrest Stephanie. Automated Response Using System-Call Delays. SSYM'00 Proceedings of the 9th conference on USENIX Security Symposium. vol. 9.2000

7. Hohlig S. Optimierter Dateitransfer uber 100 Gigabit/s.In Proceeding of the 100-Gigabit/s-Workshop:Mannheim, September 2011.

8. Бахарев А., Сименс Э., Шувалов В. Методология проведения высокоточных измерений задержек в современных компьютерных системах.: 6-я отраслевая научно — техническая конференция 'Технологии информационного общества". Москва, 2012.

9.Workinggroup 802.3 IEEE 802.3™: ETHERNET. 2008.

10. Лав Р. Linux. Системное прогрмаммирование. СПб : Питер, 2008. — 416 с.

Tools for the high-accuracy time measurement in computer systems

Kachan D., Semens E., Hu H.

Abstract: This work is dedicated to experimental comparison of time characteristics of different timer systems for personal computers. HPET, TSC and Libc-Call clock_gettimeunder Linux are the objects of this research. A method of determining real costs of each timer's call with accuracy up to tens of nanoseconds is showcased. The efficiency of virtual system call in comparison to real system call is also shown in this paper. During the experiments advantages and pitfalls were investigated. The latency of requests for each of the timers was determined. It allows comparison of their accuracy and resolution. The experiments were done on different PCs with different CPUs from Intel and AMD vendors.

First section of this work contains the information which describes the necessity of high-accuracy measurement in informatics. Second and third sections give a description of two hardware timers - HPET and TSC. Fourth and fifth sections are dedicated to system calls and especially to virtual system call clock_gettime. In sixth section detailed information about the experiment is included. Seventh section is contains the plots and analysis of received results. Eighth section summarizes the research and contains the conclusion for mentioned above results. In ninth section described future work.

Key words: HPET, TSC, Invariant TSC, clock_gettimet, time measurement, timer overhead, timing source, time resolution.