#strace-vs-ebpf
В чём разница между strace и eBPF? Когда что использовать?
Что отвечать
`strace` использует ptrace - останавливает процесс на каждом syscall'е, копирует регистры в userspace, потом возвращает управление. Overhead огромный (10-100x замедление), но работает везде. eBPF цепляется к tracepoints/kprobes в ядре, выполняет байткод там же без переключения контекста. Overhead копеечный (единицы процентов), но требует ядро 4.x+ и BPF capabilities. На проде - eBPF (bpftrace, bcc). На дев-машине, где нужно «быстро понять что одна команда делает» - strace.
Что хотят услышать
Senior должен: - объяснить ptrace overhead - каждый syscall = два context switch - назвать что strace на multi-threaded процессе с большим RPS может сериализовать всё в один поток и развалить тайминги - сказать что eBPF verifier гарантирует завершение программы и memory safety - поэтому ядро разрешает запускать BPF-программы в проде - назвать bpftrace one-liner'ы Brendan Gregg как канонический набор - упомянуть что perf, ftrace, BPF Compiler Collection (BCC) - всё семейство Linux tracing-инструментов, у которых разные точки входа в одну инфраструктуру
Подводные камни
- ✗ Запустить strace на production-процессе с тысячами syscall/sec - процесс встанет
- ✗ Думать что eBPF может всё что strace - нет, BPF не может блокировать syscall, только наблюдать
- ✗ Не знать что strace по умолчанию следует только за главным потоком, нужен `-f` для дочерних
Follow-up
- ? Что делает `strace -c` и зачем он нужен в первую очередь?
- ? Как BPF verifier гарантирует завершение программы?
- ? Чем kprobe отличается от tracepoint? Что стабильнее?
Глубина в базе знаний