Технічний словник для інженерів ядра Linux
Освоєння англійського словника з інженерії ядра Linux: scheduler, cgroups, namespaces, syscalls, kprobes, eBPF, hugepages, а також таких термінів швидкодії, як jitter і cache pressure.
Інженерія ядра Linux знаходиться на найнижчому рівні програмного стеку, і його словник відображає цю точність. Незалежно від того, чи ви робите свій внесок у розробку ядра, пишете модулі ядра або налаштовуєте швидкодію системи на рівні ядра, використання цього словника правильно показує ваші знання і надає вам змогу вести точне технічне спілкування. Цей посібник містить основні слова, що стосуються планування, примітивів контейнеризації, спостережливості, керування пам’ яттю та аналізу продуктивності.
Планування та управління процесами
** Scheduler ** — компонент ядра, який відповідає за вибір процесу або потоку, який буде запущено на якому ядрі процесора у будь- який час. Ядро Linux використовує типовий планувальник Completely Fair Scheduler (CFS). « Задача має високу затримку планування, оскільки планувальник знижує її пріоритет на користь процесів з більш високим пріоритетом, які конкурують на тому ж ядрі. »
** CFS (Completely Fair Scheduler) ** — типовий планувальник процесів у ядрі Linux. Він підтримує віртуальний час виконання для кожного завдання і завжди вибирає завдання з найменшим віртуальним часом виконання для виконання далі, з метою надати кожному процесу справедливу частку часу процесора. « CFS забезпечує справедливість між конкуруючими процесами, але може ввести коливання у завданнях, чутливих до затримки; розгляньте можливість використання класу планувальника реального часу для цих завдань. »
** Перемикання контексту ** — операція ядра, яка полягає у збереженні стану поточного запущеного процесу і відновленні стану іншого процесу, щоб можна було запустити інший процес. Часті перемикання контексту створюють надмірну навантаження на процесор. « Ми спостерігали понад 100 000 контекстних перемикань за секунду на цьому вузлі; такий рівень перемикання створює надмірну навантаження на процесор. »
** Схожість процесора ** — прив’ язка процесу або потоку до певного ядра або набору ядер процесора, що заважає планувальнику перенести його. « Ми встановили схожість процесора для потоку обробки звуку у реальному часі, щоб ізольувати його від перешкод, які спричиняють інші завдання. »
** NUMA (Non- Uniform Memory Access) ** — комп’ ютерна пам’ ять, де час доступу залежить від розташування пам’ яті відносно процесора. Розкладання з використанням NUMA розташовує процеси на процесорах, у банку пам’ яті яких зберігаються відповідні дані. « Процес має затримку NUMA, оскільки він виконується на ядрі вузла 1, але його пам’ ять виділено на вузлі 0. »
Контейнеризація примітивів
** cgroup (Control Group) ** — механізм ядра Linux, який обмежує, обліковує та ізолює використання ресурсів (ЦП, пам’ ять, вхід/ вихід, мережа) збірки процесів. cgroups є основою управління ресурсами контейнера в Docker і Kubernetes. « Контейнер обмежується, оскільки він перевищив квоту ЦП cgroup; нам потрібно збільшити обмеження ЦП або оптимізувати навантаження »
** cgroup v2 ** — поточне покоління cgroups, представлене у ядрі 4. 5, з об’ єднаною ієрархією і поліпшеним розподілом ресурсів у порівнянні з cgroup v1. « Ми перейшли до cgroup v2, щоб скористатися новими параметрами PSI (Pressure Stall Information) для спостереження за тиском у пам’ яті. »
** Простір назв ** — функція ядра Linux, яка ізолює процеси від системних ресурсів. Серед типів можна назвати простори імен PID (ІД процесів), мережеві простори імен, простори імен монтування, простори імен UTS (назва вузла), простори імен IPC і простори імен користувачів. « Кожен контейнер виконується у власному просторі імен PID, саме тому процеси, які знаходяться всередині контейнера, вважатимуть PID 1 своїм процесом запуску, незалежно від простору імен PID вузла. »
** seccomp (безпечний режим обчислень) ** — інструмент безпеки ядра Linux, який фільтрує системні виклики, які процесу дозволено робити. Використовується часом виконання контейнера для обмеження поверхні атаки контейнеризованих завантажень. « Час виконання контейнера застосовує типовий профіль seccomp, який блокує понад 300 системних викликів; якщо ваша програма потребує одного з цих викликів, ви повинні явно дозволити його. »
Системні виклики та інтерфейси ядра
** Syscall (системний виклик) ** — механізм, за допомогою якого процес у просторі користувача надсилає запит на службу ядра, наприклад, читання файла, виділення пам’ яті або створення сокета. Кожен виклик системи передбачає перемикання контексту з режиму користувача на режим ядра. « Дані профілю показують, що процес витрачає 40% свого часу на read() викликів системи; програма виконує багато невеликих читань, коли вона повинна виконувати буферизацію »
** VDSO (Virtual Dynamic Shared Object) ** — механізм ядра, який відображає частину простору ядра у простір користувача, що дозволяє певним викликам системи (наприклад, gettimeofday ) виконуватися повністю у просторі користувача без додаткових витрат, пов’ язаних з переходом до режиму ядра. « Після перемикання з gettimeofday() на clock_gettime() з монотонним годинником, часові штампи надаються з VDSO і додають майже ніяких додаткових витрат. »
** kprobe ** — механізм динамічного відстеження Linux, який надає вам змогу вставляти обробники майже до будь- якої інструкції у ядрі (або модулі ядра) під час виконання, без перекомпіляції. « Ми використовували kprobe у функції tcp_retransmit_skb для захоплення подій передачі мережею без інструментального керування самою програмою. »
** eBPF (Extended Berkeley Packet Filter) ** — технологія ядра, яка надає змогу запускати у ядрі програми, які виконуються у піщинному просторі, у відповідь на події (системні виклики, мережеві події, точки трасування) без зміни коду ядра або завантаження модулів ядра. eBPF є основою сучасних інструментів спостереження (Cilium, Falco, bpftrace). « Ми вимірюємо затримку всіх syscall за допомогою програми eBPF, яка приєднується до точок трасування; це додає менше 1% витрат у порівнянні з забороненою вартістю strace. »
Керування пам’яттю
** Hugepages ** — функція керування пам’ яттю, яка використовує більші розміри сторінок (2 МБ або 1 ГБ) замість типових сторінок розміром 4 КБ, зменшуючи навантаження на буфер перекладу (TLB). Важливо для програм, які вимагають великої затримки, що керують великими обсягами пам’ яті. « Увімкнення прозорих сторінок з великими розмірами збільшило пропускну здатність на 15% для бази даних у пам’ яті за рахунок зменшення кількості помилок TLB »
** TLB (Translation Lookaside Buffer) ** — кеш в ЦП, який зберігає останні перетворення віртуальної на фізичну адресу. Для того, щоб уникнути помилок TLB, потрібно перейти до таблиці сторінок, що коштує багато часу. « Шаблон доступу програми спричиняє часті помилки TLB; перенесення структур даних з верхніх рівнів до hugepages повинно полегшити цю проблему »
** OOM killer (Out- of- Memory killer) ** — механізм ядра, який завершує процеси, коли у системи закінчується пам’ ять. Процесам можна надати оцінку OOM, щоб визначити, який процес буде вбито першим. « Контейнер було вбито за допомогою OOM минулої ночі, оскільки він досяг обмеження пам’ яті; нам слід збільшити обмеження або дослідити витік пам’ яті »
** Помилка сторінки ** — переривання, яке викликає апаратне забезпечення, коли процес отримує доступ до сторінки пам’ яті, яка не знаходиться у оперативній пам’ яті, що вимагає завантаження ядром сторінки з пам’ яті свопу або з диска. « Пік помилок сторінок під час запуску вказує на те, що програма завантажує великі файли на запит, а не попередньо завантажує їх. »
Використання лексики
** Jitter ** — змінність затримки. Система з низькою середньою затримкою, але високою частотою коливань є непередбачуваною, що часто гірше, ніж система з постійно високою, але передбачуваною частотою коливань. « У потоці обробки звуку у реальному часі спостерігається частота коливань, спричинена випередженням планувальника; нам слід дослідити параметри випередження ядра »
** Затримка ** — час, який знадобиться для завершення операції. У контексті ядра, вимірюється у мікросекунд або наносекунд. « Затримка планування ядра p99 становить 250 мкс; для нашого застосунка з малою затримкою торгівлі, нам потрібно зменшити її до 50 мкс. »
** Прохідність ** — обсяг операцій або оброблених даних за одиницю часу. « Після налаштування планувальника вводу/ виводу з CFQ на deadline, пропускна здатність диска збільшилася з 800 МБ/ с до 1, 1 ГБ/ с. »
** Тиск кешу ** — ситуація, коли завдання вимагає більше кешу, ніж є наявним, що спричиняє часті вилучення. « Високий тиск кешу від завдання масового вживання даних спричиняє вилучення сторінок, які використовуються рушієм запиту; нам слід ізольувати два завдання на окремих вузлах NUMA. »
Приклади слів у контексті
-
«Пік затримки на 99-му процентилі викликається тремтінням планувальника; процес, що порушує правила, не прикріплений до певного ядра, тому планувальник іноді мігрує його, що викликає перевантаження кешу при холодному запуску»
-
«Ми використовуємо eBPF для приєднання точки слідування на
sys_enter_openatі записуємо в журнал кожну відкриту подію файлу з викликом PID і затримкою; це дає нам можливість спостереження за виробництвом з незначними витратами» -
«Обмеження пам’яті cgroup було встановлено на 512 МБ на основі середнього використання, але OOM killer вистрілив під час пікового навантаження — нам потрібно засновати обмеження на споживанні пам’яті p99.9, а не на середньому.»
-
«Після вмикання hugepages для екземпляра Redis, TLB пропуск знизилася на 60% і p99 GET затримка покращилася з 1,2 мкс до 0,4 мкс — вплив був більшим, ніж очікувалося.»
-
«Ізоляція простору імен означає, що процес всередині контейнера не може бачити або надсилати сигнали до процесів в інших контейнерах або на вузлі, навіть якщо вони мають одне і те ж ядро»