ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ bpftime Ρ€Π°Π·Π²ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ eBPF, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΡƒΡŽ Π² пространствС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ bpftime, Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ runtime ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ для выполнСния ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² eBPF Π² пространствС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Bpftime позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ Π² пространствС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ eBPF-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ трассировки ΠΈ Π²ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° Π² Ρ€Π°Π±ΠΎΡ‚Ρƒ процСссов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Π°ΠΊΠΈΠ΅ возмоТности, ΠΊΠ°ΠΊ uprobe ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². ΠžΡ‚ΠΌΠ΅Ρ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ благодаря ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ Π»ΠΈΡˆΠ½ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ контСкста bpftime позволяСт Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ дСсятикратного сниТСния Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с использованиСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ uprobe ΠΈ uretprobe, прСдоставляСмой ядром Linux. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, bpftime Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ, ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π½Π° систСмах Π±Π΅Π· ядра Linux ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ eBPF-прилоТСния Π² ядро. Код ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° написан Π½Π° языках Π‘/C++ ΠΈ распространяСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ MIT.

ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈ интСграция uprobe-ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° с использованиСм Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ пСрСзаписи исполняСмого ΠΊΠΎΠ΄Π° (binary rewriting), ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ обращСния ΠΊ систСмным Π²Ρ‹Π·ΠΎΠ²Π°ΠΌ, Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌ Π²Ρ…ΠΎΠ΄Π° ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ функциям ΠΏΠΎΠ΄ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π½Π° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ машинного ΠΊΠΎΠ΄Π° выполняСмого прилоТСния, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ эффСктивнСС ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° с использованиСм uprobe Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ядра Linux.

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π°ΠΌΠ΅Π½Ρ‹ ΠΈΠ»ΠΈ измСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, прикрСплСния ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² (hook-ΠΎΠ²) ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ², пСрСнаправлСния, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈΠ»ΠΈ Π·Π°ΠΌΠ΅Π½Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° Ρ‚ΠΎΡ‡Π΅ΠΊ Π²Ρ…ΠΎΠ΄Π° ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ подстановки ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΏΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΌΡƒ ΡΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ Π² ΠΊΠΎΠ΄Π΅. Bpftime ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Ρ‘Π½ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΌΡƒ процСссу Π² систСмС Π±Π΅Π· нСобходимости ΠΈΡ… пСрСзапуска ΠΈΠ»ΠΈ пСрСсборки. ΠŸΠΎΠ΄ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° bpftime Π² процСссы ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒΡΡ для Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… процСссов Ρ‡Π΅Ρ€Π΅Π· ptrace, Π° для Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· LD_PRELOAD.

Π’ составС bpftime развиваСтся runtime, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»ΡΡ‚ΡŒ eBPF-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌ трассировки систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈ uprobe; Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина eBPF с JIT для обособлСнного выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ eBPF Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса (Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ поддСрТиваСтся AOT-компиляция); Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ процСсс для взаимодСйствия с ядром ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ совмСстимости с uprobe-подсистСмой ядра (bpftime ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π΅ΠΆΠΈΠΌ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ eBPF Π² пространство ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ· ядра для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ совмСстной Ρ€Π°Π±ΠΎΡ‚Ρ‹ с eBPF-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ Π² ядрС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ kprobe ΠΈΠ»ΠΈ Π²Ρ‹ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌΠΈ сСтСвыС Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹).

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина eBPF ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½Π° Π² Ρ„ΠΎΡ€ΠΌΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ прСдоставляСт API, ΠΏΠΎΡ…ΠΎΠΆΠΈΠΉ Π½Π° ubpf, Ρ‡Ρ‚ΠΎ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‘ для ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ eBPF Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹. Для суммарного агрСгирования Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… процСссов поддСрТиваСтся созданиС совмСстных eBPF Map, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π² раздСляСмой памяти. ВмСстС с bpftime ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ eBPF, написанныС для использования Π² ядрС, Π° для сборки ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ стандартныС инструмСнты Π½Π° Π±Π°Π·Π΅ clang ΠΈ libbpf.

C bpftime Π² пространствС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΈΠ΅ систСмы трассировки, ΠΊΠ°ΠΊ BCC, bpftrace ΠΈ Deepflow. НапримСр, продСмонстрировано ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ скрипта sslsniff ΠΈΠ· Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° BCC для Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ сохранСния ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° Π² nginx. Π’ ΠΏΡ€ΠΎΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹Ρ… тСстах ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ nginx ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ sslsniff Π½Π° сторонС ядра сниТаСтся Π½Π° 58%, Π° ΠΏΡ€ΠΈ выносС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π² пространство ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° 12.3%.

АрхитСктура трассировки процСссов с использованиСм ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ eBPF Π² ядрС:

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ bpftime Ρ€Π°Π·Π²ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ eBPF, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΡƒΡŽ Π² пространствС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

АрхитСктура трассировки Π² пространствС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ с использованиСм bpftime:

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ bpftime Ρ€Π°Π·Π²ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ eBPF, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΡƒΡŽ Π² пространствС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

Π“ΠΈΠ±Ρ€ΠΈΠ΄Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ bpftime Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ совмСстно с eBPF Π² ядрС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для установки сСтСвых Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² ΠΈΠ»ΠΈ выноса ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π² пространство ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ:

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ bpftime Ρ€Π°Π·Π²ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ eBPF, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΡƒΡŽ Π² пространствС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

Из ΠΏΠ»Π°Π½ΠΎΠ² Π½Π° Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅ отмСчаСтся: Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ подстановки ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ (Fault Injection); горячСС Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ°Ρ‚Ρ‡Π΅ΠΉ (Hot Patching) для измСнСния Π»ΠΎΠ³ΠΈΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈΠ»ΠΈ исправлСнии ошибок Π² Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… сборках; созданиС модуля ΠΊ Nginx, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π³ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ eBPF (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для динамичСского Π²Ρ‹Π±ΠΎΡ€Π° ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ², ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, примСнСния ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ бСзопасности ΠΈ балансировки Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ); Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ возмоТностСй подсистСмы FUSE (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, созданиС Π² Ρ„ΠΎΡ€ΠΌΠ΅ eBPF-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ ΠΊ Π€Π‘ для ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ»ΠΈ управлСния доступом).

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru