αα½ααααΈ α αΆα! ααΎαβααΌαβαααααΆαβααΌαβαααβα’αααβααΆ ααΎαβαααα»αβαααα
αβααααα
βαααααΆααβα
ααβααααΆαΒ»α
αααααΆααααΆαααΈααα·αααα·α BPF αααααα·αααα αα·αααααΌαααΆαααααΎααααΆαααααΆαααααααααα»αααΆαα’αα»αααα ααΎαααΆααααααααααααΆααα’αααααΌαα’αααααααααα·αααααΆα’αααΈαααααααΆαα
αααα αα·αααααΆαααΆααα
αα
α»ααααααααααααΆα
αααα»αααααααααα»ααααΆαααααΆαα
α»ααααααααα α§ααααα αα·ααα
αα
αααααααααααααααα·ααΈααΆαααααΆαααΆααΆαααααα·ααααΆααααααααΆααα‘αΎαααΎααααΈααΌααΆαααααααααΆααααααααααααααΊαααααΈαα»α
αααα»αααααΈααααααααΌαα±ααααααΎαααΆααααα
ααααααααΆααααααΆαααααα·αααααΆααααααα αα
αα
αααααααααααα·αααααα»ααα½ααααααααααααααααΌαααΆαααα α
ααΆ ααααΌαααΆαααΊααα (ααααΌαααΆαααΊααα) αα·αα’αα»ααααΆαα±ααααααααΆαααααααΆαααααααΆαααΊααα ααΎααααΈααααΎαααΆαααααΎαααΆααααα
ααααααααΆαααΆααα’ααααΈααα αα’αααααααΎααααΆααα ααΆαααααααΊαααααααΆαααααααααΉαααΆααααααααααααΆααααααΆαααΈ α
αααααα’αααααααΎααααΆαα. αα·ααΆααααααΆαααααα
αααααααΎααΆαααΆαα½αααΆααααααΆαααΎαααΉαααα’ααααΎα’αααααΎααα α
αααααα’αααααααΎααααΆαα.
ααΆααααααΆααααααααΆααααααααααααααααααααΆααααααΆααα
αααααα·ααΈ user-space ααΎαααΆαααααααααΊαααααΎα (ααΆαααααΆααααααΌαααα·αα ααααΎαααΆααααααΆαααααααΆα ααΆαααααΆαααα) αααααΆαααΆααααααΆααααΆαααα
αααααααΎαααΆααααα»αααααΏα 10Gb/s α¬αααααααΆααααα Kernel bypass ααΌααα½ααααααααααααααα·ααααααααααα (ααααΎαααΆαααΆα
α) αα·αααΆααααααααΌαααΆαα’αα»ααααααααααα»ααααααααα (ααααααα NUMA, ααΆαα―αα CPUα) ααααΌαααααΆαα
ααΉαααΌαααααΆαααααΉαααααααΎαααΆααααααΆααααααΆαααααα·αααααΆαααααααααα»αα
αααααα’αααααααΎααααΆααα αααα ααααΆα§ααΆα αααααααΌαααα·ααΈααΆαααααααααΈαααα
ααααααααΎαααΆααααα
ααααααααΆα
ααΆααααα αα’αααααααααααααΆααααα»αα αααααα’αααααααΎααααΆααααΆααα»ααα·ααααα·αα½αα ααα½αα
- ααΊααα OS ααΊααΆαααααΆααα’ααΌααΈαααααΆααααααΆααααααααΉαα αααααΆααααααααα·ααΈα’αααΆαα’αααααααΎααααΆααααααΌααααααααααααααΆααααααα½ααααααααααΆαα αα½αααααααααΌαααααααααααααααααΉααααααα½ααααααααα αααα αααΎαααααΆααααααΆααααΌααααα ααααααα·ααΈαααααΆααααΆααααααα’αααα
- αααααΆαααααΎαααααααα ααααα αααΊαααααΆαααααα»α ααΎαααααΉααααααααα»αααΆααααααΆαααΆααα’αααααααααααααααΊααααααααα αααααα·ααΈααα ααααα’αααααααΎααααΌαααααααααα»αααΆαα‘αΎααα·ααααα’αΆα ααααΌαααΆαααααααααααΊααα α¬ααααααααααααα·ααααα·ααΆααα½α α αΎαα
- αααααα·ααΈααααΎαααΆααα αααα»ααααα sandbox αααααααααααΆααααααααααααΌαα’αααααααααααααα½ααα αα·αααΆααΆαααα½αααααΈααΆααα½ααααα αΌαααΆαα½ααααααααααααααααααααααααααααα·ααααα·ααΆαα
αα αααα»αααααΉαααΆα αα αααααααααααΆααα αααα»αα αααααα’αααααααΎααααΆαα ααΆαααΎαα‘αΎαααααααΎαααΆαααααΌαααΆααααααα αααααΆαααααΆααααααΌαααααΎαααΆααααα ααααααααΆαααΈααΊααααα ααΆααααα αα’αααααααΎααααΆααα XDP ααααΎαααα»αααΈαααα ααΆααααΆααααΈαααααα·ααΈαααααΆαααΈα αααααα’αααααααΎααααΆαα (ααααα α’ααααααααααΆα ααΆααααααααααΌαααα) αα αααα»αα αααααααΊαααα XDP α’αα»ααααΆαα±ααααΎαα’αα»αααααα»αααΆααααααΆααα½αααααΆαααα αααααααααα ααααααααΆααααα ααα»α αααααΆαααααααΆα αα·ααα»ααααααΆα αΆααααααΎαααααΆααααΈαα αααα»ααααααααααααααααΆαααΊαααα ααΆαααααα ααααΏαααααΎαααΆααααα ααααααααΆαααΎαα‘αΎααααΆαααααΆααα ααααααΆαααΆααααα ααΎααΊαααα’αα»ααααΆαα±ααα’αααααααΎααααα·ααααα·αααααα·ααΈαααααα½ααααααααααααΆ? αα»αααΉαααααΎααααα½αααα ααΌααααα‘ααααΎαααΆααΎ BPF ααΆα’αααΈ?
BPF αα·α eBPF
αααααΈααΆαααααα ααα‘αααααα BPF (Berkeley Packet Filtering) ααΆααα·αααΊααΆααααΌαααΆαααΈααα·αααα·αα αααΆαααΈααα·αααα·ααααααααΌαααΆααα ααΆα‘αΎαααααΌαααΎααααΈαααααααααααΆααααααααα ααααααααΆα ααΌα αααααααααα
α§αααααααααααΈααααΆααααα»ααα½ααααααααΎ BPF ααΊ tcpdump
. αα
αααα
αΆαααααααα
ααααααααΆααααααααΎ tcpdump
α’αααααααΎααααΆααα’αΆα
αααααΆαααααααααα½αααΎααααΈαααααααα
ααααααααΆαα ααΆααααααα
ααααααααΆααααααααΌααααααααααααααααααααΉαααααΌαααΆαα
αΆααααα α§ααΆα ααα αααααα "tcp dst port 80
β αααα
ααΎαααα
ααααααααΆα TCP ααΆααα’ααααααααααα
ααα 80α αααααα·ααΈα
αααααα’αΆα
ααααα½ααααααααααααααααααααααΆαα
ααΆ BPF bytecode α
$ sudo tcpdump -d "tcp dst port 80"
(000) ldh [12]
(001) jeq #0x86dd jt 2 jf 6
(002) ldb [20]
(003) jeq #0x6 jt 4 jf 15
(004) ldh [56]
(005) jeq #0x50 jt 14 jf 15
(006) jeq #0x800 jt 7 jf 15
(007) ldb [23]
(008) jeq #0x6 jt 9 jf 15
(009) ldh [20]
(010) jset #0x1fff jt 15 jf 11
(011) ldxb 4*([14]&0xf)
(012) ldh [x + 16]
(013) jeq #0x50 jt 14 jf 15
(014) ret #262144
(015) ret #0
αααααΆα’αααΈααααααααα·ααΈααΆαααΎααααΎααΆααΌαααααΆαα
- ααα ααααΈααααΆα (000): αααα»ααααα ααααααααΆααα α’α»α αααα·α 12 ααΆααΆααα 16 αααΈα αα αααα»α accumulator α α’α»α αααα·α 12 ααααΌαααααΆαα ααΉα ethertype αααααα ααααααααΆαα
- ααα ααααΈααααΆα (001)α ααααααααααααααα αααα»α accumulator ααΆαα½α 0x86dd αααααΊααΆαα½αααΉαααααα ethertype αααααΆαα IPv6α ααααα·αααΎααααααααΊαα·α ααααααααα·ααΈααΆαααααα αΌααα αααα»αααΆαααααΆα (002) α αΎαααααα·αααΎαα·αααΌα αααααα αααααΆαααααα (006)α
- ααα ααααΈααααΆα (006)α αααααααααααααααΆαα½α 0x800 (ααααα ethertype αααααΆαα IPv4)α ααααα·αααΎα ααααΎαααΊαα·α ααααααααα·ααΈαα ααΆαα (007) ααΎαα·αα’ααα αΉααα αααααΆαααααα (015)α
α αΎααααααα αΌαααααααααα·ααΈαααααααα αααααα‘ααααααααα αααααΆααααααΆαααΌααΈαα ααΆααααα‘ααααααααα·ααααααΌααα (ααΆαααααΆα (014)) ααΆααααααΆαααα ααααααααΆαααααΌαααΆαααα½ααα α αΎαααΆααααα‘αααααααααΌααα (ααΆαααααΆα (015)) ααΆααααααΆαααα ααααααααΆααα·αααααΌαααΆαααα½αααααα
αααΆαααΈααα·αααα·α BPF αα·α bytecode ααααααΆααααΌαααΆαααααΎα‘αΎαααα Steve McCann αα·α Van Jacobson αα
α
α»αααααΆα 1992 αα
αααααααααααΆααααααα½αααααααΌαααΆαααααα»ααα
αααααΆααα BPF ααΊααΆαααΆαααΈααα·αααα·α ααΆαααααααα·ααΆααΆαααααααααα·ααΈααααΎαααΆαα ααααααααΈααΎ bytecode ααΆαααααααααααΌα’αααα
αα
αΆαααΆα
α (ααΆαααααΆαα’αααΈααΆααααα»αααααΌαααΆαα’αα»αααααααΆαααΆααααΆααα
ααααααΆα
α) ααΆαα
α»αααααα (A αα·α X; accumulator αα·ααα·αα·ααααα
α»αααααα) ααΆααααα»αα’αααα
αα
αΆαααα αα·ααααααα·ααΈααΆαααααα
αΌααααααα·ααΈα αα½αα±ααα
αΆααα’αΆαααααα BPF bytecode ααααΌαααΆαααααααΌααΆα Motorola 6502 ISA α ααΌα
ααα Steve McCann ααΆαααααΉααα
αααα»αααααααΆααα
ααΆαααΆαααα BPF ααααΌαααΆαα’αα»αααααα
αααα»αααΊαααααΈαα»α
αα
αααα»ααααα v2.5 αα·ααααααααΆαααααααααααΌαααΆαααααααααΆα
αααααααααΆααα·αααααααΉαααααααααα Jay Schullist α αααααΌα BPF αα
αααα·αααααΆααααααΌααα αΌααααααααΆα 2011 αα
αααααα Eric Dumaset αα
ααΆα’ααααααααα BPF α‘αΎααα·αααΎααααΈααααΎαααΆααααα»ααααα JIT (αααααα
ααααααααααα»αααααΆα 2014 Alexey Starovoitov ααΆαααααΎααααααΆα JIT ααααΈαααααΆαα BPF α ααΆααα·α JIT ααααΈαααααΆαααααΆαααΆααααΆαααααααααααααΆαααΌαααααΆαααΎ BPF ααααΈ α αΎαααααΌαααΆαααα α ααΆ eBPF α αααα»ααα·αααΆ VMs ααΆααααΈαααΆααα½ααααααΆαα½αααααΆαα½αααα ααα»αααααα αα α»ααααααααΆααααααααα ααααααΌαααΆαα’αα»αααααααααα’ααααΎ eBPF α ααΆααα·ααα αααα»αα§ααΆα αααααΆα αααΎαααα―αααΆαααααΎα BPF ααααΌαααΆααααααααΆααΆ eBPF α αΎα BPF αα»ααΆαααααΌαααΆαααααααΆααααΆααΆ cBPF α
eBPF αααααΈααααΆαααΈααα·αααα·α BPF αα»ααΆαααΆααα·ααΈααΆα αααΎαα
- ααα’ααααΎααααΆαααααααα 64 αααΈαααααΎαα eBPF ααααΎααΆαα α»αααααα 64-bit αα·ααααααΎαα ααα½αααααΆαα α»αααααααααααΆαααΈ 2 (accumulator αα·α X) ααα 10α eBPF αααααααααΌα opcodes ααααααααααα (BPF_MOV, BPF_JNE, BPF_CALL...)α
- ααΆαααααΆα αα ααααΈαααααααααααααααΆαααααααΆαα BPF ααααΌαααΆαα αααααΆαααα ααΉαααααΌαα·ααααααααΆα αα αααααΆαααΆααααΌαααΆαααααΎαααααΆααααΆααααααααα ααααααααΆα ααΌαααααααΆααΆαααΈααΆαααα αααα»αααααααααααααααααααααΆαααααΆααααααααΆααααααΆαα ααααααΆαααΆααααα αααΆαααΈααα·αααα·α eBPF αααααΆααααΆαα½αααααΌαα·αααααααααα αΎα α αΎαα’αΆα ααααΎαααααΆαααααααααααΆαα½αα ααΌα ααααα₯α‘αΌαααααααααα·ααΈ eBPF α’αΆα ααααΌαααΆαααααΆαααα tracepoint α¬ kprobe α ααΆααΎαααααΌααα ααΆααα§ααααα eBPF ααΆααα·ααΆαααΆαα’αα»αααα αα·αααααΈααααΎααααΆααααΆα αααΎαααααα αααα»αααα·ααααααααααααααααΊαααααααααααα α₯α‘αΌαααααααααΌα eBPF ααΆαααΈααΆαααα αααα»αααααΌαααααααΆααααΆααα ααΊααα/bpf α
- αααααααααα»ααα·ααααααααααααα α ααΆαααααΈα αααααΈααΊααΆααααΆααααααααααααΉααααααΎαααΆαααααΆααααααΌααα·αααααααααΆαααα αα’αααααααΎααααΆαα αα·αααα αααΊαααα eBPF αααααααΌααααααΈααΆα αααΎαααααααα
- αα»αααΆααααααΆαααααααα ααΆαα·ααα ααΎααααΈααααααααα ααα‘αΎααα·α ααααΆααΌααααααΆαααααα α¬ααααΌααααα ααα αα»αααΆαααΆαααααααααΎαααΆααα ααΆααααα»αααΊααα α αΎααα·ααααααΆαααααα·ααΈααα α’αααααααΎααααΆααααα α’αααααα’αΆα ααααΎααΆαα α ααΆααααααααααΈαααααα·ααΈ eBPF αααααα
- αααα ααααΆαα α ααΌαααααα ααα ααααααα·ααΈαα αααα»α eBPF ααααΌαααΆααααααααααΉα 4096 ααα αα»αααΆαα α ααααα»αα’αα»ααααΆαα±αααααααα·ααΈ eBPF αααααααΆαααααααααααα αααααα·ααΈ eBPF ααααΈ α αΎαααΌα ααααααααααααααααααα (αα αΌαααα 32 αααααα·ααΈα’αΆα ααααΌαααΆαααααΆααααΆααα·ααΈααα)α
eBPF: α§ααΆα ααα
ααΆαα§ααΆα αααααΆα αααΎααααααΆαα eBPF αα αααα»ααααααααΊαααααΈαα»α α αα½αααΆααΆααα ααααΌ/bpf/α ααΎααααΈα αααααα§ααΆα αααααΆααααα ααααΆαααααααα αΌαα
$ sudo make samples/bpf/
αααα»αααΉααα·ααααααα§ααΆα αααααααΈαααααΆαα eBPF αααα½αα―ααα ααα»ααααααΉαααααΎααααΌαα½ααααα»αα
ααααααααΌαααααΆααα
αααα»αααααΌ/bpf/α αααα»αααΉαααΎααααααααααααααΌα α αΎαααααααααΈαααααααααΆααααΎαααΆαα ααΆα§ααΆα ααααααα»αααΆαααααΎαααΎααααααα·ααΈ tracex4
.
ααΆααΌαα α§ααΆα αααααΈαα½αααααα»αααααΌ/bpf/ ααΆαα―αααΆαααΈαα αααα»αααααΈβααα:
tracex4_kern.c
ααΆαααΌαααααααααααααΌαααααα·ααααα·αααα»αααΊαααααΆ eBPF bytecodeαtracex4_user.c
ααΆααααααα·ααΈααΈααα αα’αααααααΎααααΆααα
αααα»αααααΈαααααΎαααααΌαα
ααααα tracex4_kern.c
αα
eBPF bytecode α αα
αα
α»αααααααα
αααα»α gcc
αα·αααΆααααααααΆαααααααααααΆαα eBPF ααα ααΆααααΆαααα’ clang
α’αΆα
αααα
αα eBPF bytecodeα
ααΆαααααΎααααΆαα clang
αααααΆααααΆαα
ααααα tracex4_kern.c
αα
α―αααΆαααααα»α
αααα»αααΆααααααΆααααΆαααΎααΆαααααααα·ααααα½αα±ααα αΆααα’αΆαααααααααα»ααα½ααα eBPF ααΊαααααΈα tracex4_kern ααααααααααΈαα½αα
struct pair {
u64 val;
u64 ip;
};
struct bpf_map_def SEC("maps") my_map = {
.type = BPF_MAP_TYPE_HASH,
.key_size = sizeof(long),
.value_size = sizeof(struct pair),
.max_entries = 1000000,
};
BPF_MAP_TYPE_HASH
ααΊααΆααΆααα½ααααα»αα
ααααααααααααΆα
αααΎαααααααααααα eBPF α αααα»αααααΈαααααΆααααΆααααααΆαααααΆα α’ααααααα ααααΆααΆαααααααααΆααααΆαααααΆαααΆαα·ααααααααααααα SEC("maps")
. SEC ααΊααΆαααΆααααΌαααααααΎααΎααααΈαααααΎααααααααααΈααα―αααΆααααααΈαα ααΆααα·ααα
αααα»αα§ααΆα ααα tracex4_kern
αααααααΈααααααααΌαααΆααααααα
SEC("kprobe/kmem_cache_free")
int bpf_prog1(struct pt_regs *ctx)
{
long ptr = PT_REGS_PARM2(ctx);
bpf_map_delete_elem(&my_map, &ptr);
return 0;
}
SEC("kretprobe/kmem_cache_alloc_node")
int bpf_prog2(struct pt_regs *ctx)
{
long ptr = PT_REGS_RC(ctx);
long ip = 0;
// ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ip-Π°Π΄ΡΠ΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΉ ΡΡΠΎΡΠΎΠ½Ρ kmem_cache_alloc_node()
BPF_KRETPROBE_READ_RET_IP(ip, ctx);
struct pair v = {
.val = bpf_ktime_get_ns(),
.ip = ip,
};
bpf_map_update_elem(&my_map, &ptr, &v, BPF_ANY);
return 0;
}
αα»αααΆαααΆααααΈααααα’αα»ααααΆαα±ααα’ααααα»αααΆαα»α
ααααΈαααααΈ (kprobe/kmem_cache_free
) α αΎαααααααααΆαα»ααααΈαα
αααααΈ (kretprobe/kmem_cache_alloc_node
) ααααααα»αααΆαααΆααα’ααααααααααααΆα’ααααααααααΌαααααΆαα
ααΉααααΆααααΌαααααΆαααααααααα»α
.
ααααα·αααΎαααα»ααααα αααααααααα―αααΆαααααα»ααα αααα»ααα½αααααΎαααΆαααααααααΈααΆαααααααααΌαααΆαααααααα½α α αΎαα
$ objdump -h tracex4_kern.o
tracex4_kern.o: file format elf64-little
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000000 0000000000000000 0000000000000000 00000040 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 kprobe/kmem_cache_free 00000048 0000000000000000 0000000000000000 00000040 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
2 kretprobe/kmem_cache_alloc_node 000000c0 0000000000000000 0000000000000000 00000088 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
3 maps 0000001c 0000000000000000 0000000000000000 00000148 2**2
CONTENTS, ALLOC, LOAD, DATA
4 license 00000004 0000000000000000 0000000000000000 00000164 2**0
CONTENTS, ALLOC, LOAD, DATA
5 version 00000004 0000000000000000 0000000000000000 00000168 2**2
CONTENTS, ALLOC, LOAD, DATA
6 .eh_frame 00000050 0000000000000000 0000000000000000 00000170 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
ααααΆααααα
, αααααα·ααΈααααΆααα ααΆααΌαα
αααααα·ααΈαααααααΆααααααΉαααα·ααΆααα kmem_cache_alloc_node
. αα
ααααααααααΉαααα·ααΆαααααααααααΎαα‘αΎα ααΌα eBPF αααααααΌαααααΆααααΌαααΆαααααα·ααααα·α ααΌααααααΆαα»ααα»ααααααα IP ααααααααα»αα
αααα»ααααααΈ α αΎααααααΆααααααααα»ααααΌαααΆαααααα·ααα»αααΆαααααααααα·ααΈααα α§ααΆα αααα
$ sudo ./tracex4
obj 0xffff8d6430f60a00 is 2sec old was allocated at ip ffffffff9891ad90
obj 0xffff8d6062ca5e00 is 23sec old was allocated at ip ffffffff98090e8f
obj 0xffff8d5f80161780 is 6sec old was allocated at ip ffffffff98090e8f
ααΎαααααα·ααΈα’αααΆαα’αααααααΎααααΆαα αα·ααααααα·ααΈ eBPF ααΆαααααΆααααααααααΆααΌα
ααααα
? αα
ααΎααΆαα
αΆααααααΎα tracex4_user.c
αααα»αα―αααΆαααααα» tracex4_kern.o
αααααααΎαα»αααΆα load_bpf_file
.
int main(int ac, char **argv)
{
struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY};
char filename[256];
int i;
snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
if (setrlimit(RLIMIT_MEMLOCK, &r)) {
perror("setrlimit(RLIMIT_MEMLOCK, RLIM_INFINITY)");
return 1;
}
if (load_bpf_file(filename)) {
printf("%s", bpf_log_buf);
return 1;
}
for (i = 0; ; i++) {
print_old_objects(map_fd[1]);
sleep(1);
}
return 0;
}
ααααααα»αααααΎ
ααΆααααΎαα’ααααααααααΆαααααααα
αααα»αα―αααΆα eBPF ααααΌαααΆααααααααα
/sys/kernel/debug/tracing/kprobe_events
. α₯α‘αΌαααα ααΎαααααΆααααααΉαααα·ααΆαααααΆααααα α αΎααααααα·ααΈααααααΎαα’αΆα
ααααΎα’αααΈαα½ααα
ααααααααΆααΎαα‘αΎαα
$ sudo cat /sys/kernel/debug/tracing/kprobe_events
p:kprobes/kmem_cache_free kmem_cache_free
r:kprobes/kmem_cache_alloc_node kmem_cache_alloc_node
αααααα·ααΈααααααααααΆααα’αααα αααα»αααααΌ / bpf / ααααΌαααΆααααα αααααααααααΆα αα½ααααααααααΆαα―αααΆαααΈαα
XXX_kern.c
α αααααα·ααΈ eBPF αXXX_user.c
α αααααα·ααΈααααΆααα
αααααα·ααΈ eBPF ααααααααααΈ αα·ααα»αααΆααααααααΆααααΆαα½αααααααα½αα αα
ααααααααΊαααα
ααααααΉαααα·ααΆαααααααααααααΆααααΆαααα½α (α§ααΆα ααα tracepoint
) αα»αααΆααααααΆααααααααααΌαααΆαααααα·ααααα·α ααΆααααααααααΆαααααααααΆααααααα·ααΈααΊααα αα·ααααααα·ααΈααα α’αααααααΎααααΆααα
ααα ααααΈααααα·ααααΆα
α’ααααααααααΆααα·ααΆααααΆα’αααΈ BPF αα·α eBPF αααα»ααααααΌαα α αααα»αααΉαααΆααΆαααααααΆα αα·αααααΆαααΆα αααΎαα’αααΈ eBPF ααααααα ααΌα αααααααα»αααΉαααααΆαααααΆααα½αα ααα½αααααααααααααααΆααααΆααα·ααααΆααααααα
αααα»αααΌαααααΆαα±ααα’αΆαα
BPFα αααΆαααΈααα·αααα·ααααα»αααΊαααααΆααα Jonathan Corbett α ααΆαααααΆαα’αααΈ BPF αα·ααααααααααΆαα·αααααα ααΆ eBPF αααΆαααααΆααααΆαααααα ααα αααα eBPF ααα Brendan Gregg α α’αααααααΈ LWN.net α Brendan ααΆααΉαααΆαα tweets α’αααΈ eBPF αα·ααααααΆαααααΈααααααΆααα ααΎαααααΆααααα ααΎααααααΆαααααΆααααααΆααααααα ααα»αααααΆα .αααααα αααΆαααΎ BPF & eBPF Julia Evans α ααα·αααααααΎαααααα αΆαααα Suchakra Sharma βααααααααα αα BSDα ααααΆααααααααααααΈαααααΆααααΆαα αΆαααααααα ααααααααΆαααααα·αα’αααααααΎααααΆααβα ααα·αααααααΊααα’α αΎααα·αααΆαα½αα’αααα±αααααααΈααααΆααeBPF αααααααΈ 1α α’ααΈαααΆα αα αα α»ααααααααΆα αα·αα’ααΆααααΆα Ferris Ellis α α’αΆαααΌαααΆαα½αααΆααααα ααα»ααααααΆααΆααααααα’αΆαα α’αααααααααα’αααα»ααα½αααααααα»αααΆαααααααΆαααα ααΎ eBPF α
ααααα: www.habr.com