誰ããéæ³ã«ã€ããŠã®å¥œããªæ¬ãæã£ãŠããŸãã誰ããããŒã«ãã³ãæã£ãŠããã誰ãããã©ãã§ãããæã£ãŠãããç§ã®ãããªèª°ããããã¯ã¹ãã©ã€ãæã£ãŠãããä»æ¥ã¯ãç§ã®ãæ°ã«å ¥ãã®ITããžãã¯ã§ããBPFãšãã®åšèŸºã®ææ°ã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã«ã€ããŠèª¬æããŸãã
BPFã¯çŸåšããŒã¯ã«ãããŸãããã¯ãããžãŒã¯é£èºçã«çºå±ããæãäºæ³å€ã®å Žæã«æµžéããå¹³åçãªãŠãŒã¶ãŒããŸããŸãã¢ã¯ã»ã¹ã§ããããã«ãªã£ãŠããŸããä»æ¥ã®ã»ãšãã©ãã¹ãŠã®äººæ°ã®ããäŒè°ã§ããã®ãããã¯ã«é¢ããã¬ããŒããèãããšãã§ããŸããGopherConRussiaãäŸå€ã§ã¯ãããŸãããç§ã®ã¬ããŒãã®ããã¹ãããŒãžã§ã³ã玹ä»ããŸãã
ãã®èšäºã«ã¯ãŠããŒã¯ãªçºèŠã¯ãããŸããã BPFãšã¯äœããBPFã§äœãã§ããã®ãããããŠBPFãã©ã®ããã«å人çã«åœ¹ç«ã€ã®ãããèŠãããããšæããŸãã Goé¢é£ã®æ©èœã«ã€ããŠãèŠãŠãããŸãã
ç§ã®èšäºãèªãã åŸã¯ãããªãŒã»ããã¿ãŒã®æ¬ãæåã«èªãã åäŸã®ç®ãšåãããã«ç®ãèŒãããŠã家ã«åž°ã£ãããä»äºãããŠæ°ãããããã¡ãããè©ŠããŠã¿ãŠãã ããã
eBPFãšã¯äœã§ããïŒ
ããã§ãçãããããªç®ããã34æ³ã®ã²ããçãããç·ãããªãã«è©±ãã®ã¯ã©ã®ãããªéæ³ã§ããïŒ
ç§ãã¡ã¯2020幎ã«ããªããšäžç·ã«äœãã§ããŸãã TwitterãéããšããœãããŠã§ã¢ãéåžžã«ã²ã©ãå質ã§äœæãããŠããããããã¹ãŠãæšãŠãŠæåããããçŽãã®ãç°¡åã§ãããšäž»åŒµããäžæ©å«ãããªçŽ³å£«ã®ãã€ãŒããèªãããšãã§ããŸãã圌ãã¯ãã¯ããããææ ¢ã§ããªãã®ã§ãè·æ¥ãèŸãããšè ã人ããããŸãïŒãã¹ãŠã絶ããå£ããŠããŠãäžäŸ¿ã§ãé ãã§ãã
ãããã圌ãã¯æ£ããã§ãããïŒåã®ã³ã¡ã³ãããªããã°ãç§ãã¡ã¯èŠã€ããããšãã§ããŸãããããããç§ãééããªãåæããã®ã¯ãææ°ã®ãœãããŠã§ã¢ã¹ã¿ãã¯ããããŸã§ã«ãªãè€éã«ãªã£ãŠãããšããããšã§ãã
BIOSãEFIããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããã©ã€ããŒãã¢ãžã¥ãŒã«ãã©ã€ãã©ãªããããã¯ãŒãã³ã°ãããŒã¿ããŒã¹ããã£ãã·ã¥ãK8ã®ãããªãªãŒã±ã¹ãã¬ãŒã¿ãŒãDockerã®ãããªã³ã³ãããŒããããŠæåŸã«ãã©ã³ã¿ã€ã ãšã¬ããŒãžã³ã¬ã¯ã¿ãŒãåãããœãããŠã§ã¢ãæ¬åœã®å°é家ã¯ããã©ãŠã¶ã«ya.ruãæ°æ¥éå ¥åããåŸã«äœãèµ·ããããšãã質åã«çããããšãã§ããŸãã
ã·ã¹ãã ã§äœãèµ·ãã£ãŠããã®ããç解ããããšã¯éåžžã«å°é£ã§ããç¹ã«ãçŸæç¹ã§åé¡ãçºçããŠããŠããéã倱ã£ãŠããå Žåã¯ãªãããã§ãããã®åé¡ã«ãããã·ã¹ãã å ã§äœãèµ·ãã£ãŠããã®ããç解ããã®ã«åœ¹ç«ã€ããã«èšèšãããããžãã¹ã©ã€ã³ãåºçŸããŸããã倧äŒæ¥ã«ã¯ãäœçŸäžãã«ãç¯çŽããããã«ã©ããå©ãããã©ã®ããããç· ããããç¥ã£ãŠããã·ã£ãŒããã¯éšéå šäœããããŸãã
ã€ã³ã¿ãã¥ãŒã§ã¯ãæ4æã«èµ·ããå Žåã«åé¡ãã©ã®ããã«è§£æ±ºããããããå°ããŸãã
1ã€ã®ã¢ãããŒãã¯ããã°ãåæããããšã§ãããããåé¡ã¯ãéçºè ãèªåã®ã·ã¹ãã ã«å ¥ãããã®ã ããå©çšã§ãããšããããšã§ãããããã¯æè»ã§ã¯ãããŸããã
2çªç®ã«äžè¬çãªã¢ãããŒãã¯ãã¡ããªãã¯ã調æ»ããããšã§ããã¡ããªãã¯ãæäœããããã®æãäžè¬çãª3ã€ã®ã·ã¹ãã ã¯ãGoã§èšè¿°ãããŠããŸããææšã¯éåžžã«äŸ¿å©ã§ãããçç¶ã確èªã§ãããããå¿ ãããåå ãç解ããã®ã«åœ¹ç«ã€ãšã¯éããŸããã
人æ°ãé«ãŸã£ãŠãã3çªç®ã®ã¢ãããŒãã¯ãããããå¯èŠ³æž¬æ§ã§ããã·ã¹ãã ã®åäœã«ã€ããŠä»»æã«è€éãªè³ªåããããããã«å¯ŸããåçãåŸãæ©èœã§ãã質åã¯éåžžã«è€éã«ãªãå¯èœæ§ããããããåçã«ã¯ããŸããŸãªæ å ±ãå¿ èŠã«ãªãå Žåãããã質åãè¡ããããŸã§ãã©ããã©ããããããŸãããããã¯ãæè»æ§ãå¯èŠ³æž¬æ§ã«äžå¯æ¬ ã§ããããšãæå³ããŸãã
ãã®å Žã§ãã®ã³ã°ã¬ãã«ãå€æŽããæ©èœãæäŸããŸããïŒå®è¡äžã®ããã°ã©ã ã«ãããã¬ãŒã§æ¥ç¶ãããã®äœæ¥ãäžæããã«ããã§äœããããŸããïŒã·ã¹ãã ã«å ¥ã£ãŠãããªã¯ãšã¹ããç解ããé ããªã¯ãšã¹ãã®ãœãŒã¹ãèŠèŠåããpprofãä»ããŠã©ã®ã¡ã¢ãªãæ¶è²»ãããŠãããã確èªããæéã®çµéã«äŒŽãå€åã®ã°ã©ããååŸããŸããïŒ 1ã€ã®é¢æ°ã®åŸ ã¡æéãšåŸ ã¡æéã®åŒæ°ãžã®äŸåæ§ã枬å®ããŸããïŒããããã¹ãŠã®ã¢ãããŒãã«ã€ããŠãå¯èŠ³æž¬æ§ã«ã€ããŠèª¬æããŸããããã¯ããŠãŒãã£ãªãã£ãã¢ãããŒããç¥èãçµéšã®ã»ããã§ããããã¹ãŠã§ã¯ãªãã«ããŠããäœæ¥ã·ã¹ãã ã§å€ãã®ãå©çããå®çŸããæ©äŒãäžç·ã«æäŸããŸããçŸä»£ã®ã¹ã€ã¹ã®ITãã€ãã
ããããããã¯ã©ã®ããã«è¡ãããšãã§ããŸããïŒåžå Žã«ã¯ãåçŽãè€éãå±éºãäœéãªã©ãå€ãã®æ©åšããããŸãããããããä»æ¥ã®èšäºã®ãããã¯ã¯BPFã§ãã
Linuxã«ãŒãã«ã¯ã€ãã³ãé§ååã§ããã«ãŒãã«å ããã³ã·ã¹ãã å šäœã§çºçããã»ãšãã©ãã¹ãŠã®ããšã¯ãäžé£ã®ã€ãã³ããšããŠè¡šãããšãã§ããŸããäžæã¯ã€ãã³ãã§ããããããã¯ãŒã¯ãä»ãããã±ããã®åä¿¡ã¯ã€ãã³ãã§ãããããã»ããµã®å¥ã®ããã»ã¹ãžã®è»¢éã¯ã€ãã³ãã§ãããé¢æ°ã®èµ·åã¯ã€ãã³ãã§ãã
ãããã£ãŠãBPFã¯Linuxã«ãŒãã«ã®ãµãã·ã¹ãã ã§ãããã€ãã³ãã«å¿çããŠã«ãŒãã«ã«ãã£ãŠèµ·åãããå°ããªããã°ã©ã ãäœæããããšãå¯èœã«ããŸãããããã®ããã°ã©ã ã¯ãã·ã¹ãã ã§äœãèµ·ãã£ãŠããããæããã«ãããããå¶åŸ¡ããããšãã§ããŸãã
ãšãŠãé·ã玹ä»ã§ãããçŸå®ã«è¿ã¥ããŸãããã
1994幎ã«ã¯ãBPFã®æåã®ããŒãžã§ã³ãèŠãããŸãããããã¯ããããã¯ãŒã¯ãã±ããã衚瀺ãŸãã¯ã¹ãããã£ã³ã°ããããã®tcpdumpãŠãŒãã£ãªãã£ã®ç°¡åãªã«ãŒã«ãäœæãããšãã«ééããå¯èœæ§ããããŸãã tcpdumpã§ã¯ãããã£ã«ã¿ãŒããèšå®ããŠããã¹ãŠã§ã¯ãªããé¢å¿ã®ããããã±ãŒãžã®ã¿ã衚瀺ã§ããŸããããšãã°ããtcpãããã³ã«ã®ã¿ãšããŒã80ã®ã¿ããªã©ã§ããééãããã±ããããšã«ããã®ç¹å®ã®ãã±ãããä¿åãããã©ããã決å®ããé¢æ°ãå®è¡ãããŸãããããã±ãŒãžã¯ããããããå¯èœæ§ããããŸããã€ãŸããé¢æ°ã¯éåžžã«é«éã§ããå¿ èŠããããŸãã tcpdumpãã£ã«ã¿ãŒã¯BPFé¢æ°ã«å€æãããã°ããã§ããã®äŸã次ã®å³ã«ç€ºããŸãã
tcpdumpã®åçŽãªãã£ã«ã¿ãŒãBPFããã°ã©ã ãšããŠæ瀺ãããŸã
å ã®BPFã¯ãããã€ãã®ã¬ãžã¹ã¿ãåããéåžžã«åçŽãªä»®æ³ãã·ã³ã§ãããããããããã«ãããããããBPFã¯ãããã¯ãŒã¯ãã±ããã®ãã£ã«ã¿ãªã³ã°ãå€§å¹ ã«å éããŸããããã€ãŠãããã¯å€§ããªåé²ã§ããã
2014幎ãAlexeyStarovoitovã¯BPFã®æ©èœãæ¡åŒµããŸããã圌ã¯ã¬ãžã¹ã¿ãŒã®æ°ãšããã°ã©ã ã®èš±å®¹ãµã€ãºãå¢ãããJITã³ã³ãã€ã«ãè¿œå ããããã°ã©ã ã®å®å šæ§ããã§ãã¯ããããªãã¡ã€ã¢ãäœæããŸãããããããæãå°è±¡çãªããšã¯ããã±ãããåŠçãããšãã ãã§ãªããå€æ°ã®ã«ãŒãã«ã€ãã³ãã«å¿çããŠãæ°ããBPFããã°ã©ã ãèµ·åããã«ãŒãã«ãšãŠãŒã¶ãŒã¹ããŒã¹ã®éã§æ å ±ãããåãã§ããããšã§ããã
ãããã®å€æŽã«ãããBPFã®æ°ãããŠãŒã¹ã±ãŒã¹ãžã®éãéãããŸããã以åã¯è€éã§å±éºãªã«ãŒãã«ã¢ãžã¥ãŒã«ãäœæããããšã«ãã£ãŠè¡ãããŠããããã€ãã®ããšã¯ãBPFãä»ããŠæ¯èŒçç°¡åã«å®è¡ã§ããããã«ãªããŸããããªããããã¯ãŒã«ãªã®ã§ããïŒã¢ãžã¥ãŒã«ã®äœæäžã«ãã¹ããããšããããã¯ã«ã€ãªããããšãããããããã§ãããµããµãã®Go-shnoyãããã¯ã§ã¯ãªããã«ãŒãã«ãããã¯ã«ãªããŸãããã®åŸã¯åèµ·åããã ãã§ãã
çŸåšãå¹³åçãªLinuxãŠãŒã¶ãŒã¯ã以åã¯ããŒãã³ã¢ã«ãŒãã«éçºè ãŸãã¯ä»ã®èª°ããå©çšã§ãããå éšã調ã¹ãããã®è¶ èœåãæã£ãŠããŸãããã®ãªãã·ã§ã³ã¯ãiOSãŸãã¯Androidçšã®ããã°ã©ã ãç°¡åã«äœæããæ©èœã«å¹æµããŸããå€ãé»è©±ã§ã¯äžå¯èœã§ããããã¯ããã«å°é£ã§ããã
Alexeyã®æ°ããããŒãžã§ã³ã®BPFã¯ãeBPFãšããååã§ããïŒextended-extendedãšããåèªããïŒãããããä»ã§ã¯ãã¹ãŠã®å€ãããŒãžã§ã³ã®BPFã«åã£ãŠä»£ãããéåžžã«äººæ°ãé«ãŸã£ãŠãããããç°¡åã«ããããã«åã«BPFãšåŒãã§ããŸãã
BPFã¯ã©ãã§äœ¿çšãããŸããïŒ
ã§ã¯ãBPFããã°ã©ã ãã¢ã¿ããã§ãããããã®ã€ãã³ããŸãã¯ããªã¬ãŒã¯äœã§ããã人ã ã¯ã©ã®ããã«ããŠãã®æ°ããçºèŠãããåãå©çšãå§ããã®ã§ããããã
çŸåšãããªã¬ãŒã«ã¯2ã€ã®å€§ããªã°ã«ãŒãããããŸãã
æåã®ã°ã«ãŒãã¯ããããã¯ãŒã¯ãã±ããã®åŠçãšãããã¯ãŒã¯ãã©ãã£ãã¯ã®ç®¡çã«äœ¿çšãããŸãããããã¯ãXDPããã©ãã£ãã¯å¶åŸ¡ã€ãã³ãããã®ä»ããã€ãã§ãã
ãããã®ã€ãã³ãã¯æ¬¡ã®ç®çã§å¿ èŠã§ãã
- , . Cloudflare Facebook BPF- DDoS-. ( BPF- ), . .
- , , â , , . . Facebook, , , .
- ã¹ããŒããã©ã³ãµãŒãæ§ç¯ããŸããæãé¡èãªäŸã¯Ciliumãããžã§ã¯ãã§ãããã¯K8sã¯ã©ã¹ã¿ãŒã§ã¡ãã·ã¥ãããã¯ãŒã¯ãšããŠæãé »ç¹ã«äœ¿çšãããŸããCiliumã¯ãã©ãã£ãã¯ã管çãããã©ã³ã¹ãåãããªãã€ã¬ã¯ãããåæããŸãããããŠãããã¯ãã¹ãŠããããã¯ãŒã¯ãã±ãããŸãã¯ãœã±ããã«é¢é£ããã€ãã³ãã«å¿çããŠã«ãŒãã«ãå®è¡ããå°ããªBPFããã°ã©ã ã®å©ããåããŠè¡ãããŸãã
ããã¯ãåäœã«åœ±é¿ãäžããæ©èœãåãããããã¯ãŒã¯åãããåé¡ã«é¢é£ããããªã¬ãŒã®æåã®ã°ã«ãŒãã§ããã2çªç®ã®ã°ã«ãŒãã¯ãããäžè¬çãªå¯èŠ³æž¬æ§ã«é¢é£ããŠããŸãããã®ã°ã«ãŒãã®ããã°ã©ã ã¯ãã»ãšãã©ã®å Žåãäœãã«åœ±é¿ãäžããèœåãæã£ãŠããŸããããã芳å¯ãããããšããã§ããŸããã圌女ã¯ç§ã«ãã£ãšèå³ãæã£ãŠããŸãã
ãã®ã°ã«ãŒãã«ã¯ã次ã®ãããªããªã¬ãŒãå«ãŸããŠããŸãã
- perf events â , Linux- perf: , , minor/major- . . , , , - . , , , , .
- tracepoints â ( ) , (, ). , â , , , , . - , tracepoints :
- ;
- , ;
- API, , , , , API.
, , , , , pprof .
- ;
- USDT â , tracepoints, user space-. . : MySQL, , PHP, Python. enable-dtrace . , Go . -, , DTrace . , , Solaris: , , GC -, .
ããã§ã¯ãå¥ã®ã¬ãã«ã®éæ³ãå§ãŸããŸãã
- ftraceããªã¬ãŒã䜿çšãããšãã»ãšãã©ãã¹ãŠã®ã«ãŒãã«é¢æ°ã®éå§æã«BPFããã°ã©ã ãå®è¡ã§ããŸããå®å
šã«åçãããã¯ãéžæããã«ãŒãã«é¢æ°ãå®è¡ãéå§ããåã«ãã«ãŒãã«ãBPFé¢æ°ãåŒã³åºãããšãæå³ããŸãããŸãã¯ãã¹ãŠã®ã«ãŒãã«æ©èœ-äœã§ãããã¹ãŠã®ã«ãŒãã«é¢æ°ã«ã¢ã¿ããããŠãåºåå
ã®ãã¹ãŠã®åŒã³åºããé©åã«èŠèŠåã§ããŸãã
- kprobes / uprobesã¯ftraceãšã»ãŒåããã®ãæäŸããŸãããã«ãŒãã«ãšãŠãŒã¶ãŒã¹ããŒã¹ã®äž¡æ¹ã§ãé¢æ°ãå®è¡ãããšãã«ä»»æã®å Žæã«ã¹ãããããæ©èœãããããŸãããé¢æ°ã®éäžã«ããçš®ã®ifãå€æ°ã«ããããã®å€æ°ã®å€ã®ãã¹ãã°ã©ã ãããããããå¿
èŠããããŸããïŒåé¡ãªãã
- kretprobes/uretprobes â , user space. , , . , , PID fork.
ç¹°ãè¿ããŸãããããããã¹ãŠã®ããªã¬ãŒã®ããããã§åŒã³åºããããšãBPFããã°ã©ã ã¯ãé¢æ°åŒæ°ã®èªã¿åããã¿ã€ã ã¯ããã¯ãå€æ°ã®èªã¿åããã°ããŒãã«å€æ°ãã¹ã¿ãã¯ãã¬ãŒã¹ã®ååŸãä¿åãªã©ããã調ã¹ãããšãã§ããŸãããã®åŸãåŠçã®ããã«ãŠãŒã¶ãŒã¹ããŒã¹ã«ããŒã¿ã転éãããã£ã«ã¿ãªã³ã°ãŸãã¯ããã€ãã®å¶åŸ¡ã³ãã³ãã®ããã«ãŠãŒã¶ãŒã¹ããŒã¹ããããŒã¿ãååŸããŸããçŸããïŒ
ããªãã®ããšã¯ããããŸããããç§ã«ãšã£ãŠæ°ããã€ã³ãã©ã¹ãã©ã¯ãã£ã¯ãç§ãé·ãéå¿é ããŠåŸ ã£ãŠããããã¡ãã®ãããªãã®ã§ãã
APIããŸãã¯ãã®äœ¿çšæ¹æ³
ããŠããã«ã³ãããªãã¯ç§ãã¡ã«BPFã«ç®ãåããããã«èª¬åŸããŸãããããããã©ã®ããã«ããã«ã¢ãããŒãããã®ã§ããïŒ
BPFããã°ã©ã ãäœã§æ§æãããŠãããããããŠãããšã©ã®ããã«çžäºäœçšããããèŠãŠã¿ãŸãããã
ãŸããæ€èšŒãããå Žåã«ã«ãŒãã«ã«ããŒããããBPFããã°ã©ã ããããŸããããã§ãJITããã·ã³ã³ãŒãã«ã³ã³ãã€ã«ãããããªã¬ãŒãèµ·åãããšã«ãŒãã«ã¢ãŒãã§å®è¡ãããŸãã
BPFããã°ã©ã ã«ã¯ã2çªç®ã®éšåã§ãããŠãŒã¶ãŒã¹ããŒã¹ããã°ã©ã ãšå¯Ÿè©±ããæ©èœããããŸãããããè¡ãã«ã¯2ã€ã®æ¹æ³ããããŸãã埪ç°ãããã¡ã«æžã蟌ãããšãã§ãããŠãŒã¶ãŒã¹ããŒã¹éšåã¯ããããèªã¿åãããšãã§ããŸãããŸããBPFããããšåŒã°ããkey-value-storageã§ã®æžã蟌ã¿ãšèªã¿åããå¯èœã§ããããŠãŒã¶ãŒã¹ããŒã¹éšåãåãããšãå®è¡ã§ãããããçžäºã«æ å ±ã転éã§ããŸãã
ãŸã£ãããªé
BPFãæäœããæãç°¡åãªæ¹æ³ã¯ãCèšèªã«äŒŒãBPFããã°ã©ã ãäœæããClangã³ã³ãã€ã©ã䜿çšããŠãã®ã³ãŒããä»®æ³ãã·ã³ã³ãŒãã«ã³ã³ãã€ã«ããããšã§ãã次ã«ãBPFã·ã¹ãã åŒã³åºãã䜿çšããŠãã®ã³ãŒããçŽæ¥ããŒãããBPFã·ã¹ãã åŒã³åºãã䜿çšããŠBPFããã°ã©ã ãšå¯Ÿè©±ããŸãã
å©çšå¯èœãªæåã®ç°¡ç¥åã¯ãã«ãŒãã«ãœãŒã¹ã«ä»å±ããBPFã·ã¹ãã åŒã³åºããçŽæ¥æäœããªãããã«ããlibbpfã©ã€ãã©ãªã䜿çšããããšã§ããå®éãã³ãŒããããŒãããããã®äŸ¿å©ãªã©ãããŒãæäŸããã«ãŒãã«ãããŠãŒã¶ãŒã¹ããŒã¹ã«ããŒã¿ã転éãããæ»ãããããããã®ããããããããæäœããŸãã
bcc
ãã®ãããªäœ¿çšã人éã«åªãããšã¯ã»ã©é ãããšã¯æããã§ãã幞ããiovizorãã©ã³ãã§BCCãããžã§ã¯ããç»å Žããç§ãã¡ã®ç掻ãå€§å¹ ã«ç°¡çŽ åãããŸããã
å®éããã«ãç°å¢å šäœãæºåããåäžã®BPFããã°ã©ã ãäœæããæ©äŒãæäŸããŸãããã®ããã°ã©ã ã§ã¯ãCããŒããèªåçã«ã¢ã»ã³ãã«ãããŠã«ãŒãã«ã«ããŒãããããŠãŒã¶ãŒã¹ããŒã¹ããŒãã¯ã·ã³ãã«ã§ç解ããããPythonã§å®è¡ã§ããŸãã
bpftrace
ããããBCCã¯å€ãã®ç¹ã§è€éã«èŠããŸããäœããã®çç±ã§ã人ã ã¯ç¹ã«Cã§ããŒããæžãããš
ã奜ã¿ãŸãããiovizorã®åã人ãbpftraceããŒã«ãå°å ¥ããŸããããã®ããŒã«ã䜿çšãããšãAWKïŒãŸãã¯éåžžã¯ã¯ã³ã©ã€ããŒïŒã®åçŽãªã¹ã¯ãªããèšèªã§BPFã¹ã¯ãªãããèšè¿°ã§ããŸãã
æåãªããã©ãŒãã³ã¹ãšå¯èŠ³æž¬æ§ã®å°é家ã§ããBrendanGreggã¯ãBPFãæäœããããã®å©çšå¯èœãªæ¹æ³ã«ã€ããŠã次ã®èŠèŠåãæºåããŸãã
ãBCCã¯éåžžã«åŒ·åãªããŒã«ã§ãããããã»ã©åçŽã§ã¯ãªãããšãããããŸããbpftraceã¯ã¯ããã«åçŽã§ãããããã»ã©åŒ·åã§ã¯ãããŸããã
BPFã®äœ¿çšäŸ
ããããå ·äœçãªäŸãæããŠãç§ãã¡ãå©çšã§ããããã«ãªã£ãéæ³ã®èœåãèŠãŠã¿ãŸãããã
BCCãšbpftraceã®äž¡æ¹ã«Toolsãã©ã«ããŒãå«ãŸããŠããŸãããã®ãã©ã«ããŒã«ã¯ãæ¢è£œã®é¢çœããŠäŸ¿å©ãªã¹ã¯ãªãããå€æ°å«ãŸããŠããŸãããããã¯ãã¹ã¯ãªããã®ã³ãŒãã®ãã£ã³ã¯ãã³ããŒã§ããããŒã«ã«ã¹ã¿ãã¯ãªãŒããŒãããŒã§ããããŸãã
ããšãã°ãDNSã¯ãšãªã®åŸ ã¡æéã瀺ãã¹ã¯ãªããã¯æ¬¡ã®ãšããã§ãã
ââmarko@marko-home ~
â°â$ sudo gethostlatency-bpfcc
TIME PID COMM LATms HOST
16:27:32 21417 DNS Res~ver #93 3.97 live.github.com
16:27:33 22055 cupsd 7.28 NPI86DDEE.local
16:27:33 15580 DNS Res~ver #87 0.40 github.githubassets.com
16:27:33 15777 DNS Res~ver #89 0.54 github.githubassets.com
16:27:33 21417 DNS Res~ver #93 0.35 live.github.com
16:27:42 15580 DNS Res~ver #87 5.61 ac.duckduckgo.com
16:27:42 15777 DNS Res~ver #89 3.81 www.facebook.com
16:27:42 15777 DNS Res~ver #89 3.76 tech.badoo.com :-)
16:27:43 21417 DNS Res~ver #93 3.89 static.xx.fbcdn.net
16:27:43 15580 DNS Res~ver #87 3.76 scontent-frt3-2.xx.fbcdn.net
16:27:43 15777 DNS Res~ver #89 3.50 scontent-frx5-1.xx.fbcdn.net
16:27:43 21417 DNS Res~ver #93 4.98 scontent-frt3-1.xx.fbcdn.net
16:27:44 15580 DNS Res~ver #87 5.53 edge-chat.facebook.com
16:27:44 15777 DNS Res~ver #89 0.24 edge-chat.facebook.com
16:27:44 22099 cupsd 7.28 NPI86DDEE.local
16:27:45 15580 DNS Res~ver #87 3.85 safebrowsing.googleapis.com
^C%
ãã®ãŠãŒãã£ãªãã£ã¯ãDNSã¯ãšãªã®å®è¡æéããªã¢ã«ã¿ã€ã ã§è¡šç€ºãããããããšãã°ãäºæããªãç°åžžãæ€åºã§ããŸãã
ãããŠãããã¯ä»ã®äººãèªåã®ç«¯æ«ã§å ¥åãããã®ããã¹ãã€ãããã¹ã¯ãªããã§ãã
ââmarko@marko-home ~
â°â$ sudo bashreadline-bpfcc
TIME PID COMMAND
16:51:42 24309 uname -a
16:52:03 24309 rm -rf src/badoo
ãã®çš®ã®ã¹ã¯ãªããã¯ãæªãé£äººãæãŸããããäŒç€Ÿã®ãµãŒããŒã®ã»ãã¥ãªãã£ãç£æ»ãããããããã«äœ¿çšã§ããŸãã
é«ã¬ãã«èšèªã®ãããŒåŒã³åºãã衚瀺ããããã®ã¹ã¯ãªããïŒ
ââmarko@marko-home ~/tmp
â°â$ sudo /usr/sbin/lib/uflow -l python 20590
Tracing method calls in python process 20590... Ctrl-C to quit.
CPU PID TID TIME(us) METHOD
5 20590 20590 0.173 -> helloworld.py.hello
5 20590 20590 0.173 -> helloworld.py.world
5 20590 20590 0.173 <- helloworld.py.world
5 20590 20590 0.173 <- helloworld.py.hello
5 20590 20590 1.174 -> helloworld.py.hello
5 20590 20590 1.174 -> helloworld.py.world
5 20590 20590 1.174 <- helloworld.py.world
5 20590 20590 1.174 <- helloworld.py.hello
5 20590 20590 2.175 -> helloworld.py.hello
5 20590 20590 2.176 -> helloworld.py.world
5 20590 20590 2.176 <- helloworld.py.world
5 20590 20590 2.176 <- helloworld.py.hello
6 20590 20590 3.176 -> helloworld.py.hello
6 20590 20590 3.176 -> helloworld.py.world
6 20590 20590 3.176 <- helloworld.py.world
6 20590 20590 3.176 <- helloworld.py.hello
6 20590 20590 4.177 -> helloworld.py.hello
6 20590 20590 4.177 -> helloworld.py.world
6 20590 20590 4.177 <- helloworld.py.world
6 20590 20590 4.177 <- helloworld.py.hello
^C%
ãã®äŸã¯ãPythonããã°ã©ã ã®åŒã³åºãã¹ã¿ãã¯ã瀺ããŠããŸãã
åãBrendanGreggããåãŠãŒãã£ãªãã£ããç£èŠãã§ãããµãã·ã¹ãã ã瀺ãç¢å°ã䜿çšããŠãæ¢åã®ãã¹ãŠã®ã¹ã¯ãªãããåéããåçãäœæããŸãããã芧ã®ãšãããã»ãŒãã¹ãŠã®å Žåã«ããã§ã«èšå€§ãªæ°ã®æ¢è£œã®ãŠãŒãã£ãªãã£ãå©çšã§ããŸãã
ããã§äœããèŠãããšããªãã§ãã ãããåçã¯åèã«ãªããŸã
Goã§ç§ãã¡ã«ã€ããŠã¯ã©ãã§ããïŒ
ããã§ã¯ãGoã«ã€ããŠè©±ããŸãããã2ã€ã®äž»ãªè³ªåããããŸãã
- Goã§BPFããã°ã©ã ãäœæã§ããŸããïŒ
- Goã§æžãããããã°ã©ã ã解æããããšã¯å¯èœã§ããïŒ
é çªã«è¡ããŸãããã
çŸåšãŸã§ãBPFãã·ã³ãç解ã§ãã圢åŒã«ã³ã³ãã€ã«ã§ããã³ã³ãã€ã©ã¯Clangã ãã§ãããã1ã€ã®äººæ°ã®ããã³ã³ãã€ã©ã§ããGCCã«ã¯ããŸã BPFããã¯ãšã³ãããããŸããããŸããBPFã«ã³ã³ãã€ã«ã§ããå¯äžã®ããã°ã©ãã³ã°èšèªã¯Cã®éåžžã«éå®ãããããŒãžã§ã³ã§ãã
ãã ããBPFããã°ã©ã ã«ã¯ããŠãŒã¶ãŒã¹ããŒã¹ã«ãã2çªç®ã®éšåããããŸãããããŠããã¯å²ç¢ã§æžãããšãã§ããŸãã
äžã§è¿°ã¹ãããã«ãBCCã§ã¯ãããŒã«ã®äž»èŠèšèªã§ããPythonã§ãã®éšåãèšè¿°ã§ããŸããåæã«ãã¡ã€ã³ãªããžããªã§ã¯BCCã¯LuaãšC ++ããµããŒããããµãŒãããŒãã£ã®ãªããžããªã§ã¯GoããµããŒãããŸãã
ãã®ãããªããã°ã©ã ã¯ãPythonããã°ã©ã ãšãŸã£ããåãããã«èŠããŸããæåã«ãCã®BPFããã°ã©ã ã®è¡ãããã次ã«ãã®ããã°ã©ã ãã©ãã«ã¢ã¿ããããããæ瀺ããäœããã®æ¹æ³ã§ãããšå¯Ÿè©±ããŸããããšãã°ãEPFãããããããŒã¿ãååŸããŸãã
å®éãããã ãã§ãããã®äŸã«ã€ããŠã¯ãGithubã§è©³ããèŠãããšãã§ããŸãã
ããããäž»ãªæ¬ ç¹ã¯ãCã©ã€ãã©ãªlibbccãŸãã¯libbpfãäœæ¥ã«äœ¿çšããããã®ãããªã©ã€ãã©ãªã䜿çšããŠGoããã°ã©ã ãæ§ç¯ããããšã¯ãå ¬åãæ£æ©ããã®ã«ãŸã£ãã䌌ãŠããªãããšã§ãã
iovisor / gobpfã«å ããŠãGoã§ãŠãŒã¶ãŒã©ã³ãããŒããäœæã§ããçŸåšã®ãããžã§ã¯ããããã«3ã€èŠã€ãããŸããã
- https://github.com/dropbox/goebpf
- https://github.com/cilium/ebpf
- https://github.com/andrewkroh/go-ebpf
DropboxããŒãžã§ã³ã¯Cã©ã€ãã©ãªãå¿ èŠãšããŸããããClangã䜿çšããŠBPFããã°ã©ã ã®ã«ãŒãã«éšåãèªåã§ãã«ãããGoããã°ã©ã ã䜿çšããŠã«ãŒãã«ã«ããŒãããå¿ èŠããããŸãã
CiliumããŒãžã§ã³ã«ã¯ãDropboxããŒãžã§ã³ãšåãæ©èœããããŸãããããããããCiliumãããžã§ã¯ãã®äººã ã«ãã£ãŠè¡ãããŠãããšããçç±ã ãã§ãèšåãã䟡å€ããããŸããã€ãŸããæåããéåœã«ãããšããããšã§ãã
ç§ã¯çµµã®å®æã®ããã«3çªç®ã®ãããžã§ã¯ããæã£ãŠããŸãããåã®2ã€ã®ããã«ãå€éšCã®äŸåé¢ä¿ã¯ãªããBPF Cããã°ã©ã ã®æåã¢ã»ã³ããªãå¿ èŠã§ãããããŸãæåŸ ã§ããªãããã§ãã
å®éãå¥ã®è³ªåããããŸãããªãGoã§BPFããã°ã©ã ãäœæããã®ã§ãããããçµå±ã®ãšãããBCCãŸãã¯bpftraceãèŠããšãBPFããã°ã©ã ã¯éåžž500è¡æªæºã®ã³ãŒãããå¿ èŠãšããŸããã bpftraceèšèªã§ã¹ã¯ãªãããèšè¿°ããããå°ããªPythonãèŠã€ãããããæ¹ãç°¡åã§ã¯ãããŸãããïŒããã«2ã€ã®çç±ããããŸãã
ãŸããããªãã¯æ¬åœã«Goã倧奜ãã§ããã¹ãŠããããããšæã£ãŠããŸããããã«ãæœåšçã«Goããã°ã©ã ã¯ãéçãªã³ã¯ãåçŽãªãã€ããªãªã©ããã·ã³ãããã·ã³ãžã®ç§»æ€ã容æã§ããããããç§ãã¡ã¯ç¹å®ã®ã³ã¢ã«çžãããŠããã®ã§ããã¹ãŠãããã»ã©æçœã§ã¯ãããŸãããããã§åæ¢ããŸããããããªããšãç§ã®èšäºã¯ããã«50ããŒãžã«ãªããŸãã
2çªç®ã®ãªãã·ã§ã³ïŒåçŽãªã¹ã¯ãªããã§ã¯ãªããå éšã§BPFã䜿çšãã倧èŠæš¡ãªã·ã¹ãã ãäœæããŸããGoã«ãã®ãããªã·ã¹ãã ã®äŸãããããŸãïŒ
Scopeãããžã§ã¯ãã¯ãK8sã€ã³ãã©ã¹ãã©ã¯ãã£ãŸãã¯å¥ã®ã¯ã©ãŠãã§èµ·åããããšãåšå²ã§çºçãããã¹ãŠãåæããã³ã³ããããµãŒãã¹ãããããã©ã®ããã«çžäºäœçšããããªã©ã瀺ã1ã€ã®ãã€ããªã®ããã«èŠããŸãããããã®å€ãã¯BPFã䜿çšããŠè¡ãããŸããèå³æ·±ããããžã§ã¯ãã
Goããã°ã©ã ã®åæ
èŠããŠããããšæããŸããããã1ã€è³ªåããããŸããããã¯ãGoã§èšè¿°ãããããã°ã©ã ãBPFã䜿çšããŠåæã§ããããšããããšã§ããæåã«èãã-ãã¡ããïŒããã°ã©ã ãæžãããŠããèšèªã«ã©ã®ãããªéãããããŸããïŒçµå±ã®ãšãããããã¯ã³ã³ãã€ã«ãããã³ãŒãã§ãããä»ã®ãã¹ãŠã®ããã°ã©ã ãšåæ§ã«ãããã»ããµäžã§äœããèšç®ããããèªäœã§ã¯ãªããã®ããã«ã¡ã¢ãªãæ¶è²»ããã«ãŒãã«ãä»ããŠããŒããŠã§ã¢ãšå¯Ÿè©±ããã·ã¹ãã åŒã³åºããä»ããŠã«ãŒãã«ãšå¯Ÿè©±ããŸããååãšããŠããã¯æ£ããã§ãããããŸããŸãªã¬ãã«ã®è€éãã®æ©èœããããŸãã
åŒæ°ãæž¡ã
1ã€ã®æ©èœã¯ãGoãä»ã®ã»ãšãã©ã®èšèªã䜿çšããABIã䜿çšããªãããšã§ããããŸããŸãåµèšè ã®ç¶èŠªãã¡ã¯ã圌ããããç¥ã£ãŠãããã©ã³9ã·ã¹ãã ã®ABIãæ¡çšããããšã決å®ããŸããã
ABIã¯ããããããã€ããããã³ãã·ã³ã³ãŒãã®ã¬ãã«ã§ã®ã¿ãAPIãçžäºéçšæ§å¥çŽã®ãããªãã®ã§ãã
ç§ãã¡ãèå³ãæã£ãŠããäž»ãªABIèŠçŽ ã¯ããã®åŒæ°ãé¢æ°ã«æž¡ãããæ¹æ³ãšãå¿çãé¢æ°ããè¿ãããæ¹æ³ã§ããæšæºã®x86-64ABIã¯ããã»ããµã¬ãžã¹ã¿ã䜿çšããŠåŒæ°ãšå¿çãæž¡ããŸãããPlan 9ABIã¯ããã«ã¹ã¿ãã¯ã䜿çšããŸãã
Rob PikeãšåœŒã®ããŒã ã¯ãå¥ã®æšæºãäœæããäºå®ã¯ãããŸããã§ãããPlan9ã·ã¹ãã çšã®ã»ãŒæ¢è£œã®Cã³ã³ãã€ã©ããã§ã«ããã2ã2ã®åçŽãªãã®ã§ãããã«Goçšã®ã³ã³ãã€ã©ã«å€æãããŸãããå®éã®ãšã³ãžãã¢ãªã³ã°ã¢ãããŒãã
ããããå®éã«ã¯ãããã¯ããã»ã©é倧ãªåé¡ã§ã¯ãããŸããããŸããGoã§ã¬ãžã¹ã¿ãä»ããŠåŒæ°ãæž¡ãããšãããã«ããããŸãã次ã«ãBPFããã¹ã¿ãã¯ããåŒæ°ãååŸããããšã¯é£ãããããŸãããsargXãšã€ãªã¢ã¹ã¯ãã§ã«bpftraceã«è¿œå ãããŠãããåãããšãBCCã«ã衚瀺ãããŸããããããè¿ãå°æ¥ã§ãã ..ã
UpdïŒç§ãå ±åããç¬éãããABIã§ã®ã¬ãžã¹ã¿ãŒã®äœ¿çšãžã®ç§»è¡ã«é¢ãã詳现ãªå ¬åŒææ¡ããçŸããŸããã
äžæã®ã¹ã¬ããèå¥å
2çªç®ã®æ©èœã¯ãGoã®ãæ°ã«å ¥ãã®æ©èœã§ããgoroutinesãšé¢ä¿ããããŸããé¢æ°ã®åŸ ã¡æéã枬å®ãã1ã€ã®æ¹æ³ã¯ãé¢æ°ã®åŒã³åºãã«ãããæéãç¯çŽããé¢æ°ãçµäºããæéãç¯çŽããå·®ãèšç®ããããšã§ããé¢æ°åãšTIDïŒã¹ã¬ããçªå·ïŒãå«ãããŒã§éå§æéãç¯çŽããŸããåãé¢æ°ãç°ãªãããã°ã©ã ãŸãã¯åãããã°ã©ã ã®ç°ãªãã¹ã¬ããããåæã«åŒã³åºãããšãã§ãããããã¹ã¬ããçªå·ãå¿ èŠã§ãã
ããããGoã§ã¯ããŽã«ãŒãã³ã¯ã·ã¹ãã ã¹ã¬ããéã移åããŸããçŸåšããŽã«ãŒãã³ã¯1ã€ã®ã¹ã¬ããã§å®è¡ãããå°ãåŸã«å¥ã®ã¹ã¬ããã§å®è¡ãããŸãããŸããGoã®å ŽåãããŒã«TIDãå ¥ããã®ã§ã¯ãªããGIDãã€ãŸããŽã«ãŒãã³ã®IDãå ¥ããŸãããååŸããããšã¯ã§ããŸãããæè¡çã«ã¯ããã®IDã¯ååšããŸããã¹ã¿ãã¯ã®ã©ããã«ããã®ã§ãããŒãã£ããã¯ã§ãããåãé€ãããšããã§ããŸããããããè¡ãããšã¯ãäž»èŠãªGoéçºã°ã«ãŒãã®æšå¥šã«ãã£ãŠå³ããçŠæ¢ãããŠããŸãã圌ãã¯ãç§ãã¡ããã®ãããªæ å ±ãå¿ èŠãšããªãã ãããšæããŸãããGoroutineããŒã«ã«ã¹ãã¬ãŒãžãšåæ§ã«ããããç§ã¯éžè±ããŸãã
ã¹ã¿ãã¯ã®æ¡åŒµ
3çªç®ã®åé¡ã¯æãæ·±å»ã§ããéåžžã«æ·±å»ãªã®ã§ã2çªç®ã®åé¡ãäœããã®æ¹æ³ã§è§£æ±ºããŠããGoé¢æ°ã®åŸ ã¡æéã枬å®ããããšã¯ã§ããŸããã
ãããããã»ãšãã©ã®èªè ã¯ã¹ã¿ãã¯ãäœã§ããããããç解ããŠããŸããããŒããŸãã¯ããŒããšã¯å¯Ÿç §çã«ãå€æ°ã«ã¡ã¢ãªãå²ãåœãŠãããšãã§ãããããã解æŸããããšãèããªãåãã¹ã¿ãã¯ã
Cã«ã€ããŠèšãã°ãããã®ã¹ã¿ãã¯ã®ãµã€ãºã¯åºå®ãããŠããŸãããã®åºå®ãµã€ãºãè¶ ãããšãæåãªã¹ã¿ãã¯ãªãŒããŒãããŒãçºçããŸãã
Goã§ã¯ãã¹ã¿ãã¯ã¯åçã§ããå€ãããŒãžã§ã³ã§ã¯ãã¡ã¢ãªã®ãã£ã³ã¯ãé£çµãããŠããŸãããããã§ãåçã«ãµã€ãºå€æŽãããé£ç¶ãããã£ã³ã¯ã«ãªããŸãããããã¯ãéžæããããŒã¹ãç§ãã¡ã«ãšã£ãŠååã§ãªãå ŽåãçŸåšã®ããŒã¹ãæ¡åŒµããããšãæå³ããŸãããŸããå±éã§ããªãå Žåã¯ãå¥ã®å€§ããªããŒã¿ãéžæããŠããã¹ãŠã®ããŒã¿ãå€ãå Žæããæ°ããå Žæã«ç§»åããŸããããã¯ãã»ãã¥ãªãã£ä¿èšŒãcgoãã¬ããŒãžã³ã¬ã¯ã¿ãŒã«è§ŠããŠããéåžžã«é åçãªè©±ã§ãããããã¯å¥ã®èšäºã®ãããã¯ã§ãã
Goãã¹ã¿ãã¯ã移åããã«ã¯ãããã°ã©ã ã®åŒã³åºãã¹ã¿ãã¯ãã€ãŸãã¹ã¿ãã¯äžã®ãã¹ãŠã®ãã€ã³ã¿ãŒããŠã©ãŒã¯ããå¿ èŠãããããšãç¥ã£ãŠããããšãéèŠã§ãã
ããã«äž»ãªåé¡ããããŸããBPFé¢æ°ãã¢ã¿ããããããã«äœ¿çšãããuretprobesã¯ãé¢æ°ã®å®è¡ã®æåŸã«ã¹ã¿ãã¯ãåçã«å€æŽããŠããã³ãã©ãŒããããããã©ã³ããªã³ãžã®åŒã³åºããã€ã³ã©ã€ã³åããŸãããããŠãGoã«ãšã£ãŠäºæããªãã¹ã¿ãã¯ã®ãã®ãããªå€æŽã¯ãã»ãšãã©ã®å Žåãããã°ã©ã ã®ã¯ã©ãã·ã¥ã§çµäºããŸãããã£ãšïŒ
ãããããã®è©±ã¯ãŠããŒã¯ã§ã¯ãããŸããã C ++ã®ãã¹ã¿ãã¯ãã¢ã³ã©ãã©ãŒããäŸå€åŠçæã«ã¯ã©ãã·ã¥ããŸãã
ãã®åé¡ã®è§£æ±ºçã¯ãããŸããããã®ãããªå Žåã®ãã€ãã®ããã«ãåœäºè ã¯ãäºãã®çœªã®çµ¶å¯Ÿã«åççãªè°è«ã亀æããŠããŸãã
ããããæ¬åœã«uretprobeãé 眮ããå¿ èŠãããå Žåã¯ãåé¡ãåé¿ã§ããŸããã©ããã£ãŠïŒ uretprobeãå ¥ããªãã§ãã ãããé¢æ°ãçµäºãããã¹ãŠã®å Žæã«ã¢ããããŒããé 眮ã§ããŸãããã®ãããªå Žæã1ã€ããŸãã¯50ãæãããããããŸããã
ãããŠããã§ãGoã®ç¬èªæ§ãç§ãã¡ã®æã«æž¡ããŸãã
éåžžããã®ãããªããªãã¯ã¯æ©èœããŸãããååã«è³¢ãã³ã³ãã€ã©ã¯ãããããããŒã«ã³ãŒã«æé©åãå®è¡ã§ããŸããé¢æ°ããæ»ã£ãŠã³ãŒã«ã¹ã¿ãã¯ã«æ²¿ã£ãŠæ»ã代ããã«ã次ã®é¢æ°ã®å é ã«ãžã£ã³ãããã ãã§ãããã®çš®ã®æé©åã¯ãHaskellã®ãããªæ©èœèšèªã«ãšã£ãŠéèŠã§ããããããªããã°ãã¹ã¿ãã¯ãªãŒããŒãããŒãªãã§äžæ©ãèžã¿åºãããšã¯ã§ããªãã£ãã§ãããããããããã®ãããªæé©åã§ã¯ãé¢æ°ããæ»ããã¹ãŠã®å ŽæãèŠã€ããããšã¯ã§ããŸããã
ç¹åŸŽã¯ãGoã³ã³ãã€ã©ããŒãžã§ã³1.14ããŸã ããŒã«ã³ãŒã«ã®æé©åãå®è¡ã§ããªãããšã§ããããã¯ãéåžžã«é¢åã§ã¯ãããŸãããé¢æ°ã®ãã¹ãŠã®æ瀺çãªåºå£ã«ã¢ã¿ããããããªãã¯ãæ©èœããããšãæå³ããŸãã
ã®äŸ
BPFãGoã«ãšã£ãŠåœ¹ã«ç«ããªããšã¯æããªãã§ãã ãããããã¯äºå®ãšã¯ã»ã©é ãã§ããäžèšã®ãã¥ã¢ã³ã¹ã«åœ±é¿ãäžããªãä»ã®ãã¹ãŠãè¡ãããšãã§ããŸãããããŠãç§ãã¡ã¯ããããŸãã
ããã€ãã®äŸãèŠãŠã¿ãŸãããã
æºåã®ããã®ç°¡åãªããã°ã©ã ãèŠãŠã¿ãŸããããåºæ¬çã«ã¯ãããŒã8080ã§ãªãã¹ã³ããHTTPèŠæ±ãã³ãã©ãŒãæã€WebãµãŒããŒã§ãããã³ãã©ãŒã¯ãURLããnameãã©ã¡ãŒã¿ãŒãšGoãã©ã¡ãŒã¿ãŒãååŸããããµã€ããã®äœããã®ãã§ãã¯ãå®è¡ããŠããã3ã€ã®å€æ°ïŒååã幎ããã§ãã¯ã¹ããŒã¿ã¹ïŒãã¹ãŠãprepareAnswerïŒïŒé¢æ°ã«éä¿¡ããŸãããã®é¢æ°ã¯ãå¿çãæååãšããŠæºåããŸãã
ãµã€ãæ€èšŒã¯ããã€ããšãŽã«ãŒãã³ã䜿çšããŠäŒè°ãµã€ãã皌åããŠãããã©ããã確èªããHTTPãªã¯ãšã¹ãã§ãããããŠãå¿çãæºåããæ©èœã¯ãããããã¹ãŠèªã¿åãå¯èœãªæååã«å€ããã ãã§ãã
ç°¡åãªã«ãŒã«ãªã¯ãšã¹ãã§ããã°ã©ã ãããªã¬ãŒããŸãã
æåã®äŸãšããŠãbpftraceã䜿çšããŠãããã°ã©ã ã®ãã¹ãŠã®é¢æ°åŒã³åºããåºåããŸããããã§ã¯ãmainã«è©²åœãããã¹ãŠã®æ©èœã«æ·»ä»ããŸãã Goã§ã¯ããã¹ãŠã®é¢æ°ã«ããã±ãŒãžå-ãããé¢æ°åã®ãããªèšå·ãä»ããŠããŸããç§ãã¡ã®ããã±ãŒãžã¯ã¡ã€ã³ã§ãããé¢æ°runtimeã¯runtimeã«ãªããŸãã
curlãå®è¡ãããšããã³ãã©ãŒããµã€ãæ€èšŒæ©èœãããã³ãŽã«ãŒãã³ãµãæ©èœãèµ·åãã次ã«å¿çæºåæ©èœãèµ·åããŸããã¯ã©ã¹ïŒ
次ã«ãå®è¡ãããŠããé¢æ°ã ãã§ãªãããããã®åŒæ°ã衚瀺ããããšæããŸãã prepareAnswerïŒïŒé¢æ°ãèŠãŠã¿ãŸãããã圌女ã«ã¯3ã€ã®è°è«ããããŸãã 2ã€ã®intãå°å·ããŠã¿ãŸãããã
bpftraceã䜿çšããŸãããçŸåšã¯1ã©ã€ããŒã§ã¯ãªããã¹ã¯ãªããã§ããé¢æ°ã«ã¢ã¿ããããåè¿°ã®ã¹ã¿ãã¯åŒæ°ã®ãšã€ãªã¢ã¹ã䜿çšããŸãã
åºåã«ã¯ã2020幎ã«æž¡ãããã¹ããŒã¿ã¹200ãååŸãã2021ã1åæž¡ãããã®ã衚瀺ãããŸãã
ãã ãããã®é¢æ°ã«ã¯3ã€ã®åŒæ°ããããŸããæåã®ãã®ã¯æååã§ãã圌ã«ã€ããŠã¯ã©ãã§ããïŒ
0ãã4ãŸã§ã®ãã¹ãŠã®ã¹ã¿ãã¯åŒæ°ãåºåããŠã¿ãŸãããããããŠäœãããããŸããïŒããã€ãã®å€§ããªæ°åãããã€ãã®å°ããªæ°åããããŠç§ãã¡ã®å€ã2021ãš200ãæåã®ãããã®å¥åŠãªæ°åã¯äœã§ããïŒ
ããã§ãGoããã€ã¹ãç¥ã£ãŠãããšäŸ¿å©ã§ãã Cã§æååãæåã®ãŒãã§çµäºããé åã§ããå ŽåãGoã§ã¯æååã¯å®éã«ã¯æåã®é åïŒã¡ãªã¿ã«ãŒãã§çµäºããªãïŒãžã®ãã€ã³ã¿ãšé·ãã§æ§æãããæ§é ã§ãã
ãã ããGoã³ã³ãã€ã©ã¯ãæååãåŒæ°ãšããŠæž¡ããšããã®æ§é ãå±éããŠ2ã€ã®åŒæ°ãšããŠæž¡ããŸãããããŠãæåã®å¥åŠãªæ°åã¯ç§ãã¡ã®é åãžã®åãªããã€ã³ã¿ã§ããã2çªç®ã¯é·ãã§ããããšãããããŸããã
ãããŠçå®ïŒæååã®äºæ³ãããé·ãã¯22ã§ãã
ãããã£ãŠããã€ã³ã¿ã¬ãžã¹ã¿ã¹ã¿ãã¯ãšæ£ãããªãã»ãããä»ããŠãããã®2ã€ã®å€ãååŸããããã«ã¹ã¯ãªãããå°ãä¿®æ£ããçµã¿èŸŒã¿é¢æ°strïŒïŒã䜿çšããŠæååãšããŠåºåããŸãããã¹ãŠãæ©èœ
ããŸããã§ã¯ãã©ã³ã¿ã€ã ãèŠãŠã¿ãŸããããããšãã°ãç§ãã¡ã®ããã°ã©ã ãã©ã®ãããªãŽã«ãŒãã³ãç«ã¡äžããã®ãç¥ããããšæããŸããããŽã«ãŒãã³ã¯newprocïŒïŒé¢æ°ãšnewproc1ïŒïŒé¢æ°ã«ãã£ãŠããªã¬ãŒãããããšãç§ã¯ç¥ã£ãŠããŸãããããã«æ¥ç¶ããŸãããã newproc1ïŒïŒé¢æ°ã®æåã®åŒæ°ã¯ãfuncvalæ§é ãžã®ãã€ã³ã¿ãŒã§ããããã£ãŒã«ãã¯1ã€ã ãã§ãïŒé¢æ°ãã€ã³ã¿ãŒïŒã
ãã®å Žåãã¹ã¯ãªããã§çŽæ¥æ§é ãå®çŸ©ããæ©äŒãå©çšããŸãããªãã»ããã»ããã§éã¶ãããå°ãç°¡åã§ããããã§ã¯ããã³ãã©ãŒãåŒã³åºããããšãã«èµ·åããããã¹ãŠã®ãŽã«ãŒãã³ãåŒãåºããŸããããã®åŸããªãã»ããã®ã·ã³ãã«ã®ååãååŸãããšããã®äžã«checkSiteé¢æ°ã衚瀺ãããŸãããã£ããŒïŒ
ãããã®äŸã¯ãBPFãBCCãããã³bpftraceæ©èœã®æµ·ã®äœäžã§ããå éšã®é©åãªç¥èãšçµéšãããã°ãå®è¡äžã®ããã°ã©ã ãåæ¢ãããå€æŽãããããããšãªããã»ãšãã©ãã¹ãŠã®æ å ±ãååŸã§ããŸãã
çµè«
ãããç§ãããªãã«äŒãããã£ããã¹ãŠã§ããç§ã¯ããªãã«åºæ¿ãäžããããšãã§ãããšæããŸãã
BPFã¯ãLinuxã§æããã¬ã³ãã£ã§æãææãªãã¬ã³ãã®1ã€ã§ãããããŠãä»åŸæ°å¹Žéã§ããã¯ãããžãŒèªäœã ãã§ãªããããŒã«ãšãã®é åžã«ãããŠããããã«å€ãã®èå³æ·±ãããšãèŠããããšç¢ºä¿¡ããŠããŸãã
æé ãã«ãªãã誰ããBPFã«ã€ããŠç¥ã£ãŠããããã§ã¯ãªãåã«ãBPFã§éãã§ãããžã·ã£ã³ã«ãªããåé¡ã解決ããŠãååãå©ããŠãã ããã圌ãã¯ãéæ³ã®ããªãã¯ã¯äžåºŠã ãåããšèšããŸãã
Goã«é¢ããŠã¯ããã€ãã®ããã«ãç§ãã¡ã¯ããªããŠããŒã¯ã§ãããç§ãã¡ã¯åžžã«ããã€ãã®ãã¥ã¢ã³ã¹ãæã£ãŠããŸããã³ã³ãã€ã©ãç°ãªãããABIã§ããããããçš®ã®GOPATHãå¿ èŠã§ããããã¯ãGoogleã«ã¯ã§ããªãååã§ããããããç§ãã¡ã¯å°æ¬ãããåã«ãªãã人çã¯è¯ããªãã ãã ãšç§ã¯ä¿¡ããŠããŸãã