ebpf perf tools 2019
play

eBPF Perf Tools 2019 ^C @usecs: [256, 512) 2 | - PowerPoint PPT Presentation

# biolatency.bt Attaching 3 probes... Tracing block device I/O... Hit Ctrl-C to end. eBPF Perf Tools 2019 ^C @usecs: [256, 512) 2 | | [512, 1K) 10 |@


  1. # biolatency.bt Attaching 3 probes... Tracing block device I/O... Hit Ctrl-C to end. eBPF Perf Tools 2019 ^C @usecs: [256, 512) 2 | | [512, 1K) 10 |@ | [1K, 2K) 426 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| [2K, 4K) 230 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | [4K, 8K) 9 |@ | [8K, 16K) 128 |@@@@@@@@@@@@@@@ | [16K, 32K) 68 |@@@@@@@@ | [32K, 64K) 0 | | Brendan Gregg [64K, 128K) 0 | | [128K, 256K) 10 |@ | SCaLE Mar 2019

  2. LIVE DEMO eBPF Minecraft Analysis

  3. Enhanced BPF Linux 4.* also known as just "BPF" User-Defjned BPF Programs Kernel SDN Confjguration SDN Confjguration Runtime Event Targets DDoS Mitigation DDoS Mitigation sockets sockets verifjer verifjer Intrusion Detection Intrusion Detection kprobes kprobes Container Security Container Security uprobes uprobes BPF BPF Observability Observability tracepoints tracepoints BPF BPF Firewalls (bpfjlter) Firewalls (bpfjlter) perf_events perf_events actions actions Device Drivers Device Drivers …

  4. eBPF bcc Linux 4.4+ https://github.com/iovisor/bcc

  5. eBPF bpftrace (aka BPFtrace) Linux 4.9+ # Files opened by process bpftrace -e 't:syscalls:sys_enter_open { printf("%s %s\n", comm, str(args->filename)) }' # Read size distribution by process bpftrace -e 't:syscalls:sys_exit_read { @[comm] = hist(args->ret) }' # Count VFS calls bpftrace -e 'kprobe:vfs_* { @[func]++ }' # Show vfs_read latency as a histogram bpftrace -e 'k:vfs_read { @[tid] = nsecs } kr:vfs_read /@[tid]/ { @ns = hist(nsecs - @[tid]); delete(@tid) }’ # Trace user-level function Bpftrace -e 'uretprobe:bash:readline { printf(“%s\n”, str(retval)) }’ … https://github.com/iovisor/bpftrace

  6. eBPF is solving new things: ofg-CPU + wakeup analysis

  7. Raw BPF samples/bpf/sock_example.c 87 lines truncated

  8. C/BPF samples/bpf/tracex1_kern.c 58 lines truncated

  9. bcc/BPF (C & Python) bcc examples/tracing/bitehist.py entire program

  10. bpftrace bpftrace -e 'kr:vfs_read { @ = hist(retval); }' https://github.com/iovisor/bpftrace entire program

  11. The Tracing Landscape, Mar 2019 (my opinion) (less brutal) (0.9) bpftrace ply/BPF sysdig (eBPF) Ease of use stap (many) perf LTTng (hist triggers) recent changes bcc/BPF ftrace (mature) (alpha) C/BPF (brutal) Stage of Raw BPF Development Scope & Capability

  12. e.g., identify multimodal disk I/O latency and outliers with bcc/eBPF biolatency # biolatency -mT 10 Tracing block device I/O... Hit Ctrl-C to end. 19:19:04 msecs : count distribution 0 -> 1 : 238 |********* | 2 -> 3 : 424 |***************** | 4 -> 7 : 834 |********************************* | 8 -> 15 : 506 |******************** | 16 -> 31 : 986 |****************************************| 32 -> 63 : 97 |*** | 64 -> 127 : 7 | | 128 -> 255 : 27 |* | 19:19:14 msecs : count distribution 0 -> 1 : 427 |******************* | 2 -> 3 : 424 |****************** | […]

  13. bcc/eBPF programs can be laborious: biolatency # define BPF program if args.disks: bpf_text = """ bpf_text = bpf_text.replace('STORAGE', #include <uapi/linux/ptrace.h> 'BPF_HISTOGRAM(dist, disk_key_t);') #include <linux/blkdev.h> bpf_text = bpf_text.replace('STORE', 'disk_key_t key = {.slot = bpf_log2l(delta)}; ' + typedef struct disk_key { 'void *__tmp = (void *)req->rq_disk->disk_name; ' + char disk[DISK_NAME_LEN]; 'bpf_probe_read(&key.disk, sizeof(key.disk), __tmp); ' + u64 slot; 'dist.increment(key);') } disk_key_t; else: BPF_HASH(start, struct request *); bpf_text = bpf_text.replace('STORAGE', 'BPF_HISTOGRAM(dist);') STORAGE bpf_text = bpf_text.replace('STORE', 'dist.increment(bpf_log2l(delta));') // time block I/O if debug or args.ebpf: int trace_req_start(struct pt_regs *ctx, struct request *req) print(bpf_text) { if args.ebpf: u64 ts = bpf_ktime_get_ns(); exit() start.update(&req, &ts); return 0; # load BPF program } b = BPF(text=bpf_text) if args.queued: // output b.attach_kprobe(event="blk_account_io_start", fn_name="trace_req_start") int trace_req_completion(struct pt_regs *ctx, struct request *req) else: { b.attach_kprobe(event="blk_start_request", fn_name="trace_req_start") u64 *tsp, delta; b.attach_kprobe(event="blk_mq_start_request", fn_name="trace_req_start") b.attach_kprobe(event="blk_account_io_completion", // fetch timestamp and calculate delta fn_name="trace_req_completion") tsp = start.lookup(&req); if (tsp == 0) { print("Tracing block device I/O... Hit Ctrl-C to end.") return 0; // missed issue } # output delta = bpf_ktime_get_ns() - *tsp; exiting = 0 if args.interval else 1 FACTOR dist = b.get_table("dist") while (1): // store as histogram try: STORE sleep(int(args.interval)) except KeyboardInterrupt: start.delete(&req); exiting = 1 return 0; } print() """ if args.timestamp: print("%-8s\n" % strftime("%H:%M:%S"), end="") # code substitutions if args.milliseconds: dist.print_log2_hist(label, "disk") bpf_text = bpf_text.replace('FACTOR', 'delta /= 1000000;') dist.clear() label = "msecs" else: countdown -= 1 bpf_text = bpf_text.replace('FACTOR', 'delta /= 1000;') if exiting or countdown == 0: label = "usecs" exit()

  14. … rewritten in bpftrace (launched Oct 2018)! #!/usr/local/bin/bpftrace BEGIN { printf("Tracing block device I/O... Hit Ctrl-C to end.\n"); } kprobe:blk_account_io_start { @start[arg0] = nsecs; } kprobe:blk_account_io_completion /@start[arg0]/ { @usecs = hist((nsecs - @start[arg0]) / 1000); delete(@start[arg0]); }

  15. … rewritten in bpftrace # biolatency.bt Attaching 3 probes... Tracing block device I/O... Hit Ctrl-C to end. ^C @usecs: [256, 512) 2 | | [512, 1K) 10 |@ | [1K, 2K) 426 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| [2K, 4K) 230 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | [4K, 8K) 9 |@ | [8K, 16K) 128 |@@@@@@@@@@@@@@@ | [16K, 32K) 68 |@@@@@@@@ | [32K, 64K) 0 | | [64K, 128K) 0 | | [128K, 256K) 10 |@ |

  16. bcc canned complex tools, agents bpftrace one-liners, custom scripts

  17. bcc

  18. eBPF bcc Linux 4.4+ https://github.com/iovisor/bcc

  19. bpftrace

  20. eBPF bpftrace Linux 4.9+ https://github.com/iovisor/bcc

  21. bpftrace Development v0.80 Jan-2019 v0.90 v1.0 Dec 2016 Oct 2018 Mar?2019 ?2019 Major Features (v1) Minor Features (v1) ... Stable Docs API Stability Known Bug Fixes More Bug Fixes Packaging

  22. bpftrace Syntax bpftrace -e ‘k:do_nanosleep /pid > 100/ { @[comm]++ }’ Probe Action Filter (optional)

  23. Probes

  24. Probe T ype Shortcuts tracepoint t Kernel static tracepoints usdt U User-level statically defined tracing kprobe k Kernel function tracing kretprobe kr Kernel function returns uprobe u User-level function tracing uretprobe ur User-level function returns profile p Timed sampling across all CPUs interval i Interval output software s Kernel software events hardware h Processor hardware events

  25. Filters ● /pid == 181/ ● /comm != “sshd”/ ● /@ts[tid]/

  26. Actions ● Per-event output – printf() – system() – join() – time() ● Map Summaries – @ = count() or @++ – @ = hist() – … The following is in the https://github.com/iovisor/bpftrace/blob/master/docs/reference_guide.md

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend