Мониторинг на производителност в Linux с eBPF

eBPF революционизира начина, по който наблюдаваме Linux системи. Това мощно технологии позволява изпълнение на код в ядрото без промяна на изходния код или зареждане на модули. В тази статия ще разгледаме как да използваме eBPF за мониторинг на производителност.
Какво представлява eBPF?
eBPF (extended Berkeley Packet Filter) е виртуална машина в Linux ядрото. Тя изпълнява байткод в защитена среда. eBPF програми могат да се прикачат към различни събития в ядрото.
Тези събития включват системни извиквания, точки на проследяване и др. eBPF предоставя безопасен начин за разширяване на функционалността на ядрото. Това се прави без компрометиране на стабилността или сигурността.
Ключови компоненти на eBPF
eBPF се състои от няколко основни компонента:
- eBPF програми: Малки програми, писани на C или Rust
- eBPF вериги: Набор от инструкции, изпълнявани от виртуалната машина
- eBPF карти: Структури от данни за споделяне на информация
- eBPF прикачени точки: Места в ядрото, където се изпълняват програмите
Настройка на среда за eBPF
Преди да започнем, трябва да се уверим, че системата ни поддържа eBPF. Повечето модерни дистрибуции на Linux имат вградена поддръжка.
# Проверка на поддръжката на eBPF
ls /sys/fs/bpf
# Проверка на наличие на eBPF функционалност в ядрото
grep BPF /boot/config-$(uname -r)
# Инсталиране на необходимите инструменти
sudo apt-get update
sudo apt-get install bpfcc-tools linux-headers-$(uname -r)
Инструменти за работа с eBPF
Съществуват няколко популярни инструмента, които опростяват работата с eBPF:
BCC (BPF Compiler Collection)
BCC предоставя набор от инструменти и библиотеки. Те улесняват създаването на eBPF програми. BCC включва готови инструменти за мониторинг и анализ.
# Инсталиране на BCC в Ubuntu
sudo apt-get install bpfcc-tools
# Изпълнение на прост BCC инструмент за проследяване
sudo execsnoop-bpfcc
bpftrace
bpftrace е високостепенен език за eBPF. Той позволява бързо създаване на мощни скриптове за проследяване.
# Инсталиране на bpftrace
sudo apt-get install bpftrace
# Проследяване на отваряне на файлове
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%s %s\n", comm, str(args->filename)); }'
Практически примери за мониторинг
Нека разгледаме някои практически примери за мониторинг с eBPF.
Мониторинг на системни извиквания
С eBPF можем лесно да проследяваме системни извиквания. Това ни показва кои процеси какви операции извършват.
# Проследяване на всички системни извиквания с bpftrace
sudo bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'
Анализ на мрежова активност
eBPF е особено мощен за мрежов мониторинг. Можем да анализираме пакети, забавяния и грешки.
# Проследяване на TCP съединения
sudo bpftrace -e 'kprobe:tcp_connect { printf("TCP connect by %s\n", comm); }'
Мониторинг на дискови операции
Дисковите операции са често bottleneck в приложенията. eBPF ни позволява да ги анализираме в реално време.
# Проследяване на бавни дискови операции
sudo bpftrace -e 'kprobe:blk_account_io_done { @us = hist((nsecs - arg0)/1000); }'
Създаване на персонализирани eBPF програми
За напреднали потребители, създаването на персонализирани eBPF програми предоставя най-голяма гъвкавост.
Писане на eBPF програма на C
eBPF програмите традиционно се пишат на C. След това се компилират до байткод.
# Примерна eBPF програма за броене на системни извиквания
#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>
SEC("tracepoint/syscalls/sys_enter_execve")
int bpf_prog(void *ctx) {
char msg[] = "New process started\n";
bpf_trace_printk(msg, sizeof(msg));
return 0;
}
char _license[] SEC("license") = "GPL";
Компилиране и зареждане
След като програмата е написана, трябва да я компилираме и заредим в ядрото.
# Компилиране на eBPF програма
clang -O2 -target bpf -c program.c -o program.o
# Зареждане на програмата в ядрото
sudo bpftool prog load program.o /sys/fs/bpf/program
Най-добри практики и оптимизации
За да получим максимална производителност от eBPF, трябва да следваме някои принципи.
Минимизиране на overhead
eBPF програми трябва да бъдат оптимални. Избягвайте тежки операции вътре в програмите.
Управление на паметта
eBPF има ограничен достъп до паметта. Използвайте eBPF карти за ефективно управление на данни.
// Деклариране на eBPF карта
struct {
__uint(type, BPF_MAP_TYPE_HASH);
__uint(max_entries, 1024);
__type(key, u32);
__type(value, u64);
} my_map SEC(".maps");
Визуализация на данните
Събраните от eBPF данни могат да се визуализират с популярни инструменти.
Интеграция с Grafana
eBPF данните могат да се експортират до Prometheus. След това се визуализират в Grafana.
# Стартиране на eBPF износвач за Prometheus
sudo ebpf-exporter --config.file=config.yaml
Персонализирани dashboards
Създаването на персонализирани табла дава най-добра видимост. Фокусирайте се върху метриките, важни за вашата система.
Заключение
eBPF предоставя мощен и безопасен начин за мониторинг на Linux системи. Неговата ниска overhead и дълбока интеграция с ядрото го правят идеален за production среди.
Започнете с готови инструменти като BCC и bpftrace. По-късно преминете към писане на персонализирани програми. eBPF ще ви даде безпрецедентна видимост в работата на вашите системи.
Този инструмент продължава да еволюира. Следете разработките в eBPF екосистемата. Те носят все нови възможности за наблюдение и оптимизация.
Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу:
Donate ☕️ Дарете с PayPalDonate 💳 Дарете с Revolut