eBPF: Linux Kernel Observability Vocabulary (англійською)
Вивчіть англійську лексику, що використовується у розробці eBPF і можливості спостереження — програми, карти, зонди, відстеження і правила безпеки, пояснені для фахівців з інформаційних технологій.
Introduction
eBPF (розширений фільтр пакетів Berkeley) є однією з найцікавіших технологій у сучасному програмуванні систем Linux. Цей інструмент надає вам змогу запускати програми у пісочниці ядра без зміни коду ядра або завантаження модулів ядра. Інструменти, такі як Cilium, Falco, Tetragon і bpftrace, побудовані на eBPF, і вони мають багатий словник. Незалежно від того, пишете ви програми eBPF, використовуєте інструменти спостереження, засновані на eBPF, або просто обговорюєте їх у оглядах архітектури, цей словник є обов’ язковим.
Програми eBPF і Verifier
** Програма eBPF ** це невеликий шматок коду, який виконується всередині ядра Linux. Перед запуском, кожна програма eBPF проходить через verifier — компонент ядра, який перевіряє програму на безпеку. Інженери описують це так:
- «Верификационная система отклоняет небезопасные программы» — програми з доступом до пам’яті поза межами, нескінченними петлями або використанням заборонених функцій відкидаються
- «Ми пишемо програму на обмеженому C і компіляємо до BPF байт-коду» — типовий процес розробки
- «Програма повинна завершитися» — перевіряючий намагається, щоб всі шляхи коду мали обмежений час виконання
- «Програма збірки JIT» — після перевірки, ядро перекладає байт-код BPF на рідний машинний код для продуктивності
Фраза «пройти перевірку» використовується як проходження тесту: «Наша перша версія програми не пройшла перевірку через необмежений цикл — нам довелося реструктурувати логіку»
** eBPF- карти ** — це структури даних, які спільно використовуються програмою eBPF і кодом у просторі користувача. Інженери кажуть: « ми використовуємо карту гешів для відстеження стану кожного з’ єднання » або « ми читаємо лічильники з карти у просторі користувача ». До типових типів карт належать карти гешів, масиви, буфери кільця і карти LRU.
Позначає точки і точки спостереження
Програми eBPF приєднуються до певних ** точок прив’ язки ** у ядрі або просторі користувача. Важливо знати словниковий запас для цих точок прив’ язки:
- ** kprobe ** — приєднується до запису функції ядра; « ми приєднуємо kprobe до
tcp_sendmsgдля відстеження всіх надісланих TCP » - ** kretprobe ** — приєднується до функції ядра, що повертає; « ми використовуємо kretprobe для отримання значення повернення »
- ** tracepoint ** — стабільна, задокументована точка прив’ язки у ядрі; « ми віддаємо перевагу tracepoints перед kprobes, оскільки вони стабільні у всіх версіях ядра »
- ** uprobe ** — приєднується до функції простору користувача; « ми використовуємо uprobe для відстеження викликів до бібліотеки OpenSSL без її зміни »
- XDP (eXpress Data Path) — приєднується на рівні мережевого драйвера; «ми використовуємо XDP для високопродуктивного фільтрування пакетів перед мережевим стеком ядра»
- ** tc ** (контроль трафіку) — приєднується до мережевого стека на рівні контролю трафіку; « ми використовуємо tc hooks для мережевої політики на рівні піду в Cilium »
Інженери часто кажуть « ми приєднуємо програму до точки трасування », а не « ми встановлюємо » або « ми розгортаємо ». Слово ** приєднати ** є правильним дієсловом у контексті eBPF.
Можливість спостереження за bpftrace і BCC
Два поширені інструменти для eBPF-заснованої спостережливості є bpftrace і BCC (BPF Compiler Collection). Їхній словник:
- ** one- line ** — короткий скрипт bpftrace, який відстежує певну поведінку; « this bpftrace one- line traces all
opensyscalls » - ** probe ** — визначення того, до чого слід долучати і що робити; у bpftrace зонди записуються як
tracepoint:syscalls:sys_enter_open - «Ми агрегуємо в ядрі» — збір статистики всередині програми eBPF, а не надсилання кожної події в простір користувача; критичне для продуктивності
- ** flamegraph ** — візуалізація стеків викликів; « ми створюємо flamegraphs з даних perf, зібраних за допомогою eBPF »
Безпека і політика
eBPF використовується для забезпечення безпеки у таких інструментах, як Falco і Tetragon:
- ** LSM hook ** (Linux Security Module) — точка приєднання для забезпечення політики безпеки; « ми використовуємо LSM hooks для забезпечення політики доступу до файлів »
- ** policy enforcement ** — блокування або попередження про порушення правил; « правила Tetragon забезпечують, щоб жодний процес не міг відкрити оболонку після запуску контейнера »
- «Спостерігати, аудитувати, забезпечувати» — три етапи безпеки; «ми починаємо з режиму спостереження, щоб зрозуміти нормальну поведінку перед вмиканням забезпечення»
Ключовий словник
| Term | Definition |
|---|---|
| eBPF program | A sandboxed program that runs inside the Linux kernel |
| verifier | The kernel component that checks eBPF programs for safety before execution |
| eBPF map | A data structure shared between kernel eBPF programs and user-space code |
| kprobe | Dynamic attachment point at a kernel function entry |
| tracepoint | A stable, documented kernel hook point preferred over kprobes |
| uprobe | Attachment point at a user-space function entry |
| XDP | eXpress Data Path — the fastest eBPF attachment point for network packet processing |
| JIT-compiled | eBPF bytecode translated to native machine code by the kernel |
| aggregate in-kernel | Collect statistics inside the eBPF program to reduce user-space overhead |
| LSM hook | Linux Security Module hook point for enforcing security policy |
Практичні поради
-
** Запуск однорядкових команд bpftrace на тестовій системі. ** Навіть прості команди, такі як трасування викликів
opensyscall, надають вам практичний досвід роботи з словником eBPF. Напишіть речення англійською мовою, у якому пояснюється, що робить кожен з однорядкових команд перед запуском. -
** Прочитайте блог і книгу Брендана Грегг. ** Брендан Грегг є провідним автором з продуктивності Linux і eBPF. Його письмо технічно відмінне і використовує послідовний, точний англійський словник. Його блоги - чудова практика читання.
-
** Вправлятися у розмові щодо помилок перевірки. ** Якщо програма eBPF не пройшла перевірку, вам слід пояснити, чому. Практика: «Перевірник відхилив програму, тому що кількість ітерацій петлі не обмежена — нам потрібно обмежити її відомим максимальним значенням»
-
** Використовуйте « attach », а не « deploy » або « install ». ** У дискусіях eBPF, правильним дієсловом для з’ єднання програми з точкою прив’ язки є « attach ». Використання правильного слова свідчить про досвід.
Conclusion
Словник eBPF — перевірка, карти, kprobes, точки трасування, XDP і агрегування у ядрі — є точним і специфічним для програмування на рівні ядра. Оскільки інструменти, засновані на eBPF, стають стандартом у спостережливості та безпеці хмарних систем, розуміння цього словника допоможе вам оцінити інструменти, внести свій внесок у обговорення архітектури і написати чітку документацію. Технологія потужна, але складна, і точна мова є необхідною для ефективного обговорення її з колегами.
На практиці: Навігація нюансів для не-народжені мовці
eBPF (розширений фільтр пакетів Berkeley) швидко стає ключовим елементом сучасної спостережливості Linux. Але термінологія може бути щільною, наповненою точним вираженням, що є ключовим для ефективного спілкування в командах розробників і під час розгортання. Для розробників, чия перша мова не є англійською, особливо коли справа доходить до технічних концепцій, розуміння цих нюансів є надзвичайно важливим. Це не просто переклад слів; це про розуміння * як * вони зазвичай використовуються в професійних контекстах - тонкі наслідки вибору, що можуть вплинути на перегляд коду, стратегію розгортання або навіть політику безпеки.
Розглянемо звичайний сценарій: ви переглядаєте запит на захоплення, надісланий колегою. У описі PR йдеться: « Цей зонд збирає дані про трасі для HTTP- запитів розміром більше 1 КБ, використовуючи карту для фільтрування відомого внутрішнього трафіку ». Людина, яка не є носієм мови, може не розуміти багатошарового значення цього слова. « Пробка » — це не просто інструмент моніторингу; це спеціально розроблений шматок коду eBPF, який * активно * спостерігає і записує події. « Дані про траси » означає докладну інформацію про ці події — штампи часу, аргументи, повернені значення — всі ці відомості є важливими для зневадження проблем з швидкодією або визначення вузлів. Використання « використання карти для фільтрування від відомого внутрішнього трафіку » підкреслює важливість ефективності; карти є ключовими значеннями, що зберігаються у eBPF, які дозволяють вам швидко визначити і відкинути незначні дані, запобігаючи перевантаженню вашої системи вашими зондами. Це розуміння не тільки того, що робиться, але і чому це було обрано таким чином — навмисна оптимізація для продуктивності і точності. Аналогічно, при обговоренні політики безпеки, такі фрази як «заборонити трафік на основі IP-адреси джерела» вимагають ретельного розгляду наслідків блокування доступу проти його дозволу.
Інший приклад може з’явитися в розмові Slack: “Гей команда, чи може хтось дослідити, чому ми бачимо високі піки затримки? Давайте зосередимося на зондах eBPF, які стежать за обробкою мережевих пакетів — зокрема, за обробкою, пов’ язаною з керуванням перевантаженнями TCP. » Ця фраза навмисно є технічною і передбачає загальне розуміння ролі eBPF. « Піки затримки » відразу ж вказують на проблему з продуктивністю, яка потребує негайної уваги. Інструкція «фокус» передбачає пріоритизацію розслідувань, а вказівка відповідного зонда допомагає звузити сферу застосування. Це не просто про звіти; це про направлення зусиль на конкретну область занепокоєння.
Нарешті, при написанні PR-описів або документації, завжди прагніть до ясності і точності. Уникайте жаргонних слів, якщо це не абсолютно необхідно, а якщо ви використовуєте технічні терміни, надайте короткі пояснення, щоб всі члени команди розуміли один одного. Пам’ ятайте, що ефективне спілкування так само важливо, як і сам код eBPF; саме це дозволяє вам ефективно співпрацювати і будувати надійні, спостережувані системи.
# Example of creating a simple eBPF map using bpftool
bpftool maps create my_http_request_map TYPE hash SIZE 1024 KEY name VALUE http_url