Последствия изменения perf_event_mlock_kb

#linux #performance #linux-kernel #perf

#linux #Производительность #linux-ядро #perf

Вопрос:

Я пытаюсь понять точные последствия изменения /proc/sys/kernel/perf_event_mlock_kb .

  • На справочной странице для perf написано

    Максимальное количество страниц, которые может заблокировать непривилегированный пользователь (2). Значение по умолчанию равно 516 (кБ).

  • В документации по ядру говорится

    Контрольный размер кольцевого буфера для каждого процессора не учитывается из-за ограничения mlock. Значение по умолчанию равно 512 1 страница

Что меня смущает, так это то, что оба источника используют две разные единицы измерения — количество страниц и Кб памяти. В то же время постфикс _kb имени подразумевает, что файл определяет количество Кб.

Правильно ли я понимаю, что формулировка подразумевает, что число должно определяться размером страницы, и если я установлю файлу значение 8046 на компьютере с двумя vCPU, то perf сможет занимать до 16 МБ памяти для буферов событий?

Ответ №1:

Я думаю, что в документах ядра отсутствует модуль.

Это должно быть 512 КБ 1 страница = 516 Кб, что соответствует имени файла и справочной странице perf. Фактическое имя файла по-прежнему не было бы названо _kb , если бы у него были другие единицы измерения.

cat /proc/sys/kernel/perf_event_mlock_kb в моей системе показывает 516 , так что это в значительной степени подтверждает, что это в KiB.

число должно определяться размером страницы

Да, число должно быть кратным 4, чтобы сделать размер кратным размеру страницы 4k на x86.

Если нет, ядро предположительно округляет в большую или меньшую сторону, укажите, в какую.

Комментарии:

1. Согласно исходному коду , оно округлено в меньшую сторону до ближайшей степени 2. Однако, если оно равно нулю, оно, по-видимому, округлено до наибольшей степени 2, которая может быть представлена. Но позже это огромное значение снова проверяется на соответствие пределу mlock в этой функции, так что, похоже, оно работает правильно.

2. @HadiBrais: Интересно, есть ли какая-либо проверка этого значения где-либо еще, например, в пути, который принимает записи в этот sysctl? Но да, код, который фактически выбирает размер буфера, принимает этот размер и вычитает 1 страницу ( page_size/1024 ) и округляет это значение в степени 2, поэтому значение по умолчанию 512 КБ 1 страница имеет смысл.

3. Но почему при этом нужно вычитать 1 страницу? Я думаю, perf_event_mlock_kb_in_pages возвращает общее количество выделяемых страниц. Я не смог найти код, который устанавливает perf_event_mlock_kb . Обратите внимание, что вызывается соответствующее имя переменной sysctl_perf_event_mlock .

4. @HadiBrais: Я понятия не имею, почему это происходит. Может быть, по какой-то причине он хочет оставить 1 страницу заблокированной памяти неиспользованной для этого?