Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SREのためのeBPF活用ステップアップガイド

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

 SREのためのeBPF活用ステップアップガイド

Avatar for Sohei Iwahori

Sohei Iwahori

July 12, 2025
Tweet

More Decks by Sohei Iwahori

Other Decks in Technology

Transcript

  1. who? » Sohei Iwahori (@egmc) » גࣜձࣾάϦʔ ΠϯϑϥετϥΫνϟ෦ γχΞϦʔυΤϯδχΞ »

    Πϯϑϥͱ؂ࢹγεςϜ » SRE NEXT 2025 Co-Chair » eBPF Japan MeetupӡӦ
  2. ΞδΣϯμ » eBPFͷ֓ཁ » SRE͕௚઀eBPFΛѻ͏ϝϦοτ » ར༻͢Δ্Ͱͷݱ࣮తͳ೉͠͞ » ಋೖεςοϓ »

    Step1 طଘͷπʔϧΛར༻͢Δ » Step2 bpftraceΛར༻͢Δ » Step3 eBPFϓϩάϥϜΛॻ͍ͯར༻͢Δ » Recap
  3. ࢖ΘΕ͍ͯΔͱ͜ΖʢObservabilityؔ࿈ʣ » Pixie » OpenTelemetry(opentelemetry-go-instrumentationͳͲ) » Pyroscope » Grafana Beyla

    » ͦͷଞ঎༻੡඼ͳͲ » τϨʔεɺϓϩϑΝΠϥͳͲͷιϦϡʔγϣϯͰར༻͞Ε͍ͯΔ
  4. ৘ใɺར༻ऀͷগͳ͞(੩తϓϩʔϒͷ໰୊) » ubuntuͰఏڙ͞ΕΔެࣜͷPHPύοέʔδͰ͸جຊతʹ͸DTrace͸༗ޮԽ͞Ε͍ͯΔ » ͔͠͠24.04(Noble)ͷύοέʔδͰ͸disable͞Ε͍ͯͨ͠ » ౰࣌ݩͷdebianύοέʔδଆͰϏϧυʹࣦഊ͢Δ໰୊͕͋ͬͨΒ͍͠ » bug reportΛ͋͛ͨ݁Ռ

    25.04(Plucky)͔Β͸࠶౓༗ޮԽͯ͠΋Β͑ͨ3 » ·ͨɺPHPͰ͸ USE_ZEND_DTRACE=1 ͱ͍͏؀ڥม਺Λର৅ϓϩηεʹηοτ͢Δඞཁ͕͋Δ͕υΩϡϝϯτʹॻ͔Ε͍ͯ ͳ͔ͬͨ4 » ਓʑͷؔ৺͕େࣄ 4 https://github.com/php/doc-en/pull/4456 3 https://bugs.launchpad.net/ubuntu/+source/php8.3/+bug/2088977
  5. ৘ใɺར༻ऀͷগͳ͞(AI͸ʁ) » ChatGPT4oར༻࣌Ͱ͸eBPFͷίʔυͷਫ਼౓͸ମײ40%͘Β͍ͩͬͨ » Claude Sonnet 4 / Opus4͸݁ߏॻ͍ͯ͘ΕΔ »

    ͱ͸͍͑ʮͲ͜·Ͱ͕ఆܕͷίʔυ͔Θ͔Βͳ͍ʯΈ͍ͨͳͱ͜Ζ͸͋Δͱ ࢥ͏ͷͰυΩϡϝϯτͱαϯϓϧ͸͋Δఔ౓ಡΉͱྑ͍
  6. ՝୊ɿϓϩηεͷಥવࢮ » RubyͷShoryukenΛར༻ͨ͠Ξϥʔτ௨஌γεςϜ » Քಇ8೥ఔ౓ɺʢsystemd؅ཧͰ͸ͳ͘ʣૉ๿ͳ stop/start༻ͷγΣϧεΫϦϓτͰಈ࡞͍ͯͨ͠ » Shoryukenʹ͸Process.daemonΛ࢖ͬͯ σʔϞφΠζ͢ΔΦϓγϣϯ͕͋Δ »

    ىಈ࣌ʹpidΛه࿥ͯ͠ର৅ʹkill͢ΔΑ͏ͳ εΫϦϓτ » ͋Δ࣌OSόʔδϣϯΞοϓΛߦͬͨΒɺ0࣌ʹಥવ͢ ΂ͯͷϫʔΧʔ͕μ΢ϯ » ޾͍ΦʔτεέʔϧʹΑΓ਺෼ޙʹ͸෮چͨ͠ ͕ɾɾ
  7. BPFπʔϧͰ΍ͬͯΈΔ » killsnoopɺkillsnoop.bt5ͱ͍͏ͦͷ΋ͷͣ͹Γͳπʔϧ͕͋Δ » killsnoop͸BCC൛ɺkillsnoop.bt͸bpftrace൛ » OSύοέʔδͰఏڙ͞Ε͍ͯΔBCC൛͕ݹ͘ಈ࡞͠ͳ͔ͬͨͷͰkillsnoop.btΛ࢖ͬͨ » ૹ৴ݩϓϩηεͷIDɺγάφϧͳͲΛϦΞϧλΠϜʹදࣔͯ͘͠ΕΔ »

    τϨʔεϙΠϯτ͸Χʔωϧ಺Ͱఆٛ͞Ε͍ͯͯ6ɺsyscalls.h಺Ͱఆٛ͞Ε͍ͯΔϚΫϩ7Λܦ༝ͯ͠ύϥϝʔλ Λड͚औΕΔτϨʔεϙΠϯτΛࣗಈͰఆٛͯ͘͠ΕΔ 7 https://github.com/torvalds/linux/blob/master/include/linux/syscalls.h#L225C9-L225C24 6 https://github.com/torvalds/linux/blob/66701750d5565c574af42bef0b789ce0203e3071/kernel/signal.c#L3944-L3958 5 https://github.com/bpftrace/bpftrace/blob/master/tools/killsnoop.bt
  8. ࣮ߦ݁Ռ » 0࣌෇ۙͰൃੜ͢Δ͜ͱ͸Θ͔ͬ ͍ͯͨͷͰɺࡶʹcronͰಈ͔ͯ͠ ϩάΛϑΝΠϧʹॻ͖ग़ͯ͠Έͨ » pid1ʢsystemdʣ͕kill͍ͯ͠Δ » ࢖ͬͯͳ͍͸͕ͣͩɾɾʁ killsnoop.bt

    00:00:01 466297 kill 10 439956 0 00:00:04 1 systemd 15 466335 0 00:00:04 1 systemd 18 466335 0 logrotate 00:00:01 xxx COMMAND=/usr/bin/kill -USR1 439956
  9. bpftraceʹ͍ͭͯ » awkͬΆ͍ॻ͖ํͰ೚ҙͷτϨʔε͕࢖͑Δ » ϫϯϥΠφʔͰ࢖ͬͨΓɺεΫϦϓτΛϑΝΠϧͰ༻ҙ͓͖࣮ͯ͠ߦ ͨ͠Γʢ.btͳπʔϧ͸͜ͷελΠϧʣ bpftrace is a high-level

    tracing language for Linux. bpftrace uses LLVM as a backend to compile scripts to eBPF-bytecode and makes use of libbpf and bcc for interacting with the Linux BPF subsystem, as well as existing Linux tracing capabilities: kernel dynamic tracing (kprobes), user-level dynamic tracing (uprobes), tracepoints, etc. The bpftrace language is inspired by awk, C, and predecessor tracers such as DTrace and SystemTap.8 8 https://github.com/bpftrace/bpftrace
  10. bpftraceʹ͍ͭͯ » جຊ͸ϑοΫϙΠϯτͷࢦఆͱϓϩάϥϜίʔυͷηοτ » ΧʔωϧͷΠϕϯτҎ֎ʹ΋ɺuprobe/uretprobe/USDTͰϢʔβʔεϖʔεʹ΋ΞλονͰ ͖Δ » ूܭͳͲ΋Ͱ͖ΔͷͰεϙοτͷௐࠪʹ༗༻ $ sudo

    bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args->filename)); }' Attaching 1 probe... curl /etc/ld.so.cache curl /lib/x86_64-linux-gnu/libcurl.so.4 curl /lib/x86_64-linux-gnu/libz.so.1 curl /lib/x86_64-linux-gnu/libc.so.6 curl /lib/x86_64-linux-gnu/libnghttp2.so.14 curl /lib/x86_64-linux-gnu/libidn2.so.0 curl /lib/x86_64-linux-gnu/librtmp.so.1 curl /lib/x86_64-linux-gnu/libssh.so.4
  11. ͓·͚ɿΞϓϦέʔγϣϯଆͰΈͯͳ͍ؔ਺ͷ໭Γ஋ // PHPଆͰ໭Γ஋ΛΈ͍ͯͳ͍͕ apcu_store($cache_key, array('time' => $time, 'data' => $value),

    0); // uprobeͰ௚઀C֦ுΛΈΔ͜ͱͰ࣮ࡍͷ໭Γ஋Λ֬ೝͰ͖Δ sudo bpftrace -e 'uretprobe:/usr/lib/php/20190902/apcu.so:apc_cache_store {printf ("%d\n", retval)}' 1 1 1 0 ...
  12. ͲͷΑ͏ʹॻ͖࢝ΊΕ͹Α͍͔ » exmaplesҎԼΛோΊΔ » ໨తʹ͍ۙαϯϓϧΛಡΉ » ఆܕΛ཈͑Δ $ ls examples/

    | head -n20 Makefile accept-latency.bpf.c accept-latency.yaml bio-trace.bpf.c bio-trace.png bio-trace.yaml biolatency.bpf.c biolatency.png biolatency.yaml bits.bpf.h bpf-jit.bpf.c bpf-jit.yaml cachestat-pre-kernel-5.16.bpf.c cachestat-pre-kernel-5.16.yaml cachestat.bpf.c cachestat.yaml cephfs-dist.bpf.c cephfs-dist.yaml cfs-throttling-trace.bpf.c cfs-throttling-trace.png
  13. ॻ͍ͯΈͨʢൈਮʣ php.bpf.c #define MAX_STR_LEN 256 struct call_t { char filename[MAX_STR_LEN];

    }; struct { __uint(type, BPF_MAP_TYPE_LRU_HASH); __uint(max_entries, 65536); __type(key, struct call_t); __type(value, u64); } php_compile_file_total SEC(".maps"); SEC("usdt//usr/lib/apache2/modules/libphp8.1.so:php:compile__file__entry") int BPF_USDT(do_count, char *arg0, char *arg1) { struct call_t call = {}; bpf_probe_read_user_str(&call.filename, sizeof(call.filename), arg1); truncate_string(call.filename, MAX_STR_LEN); static const char fmtstr[] = "compile file entry: %s, %s\n"; bpf_trace_printk(fmtstr, sizeof(fmtstr), arg0, arg1); increment_map(&php_compile_file_total, &call, 1); return 0; } php.yaml metrics: counters: - name: php_compile_file_total help: Number of php:compile__file__entry USDT calls per filepath labels: - name: filename size: 256 decoders: - name: string
  14. ։ൃϑϩʔ » eBPFϓϩάϥϜΛϏϧυ͢Δʢexmaples಺ͷMakefile͕͋Δɺத਎͸clangΛ-target bpfͰ ࣮ߦ͍ͯ͠Δʣ » ίϯύΠϧΤϥʔ͕͋Ε͹͜ͷ࣌఺Ͱ஄͔ΕΔ » ebpf_exporterΛىಈ͢Δ »

    ىಈ࣌ʹϓϩάϥϜΛϩʔυ͢Δ » eBPFͷVerifierʹҾ͔͔ͬΔͱ͜͜Ͱམͱ͞ΕΔ » ىಈͨ͠ΒhttpͰϝτϦΫεΛ֬ೝ͠ͳ͕ΒɺλʔήοτͷΠϕϯτ͕࣮ߦ͢ΔʢPHPεΫ Ϧϓτͷ࣮ߦͳͲ
  15. σόοά1 จࣈྻग़ྗ͍ͨ͠ » bpf_trace_printk ϔϧύؔ਺͕͋Δ11 » printfతͳϑΥʔϚοτͰprint debug » /sys/kernel/debug/tracing/trace_pipe

    Λಡ Ή͜ͱͰจࣈྻͰग़ྗ͕ಘΒΕΔ 11 https://docs.ebpf.io/linux/helper-function/bpftraceprintk/
  16. σόοά2 BPF_MAPͷத਎ΛΈ͍ͨ » MAPͷத਎͸ sudo bpftool map ͰJSONͰಘΒΕΔ » bpftool

    mapͰIDΛௐ΂ͯdump idΛ͢Δ $ sudo bpftool map dump id ` sudo bpftool map |grep php_compile |egrep -o '^[0-9]+'` | jq . [ { "key": { "filename": "/var/www/html/" }, "value": 725 } ]
  17. Appendix » bpftraceʹΑΔGoΞϓϦέʔγϣϯͷτϨʔε » Real World Debugging with eBPF »

    https://github.com/egmc/ebpf_exporter/blob/ebpf-php-sample/ examples/php.bpf.c