Подтвердить что ты не робот

Использует ли Linux функцию PCID x86 CPU для TLB? Если нет, то почему?

Я написал модуль ядра для проверки CR4PCIDE, он не установлен. Почему Linux не использует такую ​​функцию для снижения замедления производительности из-за недействительности TLB и загрязнения кэша?

4b9b3361

Ответ 1

Обновление:. Это изменилось в течение 4,15 таймфрейма из-за атаки Meltdown и Spectre в конце 2017 года и в начале 2018. Подробнее см. другой ответ.

Примечание. Я не разработчик Linux.

Для Intel "Идентификаторы контекста процесса" существует лимит в 4096 идентификаторов. Это означает, что, когда есть более 4096 процессов, вам необходимо управлять ими (например, возможно, сделать "наименее недавно использованную" вещь, чтобы, если процесс, который в настоящее время не имеет идентификатора, должен быть выполнен, тогда идентификатор берется из некоторого другой процесс и повторное использование).

Другая вещь, которая приходит в нее, - "сбивание TLB" на многопроцессорных системах. Они могут быть немного дороже, поэтому люди делают трюки, чтобы избежать их. Например, если процесс имеет только один поток, он может работать только на одном CPU, и вы не знаете, что нет необходимости посылать IPI другим ЦП (прерывая их и прося их выполнить "сбой TLB" ). После того, как вы начнете использовать PCID, вы не можете быть уверены, что другие процессоры все еще не имеют записей TLB и не могут делать эти трюки, чтобы избежать "сбивания TLB". Это также означает, что (теоретически, для плохо реализованной поддержки PCID) производительность, которую вы получаете от PCID, может быть меньше производительности, которую вы теряете из-за неизбежных сбоев в работе TLB и управления идентификационными данными, что приводит к чистым потерям.

В основном, я говорю, что немного сложно добавить поддержку PCID (это не так, как вы можете просто установить флаг в CR4 и забыть об этом). Вам нужно будет провести некоторое исследование (эксперименты, прототипы, бенчмаркинг), чтобы определить наиболее эффективный способ его реализации. Для большого/сложного/старого ядра (например, Linux) это будет еще сложнее, так как вам нужно быть осторожным, чтобы не расстраивать что-то еще случайно. Другое дело, что эта функция относительно новая (она существует только несколько лет, если я правильно помню) и не поддерживается множеством процессоров (например, что-то немного старше и что-то из AMD).

В принципе, я предполагаю, что это сводится к "времени и преимуществам" (или, что мало времени для небольшого улучшения производительности на ограниченном числе процессоров).

Ответ 2

Да! Последние версии ядра Linux поддерживают PCID.. В то время, когда этот вопрос задавался, эта поддержка не существовала, но она была добавлена ​​в конце 2017 года, начиная с 4.14 ядро ​​. Вы можете выполнить некоторые из исходных обсуждений патчей в этой цепочке LKML.

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

Это стало более актуальным в последнее время, поскольку серия уязвимостей, где найдена, которая позволяет непривилегированному коду пользователя читать память ядра, против которой Патчи KPTI были развернуты. Эти исправления могут иметь значительное влияние на производительность, поскольку записи TLB пользовательского уровня могут быть недействительными при любом вызове ядра. При поддержке PCID влияние уменьшается, поскольку записи TLB пользовательского уровня сохраняются.


Более старая версия этого ответа приведена ниже, в то время, когда поддержка PCID не была доступна в выпущенных ядрах:

Пока еще, но похоже, что что-то может быть в работе. См. Поток, начинающийся здесь на LKML. В частности, предлагаются предлагаемые решения для проблем с перекрестным дублированием TLB, среди прочего:

Если при получении увольнения TLB для не-текущего PCID мы просто очистите все записи для этого PCID и удалите CPU с mm cpu_vm_mask_var, мы никогда не сможем получить более одного IPI для недействующий мм, но мы по-прежнему будем получать преимущества долговечности TLB когда дело касается, например. рабочих нагрузок на трубах, где задачи поочередно работают тот же CPU.

Вы также можете получить из этого потока, что идентификаторы адресного пространства уже давно используются на других архитектурах Linux.