Я виконую деякі орієнтири. Мій тест-бігун відстежує буфер dmesg між експериментами, шукаючи все, що може вплинути на продуктивність. Сьогодні це підкинуло:
[2015-08-17 10:20:14 Попередження] dmesg, схоже, змінився! Різниця наступна: --- 2015-08-17 09:55:00 +++ 2015-08-17 10:20:14 @@ -825,3 +825,4 @@ [3.802206] [drm] Увімкнення станів RC6: RC6 увімкнено, RC6p вимкнено, RC6pp вимкнено [7.900533] r8169 0000: 06: 00.0 eth0: з'єднатись [7.900541] IPv6: ADDRCONF (NETDEV_CHANGE): eth0: посилання стає готовим + [236832.221937] перерваність perf зайняло занадто довго (2504> 2500), знизивши kernel.perf_event_max_sample_rate до 50000
Після деяких пошуків я тепер знаю, що це стосується підсистеми профілювання ядра Linux під назвою "perf". Я не думаю, що нам це потрібно, тому я хотів би це взагалі відключити.
Шукаючи знову, я знаходжу, що sysctl perf_cpu_time_max_percent
може допомогти. Тут хтось пропонує вимкнути його, встановивши його на 0. Ознайомтесь із цим ще тут :
perf_cpu_time_max_percent:
Підкаже ядро, скільки часу процесора потрібно використовувати для обробки подій вибірки perf. Якщо підсистему perf буде повідомлено, що її зразки перевищують цю межу, вона знизить свою частоту вибірки, щоб спробувати зменшити її використання процесора.
Деякі зразки парфуму трапляються в НМІ. Якщо цих зразків несподівано зайняти занадто багато часу для виконання, НМІ можуть скластись один до одного стільки, що більше нічого не дозволено виконати.
0: відключити механізм. Не слідкуйте і не коригуйте частоту вибірки perf незалежно від того, скільки часу займає процесор.
1-100: спроба зменшити частоту вибірки перф до цього відсотка процесора. Примітка: ядро обчислює "очікувану" довжину кожної вибіркової події. 100 тут означає 100% очікуваної довжини. Навіть якщо для цього встановлено значення 100, ви все одно можете побачити дроселювання зразка, якщо ця довжина буде перевищена. Встановіть 0, якщо вам по-справжньому байдуже, скільки споживається процесор.
Мені це звучить як 0 означає, що швидкість вибірки профілювання більше не перевіряється, але частота підсистеми залишається запущеною (?).
Чи може хтось пролити світло на те, як повністю відключити профілювання ядра за допомогою freq?
EDIT: Хтось запропонував спробувати створити ядро без perf, але я не думаю, що це навіть можливо. Параметр, здається, не змінюється:
EDIT2: Після більшого читання я вирішив, що зможу встановити kernel.perf_event_max_sample_rate
нуль. Тобто ніяких проб за секунду. Однак ви також не можете цього зробити ( джерело ):
фіксувати 02f98e3e36da106338b7c732fed516420fb20e2a Автор: Кнут Петерсен Дата: Ср 25 вересня 14:29:37 2013 +0200 perf: Застосовуйте 1 як нижню межу для perf_event_max_sample_rate
EDIT 3: FWIW, perf_cpu_time_max_percent
встановлено на 25, що означає, що ядро витрачало понад 25% свого часу на вибірку апаратних реєстрів часу. Це неприпустимо для машини порівняльного аналізу.
Зараз я впевнений, що встановлення perf_cpu_time_max_percent
нуля лише погіршить ситуацію, оскільки ядро продовжує використовувати понад 25% свого часу для читання апаратних регістрів. Помилка призводить до коригування частоти вибірки, таким чином намагаючись переконатися, що ядро відповідає квотові використання <25% свого часу в перф. 25% все ще занадто високий ІМХО.
Якщо я дійсно не можу відключити перф, можливо, найкращим компромісом було б встановити perf_event_max_sample_rate
1.
EDIT4: Друг припустив, що я, можливо, неправильно трактував значення perf_cpu_time_max_percent
, тому вищезазначені твердження можуть бути невірними. Значення 25 вказує на те, що ядро використовувало більше 25% деякої довільної довжини, яку воно зарезервувало для обслуговування переривань perf.
EDIT5:
Як зазначається в коментарях, -*-
проти варіанту perf говорить про те, що цю функцію нав'язує інша включена функція. Якщо я заглянув help
, він говорить про те, які такі особливості:
Я не думаю, що я можу перемогти тут. Булева формула selected by
говорить
Якщо ви орієнтуєтесь на X86 або ...
Я щойно перевірив, чи дійсно націлювання на X86_64 дозволяє CONFIG_X86
. Тож здається, що як тільки ви націлюєте на X86 або X86_64, ви отримуєте перф.
Тому я хотів би трохи змінити своє питання на:
Які параметри perf я можу використовувати, щоб мінімізувати час, витрачений ядром, в підпрограми perf?
Майте на увазі, що загальною метою є контроль джерел випадкових варіацій для проведення бенчмаркінгу. Якщо я не можу відключити perf, як я можу мінімізувати його вплив на орієнтири?
CONFIG_HAVE_PERF_EVENTS=y
і CONFIG_PERF_EVENTS=y
. Я не думаю, що це відключений перф.
-*-
означає, що деяка підсистема залежить від модуля perf. Help
показує дерево залежностей, яке потрібно відключити, щоб змінити параметр на [*]
або [M]
.