ç§ãã¡ã¯çãçç£ã«ãããŠè€éãªãšã©ãŒã«ééããŸããããããã¯åŸæ¥ã®ç£èŠããŒã«ã§ã¯èŠã€ããã®ãå°é£ã§ãã BPFã¯ãäºåã«æºåããããšãªããå®è¡äžã®åäœäžã®ã·ã¹ãã äžã§çŽæ¥é«éãã€å®å
šãªåçãããã°ãå¯èœã«ããLinuxã«ãŒãã«ãã¯ãããžãŒã§ãã JVMèªäœã«ã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®è¿œè·¡ããªããžã§ã¯ãã®å²ãåœãŠãJNIåŒã³åºããããã«ã¡ãœããåŒã³åºãã®ããã®å€ãã®ç£èŠãã€ã³ãããããè¿œå ã®ã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³ã¯äžèŠã§ãã ãããã®ç£èŠãã€ã³ãã§ã¯äžååãªå ŽåãLinuxã«ãŒãã«ãšããããçš®é¡ã®ã©ã€ãã©ãªã䜿çšããŠãã·ã¹ãã ã³ãŒã«ããããã¯ãŒã¯ãã±ãããã¹ã±ãžã¥ãŒã©ã€ãã³ãããã£ã¹ã¯ã¢ã¯ã»ã¹ã«è²»ããããæéãããã«ã¯ããŒã¿ããŒã¹ã¯ãšãªãŸã§è¿œè·¡ã§ããŸãã
ãã®ãããã¹ãã§ã¯ãBPFããŒã«ã䜿çšããŠGNU / Linuxäžã®JVMã¢ããªã±ãŒã·ã§ã³ãç£èŠããæ¹æ³ã«é¢ããSasha Goldshteinã¬ããŒãã®ããã¹ã埩å·åãšã fileslower ã opensnoop ã straceãªã©ã®å€å
žçãªããŒã«ã䜿çšããããã©ãŒãã³ã¹ãã§ãã¯ãªã¹ããäœæããŸããããé䟵襲çã§é«éãã€å®å
šãªBPFãã¯ãããžãŒã䜿çšããŸãã
ãã£ããã®åŸãã¹ã©ã€ãä»ãã®åçããããããããŸãã 泚æãã©ãã£ãã¯ïŒ åçã¯å¯èœãªéãçž®å°ãããŸããããã以äžã¯çž®å°ãããŸããã ãããã¯ãã¹ãŠæ¬åœã«å¿
èŠã§ãã
ä»æ¥ã¯ãææ°ã®æå
端ã®LinuxããŒã«ã䜿çšããç£èŠã«ã€ããŠèª¬æããŸãã ç§ã®ååã¯Sasha Goldsteinã§ããMicrosoftã®.NETã«é¢é£ããå€ãã®ããšãããŠããŸãã æ°å¹Žéãç§ã¯Linuxã®ç£èŠããã³ãã¬ãŒã¹ããŒã«ã«é¢äžããŠããŸãããäžè¬ã«ãéå»12幎éã®ç§ã®ä»äºã¯ããã©ãŒãã³ã¹ã«é¢é£ããŠããŸãã C ++ã§ã¢ããªã±ãŒã·ã§ã³ãç£èŠããããã«äœ¿çšãããLinuxçšã®åãããŒã«ïŒç§ã¯ãããéåžžã«é »ç¹ã«è¡ããŸãïŒãPythonã§ã¯ïŒæã
ãããè¡ããŸãïŒãLinuxã§Javaã¢ããªã±ãŒã·ã§ã³ã®éèŠãªåé¡ãç£èŠãæ¹åã远跡ããã³è§£æ±ºããããã«äœ¿çšã§ããããšãå€æããŸããã ç§ãããŠããããšã®ããã€ãã¯ãJavaéçºè
ã«ãšã£ãŠã䟿å©ã§ãã
è¬æŒã§ã¯ãå°éã®Linuxãã¬ãŒã¹ããŒã«ãšãããããJavaã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšããæ¹æ³ã«ã€ããŠèª¬æããŸãã ã€ãŸããæ°·å±±ã®äžè§ã ãã玹ä»ããŸãããããã¯ãä»ã®èšèªãç°å¢ã§äœ¿çšã§ããã·ã¹ãã ã¬ãã«ã®ããŒã«ã§ãã ãããã£ãŠãJavaã§ããæžãããŠããªãã¢ããªã±ãŒã·ã§ã³ããããã°ãŸãã¯ãããã¡ã€ãªã³ã°ããå¿
èŠãããå Žåã¯ãJavaã³ãŒãã§ã®ã¿åäœããå€ãã®Javaãããã¡ã€ã©ãŒãšã¯ç°ãªãããããã®ããŒã«ã䟿å©ã§ãã
è¬çŸ©ã®äžã§ãç§ã¯ããªãã«åœ¹ç«ã€ãšæããã4ã€ã®äž»èŠãªãã€ã³ãã匷調ããŸãã æåã«ãJVMã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšã§ãããããã«äœ¿çšã§ãããã¬ãŒã¹ããŒã«ãæ£ç¢ºã«èŠã€ããŸãã ããã«ã€ããŠã¯å°ãã ã話ããŸãããã 第äºã«ãããã¯éèŠãªãããã¯ã®1ã€ã§ããã BPF ïŒããã¯ã·ã¹ãã ã¬ãã«ã®ãã¯ãããžãŒã§ãïŒãããã³Linuxã®ææ°ã®ãã¬ãŒã¹ããŒã«ã§å€§ããå€æŽã§ããããšã«ã€ããŠèª¬æããŸãã Linuxã§å®çšŒåäžã 第äžã«ãããã©ãŒãã³ã¹ãè©äŸ¡ããããã®ããŒã«ã®äžçš®ã®ãã§ãã¯ãªã¹ãã瀺ããŸããããã䜿çšãããšãç°¡åãã€è¿
éã«äºåããŒã¿ãååŸã§ããŸãã æåŸã«ãããæŽç·ŽãããæŽç·ŽãããããŒã«ã䜿çšããŠç¹å®ã®åé¡ã解決ãããçŠç¹ãçµã£ãç 究ã®äŸã瀺ããŸãã
å±éäžã«Linux以å€ã®ãã®ã䜿çšããããšãããå Žåãä»ã®ã·ã¹ãã ã«ã¯ãããã®ããŒã«ã«é¡äŒŒãããã®ããããŸãã Windowsã§ã¯ãç§ã話ãããã€ãã®ããšã§ETWãå®è¡ã§ããŸãã FreeBSDããã³MacOSã§ã¯ã DTraceã䜿çšã§ããŸãã BPFã¯ãLinuxåãã®DTraceã§ãããšèšã人ããããããããŸãããã BPFã¯ãããåŒã³åºãããšã奜ã¿ãŸããã
次ã«ãLinuxçšã®ãã¬ãŒã¹ããŒã«ã®äžè¬çãªæŠèŠãã°ã©ã圢åŒã§çŽ¹ä»ããŸãã

氎平軞ã¯è©³çŽ°ã¬ãã«ãã€ãŸãããŒã«ãæäŸã§ãã詳现æ
å ±ã®ã¬ãã«ã§ãã 瞊軞ã¯äœ¿ããããã§ãã å¥ã®è²ã¯ãæéãç¡é§ã«ããªãæ°ããããŒã«ãå®å®ããããŒã«ãããã³å»æ¢ãããããŒã«ãè¡šããŸãã
å€ãã®å Žåãç¹ã«ã·ã¹ãã ã¬ãã«ã§äœæ¥ããŠããªãéçºè
ã«ãšã£ãŠã人ã
ã¯ftraceã«äžæ
£ãã§ãã ftraceã®ããšãèããããšããããŸããïŒ ããªãå°æ°ã Ftraceã¯çµã¿èŸŒã¿ã®ã¡ã«ããºã ã§ãããæããLinuxã«çµã¿èŸŒãŸããŠãããããã©ãŒãã³ã¹ã®åé¡ãçç£äžã®ãã°ããã¬ãŒã¹ããããã®ããŒã«ã§ãã ãã ããJavaã䜿çšããããšã¯æå³ãããŠããŸããã ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãã¯ã©ã¹ã®èªã¿èŸŒã¿ããªããžã§ã¯ãã®å²ãåœãŠãªã©ãå€ãã®èå³æ·±ãJavaã€ãã³ãããã¬ãŒã¹ããããã«äœ¿çšããããšã¯ã§ããŸããã
perfã«ç§»ããŸãããã ããªãã䜿çšãã䟿å©ãªããŒã«ã¯ã©ãã§ããïŒ ãã§ã«ã¯ããã«å€ãã®äººã
ã ç§ã«ç¶ãã¹ããŒã«ãŒã¯ã perfãJavaã¢ããªã±ãŒã·ã§ã³ã§åäœããããã«é©å¿ãããæ¹æ³ã«ã€ããŠè©±ããŸãã ç§ã®ã¬ããŒãã§ã¯ã perfã䜿çšãããåŸã§ãã®çç±ã説æããŸãã ããããç§ã¯ãããã¯ããã«åºãç¯å²ã®ã¢ããªã±ãŒã·ã§ã³ã«é©çšå¯èœã§ãããšèšãã§ãããã
次ã«ã SystemTap ã ã©ããããã®äººãããã䜿ã£ãããèããããšããããŸããïŒ ç¹°ãè¿ããŸããã以åã«æãæãã人ã¯ã»ãšãã©ããªãããã§ãã SystemTapã¯éåžžã«äœã¬ãã«ã®ããŒã«ã§ããããŠãŒã¶ãŒç©ºéã®ã«ãŒãã«ã€ãã³ããšé«ã¬ãã«ã€ãã³ãïŒJavaã€ãã³ããå«ãïŒããã¬ãŒã¹ã§ããŸãã å€ãã®äººãSystemTapã§ééããäž»ãªåé¡ã¯ããã®ããŒã«ã䜿çšããã«ã¯ãå®è¡äžã«ã«ãŒãã«ã¢ãžã¥ãŒã«ãã³ã³ãã€ã«ããã«ãŒãã«ã«ããŒãããå¿
èŠãããããšã§ãã ä»ã®äººã¯ãåçã«ã³ã³ãã€ã«ãããã«ãŒãã«ã¢ãžã¥ãŒã«ãããŒãããŠãããã»ã©ç±æã¯ãããŸããã SystemTapã®äœæè
ã¯BPFã®ããã¯ãšã³ããéçºããŠãããããåãã¬ãŒã¹ããã°ã©ã çšã«æ°ããã«ãŒãã«ã¢ãžã¥ãŒã«ãã³ã³ãã€ã«ããããšã¯ã§ããŸãããããããŸã§ã®ãšããåé¡ãæ®ã£ãŠããŸãã
ã¹ãã¯ãã«ã®å¯Ÿæ¥µã«ããã®ã¯ãæ倧éã®å¯çšæ§ãšå©äŸ¿æ§ã§ãããæ©èœæ§ã¯å£ããŸããããã¯SysDigã§ãã äœäººäœ¿çšããŸãããïŒ ããã«å°ãªã人ã SysDigã¯ãã³ã³ããå
ã®ããã©ãŒãã³ã¹ã®è¿œè·¡ã«ç¹ã«éç¹ã眮ããåªããããŒã«ã§ãããã·ã¹ãã ã³ãŒã«ã§ã®ã¿æ©èœããŸãã 圌ã¯ããŸããã£ãŠããŸããããã以äžäœãç¥ããŸããã Javaã¢ããªã±ãŒã·ã§ã³ã«å¿
èŠãªãã®ã§ã¯ãããŸããã
ä»æ¥ã¯äž»ã«BPFããŒã¹ã®ããŒã«ã«ã€ããŠèª¬æããŸãããåŸã§BPFèªäœã«é²ã¿ãŸãã BPFã«ã¯ããã€ãã®ããã³ããšã³ãããããããã«åºã¥ãããŒã«ã¯Cã§äœæã§ããŸããPythonã«ã¯å€ãã®ãªãã·ã§ã³ããããŸãã ã¬ããŒãã§è°è«ããããã®ã¯æ°ãããã®ã§ãããä»ã®äººã»ã©å®å®ããŠããŸããããéåžžã«åŒ·åã§ãã 圌ãã®ç®æ°ããã®ããã«ãããã¯æã
éåžžã«ç°¡åã§ã¯ãããŸããããããã¯äŸ¡å€ããããŸã-å°ãªããšãä»æ¥ããã蚌æããããšæã£ãŠããŸãã
ä»ã®ããŒã«ããããŸãã ããšãã°ã次ã®ãããªå€ããã® Linuxã§ã®DTrace ã ããã¯ããªãéå¿çãªãããžã§ã¯ãã§ããããæçµçã«åœŒã¯æ»ã«ãŸããã å
ã»ã©èšã£ãããã«ããã®çš®ã®BPF㯠Linuxã®DTraceã§ãããç§ãã¡ã«ã¯æ¬ ããŠããŸããã
ä»æ¥ãJavaã泚ç®ãããŠãããããJVMã®ç£èŠãã€ã³ãã«ã€ããŠèª¬æããŸãããã JVMã«åºæã®å®è¡äžã®Javaã¢ããªã±ãŒã·ã§ã³ã§è¿œè·¡ã§ãããã®ãã€ãŸã ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«ãã£ãŠå®è¡ããããã®ïŒã·ã¹ãã ã³ãŒã«ããããã¯ãŒã¯ã€ãã³ãïŒä»¥å€ïŒ Javaã®ææ°ããŒãžã§ã³ã§ã¯ãJVMã«ã¯å®è¡æã«å«ããããšãã§ããå€ãã®éçãã¬ãŒã¹ãã€ã³ãããããŸããã€ãŸããäºåã«ãªã³ã«ããå¿
èŠã¯ãããŸããã 次ã«ãå¿
èŠãªæ
å ±ãæäŸãããããã®ãã€ã³ãã«ãã¬ãŒã¹ããã°ã©ã ãæ¥ç¶ã§ããŸãã

ãããã®ãã¬ãŒã¹ãã€ã³ãã®ãªã¹ããååŸããæ¹æ³ã®1ã€ã説æããŸãã Linuxã«ã¯ã ELFããããŒãåæããŠã¡ã¢ãäœæã§ããreadelfããŒã«ããããŸãã ãããã¯ãã·ã¹ãã äžã®Javaã¢ããªã±ãŒã·ã§ã³ã«çµã¿èŸŒãŸããŠããéåžžã«ãã¬ãŒã¹ãã€ã³ããèšè¿°ããŸãã é«ã¬ãã«ã®Javaã€ãã³ãã§ããclass_loaded
ã thread_start
ã object_alloc
ããããã®ãã€ã³ããä»ããŠãã¬ãŒã¹ã§ããŸãã

å¥ã®ããŒã«tplistããããŸãããããã¯å€å°äœ¿ãããããèªåã§äœæããŸããã åçŽãªãªã¹ããäœæãããããã¡ã¢ã解æããå¿
èŠã¯ãããŸããã ããã«ã¯äœåãã®ãã¬ãŒã¹ãã€ã³ãããããŸããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãã¢ãã¿ãŒã®ããã¯ã¢ãããšè±éãJNIã€ãã³ãïŒã¹ã©ã€ãã«ã¯è¡šç€ºãããŸããïŒã

ãããã®ã€ãã³ãã«ãåŒæ°ããããŸãã æéãç¯çŽããããã«ããã®æ
å ±ãã©ã®ããã«æœåºããããã«ã€ããŠã¯èª¬æããŸãããã tplistã«ã¯ããããã®å芳枬ç¹ã®åŒæ°ã衚瀺ã§ãããã©ã°ããããŸãã ããšãã°ãåžžèã«åºã¥ããŠã monitor__waited
ã€ãã³ãã«ã¯ãäºæ³ãããäœããã®çš®é¡ã®ã¢ãã¿ãŒæ
å ±ãå«ãŸããŠããå¯èœæ§ãé«ããšèšããŸããã¹ããªãŒã èå¥åãããå¯èœæ§ããããŸãã ãã ãããããã®åŒæ°ãæ£ç¢ºã«äœãæå³ãããã«ã€ããŠã¯ãããã§ã¯çŽæ¥èšåããŠããŸããã ããã§ãJVMã«ä»å±ããããã¹ããã¡ã€ã«ã圹ç«ã€ããšãããããŸããããã§ã¯ããããã®ãã¬ãŒã¹ãã€ã³ãã«ã€ããŠèª¬æããŸãã åºæ¬çã«ã SystemTapãã¬ãŒã¹ãã¡ã€ã«ã ããšãã°ã monitor__waited
ã€ãã³ãã«monitor__waited
ããã€ãã®åŒæ°monitor__waited
ããšãããããŸããããã¯ãã¹ããªãŒã èå¥åãã¢ãã¿ãŒèå¥åãäºæ³ããããªããžã§ã¯ãã®ã¯ã©ã¹åã§ãã 衚瀺çšã®ãã¬ãŒã¹çšã«æ瀺ã§ãã圢åŒãªãã·ã§ã³ãææ¡ãããŠããŸãã
質åã¯ãOpenJDKãOracle JDKãç¹å®ã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ã«é¢ãããã®ã§ããïŒ ç§ã®ç¥ãéãããã¹ãŠã®JDKã«ã¯ãããã®ãã¬ãŒã¹ãã€ã³ãããããŸãããä»æ§ãããã匷å¶ããŠããããšã匷ãçããŸãã ãŸãã«åœŒããçãŸãããšããç§ã¯ç¢ºãã«èšãããšãã§ããŸããã Oracleã®èšäºãèŠããŠããŸããã2008幎ã«èšèŒãããããã§ãããããã£ãŠãããã¯æ°ããçŸè±¡ã§ã¯ãããŸããã
ïŒãã®ã¬ããŒãã®åŸã確èªããŸããïŒOracleJDKã®Linuxã§ã¯ãããã®ç£èŠãã€ã³ãã¯ãããŸãã ãSolarisããã³ããããOracle Linuxã«ãããŸãããããã®ãã€ã³ãã¯ãœãŒã¹ã«ãããŸãããããã©ã«ãã§ã¯ã³ã³ãã€ã«ãããŸããããããããã¹ãŠã®OpenJDKã«ååšããŸãïŒïŒ
æåã«ããããã®äœ¿çšæ¹æ³ã瀺ããããšæããŸãã次ã«ã BPFãšãããã®äœ¿çšæ¹æ³ã«ã€ããŠèª¬æããŸãã ããã«ã軜èãªäŸããããŸããJavaã¢ããªã±ãŒã·ã§ã³ã¯ãéèŠãšæãããã¡ãã»ãŒãžãã³ã³ãœãŒã«ã«åºåããŸãããã©ãããæ¥ãã®ãã¯ããããŸããã ããã«ãæ¬çªç°å¢ã§ãããã®ã¡ãã»ãŒãžãéä¿¡ããã³ãŒããç¥ãããã§ãã ãããããããã¬ã®å©ããåããŠããã®åé¡ã¯ãã¬ãŒã¯ãã€ã³ããä»ããŠè§£æ±ºã§ããŸãããããã¯è¡ããŸããã PreserveFramePointerãã©ã°ãå¿
èŠã«ãªããŸã ãããã¯ãã¹ã¿ãã¯ãèµ°æ»ããããã«å€ãã®Javaãããã¡ã€ã©ãŒã§ã䜿çšãããŸãã ãã®ãã©ã°ã¯ãã§ã«JDK 8u60ã«ååšããŠããŸãããã perfã䜿çšãã次ã®ã¬ããŒãã§èª¬æããŸãã æã¯ãã¹ã¿ãã¯ãæ©ãããã«å¿
èŠã§ãã ãã®ãã©ã°ã«ã¯ããã¬ãŒã ã¬ãžã¹ã¿ïŒCPUã¬ãžã¹ã¿ã®1ã€ïŒãä»ã®ã¬ãžã¹ã¿ãšåæ§ã«éåžžã®èšç®ã«äœ¿çšãããŠããªãããšã®ç¢ºèªãå«ãŸããŸãã ã¹ã¿ãã¯äžãæ©ãããšãå«ããäžé£ã®åŒã³åºããåŠçããããã«ã®ã¿äœ¿çšããå¿
èŠããããŸãã
ãã®ãã©ã°ã䜿çšããæšå®ã³ã¹ãã¯ãçŽ3ïŒ
ã§ãã ããã»ããµã®è² è·ãéåžžã«é«ããªãã1ç§ãããæ°çŸäžã®ã¡ãœãããåŒã³åºãããªãå ŽåïŒãããã0ïŒ
ïŒãããã¯æ§ãããªèŠç©ããã§ãã ç»é¢ã«ããã¬ãŒã¹ããããšããŠããããã°ã©ã ã®åºåã衚瀺ãããŸãã

èŠåã¯ååã«æ·±å»ã«èŠãããããèŠåã®åºæãç解ããå¿
èŠããããŸãã ç§ãæžãããã¬ãŒã¹ããŒã«ã䜿çšããŠã¿ãŸãããã 圌ã¯ã·ã¹ãã ã¬ãã«ã®ã€ãã³ãããã¬ãŒã¹ããéäžã§ãããã®ã€ãã³ãããJavaåŒã³åºãã®ã¹ã¿ãã¯ãåãåããŸãã åæã«ãJavaã¢ããªã±ãŒã·ã§ã³ãåèµ·åããå®éã«ãã¬ãŒã¹ãåã³ã³ãã€ã«ããå¿
èŠã¯ãããŸãããããã¯ãå®çšŒåç°å¢ã«èµ·åã§ããéåžžã«è»œéãªããŒã«ã§ãã ã¹ã©ã€ãã«æ²¿ã£ãŠãªã³ã¯ããããã¬ããŒãã®çµãããŸã§ã«ãããããã¹ãŠã®ããŒã«ã®å
¥æå
ãããããŸãã

ãã¬ãŒã¹ã¯ BPFã«åºã¥ããŠããŸãã ã¹ã©ã€ãã«ã¯ã圌ãžã®èšŽãããããŸãã ãŸãã泚æïŒç¹æš©ãŠãŒã¶ãŒãšããŠã³ãŒããå®è¡ããå¿
èŠããããŸãã åŸã§èª¬æããããã«ã BPFã§ã¯ããããšperfãä»ã®å€ãã®ããŒã«ãšåæ§ã«å¿
èŠã§ãã 次ã«ã ãã¬ãŒã¹ãæ£ç¢ºã«æ·»ä»ãããŠãããã®ãå€å¥ããå¿
èŠããããŸãã ç»é¢ãžã®åºåã®ãã¬ãŒã¹ãå¿
èŠã§ããããã®ç¹å®ã®ã±ãŒã¹ã§ã¯ã·ã¹ãã ã¬ãã«ã§äœæ¥ããŠããã®ã§ãç¹ã«æšæºåºåãæäŸããç¹å®ã®ã·ã¹ãã ã³ãŒã«ãæ¢ããŸãã ããã«ãæåã®åŒæ°ã1ã€ã§ãªããã°ãªããªããšããæ¡ä»¶ãè¿œå ããŸãã ããªãã®æèŠã§ã¯ãå¿
èŠãªã·ã¹ãã ã³ãŒã«ã®æåã®è°è«ã¯äœã§ããïŒ
ããã§ãããã¡ã€ã«èšè¿°åãããã³ãŠãããã¯ãåºåãstdout
ãã¬ãŒã¹ããããã®æ¡ä»¶ã§ãã 次ã«ãå°å·ãããã¡ãã»ãŒãžã衚瀺ãããŸããããã¯printf
ã®ã¹ã¿ã€ã«ã§ãã äžæ¹ã arg2
ã¯ãå°å·ã®ããã»ã¹ã«çŽæ¥ãããããã¡ãŒã§ãïŒããã¹ããå«ãŸããŠããå Žåã¯ãã»ãšãã©ã®å ŽåïŒã ãã®åŸã«ããŠãŒã¶ãŒç©ºéã®åŒã³åºãã¹ã¿ãã¯ã瀺ã-U
ãã©ã°ãç¶ããŸãã æåŸã«ãJavaããã»ã¹ã®ã¿ã«é¢å¿ããããããJavaããã»ã¹ã®ã¿ãæ®ããã£ã«ã¿ãŒãé
眮ããŸãã æ§æãç解ããŠããã ããã°ãããããã¹ãŠæããã«ãªãããšãé¡ã£ãŠããŸãã
traceã®åºåãèŠãŠã¿ãŸãããã 圌ã¯ã»ãšãã©ç§ãã¡ãæãã§ãããã®ã§ãã æåã®æ°è¡ã¯ãããã»ã¹ãšãããŒã®èå¥åãèå¥ããèŠåºãã§ãã 次ã«ãç§ãã¡ã«èå³ã®ããã¡ãã»ãŒãžãæ¥ãŸã-ãããŒã¿ã®åä¿¡ãšã©ãŒãã¯ãªã¢ãã ã³ãŒã«ã¹ã¿ãã¯ã¯ã»ãšãã©å¿
èŠãªãã®ã§ãæåã¯ãã¹ãŠåé¡ãããŸããããããšãã°java_io_FileOutputStream
åã«äœãèµ·ããããªã©ãæãèå³æ·±ãéšåã¯ç€ºããŠããŸããã ãŸããJavaã¹ã¿ãã¯ãééããŠãã³ãŒãå
ã®ã·ã³ãã«ãé¢æ°åãããã³ã¡ãœãããšã®éä¿¡ãæ§ç¯ããããšããå€ãã®ããŒã«ã䜿çšããå Žåããã®åé¡ãçºçããŸãã

ããã§ã¯ã perfãä»ã®å€ãã®ããŒã«ãšåæ§ã«ãJITã§ã³ã³ãã€ã«ãããã³ãŒãã®ã¡ã¢ãªå
ã®ã¢ãã¬ã¹ãšã¡ãœããã®å®éã®ååãšã®éã®å¯Ÿå¿ãåºåããå°ããªãšãŒãžã§ã³ããå¿
èŠã«ãªããŸãã å¿
èŠã«å¿ããŠããœãŒã¹æ
å ±ã«ã¢ã¯ã»ã¹ã§ããããããœãŒã¹æ
å ±ãå°å·ã§ããŸãã ãã®å ŽåãGitHubã«ããããªãäžè¬çã§éåžžã«åçŽãªãšãŒãžã§ã³ãperf-map-agentã䜿çšããŸãã åºåã¯/ tmpãã©ã«ããŒã«éä¿¡ãããŸãããããã¯ãã³ãŒãã¢ãã¬ã¹ãç¹å®ã®ã¡ãœããã®è¡šç€ºãããã³ãã®ã¡ãœããã®ãµã€ãºãå«ãéåžžã«åçŽãªåœ¢åŒã®ãã¡ã€ã«ã«ãªããŸãã ãããã®ãããã³ã°ã¯ãJavaåŒã³åºãã¹ã¿ãã¯ã解決ããããã«å¿
èŠã§ãã ãããã¡ã€ã©ãŒãæåã«Javaã¹ã¿ãã¯ãã¬ãŒã ã®æäœæ¹æ³ãç¥ããªãå Žåããã®ãããªæäœã¯äžèŠã§ãã

ãšãŒãžã§ã³ãã䜿çšããæ°ããçµæã§ããã¹ã©ã€ãã§ã¯ãã¹ã¿ãã¯ã¯åãå
¥ããããããã«èŠããŸããçæããã°ããã®.mapãã¡ã€ã«ããæœåºãããé¢æ°ã®ååã¯ãã¹ãŠèš±å¯ãããŸãã ã¹ã©ã€ãã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒãã®äžéšïŒDataFetcher :: fetchDataïŒã匷調衚瀺ãããŠãããã³ã³ãœãŒã«ãžã®åºåãå®è¡ãããŠéªéãããŸããã ãœãŒã¹ãèŠã€ãããŸããããçŸåšã¯ç¶æ³ã«å¿ããŠããã®ã³ãŒãã§äœããããã決å®ããŸãã ããã¯ãå¿
èŠãªæ©èœã®äŸã§ããããã«æããŸããåçŽã§ããªãœãŒã¹ã倧éã«æ¶è²»ããªããããã«äœ¿çšã§ããããŒã«ã䜿çšããŠãæ¢ã«å®è¡äžã®ã·ã¹ãã ããããŒã¿ãæœåºããŸãã ããã¯ãJavaã¬ãã«ãã·ã¹ãã ã¬ãã«ãã«ãŒãã«ã¬ãã«ã§çºçããå¯èœæ§ããããŸã-åé¡ã§ã¯ãããŸããã
åé¡ã®èŠæšã«å
¥ãåã«ãå¥ã®åæ§ã®äŸãèããŠã¿ãŸãããã å€ãã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãåŒãèµ·ããJavaã¢ããªã±ãŒã·ã§ã³ã ã¬ããŒãžã³ã¬ã¯ã¿ãŒã®ãã°ããã System.gc()
çŽæ¥åŒã³åºãããšãããã£ãŠããã®ã§ãæ£ç¢ºã«ã©ããç解ããå¿
èŠããããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯å·šå€§ã§ãå€ãã®ã©ã€ãã©ãªããããã©ã®ãããªã³ãŒãããããã®åŒã³åºããè¡ããã¯äžæã§ãã ããã§ã¯å€ãã®ãªãœãŒã¹ãå¿
èŠãšãããã©ã°ãå¿
èŠã«ãªãããããã®äŸããå§ããŸããã§ããã ããã¯ã ExtendedDTraceProbes
ãšåŒã°ããäžçš®ã®ã¹ãŒããŒãããã°ã¢ãŒãã§ãããä»»æã®Javaã¡ãœããã®å
¥åããã³åºåã«ãã¬ãŒã¹ããã°ã©ã ãæ·»ä»ã§ããŸãã æããã«ãããã«ã¯ç§ã説æããä»ã®æ¹æ³ãããå€ãã®ãªãœãŒã¹ãå¿
èŠã«ãªãããããã®ãã©ã°ã¯ç¹å®ã®åé¡ã解決ããå¿
èŠãããå Žåã«ã®ã¿äœ¿çšããŠãã ããã

ã¬ããŒãžã³ã¬ã¯ã¿ãŒãã°ã®åã«ã System.gc()
çŽæ¥åŒã³åºãããããŸãã ããã§ããã¬ãŒã¹ã䜿çšããŸãããã¢ã¿ããã¡ã³ãã®ç®çããããã«ç°ãªãããããããã«ç°ãªãæ¹æ³ã§äœ¿çšããŸãã

method__entry
ãšåŒã°ããJVMå
ã®ãã€ã³ãã«ãªããŸããããã䜿çšããŠãä»»æã®Javaã¡ãœããããã¬ãŒã¹ã§ããŸãã èå³ã®ããç¹å®ã®ã¡ãœããã瀺ãããã«ã arg4
ïŒããã¯ã¡ãœããã®ååã§ãïŒãgc
ãšçããããšãå¿
èŠãšããæ¡ä»¶ã«çœ®ãæããŸãã ãããããã¯ã©ã¹åã®ãã§ãã¯ãè¿œå ããå¿
èŠãããSystem
ãããã¯System
ã§ãªããã°ãªããŸããã 次ã«ãã¡ãã»ãŒãžãåºåãããã®åŸã«åŒã³åºãã¹ã¿ãã¯ãåºåããŸãã æåŸã«ããããã¯ãã¹ãŠJavaããã»ã¹ã§ã®ã¿è¡ãå¿
èŠããããŸãã 次ã«ããã®ã¢ããªã±ãŒã·ã§ã³ã®åSystem.gc()
åŒã³åºãã®åŒã³åºããšã¹ã¿ãã¯ãã¬ãŒã¹ãããåºåããããŸãã ããã¯ãååãšåãã³ãŒãã§ããDataFetcher::fetchData
ã RequestProcessor::processRequest
ãªã©ã®èŠæ±ã«å¿ããŠRequestProcessor::processRequest
ããŸãã
ããã¯æ£çŽãªãã«ã¹ã¿ãã¯ã§ãããJavaãã¬ãŒã ãšJVMããã®ãã€ãã£ããã¬ãŒã ã®äž¡æ¹ãæã¡ãLinuxã®ã«ãŒãã¹ã¬ãããŸã§ããã¹å
šäœã«æ²¿ã£ãŠç§ãã¡ãå°ããŸãã 絶察ã«ãã¹ãŠãããã§èŠãããšãã§ããŸãã ãã®ããããã®ãããªããŒã¿ãååŸããããã«å
æããå¿
èŠããããã®ã®äŸã次ã«ç€ºããŸãã
ãã®äœæ¥ã®èåŸã«ããåæ©ä»ãã®ããã«ããã€ãã®äŸ...äŸããããã§ã«è¿°ã¹ãåé¡ã«ç§»ããŸããããperfã®äœãåé¡ãªã®ã§ããããïŒ ãã®ããŒã«ã¯ãLinuxã®å®çšŒåç°å¢ã§ã®Javaã¢ããªã±ãŒã·ã§ã³ã®ç£èŠãŸãã¯ãã¬ãŒã¹ã«é¢ãããã¹ãŠã®è¬æŒã§èšåãããŠããŸãã åè¿°ããããã«ãç§ã®æ¬¡ã®èšäºã¯ã perfã䜿çšããŠJavaã¢ããªã±ãŒã·ã§ã³ã®CPUãµã€ã¯ã«ããã§ããããæ°ããç¬èªã®æ¹æ³ã«é¢ããã¬ããŒãã§ãã

perfã䜿çšãããšãåçŽã«åäœããŸããæåã«èšé²ãã次ã«èšé²ãåŠçããŠãããšãã°ãã¬ãŒã ã°ã©ããååŸããŸãã ããããããã®perfã®äœ¿çšãèªèããŠãã人ãããŸãã ç§ãã話ãããåé¡ã¯ã BPFãšç§ãããªãã«äŒããããšæãèãã«é¢é£ããŠããŸãã ãã®äœæ¥ã®ããã«ã perfã¯åŸç¶ã®åæã®ããã«ãã¡ã€ã«ãä»ããŠãŠãŒã¶ãŒç©ºéã«å€§éã®ããŒã¿ã転éããŸãã ç¹å®ã®ã¯ã©ãŠãäžã«ä»®æ³ãã·ã³ãäœæãããã®ãã·ã³ã«æ¥ç¶ããŠãçŽ1 Gbit / sã®é床ã§ãã¡ã€ã«ãããŠã³ããŒãããŸããã èªå®
ã§ã¯ãã®ãããªæ¥ç¶ã¯ãããŸããããã®ãããã¯ã©ãŠãäžã®ä»®æ³ãã·ã³ã«ã€ããŠè©±ããŠãããšèšã£ãã®ã§ãã ãã®çµæãçŽ9äžã®netif_receive_skb
ã€ãã³ããçºçããŸããã ã·ã¹ãã ã§åä¿¡ããããŒã¿ããã¬ãŒã¹é
延ããã±ãããµã€ãºããã¬ãŒã¹ããããã«ã perfã§ãããèšé²ã§ããŸãã ãã ããåæã«ã1ç§ããã9äžã€ãã³ããåºåãããŸããã³ãŒã«ã¹ã¿ãã¯ãèšé²ããå Žåãããã¯ãã¡ã€ã«ã«æžã蟌ãŸãã1ç§ããã20ã¡ã¬ãã€ãã®ããŒã¿ã§ãã æããã«ãããã¯éåžžãå®çšŒåç°å¢ã§ã¯è¡ãããŸããããŸããããŒããã£ã¹ã¯é åãäžè¶³ããã ããªã®ã§ããã®ãããªäœæ¥ã1å以äžè¡ãããšã¯æããã«æãŸãããããŸããã åæã«ããããã®20ã¡ã¬ãã€ã/ç§ã®ãã¡ãå¹³åãã±ãããµã€ãºããã±ããã®åä¿¡ããJavaã¢ããªã±ãŒã·ã§ã³ãžã®é
ä¿¡ãŸã§ã®å¹³åé
延ãªã©ãããã5ãã€ãã«é¢å¿ããããããããŸããã 1ç§ããã20ã¡ã¬ãã€ãã¯å¿
èŠãããŸããããããããŸãã«perfã®ä»çµã¿ã§ããã€ãã³ãããã¡ã€ã«ã«éä¿¡ããããã®ãã¡ã€ã«ãåæãããŠãŒã¶ãŒã¹ããŒã¹ããã°ã©ã ãèµ·åããŸãã ããããŸãã«ç§ãã¡ã解決ããããšããŠããåé¡ã§ãã ç§ãã¡ã¯ãåŠçãçŽæ¥ããŒã¿åéããã¬ãŒã¹ããã°ã©ã ã«è¿ã¥ããèªåã§ãã¡ã€ã«ãå¿
èŠãšããªãå Žåã¯ãã¡ã€ã«ãäœæããªãããã«ããŠããŸãã

ãããŠãããã§ãBerkley Packet Filterãã®ç¥ã§ããBPFã玹ä»ããŸãã ãã®ããŒã«ã¯ã90幎代ã®åãããååšããŠããŸããã ã¬ããŒããæŽå²ã®æèšã«å€ãããã¯ãããŸãããããã§ã®åºç€ãéåžžã«æçããŠããããšã瀺ãã ãã§ãã BPFã¯ããã±ããããã£ã«ã¿ãªã³ã°ããã·ã¹ãã ã«å
¥ããã±ããããã¬ãŒã¹ããããããééããããã©ããã決å®ããããã«äœæãããŸããã tcpdump ã WiresharkãŸãã¯åæ§ã®è¿œè·¡ããŒã«ã¯ãã©ã®IPã¢ãã¬ã¹ãããã©ã®ç¹å®ã®ãããã³ã«ã§ãã±ãããåä¿¡ããããæå®ãããšãã«äœ¿çšããŸãã ã©ã¡ãã®å Žåãã tcpdumpãšWiresharkã¯ãç¬èªã®åœä»€ã»ããã䜿çšããŠå°ããªBPFããã°ã©ã ãäœæããã«ãŒãã«ã«æž¡ããŸãã次ã«ãçä¿¡ãã±ããããšã«ãã®ããã°ã©ã ãå®è¡ããŠããã®ãã±ãããåé€ããããã¬ãŒã¹ãããã決å®ããŸãã ç§ãã¡ã®ç®ã®åã®ã¹ã©ã€ãã«ã¯ãå¥ã®ã¢ã»ã³ãã©ãŒã§ãããã®äžé£ã®æ瀺ããããŸãã 90幎代ããã®äžé£ã®æ瀺ã¯éåžžã«ç°¡åã§ããã ããããéå»3ã4幎ã«ããã£ãŠããããã¯ãŒã¯ã®ç®çã ãã§ãªãããã±ããã®ãã£ã«ã¿ãªã³ã°ã ãã§ãªãBPFã䜿çšã§ããããã«ããããã«ãå€ãã®åªåãæãããŠããŸããã ä»æ¥ããã¬ãŒã¹ã¯ãã®æ©èœã®äžéšã§ãããç§ã®äž»ãªçŠç¹ã¯ããã§ãã äžèšã§ç€ºãããã¬ãŒã¹ããŒã«ã¯BPFã䜿çšããŸãã ãã ãã BPFã«ã¯ä»ã®æ©èœããããŸãã ããã«ãJavaãšåæ§ã«ã BPFã«ã¯JITã³ã³ãã€ã©ãŒãè¿œå ãããŸããã äžèšã®äžé£ã®åœä»€ã¯ãã«ãŒãã«ã«ãã£ãŠè§£éãããªããªãã代ããã«ããããããã·ã³ã³ãŒããããã»ããµåœä»€ã«ã³ã³ãã€ã«ããŠããå®è¡ããŸãã
以åã SystemTapã«ã¯åé¡ããããåçã«ã³ã³ãã€ã«ãããã«ãŒãã«ã¢ãžã¥ãŒã«ãããŒããããšããããšãèšããŸããã ããã¯ã BPFãšã¯ç°ãªããŸãã åŸè
ã®å Žåãåœä»€ã®ã»ããã¯arbitraryæçã§ã¯ãªããã»ãã¥ãªãã£ã®åé¡ãåé¿ããããã«ç¹å¥ã«éžæãããŸããã äžè¯ãªBPFããã°ã©ã ã¯ãã«ãŒãã«ããããããŸãã¯ãµã¹ãã³ãã§ããŸããã BPFããã°ã©ã ã¯ã¡ã¢ãªãå²ãåœãŠãªããããã«ãŒãã«ã§ã¡ã¢ãªãªãŒã¯ãåŒãèµ·ããããšã¯ã§ããŸããã ãããã®ããã°ã©ã ã®ãã¹ãŠã®æ©èœã¯ãçç£ã«å®³ãåãŒããªãããã«å³ããå¶éãããŠããŸãã
äž»ãªãããã¯ã§ãããã¬ãŒã¹ã«ç§»ãåã«ãããã€ãã®ã·ããªãªã«ã€ããŠç°¡åã«èª¬æããŸãã ãããã¯ãŒã¯äŒè°ã§èãããšãã§ããä»æ¥ã®BPFã®æãéèŠãªçšéã®1ã€ã¯ã XDPïŒeXpress Data PathïŒã§ãã DDoSä¿è·ãµãŒãã¹ãäœæããŠãããšä»®å®ããŸãïŒ Cloudflareã¯äŸã§ãïŒã ããã±ãŒãžãåŠçããã転éãããããããšãªããã§ããã ãæ©ãããã±ãŒãžãåé€ããå¿
èŠããããŸãã ãã®å Žåããã±ãããã«ãŒãã«ãTCPã¹ã¿ãã¯ããŸãã¯ã¢ããªã±ãŒã·ã§ã³ã«å°éããåã«ã BPFããã°ã©ã ãå®è¡ããããã±ãããåé€ããããä»ã®èª°ãã«è»¢éããããã¢ããªã±ãŒã·ã§ã³ã®æäžéšã«éä¿¡ãããã決å®ãããŸãã ããã¯ã BPFã䜿çšããŠã·ã¹ãã ã®åçã«ãŒã«ãèšå®ãã1ã€ã®äŸã§ãã
åãçš®é¡ã®å¥ã®äŸã¯seccompã§ãã çŸåšã®Linuxã§ã¯ã BPFããã°ã©ã ãã€ã³ã¹ããŒã«ããŠãç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã®ã·ã¹ãã ã³ãŒã«ããã£ã«ã¿ãªã³ã°ã§ããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯ç¹å®ã®ãã¡ã€ã«ãžã®ã¢ã¯ã»ã¹ãæåŠããããšãã§ããŸãããä»ã®ãã¡ã€ã«ãžã®åŒã³åºãã¯èš±å¯ãããŸãã ããŒããã©ã€ãããã®èªã¿åããèš±å¯ããªãããããŒããã©ã€ããžã®æžã蟌ã¿ãé²ãããšãã§ããŸãã ã·ã¹ãã ãšã®å¯Ÿè©±ã®ãã®ãã£ã«ã¿ãŒã®ãããã§ã BPFã¯äžçš®ã®ãµã³ãããã¯ã¹ãäœæããŸãã
äž»ã«ãã·ã¹ãã äžã®ã€ãã³ãïŒã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãªã©ïŒããã¬ãŒã¹ããããã®BPFã®äœ¿çšãšããã¬ãŒã¹ã®ãã¢ã§ãã§ã«èª¬æããã¡ãœããåŒã³åºãã®ãã¬ãŒã¹ã«ã€ããŠèª¬æããŸãã ã·ã¹ãã ã«ã¯ããŸããŸãªæ¥ç¶ãã€ã³ãããããŸããã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã§ã¯ããããã¯ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããªããžã§ã¯ãå²ãåœãŠãJavaã¢ããªã±ãŒã·ã§ã³ã§ã®ã¯ã©ã¹ããŒãã§ãã ããã«ããã±ããã®åä¿¡ãã·ã¹ãã ã³ãŒã«ã®write
ããã³read
ãªã©ãå€ãã®ã«ãŒãã«ã¬ãã«ã®æ¥ç¶ãã€ã³ãããããŸãã ãŠãŒã¶ãŒã¹ããŒã¹ã«ã¯ãã«ãŒãã«ã«BPFããã°ã©ã ãã€ã³ã¹ããŒã«ãããããé¢å¿ã®ããã€ãã³ãã«ã¢ã¿ããããå¶åŸ¡ããã°ã©ã ããããŸãã ãããã®ã€ãã³ããçºçãããšãã«ãŒãã«å
ã®ããã°ã©ã ãå®è¡ãããŸããã次ã®2ã€ã®ãããããå®è¡ã§ããŸãã æ
å ±ããŠãŒã¶ãŒç©ºéã«éä¿¡ã§ããåæã«ãæ¬è³ªçã«ãã¬ãŒã¹ã®æ段ãšããŠæ©èœããŸãã ãããç§ã®ããã°ã©ã ã®ä»çµã¿ã§ããããŠãŒã¶ãŒç©ºéã®ã¹ã¯ãªãããä»ããŠåºåãå°å·ããŸãã ãŸãã¯ãããã°ã©ã ã¯ãéèšãå®è¡ããã¡ã¢ãªå
ããŒã¿æ§é ãæŽæ°ã§ããŸãã åŸç¶ã®åæã®ããã«ããŒã¿ããŠãŒã¶ãŒã¹ããŒã¹ã«è»¢éãã代ããã«ãã«ãŒãã«ã§çŽæ¥éèšãå®è¡ããå¹³åãé«å€ãå®å€ããã¹ãã°ã©ã ãªã©ãååŸã§ããŸãã æ°çŸäžã®ã€ãã³ãã®éä¿¡ã«é¢äžããããšãªãããã¬ãŒãµãŒãæ©èœããå Žæã ããã¯ãŸãã«BPFã®éèŠãªéãã§ããã BPFãéåžžã«äŸ¡å€ã®ãããã®ã«ãã perfãããåªäœã«ç«ãŠãŸãã
ããã°ã©ã ãã«ãŒãã«ã§å®è¡ããããšããŠãŒã¶ãŒã¹ããŒã¹ã¹ã¯ãªããã¯ãããã¡ãŒãŸãã¯ããŒã¿æ§é ããããŒã¿ãèªã¿åããå¿
èŠãªåŠçãè¡ããŸããç»é¢ã«ã¡ãã»ãŒãžã衚瀺ããã°ã©ãããã¹ãã°ã©ã ãªã©ãäœæããŸãã perfãšã¯ç°ãªãããã¡ã€ã«ã¯å¿
èŠã§ãªãéãã©ãã«ãäœæãããŸããã
ãã®ããŒã«ãäžè¬ã«åãå
¥ããããªãã®ã¯ãªãã§ããïŒ ãŸã第äžã«ãããã¯å®å
šã«æ°ããããã§ãã ããã©ãŒãã³ã¹ããã¬ãŒã¹ããã³ç£èŠãã BPFãœãããŠã§ã¢ã䜿çšããã«ã¯ãã»ãã®æ°å¹Žåã®æå°ããŒãžã§ã³4.1
Linuxã«ãŒãã«ãå¿
èŠã§ãã Ubuntu 14ãŸãã¯CentOS 5ã¯ãµããŒãããŠããŸããã æãæçšãªããšã®ããã«ã¯ãããã«æ°ããã«ãŒãã«ãå¿
èŠã§ãã FedoraãšUbuntuã®äŸãèŠãŠã¿ãŸãããã Ubuntu 16 LTSã§ã¯ ã Ubuntu 16.10ã§BPFã®å€ãã®æ©èœã䜿çšã§ããŸã-ã»ãšãã©ãã¹ãŠã BPFã«ãã£ãŠè¿œå ãããææ°ã®æ©èœã«ã¯ãã»ãã®æ°ãæåã«ãªãªãŒã¹ããã4.9
ã«ãŒãã«ããŒãžã§ã³ãå¿
èŠã§ãã ãããã£ãŠãä»æ¥ã¯çŽæ¥åäœããªããã®ãããã°ãããªãæ°ããã«ãŒãã«ãæèŒããç¹å®ã®ã·ã¹ãã ã§ã®ã¿åäœãããã®ããããŸãã ããããLinuxãã¬ãŒã¹ã®æªæ¥ã¯BPFã«ãããŸãã ããã¯ãJavaãPythonãããã³C ++-Linuxã§å®è¡ããããã¹ãŠã®èšèªã«é©çšãããŸãã ãã®çç±ã¯ãã«ãŒãã«ã§ãã¬ãŒã¹ããã°ã©ã ãå®è¡ããåŸç¶ã®åæã®ããã«ãã¹ãŠã®ããŒã¿ããŠãŒã¶ãŒç©ºéã«è»¢éãã代ããã«ã察å¿è¡šããã¹ãã°ã©ã ã®æŽæ°ãªã©ã®è€éãªã¢ã¯ã·ã§ã³ãå®è¡ããããã§ãã
å€ãã¡ãœãããšæ°ããã¡ãœãããæ¯èŒããŸãã ååãšããŠã perfã䜿çšãããšãããŒã¿ããã¡ã€ã«ã«éä¿¡ããããã®ãã¡ã€ã«ãåŠçããã³åæãããŸãã BPF , . . , , .
. , , BPF , . BCC . , .. , , , , - Linux. . .

BCC . â , . - , . , , , , Java, MySQL, Postgres , . , , , , BPF .

, . , , , , , , . , , IO. , TCP TCP. DNS. , . , , â . , Java.
, . , . . , , BPF.

top , 100%. , , . BCC â uthreads . , Java-, . , . , . profile , ( perf ). profile Java, , PU, . , . Java, Java-, â . , perf â , java-, â .

, . , . , . , . , . , , . , , . dd, dnf, Java stress . , , Java. Java , â Prime::isPrime
, , . ? , , . isPrime
, , , , isPrime
. , . , , . â , , , CPU, . , , BPF , , .

. , , : , , ( if(isPrime(i))
) . , ? ? , Java- , ? BCC, argdist. , . , : monitor__contended__enter()
, JVM. Argdist 5 , . , â 3 , 9 . - , 3 9 5 , . , , . , . , , JVM.
CPU, , Java- , , , . Java-, , MySQL. , . , , . , , 50 , .

, dbstat BCC . MySQL PostgreSQL. , , . MySQL ASCII- ( , ). 3000 0 1 , 8 1 2 , . . MySQL. dbstat , , , 5 . , 2 , .

, MySQL. top , 2% , . , BCC dbslower. MySQL , â 500. dbslower , , call getproduct(97)
. , ?

, trace , . MySQL query__exec__start
, . trace , call getproduct(97)``
sleep(2)`. , , â sleep(2). , , .

, . Java-, . . Java , , mysqlsniff . . BPF Java , , , socket.send()
. MySQL. , , . , , . , call getproduct(97)
. , hibernate, beans ., JDBC, . â , Product::load
, User::loadProducts
, Databaseey::main
.. , , . , Wireshark , , . , BPF , MySQL , , . , , â .
, . MySQL , Java. Java , BCC , .
, , . , , , .

, , . Java-, . .NET, , , . top, , , BCC ustat . Java, . 800, , , , , , . profile, , . ResponseBuilder::addLine
, , .

, BCC Java, Ruby â uobjnew. , ExtendedDTraceProbes . , , , , . 5 , Java. , . uobjnew , , , . , , â stackcount . object__alloc
JVM, , . , , . , : _new_array_Java
, ResponseBuilder::AddLine
. , â JVM, SharedRuntime::dtrace_object_alloc
â .
, , . , , , . -, , , .

. , , â « ». , , , , ? opensnoop, . -x . , /etc
, â 2, Linux « », . , , . trace. open, «-2». Java. . , , , . , Java.
, . HTTP- . , . , , , , 1.4-2 . 6 â , - . â facebook.com, â i-dont-exist-at-all.com, . . . , , 5 .
, , DNS , . . BCC DNS. DNS . , DNS , . . , ? trace , «-2», « », .

dig â , , , , BCC. DNS i-dont-exist-at-all.com dig : , , , 15 , . . . « » 0, . dig . DNS.

. , DNS-, , 800 - . - . , DNS 0
. , , Java DNS . , , BPF , DNS.
, , : , JVM-; BPF Linux; ; . ãæž
èŽããããšãããããŸããã


åºåã®åã ãããããåç¥ã®ããã«ãäŒè°ãè¡ã£ãŠããŸãã 次ã¯JBreak 2018ãšJPoint 2018ã§ãã ããã«æ¥ãŠãããŸããŸãªãã¡ãã·ã§ããã«ãªæè¡ã®éçºè
ãšã©ã€ãã§ãã£ããã§ããŸããããšãã°ãAzul Systemsã®å¯CTOã§ããSimon RitterãããŸãã c " " . ( olegchir ) . èŠããã«ãç§ãã¡ã¯ããªããåŸ
ã£ãŠããŸãã