#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 страницу заблокированной памяти неиспользованной для этого?