Slide 1

Slide 1 text

SREͷͨΊͷeBPF׆༻ εςοϓΞοϓΨΠυ 2025/07/12 SRE NEXT 2025 Sohei Iwahori (GREE, Inc.)

Slide 2

Slide 2 text

who? » Sohei Iwahori (@egmc) » גࣜձࣾάϦʔ ΠϯϑϥετϥΫνϟ෦ γχΞϦʔυΤϯδχΞ » Πϯϑϥͱ؂ࢹγεςϜ » SRE NEXT 2025 Co-Chair » eBPF Japan MeetupӡӦ

Slide 3

Slide 3 text

ࠓ·ͰͷSRE NEXT

Slide 4

Slide 4 text

·͓͖͑ » έʔεͷ౎߹ͰʢίϯςφͰ͸ͳ͘ʣVM؀ڥʢUbuntuʣɺPHPͷ࿩͕ଟΊ ʹͳΓ·͢ » RubyɺPythonͳͲ͸େମಉ͡Α͏ʹͰ͖Δͱࢥ͍·͢ » ڞ༗ϥΠϒϥϦΛτϨʔε͢Δ࡞๏͸΄΅ಉ͡ » Go͸ͪΐͬͱؤுΔඞཁ͕͋Γɾɾ » AppendixʹϙΠϯλ͓͖·͢ !

Slide 5

Slide 5 text

ΞδΣϯμ » eBPFͷ֓ཁ » SRE͕௚઀eBPFΛѻ͏ϝϦοτ » ར༻͢Δ্Ͱͷݱ࣮తͳ೉͠͞ » ಋೖεςοϓ » Step1 طଘͷπʔϧΛར༻͢Δ » Step2 bpftraceΛར༻͢Δ » Step3 eBPFϓϩάϥϜΛॻ͍ͯར༻͢Δ » Recap

Slide 6

Slide 6 text

eBPFͷ֓ཁ

Slide 7

Slide 7 text

eBPFͷ֓ཁ(1/2) eBPFͱ͸ʁ1 1 eBPFͱ͸ https://ebpf.io/ja/what-is-ebpf/.

Slide 8

Slide 8 text

eBPFͷ֓ཁ(2/2) eBPFͰ࢖͑ΔProbe Types2 2 bpftrace https://github.com/bpftrace/bpftrace.

Slide 9

Slide 9 text

࢖ΘΕ͍ͯΔͱ͜ΖʢObservabilityؔ࿈ʣ » Pixie » OpenTelemetry(opentelemetry-go-instrumentationͳͲ) » Pyroscope » Grafana Beyla » ͦͷଞ঎༻੡඼ͳͲ » τϨʔεɺϓϩϑΝΠϥͳͲͷιϦϡʔγϣϯͰར༻͞Ε͍ͯΔ

Slide 10

Slide 10 text

SRE͕௚઀eBPFΛѻ͏ϝϦοτ

Slide 11

Slide 11 text

SRE͕௚઀eBPFΛѻ͏ϝϦοτ » طଘͷπʔϧʢϕϯμ੡඼ɺOSSʣΛར༻ͯ͠՝୊ղܾͰ͖͍ͯΕ͹Ϥγ » طଘͷπʔϧͰख͕ಧ͔ͳ͍෦෼ʹ՝୊͕͋ͬͨ৔߹ » SRE͕eBPFΛ௚઀ѻ͏͜ͱͰΑΓϐϯϙΠϯτͳ՝୊ղܾ͕Ͱ͖Δ » ୹ظతͳ՝୊ʹରͯ͠͸bpftraceͳͲͰΦϯσϚϯυʹ » ௕ظతͳ՝୊ʹରͯ͠͸ઐ༻ͷπʔϧΛ࡞ΔͳͲͷΞϓϩʔνͰ

Slide 12

Slide 12 text

Αͦ͞͏Ͱ͢Ͷʁ

Slide 13

Slide 13 text

ར༻͢Δ্Ͱͷ ݱ࣮తͳ೉͠͞

Slide 14

Slide 14 text

Ή͔ͣ͠͞ » ґଘղܾ໰୊ » ίʔυΛॻ͘೉͠͞ » ৘ใɺར༻ऀͷগͳ͞

Slide 15

Slide 15 text

ґଘղܾ໰୊ » ެࣜͷఏڙύοέʔδ͕ݹ͘BCCπʔϧɺbpftraceͳͲ͕ಈ͔ͳ͍ » BCCΛϏϧυ͠Α͏ͱ͢ΔͱOSόʔδϣϯ͝ͱʹґଘύοέʔδʢClangɺLLVMͳ ͲʣΛࢦఆ͍ͯ͠ΕΔඞཁ͕͋Γେม » ͦͷଞ৔߹ʹΑΓσόοάγϯϘϧͷύοέʔδͳͲ΋ඞཁ » ௕ظతʹ҆ఆͯ͠ಈ͔ͤΔ؀ڥΛOSόʔδϣϯΛ·͍ͨͰҡ࣋͢Δ͚ͩͰ΋େม » 2022͘Β͍͔Βঢ়گ͸Α͘ͳ͖͍ͬͯͯΔͷͱΧʔωϧͷΠϕϯτ͸CO-REΞϓϩʔ νʹΑΓ͋Δఔ౓ҟͳΔΧʔωϧόʔδϣϯͰಈ࡞͢Δπʔϧ͕࡞ΕΔΑ͏ʹͳͬͨ

Slide 16

Slide 16 text

ίʔυΛॻ͘೉͠͞ » eBPFͷίʔυ͸ओʹCݴޠͬΆ͍΋ͷͰॻ͔Ε͍ͯΔ » Χʔωϧ಺Ͱಈ࡞͢ΔͨΊ੍໿΋ଟ͍ʢϧʔϓͷ੍ݶɺϝϞϦΞΫηεͳ Ͳʣ » ϔϧύؔ਺΍ϚΫϩʹΑͬͯ͋Δఔ౓ఆܕԽ͞Ε͍ͯΔ » ޙ൒Ͱσόοάํ๏ʹ͍ͭͯ࿩͠·͢

Slide 17

Slide 17 text

৘ใɺར༻ऀͷগͳ͞(੩తϓϩʔϒͷ໰୊) » eBPFͰ͸USDTͱ͍͏ϢʔβʔۭؒͰಈ࡞͢ΔϓϩάϥϜͷ੩తͳτϨʔε ϙΠϯτ͕αϙʔτ͞Ε͍ͯ·͢ » Python/Ruby/PHPͳͲͷݴޠϥϯλΠϜɺMySQLͳͲͰ΋ར༻Մೳ » όʔδϣϯΛ·͍ͨͰ௕ظతʹར༻Ͱ͖ΔͷͰʢupbobeʹൺ΂ͯʣπʔϧ΁ ૊ΈࠐΈ΍͍͢ » ͔͠͠όΠφϦ͕ --enable-dtrace ͳͲͰDTraceΛ༗ޮʹϏϧυ͞Ε͍ͯ Δඞཁ͕͋Γɺ͜ͷ͋ͨΓ͸σΟετϦϏϡʔγϣϯґଘ

Slide 18

Slide 18 text

৘ใɺར༻ऀͷগͳ͞(੩తϓϩʔϒͷ໰୊) » 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

Slide 19

Slide 19 text

৘ใɺར༻ऀͷগͳ͞(AI͸ʁ) » ChatGPT4oར༻࣌Ͱ͸eBPFͷίʔυͷਫ਼౓͸ମײ40%͘Β͍ͩͬͨ » Claude Sonnet 4 / Opus4͸݁ߏॻ͍ͯ͘ΕΔ » ͱ͸͍͑ʮͲ͜·Ͱ͕ఆܕͷίʔυ͔Θ͔Βͳ͍ʯΈ͍ͨͳͱ͜Ζ͸͋Δͱ ࢥ͏ͷͰυΩϡϝϯτͱαϯϓϧ͸͋Δఔ౓ಡΉͱྑ͍

Slide 20

Slide 20 text

ͱ͍͏͜ͱͰɾɾ » ศརͳeBPFͰ͕͢೉͠͞΋͋ΔͷͰ » SRE͕ಋೖ͍ͯͨ͘͠Ίͷஈ֊తͳεςοϓΛɺ۩ମతͳ՝୊ղܾͷྫͱͱ ΋ʹݟ͍͖ͯ·͠ΐ͏

Slide 21

Slide 21 text

ಋೖεςοϓ

Slide 22

Slide 22 text

Step1 طଘͷπʔϧΛར༻͢Δ killsnoopͷྫ ϫʔΧʔಥવࢮ໰୊

Slide 23

Slide 23 text

՝୊ɿϓϩηεͷಥવࢮ » RubyͷShoryukenΛར༻ͨ͠Ξϥʔτ௨஌γεςϜ » Քಇ8೥ఔ౓ɺʢsystemd؅ཧͰ͸ͳ͘ʣૉ๿ͳ stop/start༻ͷγΣϧεΫϦϓτͰಈ࡞͍ͯͨ͠ » Shoryukenʹ͸Process.daemonΛ࢖ͬͯ σʔϞφΠζ͢ΔΦϓγϣϯ͕͋Δ » ىಈ࣌ʹpidΛه࿥ͯ͠ର৅ʹkill͢ΔΑ͏ͳ εΫϦϓτ » ͋Δ࣌OSόʔδϣϯΞοϓΛߦͬͨΒɺ0࣌ʹಥવ͢ ΂ͯͷϫʔΧʔ͕μ΢ϯ » ޾͍ΦʔτεέʔϧʹΑΓ਺෼ޙʹ͸෮چͨ͠ ͕ɾɾ

Slide 24

Slide 24 text

՝୊2 » ϩάΛΈΔͱͲ͏΋logrotate͕͋΍͍͠ » logrotate࣌ʹਖ਼ৗʹstop/start͍ͯ͠Δ͕ɺه࿥ΛΈΔͱstart௚ޙʹ SIGTERMΛड͚ͯࡴ͞Ε͍ͯΔ » SIGTERMΛʮ୭͕ʯૹ͖͍ͬͯͯΔͷΛ஌Γ͍͕ͨɺRubyଆͷSignal.trap Ͱ͸ૹ৴ݩͷpidͳͲ͸ͱΕͳ͍ » eBPF ͳΒγεςϜίʔϧͷτϨʔεϙΠϯτ͔ΒύϥϝʔλʹΞΫηε͢Δ ͜ͱ͕Ͱ͖Δ

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

࣮ߦ݁Ռ » 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

Slide 27

Slide 27 text

͜ΕΛ౿·͑ͯͷ݁࿦ » OSόʔδϣϯΞοϓͰlogrotateͷ࣮ߦ͕cron->systemd.timerͷ࣮ߦʹมΘ͍ͬͯͨ » systemd.timer͸Type=oneshotͷαʔϏεͱͯ͠ىಈ͢Δ » Type=oneshotͷαʔϏε͸࣮ߦऴྃ࣌ʹunitͷcgroupʹॴଐ͢Δ͢΂ͯͷϓϩηε͕ kill͞ΕΔσϑΥϧτϞʔυͰಈ͘ » Process.daemon͸σʔϞφΠζʢϓϩηεάϧʔϓͷ੾Γ཭͠ʣ͸΍ͬͯ͘ΕΔ͕ɺ cgourp͸ಛʹԿ΋͠ͳ͍ » ݁Ռ࠶ىಈ࣌ʹlogrotate unit͔Βىಈ͞ΕͨϫʔΧʔ͸SIGTERMͷૹग़ର৅ʹͳΓKILL ͞Εͨ

Slide 28

Slide 28 text

ղܾ » ૉ๿ͳstart/stopεΫϦϓτΛ΍ΊϫʔΧʔͦͷ΋ͷsystemd؅ཧͱ͢Δ͜ͱ Ͱղܾ » systemdͦͷ΋ͷͷػೳʹΑΓεΫϦϓτͷେ൒ͷػೳ͸࿫͑ΔΑ͏ʹ » xx snoopܥ͸ͦͷଞ৭ʑศརίϚϯυ͕༻ҙ͞Εͯ·͢ » execsnoop » opensnoop

Slide 29

Slide 29 text

Step2 bpftraceΛར༻͢Δ ෛՙࢼݧʹ͓͚ΔMemcachedͷ ߴτϥϑΟοΫݪҼௐࠪ

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

՝୊ɿෛՙࢼݧʹ͓͚ΔϘτϧωοΫ » ͋ΔҊ݅ͰAWS্ͷ؀ڥͰෛՙࢼݧΛ࣮ࢪ͍ͯͨ͠ͱ͜Ζ͋ΔϙΠϯτͰϨ Πςϯγ͕ѱ͘ͳͬͨ » 2୆த1୆ͷElasticache(Memcached)΁ͷτϥϑΟοΫ͕ଟ͗ͯ͢ଳҬΛ࢖͍ ੾͍ͬͯͨ » Memcached΁ͷΠϯλʔϑΣʔε͸ϑϨʔϜϫʔΫʢFuelPHPʣʹ͓೚ͤ » ෼ࢄΞϧΰϦζϜΛมߋͨ͠ΒτϥϑΟοΫͷภΔϊʔυ͕มΘͬͨ » ͦΕͧΕͷϊʔυίϚϯυͷ਺͸΄΅ಉҰͰҧ͍͸τϥϑΟοΫͷΈ

Slide 33

Slide 33 text

ෛՙࢼݧʹ͓͚ΔϘτϧωοΫௐࠪͰͷར༻

Slide 34

Slide 34 text

ෛՙࢼݧʹ͓͚ΔϘτϧωοΫௐࠪͰͷར༻ » ൃߦ͞ΕΔίϚϯυ਺͸ಉҰͳͷͰ෼ࢄࣗମ͸ग़དྷ͍ͯΔ » ঢ়گతʹ͸ಛఆͷΩʔͰڊେͳΦϒδΣΫτ͕΍ΓͱΓ͞Ε͍ͯΔΑ͏ʹݟ ͑Δ » ཪͱΓΛߦ͏ͨΊʹbpftraceͰlibmemcachedʹuprobeΛ࢓ֻ͚τϨʔεΛ औͬͯΈͨ

Slide 35

Slide 35 text

ෛՙࢼݧʹ͓͚ΔϘτϧωοΫௐࠪͰͷར༻ » ൃߦ͞ΕΔίϚϯυ਺͸ಉҰͳͷͰ෼ࢄࣗମ͸ग़དྷ͍ͯΔ » ঢ়گతʹ͸ಛఆͷΩʔͰڊେͳΦϒδΣΫτ͕΍ΓͱΓ͞Ε͍ͯΔΑ͏ʹݟ ͑Δ » ཪͱΓΛߦ͏ͨΊʹbpftraceͰlibmemcachedʹuprobeΛ࢓ֻ͚τϨʔεΛ औͬͯΈͨ

Slide 36

Slide 36 text

bpftraceʹΑΔௐࠪ $ sudo bpftrace -e 'uprobe:/usr/lib/x86_64-linux-gnu/libmemcached.so.11.0.0:memcached_set { printf("----");time(); printf("key_length: %d\nkey: %s\n", arg2, str(arg1)); printf("val_length: %d\nval: %s\n", arg4, str(arg3) );}'

Slide 37

Slide 37 text

ղܾ » fuelphpͷmemcachedυϥΠό͕memcachedʹετΞ͢ΔࡍʹΦϦδφϧͷ ΩʔΛੜ੒ͨ͠ΩʔʹϚοϐϯά » Ϛοϐϯά৘ใͷΠϯσοΫε͸୯ҰͷΦϒδΣΫτʹ֨ೲ͞Ε͍ͯͨ » ΩʔͷϚοϐϯά৘ใͳͷͰຖճࢀরɺߋ৽͞Ε͍ͯͨ » ౰֘Ҋ݅Ͱ͸Ωʔ͕૿͑΍͍͢܏޲ʹ͋ͬͨͨΊɺΦϒδΣΫτ͕ංେԽͯ͠ ͍ͨ » ࠷ऴతʹϑϨʔϜϫʔΫͷػߏΛ࢖Θͳ͍࣮૷ʹஔ͖׵͑໰୊Λղফ

Slide 38

Slide 38 text

͓·͚ɿΞϓϦέʔγϣϯଆͰΈͯͳ͍ؔ਺ͷ໭Γ஋ // 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 ...

Slide 39

Slide 39 text

Step3 eBPFϓϩάϥϜΛॻ͍ͯར༻͢ Δ ebpf_exporterΛར༻ͨ͠ PHPͷະར༻ίʔυͷ͋ͿΓग़͠ଞ

Slide 40

Slide 40 text

ebpf_exporter » cloudflare/ebpf_exporter9 » ىಈ࣌ʹϩʔυͨ͠eBPFϓϩάϥϜ͔Βऔಘͨ͠ϝτϦΫεΛPrometheusܗࣜͰ export͢Δ » ϝτϦΫεͷσʔλ͸BPF_MAPΛܦ༝ͯ͠Ϣʔβʔεϖʔε΁౉͞ΕΔ » ͋Β͔͡Ί࡞੒ͨ͠eBPFϓϩάϥϜʢELFόΠφϦʣͱରʹͳΔYAMLϑΝΠϧʢϝτϦ Ϋεͷ։ࣔΛ࢓ํΛࢦࣔ͢Δ΋ͷʣΛ࡞੒͢Δ͜ͱͰ೚ҙͷϝτϦΫεΛੜ੒Ͱ͖·͢ 9 https://github.com/cloudflare/ebpf_exporter

Slide 41

Slide 41 text

ebpf_exporterͷྫ » ௨ৗͷϊʔυͷϝτϦΫεͰ͸औΕͳ͍ʮIPΞυϨεɺѼઌϙʔτʯΛϥϕϧʹͯ͠ΑΓৄࡉͳσʔλΛಘΔ

Slide 42

Slide 42 text

՝୊ɿະར༻ίʔυ » ௕ظӡ༻λΠτϧͰ͸ίʔυ͕ංେԽ » όʔδϣϯΞοϓͷͨͼʹॻ͖׵͕͑ඞཁ » ίʔυͷ૯ྔΛݮΒ͍͕࣮ͨ͠ࡍʹ࢖ΘΕ͍ͯΔ͔Θ͔Βͳ͍

Slide 43

Slide 43 text

ebpf_exporterʹΑΔPHPΞϓϦέʔγϣϯͷ ՄࢹԽ » uprobe/USDTΛར༻ͯ͠PHPͷ಺෦ϝτϦΫεΛऔಘ͢Δ » PHPͷUSDTͰ͸ͨͱ͑͹ϑΝΠϧͷίϯύΠϧɺϦΫΤετͷ։࢝/ऴྃɺΤϥʔͷൃੜͳͲͷϑοΫϙΠϯτ͕༻ ҙ͞Ε͍ͯΔ10 » ͜ΕΒΛϝτϦΫεͱͯ͠ՄࢹԽ͢Δ͜ͱͰSRE/։ൃऀʹ༗༻ͳ৘ใΛఏڙ͢Δ » εςοϓΞοϓΨΠυͳͷͰ࡞ΓํΛݟ͍͖ͯ·͢ » ʮίϯύΠϧͷΠϕϯτΛΈͯະ࢖༻ίʔυͷ͋ͿΓग़͠ʯΛͯ͠Έ·͢ 10 https://www.php.net/manual/ja/features.dtrace.dtrace.php

Slide 44

Slide 44 text

ߏ੒

Slide 45

Slide 45 text

ͲͷΑ͏ʹॻ͖࢝ΊΕ͹Α͍͔ » 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

Slide 46

Slide 46 text

ͲͷΑ͏ʹॻ͖࢝ΊΕ͹Α͍͔

Slide 47

Slide 47 text

ͲͷΑ͏ʹॻ͖࢝ΊΕ͹Α͍͔

Slide 48

Slide 48 text

͍͚ͦ͏Ͱ͢Ͷ

Slide 49

Slide 49 text

ॻ͍ͯΈͨʢൈਮʣ 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

Slide 50

Slide 50 text

։ൃϑϩʔ » eBPFϓϩάϥϜΛϏϧυ͢Δʢexmaples಺ͷMakefile͕͋Δɺத਎͸clangΛ-target bpfͰ ࣮ߦ͍ͯ͠Δʣ » ίϯύΠϧΤϥʔ͕͋Ε͹͜ͷ࣌఺Ͱ஄͔ΕΔ » ebpf_exporterΛىಈ͢Δ » ىಈ࣌ʹϓϩάϥϜΛϩʔυ͢Δ » eBPFͷVerifierʹҾ͔͔ͬΔͱ͜͜Ͱམͱ͞ΕΔ » ىಈͨ͠ΒhttpͰϝτϦΫεΛ֬ೝ͠ͳ͕ΒɺλʔήοτͷΠϕϯτ͕࣮ߦ͢ΔʢPHPεΫ Ϧϓτͷ࣮ߦͳͲ

Slide 51

Slide 51 text

σόοά1 จࣈྻग़ྗ͍ͨ͠ » bpf_trace_printk ϔϧύؔ਺͕͋Δ11 » printfతͳϑΥʔϚοτͰprint debug » /sys/kernel/debug/tracing/trace_pipe Λಡ Ή͜ͱͰจࣈྻͰग़ྗ͕ಘΒΕΔ 11 https://docs.ebpf.io/linux/helper-function/bpftraceprintk/

Slide 52

Slide 52 text

σόοά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 } ]

Slide 53

Slide 53 text

Ͱ͖·ͨ͠

Slide 54

Slide 54 text

Ԡ༻ฤ

Slide 55

Slide 55 text

ศརͰ͢Ͷ

Slide 56

Slide 56 text

Recap » eBPF͸ΦϒβʔόϏϦςΟܥͷπʔϧ಺෦Ͱ΋࢖༻͞Ε͍ͯΔ » SRE͕௚઀ѻ͏͜ͱͰΑΓϐϯϙΠϯτͳ՝୊ղܾʹར༻Ͱ͖Δ » ΞυϗοΫͳௐࠪ » ࣗ૊৫ͷ՝୊ղܾͷͨΊͷઐ༻πʔϧ » طଘπʔϧͷར༻ɺbpftraceͷར༻ɺeBPFϓϩάϥϜͷࣗ࡞ͷॱ͕͓͢͢Ί

Slide 57

Slide 57 text

Thank you for listening

Slide 58

Slide 58 text

Appendix » bpftraceʹΑΔGoΞϓϦέʔγϣϯͷτϨʔε » Real World Debugging with eBPF » https://github.com/egmc/ebpf_exporter/blob/ebpf-php-sample/ examples/php.bpf.c