Будет ли функция gettimeofday() работать медленнее из-за исправления недавно объявленной ошибки Intel?

Я оценивал влияние недавно объявленной ошибки Intel на мое приложение для обработки пакетов, используя netmap< /а>. Пока я измерил, что обрабатываю около 50 пакетов на каждый сделанный poll() системный вызов, но это число не включает gettimeofday() вызовов. Я также измерил, что могу читать из несуществующего файлового дескриптора (это самое дешевое, что может сделать системный вызов) 16,5 миллионов раз в секунду. Моя скорость обработки пакетов составляет 1,76 миллиона пакетов в секунду, или, с точки зрения системных вызовов, 0,0352 миллиона системных вызовов в секунду. Это означает, что снижение производительности составит 0,0352 / 16,5 = 0,21333%, если штраф за системные вызовы удвоится, и вряд ли мне стоит беспокоиться.

Однако мое приложение может довольно часто использовать gettimeofday() системные вызовы. Насколько я понимаю, это не настоящие системные вызовы, а реализованные как виртуальные системные вызовы, как описано в Что такое vdso и vsyscall?.

Теперь мой вопрос: замедляет ли исправление недавно объявленной ошибки Intel (которая также может повлиять на ARM и, вероятно, не затронет AMD) gettimeofday() системные вызовы? Или gettimeofday() это совершенно другое животное из-за того, что оно реализовано как виртуальный системный вызов другого типа?


person juhist    schedule 03.01.2018    source источник
comment
Спасибо за ссылку на vDSO и vsyscalls. Не знал о них раньше.   -  person Ted    schedule 22.01.2018


Ответы (2)


В общем, нет

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

На большинстве архитектур gettimeofday() реализуется как чисто пользовательский вызов и никогда не входит в ядро, не включает сброс TLB или переключатель CR3, которые подразумевает KPTI, поэтому вы не должны увидеть влияние на производительность.

Исключения включают необычные конфигурации ядра или оборудования, которые не используют механизмы vDSO, например, если у вас нет константы rdtsc или если вы явно отключили rdtsc отсчет времени с помощью параметра загрузки. Вы, вероятно, уже знаете, так ли это, поскольку это означает, что gettimeofday займет 100-200 нс, а не 15-20 нс, поскольку он уже выполняет вызов ядра.

person BeeOnRope    schedule 03.01.2018

Хороший вопрос, страницы VDSO находятся в памяти ядра, отображаемой в пространство пользователя. Если вы сделаете один шаг в gettimeofday(), вы увидите call на странице VDSO, где какой-то код использует rdtsc и масштабирует результат с коэффициентами масштабирования, которые он считывает с другой страницы данных.

Но эти страницы должны быть доступны для чтения из пользовательского пространства, поэтому Linux может сохранять их сопоставленными без какого-либо риска. Уязвимость Meltdown заключается в том, что бит U/S (пользователь/супервизор) в записях таблицы страниц/TLB не останавливает непривилегированные загрузки (и дальнейшие зависимые инструкции) от выполнения микроархитектуры, вызывая изменение состояния микроархитектуры, которое затем можно прочитать. с таймингом кеша.

person Peter Cordes    schedule 03.01.2018