virshã®vcpupinã¨vcpuinfoã§è¡¨ç¤ºã•ã‚Œã‚‹affinityã®é•ã„
以å‰virsh vcpupin
㨠virsh vcpuinfo
ã§è¡¨ç¤ºã•ã‚Œã‚‹CPUã®Affinityæƒ…å ±ãŒé•ã†ã¨ã„ã†ã“ã¨ãŒã‚ã‚Šã¾ã—ãŸï¼Ž
% sudo virsh vcpupin vm1 VCPU CPU Affinity ---------------------- 0 0-47 1 0-47 2 0-47 [...]
% sudo virsh vcpuinfo vm1 VCPU: 0 CPU: 25 State: running CPU time: 508.0s CPU Affinity: ------------------------yyyyyyyyyyyyyyyyyyyyyyyy
動作的ã«ã¯ virsh vcpuinfo
ã®æƒ…å ±ã®æ–¹ãŒæ£ã—ã,ãªã‚“ã§ã‹ãªãã¨æ€ã£ã¦ãŸã‚“ã§ã™ãŒï¼Œã‚½ãƒ¼ã‚¹ã‚’調ã¹ã¦ã¿ãŸã‚‰ virsh vcpuinfo
ã¯å‘¼ã°ã‚Œã‚‹ãŸã³ã« sched_getaffinity()
ã§ã‚¢ãƒ•ã‚£ãƒ‹ãƒ†ã‚£ã‚’å–å¾—ã™ã‚‹ã®ã«å¯¾ã—ã¦ï¼Œ virsh vcpupin
ã®æ–¹ã¯libvirt内部ã®æƒ…å ±ã‚’å‚ç…§ã—ã¦ã„るよã†ã§ã—ãŸï¼Žçµæžœã¨ã—ã¦libvirtã®å¤–部ã‹ã‚‰CPUアフィニティãŒå¤‰æ›´ã•ã‚Œã‚‹ã¨ã“ã®ã‚ˆã†ã«æƒ…å ±ã«å·®ç•°ãŒç”Ÿã˜ã‚‹ã‚ˆã†ã§ã™ï¼Ž
実際ã«libvirtdã‚’straceã™ã‚‹ã‹ï¼Œbpftraceãªã©ã§ sched_getaffinity()
ã®å‘¼ã³å‡ºã—を監視ã™ã‚‹ã¨ï¼Œ virsh cpuinfo
コマンドを実行ã™ã‚‹ã¨ shced_getaffinity()
ãŒå®Ÿè¡Œã•ã‚Œã‚‹ã®ã«å¯¾ã—ã¦ï¼Œã‚‚ã†ä¸€æ–¹ã¯ã•ã‚Œãªã„ã“ã¨ãŒç¢ºèªã§ãã¾ã™ï¼ˆãªãŠï¼Œvirshコマンドã¯libvirtdã¨RPCã§ã‚„ã‚Šã¨ã‚Šã—ã¦ã„ã¾ã™ã®ã§ï¼Œvirshコマンドã®æ–¹ã‚’対象ã«ç›£è¦–ã—ã¦ã‚‚çµæžœã¯å¾—られã¾ã›ã‚“).
ã¨ã„ã†ã“ã¨ã§libvirtを使ã£ã¦ã„ã‚‹ã¨ãゲストã®CPU affinityを知りãŸã„ãªã‚‰ virsh vcpuinfo
を使ã£ãŸæ–¹ãŒè‰¯ã„ã¨ã„ã†è©±ã§ã—ãŸï¼ˆâ€»ã“ã¡ã‚‰2020å¹´10月ã”ã‚ã®libvirtdをコンパイルã—ã¦ä½¿ã£ãŸã¨ãã®æƒ…å ±ã«ãªã‚Šã¾ã™ï¼‰ï¼Ž
bpftrace 2020
(ã“ã®è¨˜äº‹ã¯Linux Advent Calendar 2020 - Qiitaã®2日目ã®è¨˜äº‹ã§ã™ï¼Žå‰æ—¥ã¯masami256ã•ã‚“ã®Tiny Core Linuxã§Linuxã®initプãƒã‚»ã‚¹ãŒå®Ÿè¡Œã•ã‚Œã‚‹ã‚ãŸã‚Šã‚’調ã¹ã‚‹ã§ã—ãŸï¼Ž)
ã¿ãªã•ã‚“ã“ã‚“ã«ã¡ã¯ã“ã‚“ã°ã‚“ã¯ï¼Žbpftraceを使ã£ã¦ã„ã¾ã™ã‹? (e)BPFã¨ã„ãˆã°æœ€è¿‘ã¯å°‚らCiliumãªã©ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãŒè©±é¡Œã§ã™ãŒï¼Œbpftraceã¯BPF*1を利用ã—ãŸãƒˆãƒ¬ãƒ¼ã‚·ãƒ³ã‚°ãƒ„ールã§ã™ï¼Žç§ã¯æ˜¨å¹´ã‹ã‚‰ã¼ã¡ã¼ã¡ä½¿ã„始ã‚ã¦ï¼Œæ©Ÿèƒ½è¿½åŠ ã‚„ãƒã‚°ä¿®æ£ã®ãƒ‘ッãƒã‚’ã„ã‚ã„ã‚ã¨æŠ•ã’ã¦ã„ãŸ(130+)ら気ã¥ã„ãŸã‚‰ã‚³ãƒŸãƒƒã‚¿ã«ãªã£ã¦ã„ã¾ã—ãŸï¼Žã¨ã„ã†ã“ã¨ã§bpftraceã«ã¤ã„ã¦ã¯æ¯”較的よã知ã£ã¦ã„ã‚‹ã¨æ€ã†ã®ã§ï¼Œä»Šå¹´ã«bpftraceã«è¿½åŠ ã•ã‚ŒãŸä¸»è¦ãªæ©Ÿèƒ½ã‚„変更点を紹介ã—ãŸã„ã¨æ€ã„ã¾ã™ï¼Ž
bpftrace知らãªã„ãªãã¨ã„ã†æ–¹ã¯ã“ã¡ã‚‰(拙文ã§ã™)を,bpftrace使ã£ã¦ãªã„ãªãã¨ã„ã†æ–¹ã¯æŠ˜è§’ã§ã™ã‹ã‚‰æœ€å¾Œã®å°è©±ã ã‘ã§ã‚‚èªã‚“ã§ã¿ã¦ã¯ã„ã‹ãŒã§ã—ょã†ã‹ï¼Žã¾ãŸæœ€è¿‘bpftraceã‚’macã‹ã‚‰ç°¡å˜ã«è©¦ã›ã‚‹ã‚‚ã®ã‚’作ã£ãŸã®ã§ï¼Œmacユーザã§bpftraceã«èˆˆå‘³ã®ã‚ã‚‹æ–¹ã¯ãã¡ã‚‰ã‚‚ã©ã†ãžï¼ˆå‹¿è«–M1ã¯å¯¾è±¡å¤–ã§ã™..).
目次
- 目次
- 本題ã«å…¥ã‚‹å‰ã«
- BTFサãƒãƒ¼ãƒˆã®å¼·åŒ–
- Docker ビルド・スタティックビルドã®æä¾›
- 知ã£ã¦ãŠãã¨ä¾¿åˆ©ãªæ©Ÿèƒ½
- ãã®ä»–主è¦ãªå¤‰æ›´ãƒ»æ›´æ–°ç‚¹
- ãƒã‚°æƒ…å ±
- ãŠã¾ã‘
- 最後ã«-- bpftraceã«é–¢ã‚ã£ã¦ãã¦
- æ¥å¹´ã®æŠ±è²
本題ã«å…¥ã‚‹å‰ã«
bpftraceã¯ã“ã®ä¸€å¹´é–“ã§å¤šãã®æ©Ÿèƒ½è¿½åŠ ,ãƒã‚°ä¿®æ£ãŒãŠã“ãªã‚ã‚Œã¾ã—ãŸï¼Žbpftraceã‚’ãŠä½¿ã„ã®æ–¹ã¯ä»Šä¸€åº¦ã‚¢ãƒƒãƒ—デートã®ç¢ºèªã‚’ãŠã™ã™ã‚ã—ã¾ã™ï¼Žã‚‚ã—以下ã§ç´¹ä»‹ã™ã‚‹æ©Ÿèƒ½ãŒä½¿ãˆãªã„å ´åˆï¼Œbpftraceã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå¤ã„å¯èƒ½æ€§ãŒé«˜ã„ã§ã™ï¼Žã¾ãŸä¸€éƒ¨æ©Ÿèƒ½ã¯ã‚«ãƒ¼ãƒãƒ«ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆä¸»ã«ã‚«ãƒ¼ãƒãƒ«5.6以上)や,libbpfã¨ä¸€ç·’ã«bpftraceをコンパイルã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼ˆç‰¹ã«BTFãŒãã‚Œã«è©²å½“ã—ã¾ã™ï¼‰ï¼Ž
bpftraceã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚„サãƒãƒ¼ãƒˆã—ã¦ã„る機能ã®ç¢ºèª
bpftraceã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚„,サãƒãƒ¼ãƒˆã—ã¦ã„る機能ã¯ï¼Œbpftrace --info
コマンドã‹ã‚‰ç¢ºèªã§ãã¾ã™ï¼Ž
$ sudo bpftrace --info System OS: Linux 5.9.0+ #26 SMP Mon Nov 16 11:50:54 JST 2020 Arch: x86_64 Build version: v0.11.0-287-gc62f LLVM: 10.0.1 foreach_sym: yes unsafe uprobe: no bfd: yes bpf_attach_kfunc: yes bcc_usdt_addsem: yes bcc bpf_attach_uprobe refcount: no libbpf: yes libbpf btf dump: yes libbpf btf dump type decl: yes Kernel helpers probe_read: yes probe_read_str: yes probe_read_user: yes probe_read_user_str: yes probe_read_kernel: yes probe_read_kernel_str: yes get_current_cgroup_id: yes send_signal: yes override_return: yes get_boot_ns: yes dpath: no Kernel features Instruction limit: 1000000 Loop support: yes btf (depends on Build:libbpf): yes map batch (depends on Build:libbpf): yes uprobe refcount (depends on Build:bcc bpf_attach_uprobe refcount): no Map types hash: yes percpu hash: yes array: yes percpu array: yes stack_trace: yes perf_event_array: yes Probe types kprobe: yes tracepoint: yes perf_event: yes kfunc: yes
BTFサãƒãƒ¼ãƒˆã®å¼·åŒ–
ãã‚Œã§ã¯æ—©é€Ÿè¿½åŠ ã•ã‚ŒãŸä¸»è¦ãªæ©Ÿèƒ½ã‚’振り返ã£ã¦ã„ããŸã„ã¨æ€ã„ã¾ã™ï¼Žä»Šå¹´ã¯ãªã‚“ã¨ã„ã£ã¦ã‚‚BTF (BPF Type Format) を利用ã—ãŸæ©Ÿèƒ½ãŒã„ã‚ã„ã‚ã¨è¿½åŠ ã•ã‚Œã¾ã—ãŸï¼Žä»¥ä¸‹ã§ã¯ã©ã‚“ãªã“ã¨ãŒã§ãã‚‹ã‹ç°¡å˜ã«ç´¹ä»‹ã—ã¦ã„ãã¾ã™ï¼Ž
ãã‚‚ãã‚‚BTFã¨ã¯
BTFã«ã¯ã„ã‚ã„ã‚ãªç”¨é€”ãŒã‚ã‚‹ãŸã‚,簡å˜ã«èª¬æ˜Žã™ã‚‹ã®ã¯é›£ã—ã„ã®ã§ã™ãŒï¼Œbpftraceã®æ–‡è„ˆã§ã„ã†ã¨/proc/kallsyms ãŒç¾åœ¨å‹•ã„ã¦ã„るカーãƒãƒ«ã‚·ãƒ³ãƒœãƒ«ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’æä¾›ã™ã‚‹ã®ã¨åŒã˜ã‚ˆã†ã«ï¼ŒBTFã¯ç¾åœ¨å‹•ã„ã¦ã„るカーãƒãƒ«ãŒåˆ©ç”¨ã—ã¦ã„ã‚‹é–¢æ•°ã‚„ãƒ‡ãƒ¼ã‚¿æ§‹é€ ã®æƒ…å ±ã‚’æä¾›ã—ã¾ã™ï¼Žä¾‹ãˆã°ï¼ŒBTFã‚’å‚ç…§ã™ã‚Œã°ãã®ã‚«ãƒ¼ãƒãƒ«ãŒåˆ©ç”¨ã—ã¦ã„る,プãƒã‚»ã‚¹ã®çŠ¶æ…‹ã‚’ä¿æŒã™ã‚‹ struct task_struct
ã®æ§‹é€ を知るã“ã¨ãŒã§ã,ã©ã®ãƒ¡ãƒ³ãƒã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã©ã‚Œã ã‘ã®ã‚ªãƒ•ã‚»ãƒƒãƒˆãŒå¿…è¦ã‹ãŒåˆ†ã‹ã‚Šã¾ã™ï¼Žä»–ã«ã¯ä¾‹ãˆã°ï¼Œvfs_open()
関数ã®å¼•æ•°ã®æ•°ã‚„引数ã®åž‹ãŒåˆ†ã‹ã‚Šã¾ã™ï¼Žã“ã‚Œã§ä½•ãŒå¬‰ã—ã„ã®? ã¨æ€ã†ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ãŒï¼Œã‚«ãƒ¼ãƒãƒ«å†…ã®é–¢æ•°ã‚„æ§‹é€ ä½“ã¯unstableã§å¸¸ã«å¤‰åŒ–ã—ã¾ã™ï¼Žã‚«ãƒ¼ãƒãƒ«ãƒˆãƒ¬ãƒ¼ã‚·ãƒ³ã‚°ã‚’ã™ã‚‹å ´åˆï¼Œå¤šãã®å ´åˆã¯ã‚«ãƒ¼ãƒãƒ«ã®é–¢æ•°ã‚„æ§‹é€ ä½“ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ãŸã‚ï¼Œé–¢æ•°ã‚„æ§‹é€ ä½“ãŒå¤‰åŒ–ã—ã¦ã—ã¾ã†ã¨æŠ˜è§’書ã„ãŸãƒˆãƒ¬ãƒ¼ã‚·ãƒ³ã‚°ã‚¹ã‚¯ãƒªãƒ—トãŒç‰¹å®šã®ã‚«ãƒ¼ãƒãƒ«ã§ã—ã‹å‹•ã‹ãªã„ã¨ã„ã†ã“ã¨ã«ãªã‚Šã¾ã™ï¼ŽBTFã«ã‚ˆã‚Šãã®ã‚«ãƒ¼ãƒãƒ«ãŒåˆ©ç”¨ã—ã¦ã„る関数やカーãƒãƒ«ãŒåˆ†ã‹ã‚Œã°ï¼Œãã®æƒ…å ±ã‚’åˆ©ç”¨ã—ã¦ã‚¹ã‚¯ãƒªãƒ—トを補æ£ã™ã‚‹ã“ã¨ã§ï¼Œè¤‡æ•°ã‚«ãƒ¼ãƒãƒ«ã§å‹•ä½œã™ã‚‹ãƒˆãƒ¬ãƒ¼ã‚·ãƒ³ã‚°ã‚¹ã‚¯ãƒªãƒ—トãŒå‹•ä½œã§ãるよã†ã«ãªã‚‹ã¨ã„ã†ã‚ã‘ã§ã™ï¼Žé‹ã„æ–¹ã¯ãã‚Œã£ã¦DWARFã§ã§ãã‚‹ã®ã§ã¯?ã¨æ€ã†ã“ã¨ã§ã—ょã†ï¼Žå‹¿è«–DWARFã§ã‚‚å¯èƒ½ã§ã™ãŒï¼ŒBTFã¯ãƒˆãƒ¬ãƒ¼ã‚·ãƒ³ã‚°ç”¨é€”ã«ç‰¹åŒ–ã—ã¦ãƒ—ãƒãƒ€ã‚¯ã‚·ãƒ§ãƒ³ç’°å¢ƒã§ã‚‚利用ã§ãã‚‹ã“ã¨ã‚’一ã¤ã®ç›®æ¨™ã«ã—ã¦ã„ã‚‹ãŸã‚,サイズãŒéžå¸¸ã«å°ã•ã„ã§ã™ï¼ˆæ•°MB程度).ãŸã ã—ãã®ä»£ã‚ã‚ŠDWARFã¨æ¯”ã¹ã¦å½“ç„¶æƒ…å ±é‡ãŒå°‘ãªã„ãŸã‚,ã§ãã‚‹ã“ã¨ã¯å¿…然的ã«é™ã‚‰ã‚Œã¾ã™ï¼Ž
bpftraceã¯å®Ÿè¡Œæ™‚ã«ãƒˆãƒ¬ãƒ¼ã‚·ãƒ³ã‚°ã‚¹ã‚¯ãƒªãƒ—トをコンパイルã™ã‚‹å½¢ã§ã™ï¼ŽBTFãŒåˆ©ç”¨å¯èƒ½ãªå ´åˆã¯ï¼Œbpftraceã¯ã‚³ãƒ³ãƒ‘イル時ã«BTFæƒ…å ±ã‚’åˆ©ç”¨ã—ã¦ï¼Œé©åˆ‡ãªã‚ªãƒ•ã‚»ãƒƒãƒˆã§ãƒ‡ãƒ¼ã‚¿ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹BPFプãƒã‚°ãƒ©ãƒ を生æˆã—ã¾ã™ï¼ˆã‚‚ã—BTFãŒåˆ©ç”¨ã§ããªã„å ´åˆã¯ï¼Œincludeã—ãŸãƒ˜ãƒƒãƒ€ã«å«ã¾ã‚Œã‚‹å®šç¾©æƒ…å ±ã‚’åˆ©ç”¨ã—ã¾ã™ï¼‰ï¼Žä¸€æ–¹ã§ï¼Œå®Ÿè¡Œå‰ã«ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ—ãƒã‚°ãƒ©ãƒ ã‚’ã‚るカーãƒãƒ«ãƒãƒ¼ã‚¸ãƒ§ãƒ³ä¸Šã§ã‚³ãƒ³ãƒ‘イルã—ã¦ãŠã,BTFを利用ã—ã¦ãã®ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ—ãƒã‚°ãƒ©ãƒ ã‚’ãƒãƒ¼ãƒ‰ã™ã‚‹å‰ã«ï¼Œãƒ‡ãƒ¼ã‚¿æ§‹é€ アクセスã®ã‚ªãƒ•ã‚»ãƒƒãƒˆã®ä¿®æ£ã‚’ãŠã“ãªã†ã¨ã„ã†æ–¹æ³•ã‚‚ã‚ã‚Šã¾ã™ï¼Žã“ã¡ã‚‰ã¯ BPF CO-REã¨å‘¼ã°ã‚Œã‚‹æ©Ÿèƒ½ã§ï¼Œã“ã¡ã‚‰ã¯ã“ã¡ã‚‰ã§éžå¸¸ã«é‡è¦ã§ç©æ¥µçš„ã«é–‹ç™ºãŒé€²ã‚られã¦ã„ã¾ã™ãŒï¼ˆç‰¹ã«iovisor/bccã®æ–¹ã§ï¼‰ï¼Œbpftraceã¨ã¯ç›´æŽ¥ã¯é–¢ä¿‚ã‚ã‚Šã¾ã›ã‚“.
BTFã¯ã‚«ãƒ¼ãƒãƒ«ã®é–¢æ•°ã‚„æ§‹é€ ä½“ã®æƒ…å ±ã‚’æä¾›ã™ã‚‹ã ã‘ã®ã‚‚ã®ã§ã¯ã‚ã‚Šã¾ã›ã‚“.BTFã«ã¤ã„ã¦ã‚ˆã‚Šè©³ã—ãã¯ã“ã®è¾ºã‚Š(拙文ã§ã™)やカーãƒãƒ«ã®ãƒ‰ã‚ュメントをã”å‚ç…§ãã ã•ã„.
BTFを使用ã™ã‚‹ã«ã¯
BTFã®æ©Ÿèƒ½ã‚’利用ã™ã‚‹ã«ã¯ï¼ŒCONFIG_DEBUG_INFO_BTF
を有効ã«ã—ãŸã‚«ãƒ¼ãƒãƒ«ãŒå¿…è¦ã§ã™ï¼Žã¾ãŸã‚«ãƒ¼ãƒãƒ«5.6以上ã§ãªã„ã¨ä»¥ä¸‹ã§èª¬æ˜Žã™ã‚‹kfuncã®æ©Ÿèƒ½ã¯ä½¿ãˆã¾ã›ã‚“.bpftrace自体もlibbpfã¨ä¸€ç·’ã«ã‚³ãƒ³ãƒ‘イルã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼Žã€€
bpftrace --info
ã§BTFã®æ©Ÿèƒ½ãŒåˆ©ç”¨ã§ãã‚‹ã‹ç¢ºèªã§ãã¾ã™ï¼Žç‰¹ã«ï¼Œ
- BTFを使ã„ãŸã„å ´åˆã¯ "Kernel features" ã®btf ㌠yes
- kfuncを使ã„ãŸã„å ´åˆã¯ Probe typesã® kfunc ãŒyes
ã§ã‚ã‚‹å¿…è¦ã‚ã‚Šã¾ã™ï¼Ž
BTFã§ã§ãã‚‹ã“ã¨
ãã‚Œã§ã¯BTFã§ã§ãã‚‹ã“ã¨ã‚’ã¿ã¦ã„ãã¾ã—ょã†ï¼Ž
カーãƒãƒ«æ§‹é€ 体ã®è‡ªå‹•è§£æ±º
例ã¨ã—ã¦ï¼Œvfs_open(struct path*, strust file *)
関数ã®å‘¼ã³å‡ºã—をフックã—ã¦ï¼Œvfs_openãŒå‘¼ã°ã‚ŒãŸæ™‚ã®path
ã®ãƒ•ã‚¡ã‚¤ãƒ«åを呼ã³å‡ºã™ã‚¹ã‚¯ãƒªãƒ—トを考ãˆã¾ã™(ã“ã‚Œã¯bptraceã®reference guideã‹ã‚‰ã®å¼•ç”¨ã§ã™).BTFãŒç„¡ã„以å‰ã¯ï¼Œã‚¹ã‚¯ãƒªãƒ—トãŒåˆ©ç”¨ã™ã‚‹ struct path
や. struct dentry
ãŒå®šç¾©ã—ã¦ã‚るヘッダをインクルードã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã—ãŸï¼Ž
#include <linux/path.h> #include <linux/dcache.h> kprobe:vfs_open { printf("open path: %s\n", str(((struct path *)arg0)->dentry->d_name.name)); }
ã‚‚ã—BTFãŒä½¿ç”¨ã§ãる環境ã§ã‚ã‚Œã°ï¼Œä»¥ä¸‹ã®ã‚ˆã†ã«ãƒ˜ãƒƒãƒ€ã‚’インクルードã—ãªãã¦ã‚‚,スクリプトå´ã§åˆ©ç”¨ã™ã‚‹ã‚«ãƒ¼ãƒãƒ«æ§‹é€ 体ãŒï¼Œç‰¹ã«ä½•ã‚‚ã—ãªãã¦ã‚‚利用ã§ãるよã†ã«ãªã‚Šã¾ã™ï¼Ž
kprobe:vfs_open { printf("open path: %s\n", str(((struct path *)arg0)->dentry->d_name.name)); }
内部的ã«ã¯ã¾ãšBTFã‹ã‚‰ struct path
ã®æƒ…å ±ã‚’å–ã£ã¦ãã¦ï¼Œãã“ã‹ã‚‰ã‚¹ã‚¯ãƒªãƒ—トãŒã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹æ§‹é€ ä½“æƒ…å ±ã‚’é›†ã‚ã¦ãã¦ãれを利用ã—ã¦ã„ã¾ã™ï¼Ž
kfuncã®åˆ©ç”¨
上記ã®ã‚¹ã‚¯ãƒªãƒ—ト例ã§ã¯kprobeを利用ã—ã¦ã„ã¾ã—ãŸï¼Žkprobeã¯åŸºæœ¬çš„ã«ã‚«ãƒ¼ãƒãƒ«å†…ã®ã©ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã‚‚アタッãƒã§ãã‚‹ã®éžå¸¸ã«ä¾¿åˆ©ã§ã™ãŒï¼Œä¸€æ–¹ã§bpftraceã§ã¯é–¢æ•°ã«ã‚¢ã‚¿ãƒƒãƒã—ãŸã¨ã,自分ã§å¼•æ•°ã‚’ã‚ャストã™ã‚‹å¿…è¦ï¼ˆä¸Šè¨˜ã®ä¾‹ã 㨠(struct path *)arg0)
ãŒã‚ã‚Šã¾ã—ãŸï¼Žï¼‰ã‚«ãƒ¼ãƒãƒ«5.6ã‹ã‚‰ï¼Œkfuncã¨ã„ã†ï¼Œkprobeã¨ã¯ã¾ãŸé•ã†ãƒˆãƒ¬ãƒ¼ã‚¹æ–¹æ³•ãŒè¿½åŠ ã•ã‚Œã¾ã—ãŸï¼Žkfuncã¯kprobeã¨é•ã„関数ã®entryã¾ãŸã¯exitã«ã—ã‹ã‚¢ã‚¿ãƒƒãƒã§ãã¾ã›ã‚“ãŒï¼ŒBTFã®æƒ…å ±ã‚’åˆ©ç”¨ã™ã‚‹ã“ã¨ã§ï¼Œä»¥ä¸‹ã®ã‚ˆã†ã«æ§‹é€ 体ã®ã‚ャストãªã—ã«é–¢æ•°ã®å¼•æ•°ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ï¼Ž
kfunc:vfs_open { printf("open path: %s\n", str(args->path->dentry->d_name.name)); }
ãƒã‚¤ãƒ³ãƒˆã¯ args->path
ã§ï¼Œã“ã‚Œã«ã‚ˆã‚Š vfs_open()
ã®å¼•æ•° path
ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„ã¾ã™ï¼Žä½•æ•…ã“ã‚ŒãŒã§ãã‚‹ã‹ã¨ã„ã†ã¨ï¼ŒBTFã«ã¯é–¢æ•°ã®æƒ…å ±ã‚‚å…¥ã£ã¦ã„ã‚‹ã®ã§ï¼Œã¾ãš vfs_open
ã®é–¢æ•°ã®ãƒ—ãƒãƒˆã‚¿ã‚¤ãƒ—æƒ…å ±ã‚’ã¨ã¦ãã¦ï¼Œãã‚Œã‹ã‚‰ args->path
ã§vfs_open
ã®pathã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã‚‹ã“ã¨ãŒåˆ†ã‹ã‚‹ã®ã§ï¼Œãã“ã‹ã‚‰ã‚¹ã‚¯ãƒªãƒ—トãŒç”Ÿæˆã§ãã‚‹ã¨ã„ã†ã‚ã‘ã§ã™ï¼Ž ã¾ãŸkfuncã®å ´åˆkprobeã¨é•ã£ã¦å¼•æ•°ãŒè‡ªå‹•ã§ã‚ャストã•ã‚Œã‚‹ã®ã§ï¼Œé–“é•ã£ãŸã‚ャストをã—ã¦ã—ã¾ã†ã¨ã„ã†ãƒŸã‚¹ã‚‚ãªããªã‚Šã¾ã™ï¼Ž
カーãƒãƒ«é–¢æ•°ã®å¼•æ•°ã‚„æ§‹é€ ä½“ã®ç¢ºèª
ã‚„ã‚„ãŠã¾ã‘的機能ã§ã™ãŒï¼Œä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¦BTFを利用ã—ã¦é–¢æ•°ã®ãƒ—ãƒãƒˆã‚¿ã‚¤ãƒ—ã‚„ï¼Œæ§‹é€ ä½“ã®ãƒ¡ãƒ³ãƒãŒç¢ºèªã§ãã¾ã™ï¼Ž
% sudo bpftrace -lv "kfunc:vfs_open" kfunc:vfs_open const struct path * path; struct file * file;
% sudo ./src/bpftrace -lv "struct path" struct path { struct vfsmount *mnt; struct dentry *dentry; };
ã“ã®æ§‹é€ 体ã®ãƒ¡ãƒ³ãƒãªã‚“ã ã£ã‘?ã¨ãªã£ãŸã¨ãカーãƒãƒ«ã‚½ãƒ¼ã‚¹ã‚’確èªã™ã‚‹å¿…è¦ãŒãªããªã‚Šã¾ã™ï¼Ž
ç¾çŠ¶ã®BTFã®åˆ¶ç´„
BTFã¯éžå¸¸ã«ä¾¿åˆ©ã§ã™ãŒï¼Œä»¥ä¸‹ã®ã‚ˆã†ãªåˆ¶ç´„・課題ãŒã‚ã‚Šã¾ã™ï¼Ž
- ç¾çŠ¶BTFã«å«ã¾ã‚Œã‚‹é–¢æ•°ã¯non-statitcãªã‚‚ã®ã®ã¿ (kprobeã¯staticãªé–¢æ•°ã«ã‚‚対応ã—ã¦ã„ã¾ã™)
- カーãƒãƒ«ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã«æœªå¯¾å¿œ (ã‚‚ã—カーãƒãƒ«ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’BTFã§ãƒˆãƒ¬ãƒ¼ã‚·ãƒ³ã‚°ã—ãŸã„å ´åˆã¯ï¼Œã‚«ãƒ¼ãƒãƒ«å´ã«ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ãˆã¯ãªã組ã¿è¾¼ã‚“ã§ãƒ“ルドã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™)
- define 値ã®æ¬ 如
ã“ã®è¾ºã‚Šã®å•é¡Œã¯ã„ã‚ã„ã‚ã¨è§£æ±ºã«å‘ã‘ã¦è°è«–ãŒã•ã‚Œã¦ã„ã¾ã™ï¼Žç‰¹ã«æœ€å¾Œã®defineã•ã‚Œã¦ã„る値ãŒæ¬ 如ã•ã‚Œã¦ã„ã‚‹ã¨ã„ã†ã®ã¯åœ°å‘³ã«ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ—ãƒã‚°ãƒ©ãƒ を書ã時ã«éšœå®³ã«ãªã‚Šã¾ã™ï¼Žä¾‹ãˆã° AF_INET
ã®å€¤ã‚’知りãŸã„ã¨ãã¯ï¼ŒBTFãŒã‚ã£ã¦ã‚‚ãã‚ŒãŒdefineã•ã‚Œã¦ã„るヘッダをインクルードã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‚ã‘ã§ã™ï¼Žè§£æ±ºç–ã®ä¸€ã¤ã¯#defineã§ã¯ãªãenumを使ã†ã“ã¨ã§ (enumã®æƒ…å ±ã¯BTFã«å«ã¾ã‚Œã¾ã™),実ã¯ä¸€éƒ¨ãƒ˜ãƒƒãƒ€ã¯BTFã«å¯¾å¿œã§ãるよã†ã«ãã®ã‚ˆã†ãªå¤‰æ›´ãŒåŠ ãˆã‚‰ã‚Œã¦ã„ã¾ã™ï¼Žå°†æ¥çš„ã«ã¯ã“ã®è¾ºã‚Šã®å•é¡ŒãŒè§£æ±ºã•ã‚Œã‚‹ã¨å¬‰ã—ã„ã§ã™ã.
Docker ビルド・スタティックビルドã®æä¾›
x86_64用ã§ã™ãŒï¼Œãƒ›ã‚¹ãƒˆã‚’トレースã™ã‚‹ãŸã‚ã®DockerビルドãŒã‚ã‚Šã¾ã™ï¼Žä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¦åˆ©ç”¨ã§ãã¾ã™ï¼Ž
% sudo docker run -it --privileged -v /sys/kernel/debug:/sys/kernel/debug:rw -v /lib/modules/:/lib/modules:ro -v /usr/src:/usr/src:ro quay.io/iovisor/bpftrace tcpconnect.bt
é©åˆ‡ã«debugfsやカーãƒãƒ«ãƒ˜ãƒƒãƒ€ã®å ´æ‰€ã‚’コンテナå´ã«ãƒžã‚¦ãƒ³ãƒˆã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ãŒï¼Œdocker buildを使ã†ã¨bpftraceã®æœ€æ–°ç‰ˆãŒä½¿ãˆã¦ä¾¿åˆ©ã§ã™ï¼ŽãŸã 残念ãªãŒã‚‰ç¾çŠ¶BTFã®ã‚µãƒãƒ¼ãƒˆ(ã¨ã„ã†ã‹libbpfã¨ã®ãƒ“ルド)ã¯ã‚ã‚Šã¾ã›ã‚“.
ã¾ãŸï¼Œgithub actionã«ã‚ˆã‚Šã‚¹ã‚¿ãƒ†ã‚£ãƒƒã‚¯ãƒ“ルドãŒæä¾›ã•ã‚Œã‚‹ã‚ˆã†ã«ãªã£ã¦ã„ã¾ã™ï¼ŽReleaseã‹ã‚‰ãƒªãƒªãƒ¼ã‚¹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¹ã‚¿ãƒ†ã‚£ãƒƒã‚¯ãƒ“ルドãŒå–å¾—ã§ãる他,やや分ã‹ã‚Šã«ãã„ã§ã™ãŒgithubアクションã®embedded buildã®é …ç›®ã‹ã‚‰æœ€æ–°ã®ã‚¹ã‚¿ãƒ†ã‚£ãƒƒã‚¯ãƒ“ルドãŒå–å¾—ã§ãã¾ã™ï¼Ž
知ã£ã¦ãŠãã¨ä¾¿åˆ©ãªæ©Ÿèƒ½
タプル
以下ã®ã‚ˆã†ã«ã‚¿ãƒ—ルãŒä½¿ãˆã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã—ãŸï¼Žã‚ã–ã‚ã–複数マップを作らãªãã¦ã‚‚値ãŒæ ¼ç´ã§ãã¾ã™ï¼Ž
% bpftrace -e 'BEGIN { @ = (0, 1, "abc"); printf("%d\n", @.0); print(@); }' Attaching 1 probe... 0 @: (0, 1, abc)
マップã®è¤‡æ•°ã‚ーã®åˆ©ç”¨
別ã«ã“れ自体ã¯å‰ã‹ã‚‰ã‚ã£ãŸæ©Ÿèƒ½ãªã®ã§ã™ãŒï¼Œã„ã¾ã„ã¡èªçŸ¥ã•ã‚Œã¦ã„ãªã„よã†ãªã®ã§æ›¸ã„ã¦ãŠãã¾ã™ï¼Žä»¥ä¸‹ã®ã‚ˆã†ã« @[]
ã«ä½¿ã†ã‚ーã¯è¤‡æ•°å€‹æŒ‡å®šã§ãã¾ã™ï¼Ž
% sudo ./share/bpftrace -e 'BEGIN { @[pid, cpu] = 1; print(@); }' Attaching 1 probe... @[10189, 35]: 1
ã“れを使ã†ã¨æ¡ä»¶ï¼ˆä¾‹ãˆã°CPU番å·ï¼‰ã«å¿œã˜ãŸé›†è¨ˆãªã©ãŒç°¡å˜ã«ã§ãã¾ã™ï¼Ž
ãƒã‚¤ãƒŠãƒªå€¤ã®ãƒ€ãƒ³ãƒ—
buf()
を使ã†ã¨ï¼Œãƒã‚¤ãƒ³ã‚¿å…ˆã®ãƒ‡ãƒ¼ã‚¿ã‚’ダンプãŒã§ãã¾ã™ï¼Žä¼¼ãŸã‚ˆã†ãªé–¢æ•°ã« str()
ãŒã‚ã‚Šã¾ã™ãŒï¼Œ str()
ã¯NULL終端ã•ã‚ŒãŸæ–‡å—列を扱ã†ç‚¹ãŒç•°ãªã‚Šã¾ã™ï¼Ž
% bpftrace -e 'tracepoint:syscalls:sys_enter_sendto { printf("Datagram bytes: %r\n", buf(args->buff, args->len)); }' -c 'ping 8.8.8.8 -c1' Attaching 1 probe... PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. Datagram bytes: \x08\x00@\xc3\x05\xb6\x00\x01\xe9\x0aW_\x00\x00\x00\x00\xb0H\x02\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x1 6\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&'()*+,-./01234567 ^C --- 8.8.8.8 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms
エラーãƒã‚§ãƒƒã‚¯
-k
ã‚ã‚‹ã„㯠-kk
オプションã§BPFプãƒã‚°ãƒ©ãƒ 実行ä¸ã®ã‚¨ãƒ©ãƒ¼ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ï¼Ž
% bpftrace -kk -e 'BEGIN { @[0] = 1; @[1]++; }' Attaching 1 probe... stdin:1:19-25: WARNING: Failed to map_lookup_elem: 0 BEGIN { @[0] = 0; @[1]++;} ~~~~~~
ã‚‚ã—bpftraceã®ã‚¹ã‚¯ãƒªãƒ—トãŒæœŸå¾…ã—ãŸã¨ãŠã‚Šã«å‹•ã‹ãªã„å ´åˆï¼Œã¨ã‚Šã‚ãˆãš -kk
ã‚’ã¤ã‘ã¦å®Ÿè¡Œã—ã¦ã¿ã‚‹ã¨è‰¯ã„ã¨æ€ã„ã¾ã™ï¼Ž
ã“ã®æ©Ÿèƒ½ã«ã¤ã„ã¦è£œè¶³ã™ã‚‹ã¨ï¼ŒBPFプãƒã‚°ãƒ©ãƒ ã«ã¯ãƒ˜ãƒ«ãƒ‘ー関数ã¨å‘¼ã°ã‚Œã‚‹é–¢æ•°ã‚’利用ã—ã¦ï¼Œã‚«ãƒ¼ãƒãƒ«ã®å‡¦ç†ã‚’呼ã³å‡ºã™æ©Ÿèƒ½ãŒã‚ã‚Šã¾ã™ï¼Žã“ã‚Œã¯ã„ã‚ã°ãƒ¦ãƒ¼ã‚¶ãƒ—ãƒã‚°ãƒ©ãƒ ã«ãŠã‘るシステムコールã®ã‚ˆã†ãªã‚‚ã®ã§ï¼ŒBPFマップã®æ“作や出力処ç†ãªã©ã®æ©Ÿèƒ½ã¯å…¨ã¦ã“ã®ãƒ˜ãƒ«ãƒ‘ー関数ã«ã‚ˆã£ã¦æˆã‚Šç«‹ã£ã¦ã„ã¾ã™ï¼Žbpftraceを利用ã™ã‚‹å ´åˆã¯ç‰¹ã«ã“ã®ãƒ˜ãƒ«ãƒ‘ー関数をæ„è˜ã™ã‚‹å¿…è¦ã¯ãªã„ã§ã™ãŒï¼Œé‡è¦ãªã®ã¯ãƒ˜ãƒ«ãƒ‘ー関数ã®å‡¦ç†ã¯ä½•ã‚‰ã‹ã®ç†ç”±ã«ã‚ˆã£ã¦å¤±æ•—ã™ã‚‹ã“ã¨ãŒã‚ã‚‹ã¨ã„ã†ã“ã¨ã§ã™ï¼Žã“ã®ã¨ã,ヘルパー関数ã¯æˆ»ã‚Šå€¤ã¨ã—ã¦ã‚¨ãƒ©ãƒ¼ã‚’è¿”ã—ã¾ã™ãŒï¼Œãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã¯ã“ã®ã‚¨ãƒ©ãƒ¼å€¤ã¯ç„¡è¦–ã•ã‚Œã¾ã™ï¼Žã“れをãƒã‚§ãƒƒã‚¯ã™ã‚‹ã®ãŒ -k
ãŠã‚ˆã³ -kk
オプションã§ã™ï¼Ž -k
㨠-kk
ã®é•ã„ã¯ï¼Œãƒã‚§ãƒƒã‚¯ã™ã‚‹ãƒ˜ãƒ«ãƒ‘ー関数ã®æ•°ã§ã™ï¼Žbpftraceã¯ãƒ‡ãƒ¼ã‚¿ã®èªã¿å‡ºã—ã‚’ãŠã“ãªã†ãƒ˜ãƒ«ãƒ‘ー関数ãŒå¤±æ•—ã™ã‚‹ã¨ï¼Œå€¤ã‚’0ã¨ã—ã¦è¿”ã™ã¨ã„ã†ä»•æ§˜ã«ãªã£ã¦ã„ã¾ã™ï¼Žã“ã‚Œã«ã‚ˆã£ã¦ï¼Œä¾‹ãˆã° / @[tid] /
ã®ã‚ˆã†ã«æ›¸ãã¨ï¼Œ @[tid]
ãŒå˜åœ¨ã—ãªã„å ´åˆã¯ãã®å‡¦ç†ãŒã‚¹ã‚ップã§ãã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ï¼Žã“ã®ã‚ˆã†ãªãƒ†ã‚¯ãƒ‹ãƒƒã‚¯ã¯bpftraceã®ã‚¹ã‚¯ãƒªãƒ—トã§åºƒã使ã‚ã‚Œã¦ã„ã¦ï¼Œã“ã®ã‚¨ãƒ©ãƒ¼ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ã—ã¾ã†ã¨å†—é•·ãªå ´åˆãŒã‚ã‚‹ãŸã‚, -k
オプションã§ã¯ã“ã®ã‚ˆã†ãªãƒ‡ãƒ¼ã‚¿èªã¿å‡ºã—ã®é–¢æ•°ã«é–¢ã—ã¦ã‚¨ãƒ©ãƒ¼ã¯ãƒã‚§ãƒƒã‚¯ã—ã¾ã›ã‚“. -kk
ã ã¨å…¨ã¦ã®ãƒ˜ãƒ«ãƒ‘ー関数ã®ã‚¨ãƒ©ãƒ¼ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¾ã™ï¼Žä¸€ã¤æ³¨æ„点ã¨ã—ã¦ï¼Œã‚¨ãƒ©ãƒ¼ãƒã‚§ãƒƒã‚¯æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹ã¨BPFプãƒã‚°ãƒ©ãƒ ãŒãã®åˆ†é•·ããªã‚Šã¾ã™ï¼Žå ´åˆã«ã‚ˆã£ã¦ã¯ãã®ã‚ªãƒ¼ãƒãƒ˜ãƒƒãƒ‰ãŒå•é¡Œã«ãªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ï¼Žã¾ãŸï¼Œãƒãƒ¼ãƒ‰ã§ãã‚‹BPFプãƒã‚°ãƒ©ãƒ é•·ã«ã¯åˆ¶é™ãŒã‚ã‚‹ãŸã‚,大ããªbpftraceスクリプトã§ã¯ã‚¨ãƒ©ãƒ¼ãƒã‚§ãƒƒã‚¯æ©Ÿèƒ½ãŒåˆ©ç”¨ã§ããªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ï¼Ž
whileループ
ã‚‚ã¨ã‚‚ã¨BPFプãƒã‚°ãƒ©ãƒ ã¯åœæ¢æ€§ä¿è¨¼ã®ãŸã‚ã«ãƒ«ãƒ¼ãƒ—(後方ジャンプ)ãŒä¸€åˆ‡è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ã§ã—ãŸãŒï¼ŒverifierãŒè³¢ããªã£ã¦æœ‰é™å›žã§åœæ¢ã™ã‚‹ãƒ«ãƒ¼ãƒ—処ç†ãŒæ›¸ã‘るよã†ã«ãªã‚Šã¾ã—ãŸï¼Žã‚«ãƒ¼ãƒãƒ«5.3以上ãŒå¿…è¦ã§ã™ï¼Žbpftraceã§ã¯ while()
を使ã„ã¾ã™ï¼Ž
% bpftrace -e 'i:ms:100 { $i = 0; while ($i <= 100) { printf("%d ", $i); $i++} exit(); }'
ã“ã“ã§ï¼Œverifierã¯å®Ÿéš›ã«ãƒ«ãƒ¼ãƒ—処ç†ã‚’一ã¤ä¸€ã¤è§£é‡ˆã—ã¦ã„ã,ãã®ãƒ«ãƒ¼ãƒ—ãŒåœæ¢ã™ã‚‹ã‹ã‚’ã¿ã¦ã„ã¾ã™ï¼Žå¾“ã£ã¦ï¼Œæ¥µç«¯ã«å¤§ããªãƒ«ãƒ¼ãƒ—ã¯verifierã®å‘½ä»¤è§£é‡ˆæ•°ä¸Šé™ã«å¼•ã£ã‹ã‹ã‚‹ãŸã‚実行ã§ãã¾ã›ã‚“.例ãˆã°ï¼Œä»¥ä¸‹ã®ãƒ—ãƒã‚°ãƒ©ãƒ ã¯ã‚¨ãƒ©ãƒ¼ã«ãªã‚Šã¾ã™ï¼Ž
$i = 0; while ($i <= rand) { printf("%d ", $i); $i++} exit(); }
ã“れ㯠rand
ã¯uint64ã®å€¤ã‚’è¿”ã™é–¢æ•°ã§ï¼Œverifierã¯ãã®å€¤ã®æœ€å¤§ã‚’想定ã—ã¦verificationã‚’ãŠã“ãªã†ãŸã‚ã§ã™ï¼Žä»¥ä¸‹ã®ã‚ˆã†ã«ï¼Œæ˜Žç¤ºçš„ã«ãƒ«ãƒ¼ãƒ—上é™ã‚’定ã‚ã¦ã‚ã’ã‚‹ã¨ãƒ—ãƒã‚°ãƒ©ãƒ ãŒå®Ÿè¡Œã§ãるよã†ã«ãªã‚Šã¾ã™ï¼Ž
$i = 0; $max = rand; if ($max > 100) { $max = 100;} while ($i <= $max) { printf("%d ", $i); $i++} exit();}
ãã®ä»–主è¦ãªå¤‰æ›´ãƒ»æ›´æ–°ç‚¹
s390x, aarch64ã®ã‚µãƒãƒ¼ãƒˆ
ビッグエンディアンã®ã‚¢ãƒ¼ã‚テクãƒãƒ£ã«å˜åœ¨ã—ãŸä¸€éƒ¨å•é¡ŒãŒä¿®æ£ã•ã‚Œã¾ã—ãŸï¼Žã¾ãŸaarch64ãªã©ã®ã‚¢ãƒ¼ã‚テクãƒãƒ£ã§ã¯ï¼Œã‚«ãƒ¼ãƒãƒ«ãƒ¢ãƒ¼ãƒ‰ã¨ãƒ¦ãƒ¼ã‚¶ãƒ¢ãƒ¼ãƒ‰ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚¹ãƒšãƒ¼ã‚¹ãŒç•°ãªã‚‹ã“ã¨ã«èµ·å› ã—ã¦ï¼Œãã‚Œãžã‚Œã®ãƒ‡ãƒ¼ã‚¿ã®èªã¿å‡ºã—ã«å°‚用ã®ãƒ˜ãƒ«ãƒ‘ー関数*2を利用ã™ã‚‹å¿…è¦ãŒã‚り,ã—ã°ã‚‰ãã®é–“bpftraceã¯ã“れをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“ã§ã—ãŸãŒï¼Œã¤ã„最近ã“ã®æ©Ÿèƒ½ãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã—ãŸï¼Žçµæžœã¨ã—ã¦aarch64ã§ã‚‚å•é¡ŒãªãbpftraceãŒä½¿ãˆã‚‹ã‚ˆã†ã«ãªã£ã¦ã„ã‚‹ã¯ãšã§ã™ï¼Ž
日本語版ドã‚ュメント
ワンライナーãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã«ã¯æ—¥æœ¬èªžè¨³(拙訳ã§ã™)ãŒã‚ã‚Šã¾ã™ï¼ŽReference Guideã¯è‹±èªžã®ã¿ã§ã™ï¼Ž
Discourse フォーラãƒ
Discourceã«bpftraceã®ãƒ•ã‚©ãƒ¼ãƒ©ãƒ ãŒã§ãã¾ã—ãŸï¼Žè³ªå•ã¯ã“ã“ã«æŠ•ã’ã‚‹ã¨è‰¯ã„ã¨æ€ã„ã¾ã™ï¼Žé–‹ç™ºè€…ã®æ–¹ãŒè¦‹ã¦ã„ã¾ã™ï¼Ž
より詳ã—ã知りãŸã„æ–¹
実際ã«ã¯ä»–ã«ã‚‚ã„ã‚ã„ã‚ã¨æ©Ÿèƒ½ãŒè¿½åŠ ã•ã‚Œã¦ã„ã¾ã™ï¼Žè©³ã—ã㯠CHANGELOG ã‚’ã©ã†ãžï¼Ž
ãƒã‚°æƒ…å ±
最後ã«ï¼Œç¾åœ¨ã®bpftraceã«ã¯ printf()ã—ãŸã¨ãã«é–“é•ã£ãŸå€¤ãŒã”ãã¾ã‚Œã«è¡¨ç¤ºã•ã‚Œã‚‹ ã¨ã„ã†å‰²ã¨è‡´å‘½çš„ãªãƒã‚°ãŒã‚ã‚Šã¾ã™ï¼Žé•·ã„é–“åŽŸå› ãŒåˆ†ã‹ã‚‰ãšé–‹ç™ºè€…を困らã›ã¦ã„ã¾ã„ã—ãŸãŒï¼Œã©ã†ã‚„らLLVMã®ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã«å•é¡ŒãŒã‚ã‚‹ã¨ã„ã†ã“ã¨ãŒåˆ†ã‹ã‚Šã¾ã—ãŸï¼ˆè©³ã—ã㯠#1305, Bugzilla – Bug 47591 ã‚’ã©ã†ãžï¼‰ï¼Ž2020å¹´12月ç¾åœ¨ã“ã®ãƒã‚°ã¯ä¿®æ£ã•ã‚Œã¦ãŠã‚‰ãšï¼Œç¾çŠ¶ã“ã‚Œã«å¯¾å¿œã™ã‚‹å®Œç’§ãªæ–¹æ³•ã¯ãªã„ã®ã§ã™ãŒï¼Œprintf()ã®ä½ç½®ã‚’変ãˆãŸã‚Šã™ã‚‹ã¨çµæžœçš„ã«BPFã®ã‚³ãƒ¼ãƒ‰ãŒå¤‰ã‚ã‚‹ã®ã§å•é¡ŒãŒè§£æ±ºã™ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ï¼Žä¸Šè¨˜ã§ç´¹ä»‹ã—㟠-k
ã‚ã‚‹ã„㯠-kk
オプションも有効ã§ã™ï¼Žã‚‚ã—bpftraceを使ã£ã¦ã„ã¦æ˜Žã‚‰ã‹ã«å‡ºåŠ›ãŒãŠã‹ã—ã„å ´åˆã¯ã“ã®ãƒã‚°ã‚’ç–‘ã£ã¦ã¿ã¦ãã ã•ã„.ã¡ãªã¿ã«æœ¬å½“ã«ã“ã®ãƒã‚°ã‹ã©ã†ã‹ã¯BPFプãƒã‚°ãƒ©ãƒ ã®ã‚¢ã‚»ãƒ³ãƒ–ラコードを眺ã‚ã¦ã¿ã‚‹ã¨åˆ†ã‹ã‚Šã¾ã™ï¼Žä¸è‡ªç„¶ã«loadã¨store命令ãŒå…¥ã‚Œæ›¿ã‚ã£ã¦ã„る箇所ãŒã‚ã‚‹ã¯ãšã§ã™ï¼Ž
2020-12-4 追記
ã“ã®ãƒã‚°ã§ã™ãŒï¼ŒLLVM12ã§ä¿®æ£ã•ã‚ŒãŸãã†ã§ã™ï¼ŽãŸã ã—LLVM12ãŒå®Ÿéš›ã«åˆ©ç”¨ã•ã‚Œã‚‹ã‚ˆã†ã«ãªã‚‹ã®ã¯æ•°å¹´ã‹ã‹ã‚‹ã§ã—ょã†ã—,bpftraceå´ã§ã‚‚ãªã‚“ã¨ã‹ä¿®æ£ã§ããªã„ã‹ã„ã‚ã„ã‚ã¨æ¤œè¨Žã—ã¦ã„ã¾ã™ï¼Ž
追記ã“ã“ã¾ã§
ãŠã¾ã‘
bpftaceã«ã‚ˆã‚‹BitVisorã®ãƒˆãƒ¬ãƒ¼ã‚¹
先日BitVisorã‚’bpftraceトレースã™ã‚‹ã¨ã„ã†å†…容ã®ç™ºè¡¨ã‚’BitVisor Summit 9ã§ãŠã“ãªã„ã¾ã—ãŸï¼Žè¨€ã£ã¦ã‚‹æ„味ãŒä¸æ˜Žã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ãŒï¼Œèˆˆå‘³ã®ã‚ã‚‹æ–¹ã¯ã”笑覧ãã ã•ã„ ⇒ スライド
macã‹ã‚‰bpftraceを試ã™
最åˆã«æ›¸ãã¾ã—ãŸãŒï¼ŒIntel macã‹ã‚‰bpftraceã‚’ç°¡å˜ã«è©¦ã›ã‚‹ã‚‚ã®ã‚’作りã¾ã—ãŸï¼Žè©³ã—ãã¯ã“ã¡ã‚‰ã‚’ã©ã†ãžï¼Ž
システム系論文ã®æƒ…å ±åŽé›†æ–¹æ³•
ã‚ã¾ã‚ŠBPFã¨é–¢ä¿‚ãªãã¦æ縮ã§ã™ãŒï¼Œæ˜¨æ—¥ã‚·ã‚¹ãƒ†ãƒ 系論文ã®æƒ…å ±åŽé›†æ–¹æ³•ã¨ã„ã†ã‚¨ãƒ³ãƒˆãƒªã‚’書ãã¾ã—ãŸï¼Žå¦è¡“çš„ã«ã‚‚BPFを使ã£ãŸè«–æ–‡ã¯çµæ§‹å‡ºã¦ã„ã‚‹ã®ã§ï¼Œæ°—ã«ãªã‚‹æ–¹ã¯ãƒã‚§ãƒƒã‚¯ã—ã¦ã¿ã¦ãã ã•ã„.
最後ã«-- bpftraceã«é–¢ã‚ã£ã¦ãã¦
最後ã«æŠ˜è§’ã®æ©Ÿä¼šãªã®ã§ä¸€å¹´é–“bpftraceã«é–¢ã‚ã£ã¦ããŸæ„Ÿæƒ³ã‚’書ã„ã¦ã¿ã‚ˆã†ã¨æ€ã„ã¾ã™ï¼Žã¾ãšï¼Žbpftraceã¯ã‚‚ã¨ã‚‚ã¨Alastair Robertsonã•ã‚“一人ã«ã‚ˆã£ã¦2017å¹´ã‹ã‚‰é–‹ç™ºã•ã‚ŒãŸãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã§ã™ï¼ˆã™ã”ã„).ãã®å¾Œï¼ŒBrendan Greggã•ã‚“ã«ã‚ˆã‚Šå¤šãã®ãƒ„ールãŒè¿½åŠ ã•ã‚Œï¼Œã•ã‚‰ã«Netflixã®ã‚¨ãƒ³ã‚¸ãƒ‹ã‚¢ã®æ–¹ã«ã‚ˆã£ã¦åŸºæœ¬çš„ãªæ©Ÿèƒ½ã®å¤šããŒè¿½åŠ ã•ã‚Œã¾ã—ãŸï¼Žã ã„ãŸã„去年ã®æ˜¥å…ˆã”ã‚ã®ã“ã¨ã ã¨æ€ã„ã¾ã™ï¼Žæ›¸ç±"BPF Performance Tools" (Brendan Gregg箸)ã¯ãã®è¾ºã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®bpftraceã‚’ã‚‚ã¨ã«æ›¸ã‹ã‚Œã¦ã„ã¾ã™ï¼Žãã®ã“ã‚ã¨æ¯”ã¹ã¦ï¼Œbpftraceã¯çµæ§‹é€²åŒ–ã—ã¦ã„ã‚‹ã¨æ€ã„ã¾ã™ï¼Žç¾åœ¨ã¯å‰è¿°ã®3人ã¯ã‚³ãƒŸãƒƒãƒˆã«é–¢ã—ã¦ã¯æŽ§ãˆã‚ã§ï¼Œä»Šã¯ç§ã‚’å«ã‚ãŸåˆ¥ã®3人ãŒä¸»ã«ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã«é–¢ã‚ã£ã¦ã„ã¾ã™ï¼Žç‰¹ã«ãã®ä¸ã®ä¸€äººã®FBã®ã‚¨ãƒ³ã‚¸ãƒ‹ã‚¢ã®æ–¹ãŒãƒ¡ã‚¤ãƒ³ã®ãƒ¡ãƒ³ãƒ†ãƒŠã¨ã„ã£ãŸæ„Ÿã˜ã§ã™ï¼Žãã®ä»–Red Hatã‚„IBMã®æ–¹ã‹ã‚‰ã‚‚定期的ã«ã‚³ãƒ³ãƒˆãƒªãƒ“ューションãŒã‚ã‚Šã¾ã™ï¼Ž
ã“ã‚Œã¾ã§ã«ç§ãŒã‚³ãƒŸãƒƒãƒˆã—ãŸä¸»ãªå†…容ã«ã¯ä»¥ä¸‹ãŒã‚ã‚Šã¾ã™ï¼Ž
- æ•´æ•°åž‹ãƒã‚¤ãƒ³ã‚¿ã®ã‚ャストã®ã‚µãƒãƒ¼ãƒˆ#942
- kprobe offset ã«å¯¾ã™ã‚‹ã‚¢ã‚¿ãƒƒãƒæ©Ÿèƒ½ã®è¿½åŠ #956
- BPFコンテã‚ストアクセスã®ä¿®æ£ #1104
- bpftrace oneliner ドã‚ュメント翻訳 #1176, 訳文
- bpf helper functionエラーã®ãƒ¬ãƒãƒ¼ãƒˆæ©Ÿèƒ½ #1276
- fuzzingã®ã‚µãƒãƒ¼ãƒˆ #1601, #1633, ドã‚ュメント
- ãã®ä»–ã®ãƒã‚°ä¿®æ£ãªã©
一番最åˆã®PRã¯æ•´æ•°åž‹ãƒã‚¤ãƒ³ã‚¿ã®ã‚ャストã®ã‚µãƒãƒ¼ãƒˆ ((int8*)$var
ã¿ãŸã„ãªã‚„ã¤) ã§ã—ãŸï¼Žã“ã‚Œã¯bpftraceを使ã„始ã‚ã¦ã™ãã«ã“ã®æ©Ÿèƒ½ãŒãªãã¦ä¸ä¾¿ã ã£ãŸã®ã§ï¼Œãªã‚“ã¨ãªãソースを見ã¦ä¿®æ£ã—ã¦PRã‚’é€ã£ãŸã‚‚ã®ã§ã™ï¼ŽC++ãªã‚“ã¦3年以上ã¾ã¨ã‚‚ã«æ›¸ã„ã¦ãªã‹ã£ãŸã—,ãã‚‚ãã‚‚C++ã¯ç†è§£ã—ã¦ãªã„ã—,ã“ã®ã¨ã多分1割ãらã„ã—ã‹bpftraceã®ã“ã¨ã‚’分ã‹ã£ã¦ãªã‹ã£ãŸã‚“ã§ã™ãŒï¼Œå°‘ã—フィードãƒãƒƒã‚¯ã‚‚らã£ãŸã‚ã¨ã«ãƒžãƒ¼ã‚¸ã•ã‚ŒãŸã®ãŒã¯ã˜ã¾ã‚Šã§ã—ãŸï¼Žbpftraceã¯ä½¿ã£ã¦ã„ãã»ã©ã„ã‚ã„ã‚ã¨å•é¡Œã«éé‡ã—ãŸã®ã§ï¼Œæ¯æŠœãã¨ã—ã¦ç©ºã„ã¦ã‚‹æ™‚é–“ã«ãれを直ã—ã¦è¡Œã£ãŸã‚‰ä»Šã®çŠ¶æ…‹ã«ãªã£ãŸã¨ã„ã†ã®ãŒå®Ÿæƒ…ã§ã™ï¼Žã“ã“ã¾ã§é–¢ã‚ã£ãŸOSSプãƒã‚¸ã‚§ã‚¯ãƒˆã¯bpftraceãŒåˆã‚ã¦ã§ã™ãŒï¼Œã‚„ã¯ã‚Šä¸–ç•Œä¸ã®äººã¨ä½œæ¥ã‚’ã—ã¦ã„ãã¨ã„ã†ã®ã¯OSSã®é†é†å‘³ã§ï¼Œã¨ã¦ã‚‚楽ã—ã„経験ã§ã™ï¼Žä½œè€…ã®æ–¹ã«"good work!"ã¨è¨€ã‚れるã¨ã‚„ã¯ã‚Šå¬‰ã—ã„ã‚‚ã®ã§ã™ï¼Ž
bpftraceã«ã‚³ãƒŸãƒƒãƒˆã™ã‚‹ã“ã¨ã§BPFã«é–¢ã—ã¦ã‚ˆã‚Šè©³ã—ããªã£ãŸã®ã¯å‹¿è«–ã®ã“ã¨ï¼Œã‚‚ã¨ã‚‚ã¨ã‚‚ç§ã¯Linuxã®ãƒˆãƒ¬ãƒ¼ã‚·ãƒ³ã‚°æ‰‹æ³•ã«ã¤ã„ã¦ã„ã‚ã„ã‚ã¨èª¿æŸ»ã—ã¦ä½¿ã£ã¦ãã¾ã—ãŸãŒï¼Œå…·ä½“çš„ã«ãれらãŒåˆ©ç”¨ã•ã‚Œã‚‹ã‹ã«ã¤ã„ã¦ã®ç†è§£ãŒæ·±ã¾ã‚Šã¾ã—ãŸï¼Žæœ€è¿‘改ã‚ã¦"BPF Performance Tools"ã‚’èªã¿è¿”ã—ã¦ã¿ãŸã®ã§ã™ãŒï¼Œã¤ã„ã«çœŸã«ç†è§£ã§ãるよã†ã«ãªã£ãŸã‚ˆã†ãªæ°—ãŒã—ã¦ã„ã¾ã™ï¼Ž
ã¾ãŸbpftrace自体ã¯flex/bisonã«ã‚ˆã‚‹å—å¥è§£æžï¼Œæ§‹æ–‡è§£æžã‚’ãŠã“ãªã£ãŸå¾Œï¼ŒLLVMã«ã‚ˆã‚ŠIRを出力ã™ã‚‹ã‚³ãƒ³ãƒ‘イラã§ã™ï¼Žã‚ˆãCPU, OS, コンパイラを自作ã™ã‚‹ã¨è‰¯ã„ãªã‚“ã¦è©±ãŒã‚ã‚Šã¾ã™ãŒï¼Œç§ã¯ç°¡å˜ãªCPUã‚„OSã¯ä½œã£ãŸã“ã¨ãŒã‚ã£ãŸã‚‚ã®ã®*3,コンパイラã¯çœŸé¢ç›®ã«å–り組んã ã“ã¨ãŒãªã‹ã£ãŸã®ã§ï¼Œãã®è¾ºã‚‚ã„ã‚ã„ã‚ã¨å‹‰å¼·ã«ãªã‚Šã¾ã—ãŸï¼Žï¼ˆã¨åŒæ™‚ã«LLVMã®é›£ã—ã•ã‚‚知るã“ã¨ã«...)bpftraceã¯ã‚³ãƒ³ãƒ‘クトã«ã„ã‚ã„ã‚ã¨ã¾ã¨ã¾ã£ã¦ã‚‹ã¨æ€ã†ã®ã§ï¼Œã“れらã«ã¤ã„ã¦èˆˆå‘³ã®ã‚ã‚‹æ–¹ã¯ã‚³ãƒ¼ãƒ‰ã‚’見ã¦ã¿ã‚‹ã¨æ¥½ã—ã„ã®ã§ã¯ãªã„ã‹ãªã¨æ€ã„ã¾ã™ï¼Ž
æ¥å¹´ã®æŠ±è²
æ¥å¹´ã¯ä»Šå¹´ã¨åŒæ§˜ï¼Œæœ¬æ¥ãŒä¸€ç•ªãªã®ã¯å‹¿è«–ã§ã™ãŒï¼Œbpftraceã«é–¢ã™ã‚‹ã‚³ãƒŸãƒƒãƒˆã¯ç¶™ç¶šã—ã¤ã¤ï¼Œã‚«ãƒ¼ãƒãƒ«ã®æ–¹ã«å¯¾ã—ã¦ã‚‚コミットã—ã¦ã„ã‘ãŸã‚‰...ãªã‚“ã¦æ€ã„ã¾ã™ï¼ŽFBã®BPFã‚„ã£ã¦ã‚‹ã‚¨ãƒ³ã‚¸ãƒ‹ã‚¢ã¯ã‚«ãƒ¼ãƒãƒ«ãŒã„ã˜ã‚Œã‚‹ã®ã¯å‹¿è«–ã®ã“ã¨ï¼ŒLLVM(本体ã®æ–¹ï¼‰ã‚‚ã§ãã‚‹ã®ã§ã¿ã‚“ãªã™ã”ã„ãªãã¨æ€ã†æ¬¡ç¬¬ã§ã™ï¼Žã¾ã ã¾ã è‡ªåˆ†ã‚‚é ‘å¼µã‚‰ãªã„ã¨ã„ã‘ã¾ã›ã‚“ã.
ãã‚Œã§ã¯ã¿ãªã•ã‚“,ã¡ã‚‡ã£ã¨æ—©ã„ã§ã™ãŒã‚ˆã„ãŠå¹´ã‚’.
システム系論文ã®æƒ…å ±åŽé›†æ–¹æ³•
(ã“ã®è¨˜äº‹ã¯æ±äº¬å¤§å¦ å“å·ç ”究室 Advent Calendar 2020ã®1日目ã®è¨˜äº‹ã¨ã—ã¦æ›¸ã‹ã‚ŒãŸã‚‚ã®ã§ã™)
ã“ã®è¨˜äº‹ã§ã¯ç°¡å˜ã«ã‚·ã‚¹ãƒ†ãƒ ç³»ã®ä¼šè°ã®è«–æ–‡ã«é–¢ã—ã¦ã©ã†ã‚„ã£ã¦è«–文を探ã—ã¦èªã‚€ã®ã‹ï¼Žå€‹äººçš„ãªæ–¹æ³•ã‚’書ã„ã¦ã¿ã‚ˆã†ã¨æ€ã„ã¾ã™ï¼Žã“ã“ã«æ›¸ã„ã¦ã‚ã‚‹ã“ã¨ãŒåˆ¥ã«ã™ã¹ã¦ã§ã¯ãªã„ã®ã§ï¼Œæ˜¯éžè‡ªåˆ†ã«åˆã†æ–¹æ³•ã‚’å„自探ã—ã¦ã¿ã¦ãã ã•ã„.
目次
- 目次
- 会è°ã‚’知る
- 会è°ã®æ—¥ç¨‹ã®ãƒã‚§ãƒƒã‚¯
- 論文をèªã‚€ï¼ˆã‚µãƒ¼ãƒ™ã‚¤ã™ã‚‹ï¼‰
- 文献管ç†
- 産æ¥ç³»ã‚«ãƒ³ãƒ•ã‚¡ãƒ¬ãƒ³ã‚¹
- 最新ã®å‹•å‘を追ã†
- ãã®ä»–
- 最後ã«
会è°ã‚’知る
会è°ã«ã¯ãƒ©ãƒ³ã‚¯ï¼ˆè¢«å¼•ç”¨æ•°ãªã©ã§æ±ºã‚ãŸã‚¹ã‚³ã‚¢ã«ã‚ˆã‚‹é †ä½ä»˜ã‘)ãŒã‚ã‚Šã¾ã™ï¼Žä¸€èˆ¬ã«ã¯ãƒ©ãƒ³ã‚¯ã®é«˜ã„ä¼šè° = レベルãŒé«˜ã„会è°ã¨ã„ã†ã“ã¨ã«ãªã‚Šã¾ã™ï¼Žè«–文を探ã™ã¨ã,ã“ã®ãƒ©ãƒ³ã‚¯ã¯ä¸€ã¤ã®åˆ¤æ–基準ã¨ãªã‚Šã¾ã™ï¼Žãƒ©ãƒ³ã‚¯ã®é«˜ã„会è°ã§ã‚ã‚‹æ–¹ãŒï¼Œè‰¯ã„è«–æ–‡ãŒã‚ã‚‹å¯èƒ½æ€§ãŒé«˜ã„ãŸã‚ã§ã™ï¼Žæƒ…å ±ç³»ã®ãƒˆãƒƒãƒ—ã®ä¼šè°ã«ã¤ã„ã¦ã¯ï¼Œä¾‹ãˆã°ï¼Œä»¥ä¸‹ã®ã‚µã‚¤ãƒˆã«ã¾ã¨ã¾ã£ã¦ã„ã¾ã™ï¼Ž
- Guide 2 Research, Top Computer Science Conferences
ãŸã ã“ã‚Œã¯ç”»åƒå‡¦ç†ã‚„機械å¦ç¿’ãªã©ï¼Œã„ã‚ã„ã‚ãªã‚¸ãƒ£ãƒ³ãƒ«ã‚’å«ã‚€ã®ã§ï¼Œã‚·ã‚¹ãƒ†ãƒ ç³»ã«é–¢ã—ã¦ã¯ä»¥ä¸‹ã®ã‚‚ã®ã‚’å‚考ã«ã™ã‚‹ã¨ã‚ˆã„ã¨æ€ã„ã¾ã™ï¼Ž
- Takahiro Shinagawa, Conferences and Workshops (Operating Systems & System Software)
- Dan Tsafrir, systems conferences by deadline
ã¾ãŸï¼Œã‚»ã‚ュリティ系ã®ä¼šè°ã®ãƒ©ãƒ³ã‚¯ã¯ä»¥ä¸‹ã«ã¾ã¨ã¾ã£ã¦ã„ã¾ã™ï¼Ž
ランクã§ã¯ãªã„ã§ã™ãŒï¼Œã‚¯ãƒ©ã‚¦ãƒ‰ç³»ã®ä¼šè°ã®æƒ…å ±ã¯ä»¥ä¸‹ã«ã¾ã¨ã¾ã£ã¦ã„ã¾ã™ï¼Ž
会è°ã®ãƒ©ãƒ³ã‚¯ä»˜ã‘方法ã¨ã—ã¦ã¯ï¼ŒCORE, Qualis, MSAR ã¨ã„ã£ãŸã‚‚ã®ãŒã‚ã‚Šã¾ã™ï¼Žã“れら㯠conferenceranks ã¨ã„ã†ã‚µã‚¤ãƒˆã‹ã‚‰èª¿ã¹ã‚‹ã“ã¨ãŒã§ãã¾ã™ï¼ŽãŸã ã—ã‚ãã¾ã§æƒ…å ±ãŒæœ€æ–°ã§ã‚ã‚‹ã¨ã¯é™ã‚‰ãªã„点ã«æ³¨æ„ã—ã¦ãã ã•ã„.ã¾ãŸå½“然ã§ã™ãŒï¼Œãƒ©ãƒ³ã‚¯ãŒä½Žã„ã‹ã‚‰ã¨ã„ã£ã¦è‰¯ã„è«–æ–‡ãŒãªã„ã‚ã‘ã§ã¯ãªã„ã§ã™ï¼Ž
システム系ã§ç‰¹ã«ä¸»è¦ãªä¼šè°ã¨ã—ã¦ã¯ï¼ŒUSENIXã®ä¼šè°å…¨èˆ¬ (OSDI, ATC, NSDI, FAST, SEC ãªã©) åŠã³ IEEE ã® SOSP, ACMã®ASPLOS, VEE, EuroSys ãªã©ã§ï¼Œä»–ã«ã‚‚分野ã”ã¨ã«ã„ã‚ã„ã‚ã¨ã‚ã‚Šã¾ã™ï¼Žã¾ãŸã‚»ã‚ュリティã«é–¢ã—ã¦ã¯ USENIX SEC, NDSS, IEEE S&P, ACM CCSãŒ4大会è°ã¨ã—ã¦çŸ¥ã‚‰ã‚Œã¦ã„ã¾ã™(æš—å·ç³»ã‚’除ã).
会è°ã®æ—¥ç¨‹ã®ãƒã‚§ãƒƒã‚¯
会è°ã®æ—¥ç¨‹ã¯ä¼šè°ã®ã‚µã‚¤ãƒˆã®ä»–,上記ã«ç¤ºã—ãŸ
ã«ã‚ã‚Šã¾ã™ï¼Žæ°—ã«ãªã‚‹ä¼šè°ã¯ã‚«ãƒ¬ãƒ³ãƒ€ãƒ¼ã«ç™»éŒ²ã—ã¦ãŠãã¨è‰¯ã„ã§ã—ょã†ï¼Ž
論文をèªã‚€ï¼ˆã‚µãƒ¼ãƒ™ã‚¤ã™ã‚‹ï¼‰
ã¨ã‚Šã‚ãˆãšã‚·ã‚¹ãƒ†ãƒ ç³»ã®è«–æ–‡ãŒã©ã‚“ãªã‚‚ã®ã‹çŸ¥ã‚ŠãŸã„,ã¨ã„ã†å ´åˆã¯OSDIã‚„SOSP, ATC, EuroSysãªã©ã‚·ã‚¹ãƒ†ãƒ 系全般を扱ã£ã¦ã„る会è°ã§ç™ºè¡¨ã•ã‚Œã¦ã„る論文を眺ã‚ã¦ã¿ã‚‹ã®ãŒè‰¯ã„ã¨æ€ã„ã¾ã™ï¼Žã¾ãŸã‚‚ã—例ãˆã°ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ç³»ã«èˆˆå‘³ãŒã‚ã‚‹ãªã‚‰NSDIãªã©ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«ç‰¹åŒ–ã—ãŸä¼šè°ã‚’ã¿ã¦ã¿ã‚‹ã¨è‰¯ã„ã§ã—ょã†ï¼ŽGoogle Scholarã§ã‚ーワード検索ã—ã¦è«–文を探ã™ã®ã‚‚当然有効ã§ã™ï¼Žãã®éš›ï¼Œå€‹äººçš„ã«ã¯è¿‘å¹´ã®ãƒˆãƒƒãƒ—ã®ä¼šè°ã®æœ€è¿‘ã®è«–文を探ã—ã¦ï¼Œãã“ã‹ã‚‰ãã®è«–æ–‡ã®å¼•ç”¨ãƒ»è¢«å¼•ç”¨è«–文を辿るã¨ã„ã†ã‚„り方をã—ã¦ã‚µãƒ¼ãƒ™ã‚¤ã™ã‚‹ã“ã¨ãŒå¤šã„ã§ã™ï¼Ž
ã‚‚ã—大å¦ã«æ‰€å±žã—ã¦ã„ã‚‹å ´åˆã¯ï¼Œå¤šãã®å ´åˆå¤§å¦ãŒACMã‚„IEEEã¨åŒ…括契約ã—ã¦ã„ã‚‹ãŸã‚è«–æ–‡ãŒèªã‚ã‚‹ã¯ãšã§ã™ãŒï¼Œãã†ã§ãªã„å ´åˆã‚‚最近ã¯ã ã„ã¶ã‚ªãƒ¼ãƒ—ンアクセスã®æµã‚ŒãŒã‚り,多ãã®è«–æ–‡ãŒç„¡æ–™ã§å…¬é–‹ã•ã‚Œã¦ã„ã¾ã™ï¼Žã¨ãã«USENIXç³»ã®ä¼šè°ã¯å…¨ã¦ã‚ªãƒ¼ãƒ—ンアクセスã¨ãªã£ã¦ã„ã¾ã™ï¼Žã¾ãŸï¼Œã‚ªãƒ¼ãƒ—ンアクセスã§ãªã„会è°ã§ã‚‚著者ã®ã‚µã‚¤ãƒˆã«å€‹äººçš„ãªã‚³ãƒ”ーãŒã‚ã‚‹å ´åˆãŒã‚ã‚‹ã®ã§ï¼Œèªã¿ãŸã„è«–æ–‡ãŒã‚ã‚‹å ´åˆã¯ãã¡ã‚‰ã‚’探ã—ã¦ã¿ã‚‹ã®ã‚‚一ã¤ã®æ‰‹ã§ã™ï¼Žã¾ãŸæœ€è¿‘ã¯ã‚ã‚ŠãŒãŸã„ã“ã¨ã«ç™ºè¡¨ã‚¹ãƒ©ã‚¤ãƒ‰ã«åŠ ãˆã¦ç™ºè¡¨å‹•ç”»ãŒå…¬é–‹ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚‚çã—ãã‚ã‚Šã¾ã›ã‚“.ç©æ¥µçš„ã«æ´»ç”¨ã™ã‚‹ã¨è‰¯ã„ã§ã—ょã†ï¼Ž
è«–æ–‡ã®èªã¿æ–¹ã«é–¢ã—ã¦ã¯ã„ã‚ã„ã‚ã¨æµå„€ãŒã‚ã‚‹ã®ã§ï¼Œä»¥ä¸‹ã«ç´¹ä»‹ã™ã‚‹ã‚‚ã®ã‚’èªã‚€ãªã©ã—ã¦è‡ªåˆ†ã«åˆã†æ–¹æ³•ã‚’探ã—ã¦ã¿ã‚‹ã®ãŒè‰¯ã„ã¨æ€ã„ã¾ã™ï¼Ž
- William G. Griswold, How to Read an Engineering Research Paper
- VirginiaTech Cook Cook Counseling Center, SQ3R Improving Reading Comprehension
- 矢谷 浩å¸, 矢谷æµè«–æ–‡ã®èªã¿æ–¹
個人的ã«ã¯ã‚¢ãƒ–ストã¨æœ€å¾Œã®ã¾ã¨ã‚を見ã¦ã“ã®è«–æ–‡ã®å‹•æ©Ÿã¯ä½•ã§ï¼Œä½•ãŒè²¢çŒ®ãªã®ã‹ã‚’ã–ã£ã¨è¦‹ã¦ï¼Œè‡ªåˆ†ãŒæŽ¢ã—ã¦ã„ã‚‹ã‚‚ã®ã¨åˆã„ãã†ã§ã‚ã‚Œã°ã‚‚ã†å°‘ã—ä¸èº«ã‚’ã¿ã¦ã¿ã‚‹ã¨ã„ã£ãŸãƒ‘ターンãŒå¤šã„ã§ã™ï¼Žä¸Šè¨˜ã®ãƒªãƒ³ã‚¯ã«ã‚‚書ã„ã¦ã‚ã‚Šã¾ã™ãŒï¼Œæ™‚é–“ã¯æœ‰é™ã§ã„ã¤ã¾ã§ã‚‚サーベイã™ã‚‹ã“ã¨ã¯ã§ããªã„ã®ã§ï¼Œã—ã£ã‹ã‚Šæ™‚間を決ã‚ã¦é›†ä¸ã—ã¦è«–æ–‡ã”ã¨ã®è²¢çŒ®ã‚„関係を整ç†ã—ã¦ã„ãã“ã¨ãŒå¤§äº‹ã ã¨æ€ã„ã¾ã™ï¼Ž
文献管ç†
論文を管ç†ã™ã‚‹ãŸã‚ã®ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ãŒæ–‡çŒ®ç®¡ç†ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã™ï¼Žæ–‡çŒ®ç®¡ç†ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯æŽ¢ã›ã°ãŸãã•ã‚“ã‚ã‚Šã¾ã™ï¼Žç‰¹ã«æ¯”較ã¯ã—ã¦ã„ã¾ã›ã‚“ãŒï¼Œè‡ªåˆ†ã¯Zoteroを使ã£ã¦ã„ã¦ã¾ã™ï¼ŽChromeã®æ‹¡å¼µæ©Ÿèƒ½ã‹ã‚‰è‡ªå‹•ã§ãƒãƒ¼ã‚«ãƒ«ã®zoteroã«PDFå«ã‚ã¦æƒ…å ±ãŒã‚¤ãƒ³ãƒãƒ¼ãƒˆã§ãã‚‹ã»ã‹ï¼Œã‚¯ãƒ©ã‚¦ãƒ‰ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ã‚‚自動ã§åŒæœŸã•ã‚Œã¾ã™ï¼ˆç„¡æ–™æž ã§ã¯300Mã¾ã§ï¼‰ï¼ŽãƒŽãƒ¼ãƒˆã‚„extraã®éƒ¨åˆ†ã«ãƒ¡ãƒ¢ãŒæ®‹ã›ã‚‹ã®ã§ï¼Œèªã‚“ã ã¨ãã«è»½ãメモを残ã—ã¦ãŠãã¨ãŒã§ã便利ã§ã™ï¼Ž
ã“ã†ã—ãŸæ©Ÿèƒ½ã¯ã©ã®æ–‡çŒ®ç®¡ç†ã‚½ãƒ•ãƒˆã«ã‚‚ã‚ã‚‹ã¨æ€ã„ã¾ã™ï¼Žã¾ãŸã“れらã®æ–‡çŒ®ç®¡ç†ã‚½ãƒ•ãƒˆã¯ç°¡å˜ã«è«–文作æˆã«ã¯æ¬ ã‹ã›ãªã„bibtexをエクスãƒãƒ¼ãƒˆã™ã‚‹æ©Ÿèƒ½ãŒã‚ã‚‹ã¯ãšãªã®ã§ï¼Œä½•ã‹ã—らã¯ä½¿ã£ãŸæ–¹ãŒè‰¯ã„ã¨æ€ã„ã¾ã™ï¼Ž
産æ¥ç³»ã‚«ãƒ³ãƒ•ã‚¡ãƒ¬ãƒ³ã‚¹
システム系ã®å ´åˆã¯ç”£æ¥ç³»ã®ã‚«ãƒ³ãƒ•ã‚¡ãƒ¬ãƒ³ã‚¹ã‚‚,å¦è¡“çš„ã¨ã¯ã¡ã‚‡ã£ã¨æ¯›è‰²ãŒç•°ãªã‚Šã¾ã™ãŒï¼Œå‚考ã«ãªã‚‹ã‚‚ã®ãŒå¤šãã‚ã‚Šã¾ã™ï¼Žä¾‹ãˆã°Linux foundationãŒä¸»å®°ã®Open Source Summit,KVM Forumãªã©ã‚„,ストレージ系ãªã‚‰SNIAã®Storage Developer Conferenceãªã©ã§ã™ï¼Žã“れらã‹ã‚‰ã¯å®Ÿå‹™ã«å³ã—ãŸæœ€æ–°ã®è©±é¡Œã‚„課題ãŒå¾—られるã®ã§ï¼Œè«–æ–‡èªã‚€ã®ã«ç–²ã‚ŒãŸæ™‚ã«ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã„ã„ã¨æ€ã„ã¾ã™ï¼Ž
最新ã®å‹•å‘を追ã†
本当ã«æœ€æ–°ã®æƒ…å ±ã‚’çŸ¥ã‚ŠãŸã„å ´åˆã¯ï¼ŒGoogleアラートã§ç‰¹å®šã®ã‚ーワードを指定ã—ã¦ãŠã方法ãŒã‚ã‚Šã¾ã™ï¼Žã‚ーワードをã†ã¾ãè¨å®šã—ãªã„ã¨ãŸãã•ã‚“通知ãŒæ¥ã™ãŽã‚‹ç‚¹ã«ã¯æ³¨æ„ã§ã™ï¼Žã¾ãŸï¼Œæœ€è¿‘ã¯arXivã«è«–文を上ã’ã‚‹ã“ã¨ã‚‚,システム系ã§ã‚‚çã—ããªããªã£ã¦ãã¦ã„ã¾ã™ï¼ˆãƒˆãƒƒãƒ—会è°ã®ã»ã¨ã‚“ã©ã¯double blindã§ã™ãŒï¼ŒarXivãªã©ã¸ã®æŠ•ç¨¿ã¯è¨±å¯ã•ã‚Œã¦ã„ã‚‹ã“ã¨ãŒå¤šã„ã§ã™ï¼ŽãŸã ã—å…¨ã¦ã§ã¯ã‚ã‚Šã¾ã›ã‚“).arXivを追ã†å ´åˆã¯Operating Systemsや,セã‚ュリティãªã‚‰Cryptography and Securityã«ãªã‚‹ã§ã—ょã†ï¼Žå€‹äººçš„ã«æƒ…å ±ãŒå¤šã™ãŽã‚‹ã®ã§arXivを追ã†ã“ã¨ã¯ã‚ã¾ã‚Šã—ã¦ã„ã¾ã›ã‚“ãŒï¼ŒãŸã¾ã«ã‚ーワード検索ã§è«–文を探ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã™ï¼ŽæŽ¡æŠžãŒæ±ºã¾ã£ã¦ã„ã‚‹ã‘ã‚Œã©ã¾ã 会è°å‰ã§å…¬é–‹ã•ã‚Œã¦ãªã„è«–æ–‡ãŒã‚るケースもã‚ã‚Šã¾ã™ï¼Žã¾ãŸLinuxã§ã‚ã‚Œã°LKMLã®ãƒ¡ãƒ¼ãƒªã‚¹ã«ç™»éŒ²ã™ã‚Œã°æœ€æ–°ã®ã‚«ãƒ¼ãƒãƒ«æƒ…å ±ãŒæµã‚Œã¦ãã¾ã™ãŒï¼Œã“れを真é¢ç›®ã«è¿½ã†ã®ã¯ã‹ãªã‚Šå¤§å¤‰ã§ã™ï¼ŽGmailã®ãƒ•ã‚£ãƒ«ã‚¿æ©Ÿèƒ½ãªã®ã§ç‰¹å®šã®æ©Ÿèƒ½ã‚„パッãƒã®æ›´æ–°ãŒã‚ã£ãŸã¨ãã«é€šçŸ¥ã™ã‚‹ã‚ˆã†ã«ã™ã‚‹ã¨è‰¯ã„ã¨æ€ã„ã¾ã™ï¼Ž
ãã®ä»–
ジャンルã«ã‚ˆã£ã¦ã¯ã‚µãƒ¼ãƒ™ã‚¤ã‚„ニュースを定期的ã«å‡ºã—ãŸã‚Šã¾ã¨ã‚ãŸã‚Šã—ã¦ã„る人ãŒã„ã¾ã™ï¼Žãれらを活用ã—ãªã„手ã¯ãªã„ã§ã—ょã†ï¼Žä¾‹ãˆã°BPFã«é–¢ã—ã¦ã¯ciliumãŒnewsを出ã—ã¦ã„ã¾ã™ï¼Žã¾ãŸãƒ–ãƒã‚°ã‚„GitHubã®ãƒªãƒã‚¸ãƒˆãƒªã«èªã‚“ã 論文をã¾ã¨ã‚ã¦ã„ãŸã‚Šã™ã‚‹äººã‚‚ã„ã¾ã™ï¼Žä»–ã«ã‚‚今ã¯webã§æ¤œç´¢ã™ã‚Œã°ã„ã‚ã„ã‚ã¨ãƒ’ットã™ã‚‹ã¨æ€ã†ã®ã§ï¼Œå‹¿è«–一番大事ãªã®ã¯è«–文本体ã§ã™ãŒï¼ŒãŸã¾ã«ã¯ãれ以外ã«ã‚‚目をå‘ã‘ã¦ã¿ã‚‹ã®ã‚‚悪ããªã„ã¨æ€ã„ã¾ã™ï¼ŽãŸã ã—ã‚‚ã—ãれらã§è‰¯ã„æƒ…å ±ã‚’è¦‹ã¤ã‘ãŸã‚‰ï¼Œä¸€æ¬¡æ–‡çŒ®ã«å½“ãŸã‚‹ã“ã¨ã¯å¿…然ã§ã™ï¼Ž
最後ã«
最åˆã«ã‚‚書ãã¾ã—ãŸãŒï¼Œè«–文調査方法ã¯ã„ã‚ã„ã‚ã‚ã‚‹ã®ã§ï¼Œã„ã‚ã‚“ãªæ–¹æ³•ã‚’試ã—ã¦è‡ªåˆ†ã«åˆã†ã®ã‚’見ã¤ã‘ã‚‹ã“ã¨ãŒå¤§äº‹ã ã¨æ€ã„ã¾ã™ï¼Žã“ã“ã«æ›¸ã„ãŸã‚‚ã®ã‚‚ã‚ãã¾ã§è‡ªåˆ†ãŒã„ã‚ã„ã‚試ã—ãŸä¸ã§ä»Šåˆ©ç”¨ã—ã¦ã„る方法ã§ã™ï¼Žæ„外ã¨ã“ã†ã„ã£ãŸæƒ…å ±ã¯å…±æœ‰ã•ã‚Œãªã„ã“ã¨ãŒå¤šã„ã®ã§æ›¸ã„ã¦ã¿ã¾ã—ãŸï¼Žæ˜¯éžã¿ãªã•ã‚“も何ã‹è‰¯ã„方法ãŒã‚ã‚Œã°æ•™ãˆã¦ãã ã•ã„.
macã§bpftraceを試ã™
全然使ã£ã¦ãªã‹ã£ãŸã®ã§æœ€è¿‘æ°—ã¥ã„ãŸã®ã§ã™ãŒï¼Œã„ã¤ã®ã¾ã«ã‹ Docker for mac ã§ä½¿ã‚ã‚Œã¦ã„ã‚‹ linuxkit ã®ã‚«ãƒ¼ãƒãƒ«ãŒ 5.4ベースã«ãªã£ã¦ã„ã¦ï¼ŒBPFã®åŸºæœ¬çš„ãªæ©Ÿèƒ½ãŒä½¿ãˆã‚‹ã‚ˆã†ã«ãªã£ã¦ã¾ã—ãŸï¼ˆå¿µã®ãŸã‚言ã£ã¦ãŠãã¨ï¼Œdocker for macã¯Linuxã‚’ãƒã‚¤ãƒ‘ーãƒã‚¤ã‚¶ä¸Šã§å‹•ã‹ã—ã¦ï¼Œãã®ä¸Šã§dockerã‚’å‹•ã‹ã—ã¦ã„ã¾ã™ï¼‰ï¼Žã¨ã„ã†ã“ã¨ã§ç°¡å˜ã«macã‹ã‚‰bpftraceãŒè©¦ã›ã‚‹ã‚ˆã†ã«ä»¥ä¸‹ã®ã‚ˆã†ãªã‚‚ã®ã‚’作ã£ã¦ã¿ã¾ã—ãŸï¼Ž
macã«dockerをインストールã—ã¦ï¼Œ./build.sh && ./run.sh
ã§å‹•ãã¨æ€ã„ã¾ã™ï¼Žbpftraceã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®ãƒ„ールã¨ï¼Œå‰ã«è‡ªåˆ†ãŒä½œã£ãŸtetrisãŒå…¥ã£ã¦ã¾ã™ï¼Žãƒˆãƒ¬ãƒ¼ã‚·ãƒ³ã‚°ã¯ä½•ã‹ã—らアプリケーションãŒå‹•ã„ã¦ãªã„ã¨ã‚ã¾ã‚Šé¢ç™½ããªã„ã®ã§ï¼Œtmuxã§ã‚‚使ã£ã¦ãƒˆãƒ¬ãƒ¼ã‚¹ã—ãªãŒã‚‰ä½•ã‹å‹•ã‹ã—ã¦ã¿ã‚‹ã®ãŒè‰¯ã„ã¨æ€ã„ã¾ã™ï¼Žä»¥ä¸‹ãŒå®Ÿè¡Œä¾‹ã§ã™ï¼Žãªã‚“ã‹ã‚‚ã£ã•ã‚Šã—ã¦ã‚‹éƒ¨åˆ†ãŒã‚ã‚Šã¾ã™ãŒGIF化ã—ãŸã¨ãã®å½±éŸ¿ãªã®ã§å®Ÿéš›ã¯æ™®é€šã«å‹•ã„ã¦ã„ã¾ã™ï¼Ž
VM作ã£ãŸæ–¹ãŒã„ã‚ã„ã‚ã¨å¼„れるã‚ã‘ã§ã™ãŒï¼Œã‚‚ã—bpftraceã©ã‚“ãªã‚‚ã®ã‹çŸ¥ã‚ŠãŸã„ã¨æ€ã£ã¦ã‚‹macユーザã®æ–¹ã¯è©¦ã—ã¦ã¿ã¦ã¯ã„ã‹ãŒã§ã—ょã†ã‹ï¼Žã¡ãªã¿ã«BTFã®ã‚µãƒãƒ¼ãƒˆã¨ã‹ã¯ãªã„ã®ã§ ,bpftraceã®100%ã®åŠ›ã‚’発æ®ã§ãã‚‹ã‚ã‘ã§ã¯ãªã„ã®ã§ãã“ã¯ã”了承ãã ã•ã„.本当ã®bpftraceã®åŠ›ã‚’知るã«ã¯... 自分ã§ã‚«ãƒ¼ãƒãƒ«ã¨bpftraceをコンパイルã—ã¾ã—ょã†ï¼Ž
BPF_PROG_TYPE_RAW_TRACEPOINT (raw tracepoint) ã«ã¤ã„ã¦
BPFã®ãƒ—ãƒã‚°ãƒ©ãƒ タイプã®ä¸€ã¤ã«BPF_PROG_TYPE_RAW_TRACEPOINTãŒã‚ã‚Šã¾ã™ (commit).ã“れを利用ã™ã‚‹ã¨tracepointã®å¤‰æ›å‰ã®å¼•æ•°ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ï¼Ž
例ã¨ã—ã¦kernel/sched/core.cã§å®šç¾©ã•ã‚Œã‚‹sched_swtich
ã®tracepointを考ãˆã¾ã™ï¼Ž
trace_sched_switch(preempt, prev, next);
ã“ã®tracepointã¯include/trace/events.sched.hã§å®šç¾©ã•ã‚Œã¾ã™ï¼Ž
TRACE_EVENT(sched_switch, TP_PROTO(bool preempt, struct task_struct *prev, struct task_struct *next), TP_ARGS(preempt, prev, next), TP_STRUCT__entry( __array( char, prev_comm, TASK_COMM_LEN ) __field( pid_t, prev_pid ) __field( int, prev_prio ) __field( long, prev_state ) __array( char, next_comm, TASK_COMM_LEN ) __field( pid_t, next_pid ) __field( int, next_prio ) ), TP_fast_assign( memcpy(__entry->next_comm, next->comm, TASK_COMM_LEN); __entry->prev_pid = prev->pid; __entry->prev_prio = prev->prio; __entry->prev_state = __trace_sched_switch_state(preempt, prev); memcpy(__entry->prev_comm, prev->comm, TASK_COMM_LEN); __entry->next_pid = next->pid; __entry->next_prio = next->prio; /* XXX SCHED_DEADLINE */ ), TP_printk("prev_comm=%s prev_pid=%d prev_prio=%d prev_state=%s%s ==> next_comm=%s next_pid=%d next_prio=%d", __entry->prev_comm, __entry->prev_pid, __entry->prev_prio, (__entry->prev_state & (TASK_REPORT_MAX - 1)) ? __print_flags(__entry->prev_state & (TASK_REPORT_MAX - 1), "|", { TASK_INTERRUPTIBLE, "S" }, { TASK_UNINTERRUPTIBLE, "D" }, { __TASK_STOPPED, "T" }, { __TASK_TRACED, "t" }, { EXIT_DEAD, "X" }, { EXIT_ZOMBIE, "Z" }, { TASK_PARKED, "P" }, { TASK_DEAD, "I" }) : "R", __entry->prev_state & TASK_REPORT_MAX ? "+" : "", __entry->next_comm, __entry->next_pid, __entry->next_prio) );
ã“ã“ã§ï¼Œé€šå¸¸ã®tracepointã§ã‚ã‚Œã°ï¼ŒTP_STRUCT__entry
ã§å®šç¾©ã•ã‚Œã¦ã„ã‚‹é …ç›® (+ tracepointã«å…±é€šã®é …ç›®)ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ï¼Žã“ã‚Œã¯ä»¥ä¸‹ã®tracing/events/sched/sched_switch/format
ã‹ã‚‰ã‚‚確èªã§ãã¾ã™ï¼Ž
# cat /sys/kernel/debug/tracing/events/sched/sched_switch/format name: sched_switch ID: 318 format: field:unsigned short common_type; offset:0; size:2; signed:0; field:unsigned char common_flags; offset:2; size:1; signed:0; field:unsigned char common_preempt_count; offset:3; size:1; signed:0; field:int common_pid; offset:4; size:4; signed:1; field:char prev_comm[16]; offset:8; size:16; signed:1; field:pid_t prev_pid; offset:24; size:4; signed:1; field:int prev_prio; offset:28; size:4; signed:1; field:long prev_state; offset:32; size:8; signed:1; field:char next_comm[16]; offset:40; size:16; signed:1; field:pid_t next_pid; offset:56; size:4; signed:1; field:int next_prio; offset:60; size:4; signed:1; print fmt: "prev_comm=%s prev_pid=%d prev_prio=%d prev_state=%s%s ==> next_comm=%s next_pid=%d next_prio=%d", REC->prev_comm, REC->prev_pid, REC->prev_prio, (REC->prev_state & ((((0x0000 | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040) + 1) << 1) - 1)) ? __print_flags(REC->prev_state & ((((0x0000 | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040) + 1) << 1) - 1), "|", { 0x0001, "S" }, { 0x0002, "D" }, { 0x0004, "T" }, { 0x0008, "t" }, { 0x0010, "X" }, { 0x0020, "Z" }, { 0x0040, "P" }, { 0x0080, "I" }) : "R", REC->prev_state & (((0x0000 | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040) + 1) << 1) ? "+" : "", REC->next_comm, REC->next_pid, REC->next_prio
一方ã§raw tracepiontã®å ´åˆï¼Œã‚¢ã‚¯ã‚»ã‚¹ã§ãã‚‹ã®ã¯trace_sched_switch()
ã«ä¸ŽãˆãŸå¼•æ•° (TP_PROTO
ã®å¼•æ•°ï¼‰ã«ãªã‚Šã¾ã™ï¼Žsched_switch
ã®å ´åˆã¯
TP_PROTO(bool preempt, struct task_struct *prev, struct task_struct *next)
ã«ãªã‚Šã¾ã™ï¼Ž
raw tracepintã®ã‚‚ã¨ã‚‚ã¨ã®å°Žå…¥ã®çµŒç·¯ã¯ï¼Œsched_switch
ã«ãŠã„ã¦prev
ã¨next
ã®task_struct
ã®ä¸èº«ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ãŸã„ã¨ã„ã†è¦æ±‚ã‹ã‚‰ã ã£ãŸã‚ˆã†ã§ã™ï¼ˆå‚考).通常ã®tracepointã§ã‚ã‚Œã°BPFプãƒã‚°ãƒ©ãƒ 呼ã³å‡ºã—å‰ã«tracepointã®ãƒ‡ãƒ¼ã‚¿ã‚’æ•´å½¢ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ãŒï¼Œraw tracepointã§ã¯ãã®å¿…è¦ãŒãªã„ãŸã‚,ãã®åˆ†ã®ã‚ªãƒ¼ãƒãƒ˜ãƒƒãƒ‰ãŒæŠ‘ãˆã‚‰ã‚Œã¾ã™ï¼ŽãŸã ã—,raw tracepointã®å¼•æ•°ã§ä¸Žãˆã‚‰ã‚ŒãŸãƒã‚¤ãƒ³ã‚¿ã®ãƒ‡ãƒ¼ã‚¿ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯bpf_probe_read()
を使ã†å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼ŽåŸºæœ¬çš„ã«ã¯tarcepiontã®æ–¹ãŒæ‰±ã„ã‚„ã™ã„ã®ã§ï¼Œãã¡ã‚‰ã‚’使ãˆã°è‰¯ã„ã¨æ€ã„ã¾ã™ãŒï¼Œãƒ‘フォーマンスãŒå•é¡Œã§ã‚ã£ãŸã‚Šï¼Œã‚ã‚‹ã„ã¯tracepointã®æƒ…å ±ã ã‘ã§ã¯ä¸è¶³ã—ã¦ã„ã‚‹å ´åˆã¯raw tracepointを検討ã—ã¦ã¿ã‚‹ã¨è‰¯ã„ã¨æ€ã„ã¾ã™ï¼Ž
BPFプãƒã‚°ãƒ©ãƒ ã‹ã‚‰ã‚«ãƒ¼ãƒãƒ«å†…ã®ãƒ‡ãƒ¼ã‚¿æ§‹é€ ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹æ–¹æ³•
kprobeã‚„tracepointãªã©ã«ã‚¢ã‚¿ãƒƒãƒã—ãŸBPFプãƒã‚°ãƒ©ãƒ ã¯ï¼ŒBPF_FUNC_probe_read()
関数ã§ã‚«ãƒ¼ãƒãƒ«å†…ã®ãƒ‡ãƒ¼ã‚¿æ§‹é€ ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ï¼Žã“ã‚Œã¯probe_kernel_read()
ã®ãƒ©ãƒƒãƒ‘ーã§ï¼Œã‚‚ã—変ãªé ˜åŸŸã«ã‚¢ã‚¯ã‚»ã‚¹ã—よã†ã—ãŸå ´åˆï¼ˆpage faultãŒç™ºç”Ÿã—ãŸå ´åˆï¼‰ã¯-EFAULTãŒè¿”ã‚Šã¾ã™ï¼Ž
ã¾ãŸï¼ŒBPF_FUNC_get_current_task()
ã§currentã®task_structã‚’å¾—ã‚‹ã“ã¨ãŒã§ãã¾ã™ï¼Ž
例ã¨ã—ã¦ï¼Œ/bin/catãŒå®Ÿè¡Œã•ã‚ŒãŸã¨ãã«ï¼Œãã®ãƒ—ãƒã‚»ã‚¹ã®vm_area_struct
ã®ä¸èº«ã‚’ダンプã™ã‚‹ãƒ—ãƒã‚°ãƒ©ãƒ を書ã„ã¦ã¿ã¾ã™ï¼Žbccを利用ã—ã¦ä»¥ä¸‹ã®ã‚ˆã†ã«æ›¸ã‘ã¾ã™ï¼Ž
#!/usr/bin/env python import bcc text = r""" #include <linux/ptrace.h> #include <linux/sched.h> int probe(struct pt_regs *ctx) { int i; struct task_struct *t = (struct task_struct *)bpf_get_current_task(); struct vm_area_struct *vma = t->mm->mmap; #pragma clang loop unroll(full) for (i = 0; i < 20; i++) { if (vma != NULL) { unsigned long inode = vma->vm_file->f_inode->i_ino; bpf_trace_printk("%lx-%lx %ld\n", vma->vm_start, vma->vm_end, inode); vma = vma->vm_next; } } return 0; } """ def main(): b = bcc.BPF(text=text, debug=0) b.attach_uprobe(name="/bin/cat", sym="main", fn_name="probe") b.trace_print() if __name__ == "__main__": main()
ã“ã“ã§æ³¨æ„点ã¨ã—ã¦ã¯ï¼Œï¼ˆå¤ã„カーãƒãƒ«ã ã¨ï¼‰BPFプãƒã‚°ãƒ©ãƒ ã¯ãƒ«ãƒ¼ãƒ—を扱ãˆãªã„ã®ã§*1,pragmaを利用ã—ã¦å±•é–‹ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼Žã¾ãŸbreak文をå«ã‚€ã‚ˆã†ãªãƒ—ãƒã‚°ãƒ©ãƒ ã¯verifierã«ãŠã“られるã®ã§ï¼Œã¡ã‚‡ã£ã¨æ›¸ãæ–¹ã«å·¥å¤«ãŒã„ã‚Šã¾ã™ï¼Ž
bccã§ã¯ï¼Œãƒã‚¤ãƒ³ã‚¿å‚ç…§ã¯åŽŸå‰‡bpf_probe_read()
関数呼ã³å‡ºã—ã«ãªã‚Šã¾ã™*2.ã“ã“ã§ï¼Œä¸Šè¨˜ãƒ—ãƒã‚°ãƒ©ãƒ ã§ã¯ãƒã‚¤ãƒ³ã‚¿ãŒNULLã‹ç¢ºèªã—ã¦ã„ã¾ã›ã‚“*3.ã“ã‚Œã§å¤§ä¸ˆå¤«ï¼Ÿã¨æ€ã†ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ãŒï¼Œå®Ÿéš›ã®ãƒã‚¤ãƒ³ã‚¿å‚ç…§ã¯bpf_probe_read()
を利用ã—ã¦ã„ã¦ï¼Œã‚‚ã—èªã¿å‡ºã—ã«å¤±æ•—ã—ãŸå ´åˆã¯bccã¯äº‹å‰ã«ãƒãƒƒãƒ•ã‚¡ã‚’クリアã™ã‚‹ã®ã§å¾—られる値ã¯0ã«ãªã‚Šã¾ã™ï¼Žã‚¢ãƒ‰ãƒ¬ã‚¹0ã«å¯¾ã™ã‚‹bpf_probe_read()
ã¯å¤±æ•—ã™ã‚‹ã§ã—ょã†ãŒï¼Œãƒ—ãƒã‚°ãƒ©ãƒ ãŒã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã™ã‚‹ã¨ã„ã£ãŸã“ã¨ã¯ãªã„ã®ã§ï¼Œã“ã‚Œã§å¤§ä¸ˆå¤«ã§ã™ï¼Žçµæžœã¨ã—ã¦ã¯vma->vm_file
ãŒNULLãªã‚‰inodeã¯0ã«ãªã‚Šã¾ã™ï¼Ž
上記プãƒã‚°ãƒ©ãƒ を実行ã—ã¦ãŠã„ã¦*4,以下ã®ã‚ˆã†ã«catを実行ã™ã‚‹ã¨ï¼Œ
% cat /proc/self/maps 55e4824bf000-55e4824c7000 r-xp 00000000 08:02 2621482 /bin/cat 55e4826c6000-55e4826c7000 r--p 00007000 08:02 2621482 /bin/cat 55e4826c7000-55e4826c8000 rw-p 00008000 08:02 2621482 /bin/cat 55e4835b0000-55e4835d1000 rw-p 00000000 00:00 0 [heap] 7f1b8bfcf000-7f1b8c1b6000 r-xp 00000000 08:02 6685444 /lib/x86_64-linux-gnu/libc-2.27.so 7f1b8c1b6000-7f1b8c3b6000 ---p 001e7000 08:02 6685444 /lib/x86_64-linux-gnu/libc-2.27.so 7f1b8c3b6000-7f1b8c3ba000 r--p 001e7000 08:02 6685444 /lib/x86_64-linux-gnu/libc-2.27.so 7f1b8c3ba000-7f1b8c3bc000 rw-p 001eb000 08:02 6685444 /lib/x86_64-linux-gnu/libc-2.27.so 7f1b8c3bc000-7f1b8c3c0000 rw-p 00000000 00:00 0 7f1b8c3c0000-7f1b8c3e7000 r-xp 00000000 08:02 6685432 /lib/x86_64-linux-gnu/ld-2.27.so 7f1b8c41a000-7f1b8c43c000 rw-p 00000000 00:00 0 7f1b8c43c000-7f1b8c5d7000 r--p 00000000 08:02 4326139 /usr/lib/locale/locale-archive 7f1b8c5d7000-7f1b8c5d9000 rw-p 00000000 00:00 0 7f1b8c5e7000-7f1b8c5e8000 r--p 00027000 08:02 6685432 /lib/x86_64-linux-gnu/ld-2.27.so 7f1b8c5e8000-7f1b8c5e9000 rw-p 00028000 08:02 6685432 /lib/x86_64-linux-gnu/ld-2.27.so 7f1b8c5e9000-7f1b8c5ea000 rw-p 00000000 00:00 0 7fffea906000-7fffea927000 rw-p 00000000 00:00 0 [stack] 7fffea9fc000-7fffea9ff000 r--p 00000000 00:00 0 [vvar] 7fffea9ff000-7fffeaa00000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
以下ã®å‡ºåŠ›ãŒå¾—られã¾ã™*5.BPFプãƒã‚°ãƒ©ãƒ å´ã‹ã‚‰vma_structã®æƒ…å ±ãŒå–å¾—ã§ãã¦ã„ã‚‹ã“ã¨ãŒåˆ†ã‹ã‚Šã¾ã™ï¼Ž
<...>-8164 [001] .... 512025.107366: 0: 55e4824bf000-55e4824c7000 2621482 <...>-8164 [001] .... 512025.107381: 0: 55e4826c6000-55e4826c7000 2621482 <...>-8164 [001] .... 512025.107382: 0: 55e4826c7000-55e4826c8000 2621482 <...>-8164 [001] .... 512025.107383: 0: 7f1b8bfcf000-7f1b8c1b6000 6685444 <...>-8164 [001] .... 512025.107384: 0: 7f1b8c1b6000-7f1b8c3b6000 6685444 <...>-8164 [001] .... 512025.107384: 0: 7f1b8c3b6000-7f1b8c3ba000 6685444 <...>-8164 [001] .... 512025.107385: 0: 7f1b8c3ba000-7f1b8c3bc000 6685444 <...>-8164 [001] .... 512025.107390: 0: 7f1b8c3bc000-7f1b8c3c0000 0 <...>-8164 [001] .... 512025.107391: 0: 7f1b8c3c0000-7f1b8c3e7000 6685432 <...>-8164 [001] .... 512025.107394: 0: 7f1b8c5d7000-7f1b8c5d9000 0 <...>-8164 [001] .... 512025.107395: 0: 7f1b8c5e7000-7f1b8c5e8000 6685432 <...>-8164 [001] .... 512025.107396: 0: 7f1b8c5e8000-7f1b8c5e9000 6685432 <...>-8164 [001] .... 512025.107399: 0: 7f1b8c5e9000-7f1b8c5ea000 0 <...>-8164 [001] .... 512025.107402: 0: 7fffea906000-7fffea927000 0 <...>-8164 [001] .... 512025.107405: 0: 7fffea9fc000-7fffea9ff000 0 <...>-8164 [001] .... 512025.107408: 0: 7fffea9ff000-7fffeaa00000 0
ã¾ãŸbpftraceãªã‚‰ä»¥ä¸‹ã®ã‚ˆã†ã«æ›¸ã‘ã¾ã™ï¼Ž
#include <linux/sched.h> #include <linux/fs.h> uprobe:/bin/cat:main { $vma = (struct vm_area_struct*)curtask->mm->mmap; unroll(20) { if ($vma != 0) { $inode = $vma->vm_file->f_inode->i_ino; printf("%lx-%lx %ld\n", $vma->vm_start, $vma->vm_end, $inode); $vma = $vma->vm_next; } } }
(ãƒã‚¤ãƒ©ã‚¤ãƒˆãŒæ¬²ã—ã„...)
使ã„所ãŒé™ã‚‰ã‚Œã¾ã™ãŒï¼Œã‚ã®æƒ…å ±ã“ã“ã«ã‚ã£ãŸã£ã‘?ã¨ã„ã†æ™‚ã«ã‚«ãƒ¼ãƒãƒ«ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’書ã‹ãªãã¦ã‚‚確èªã§ãã¾ã™ï¼Ž
*1:Linux5.3ã‹ã‚‰Bounded Loopã«å¯¾å¿œã—ã¾ã—ãŸ
*2:BPFプãƒã‚°ãƒ©ãƒ ã«ä¸Žãˆã‚‰ã‚Œã‚‹å¼•æ•°(ctx)ã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚»ã‚¹ã¯load命令ã«ãªã‚Šã¾ã™
*3:例ãˆã°ï¼Œvma->vm_fileã¯mmapã•ã‚ŒãŸé ˜åŸŸã§ãªã‘ã‚Œã°NULLã«ãªã‚Šã¾ã™
*4:attach_uprobeã™ã‚‹éš›ã¯ãƒ‡ãƒãƒƒã‚°æƒ…å ±ã‚’ã¿ã¦ã‚¢ãƒ‰ãƒ¬ã‚¹è§£æ±ºã™ã‚‹ã®ã§ï¼Œãƒ‡ãƒãƒƒã‚°ã‚·ãƒ³ãƒœãƒ« (ubuntuãªã‚‰coreutils-dbgsym)をインストールã—ã¦ãŠãå¿…è¦ãŒã‚ã‚Šã¾ã™ï¼Ž
*5:[heap]ãªã©ã®æƒ…å ±ãŒè¡¨ç¤ºã•ã‚Œã¦ã„ãªã„ã®ã¯ã“ã‚Œã¯ã‚«ãƒ¼ãƒãƒ«å´ã§è¡¨ç¤ºã—ã¦ã„ã‚‹æƒ…å ±ã§ã‚ã‚‹ãŸã‚ã§ã™
Rustã§Unix Domain Socketを扱ã†æ–¹æ³•
"rust domain socket"ã¨ã‹ã§æ¤œç´¢ã™ã‚‹ã¨ã„ã‚ã„ã‚引ã£ã‹ã‹ã‚‹ã‘ã©ã„ã‹ã‚“ã›ã‚“ライブラリã®æ›´æ–°ãŒæ—©ãã¦æƒ…å ±ãŒå¤ã‹ã£ãŸã‚Šã™ã‚‹ã®ã§ã“ã“ã«ç¾çŠ¶ã‚’書ãã¾ã™ï¼ˆã“ã®æ–‡ç« ã‚‚ã™ãã«å¤ããªã‚‹ã‹ã‚‚ã—ã‚Œãªã„ã®ã§å¾Œã‹ã‚‰èªã‚€äººã¯æ³¨æ„ã—ã¦ãã ã•ã„..)
基本
std::os::unix::net
- 元㯠rust-lang-nursery/unix-socketã ã£ãŸã‚‚ã®ãŒï¼Œstdã«å–ã‚Šè¾¼ã¾ã‚ŒãŸã‚‚ã®ï¼ˆrfc)
std::net::TcpListener
ç‰ã¨åŒæ§˜ã®ä½¿ã„å‹æ‰‹
- nix
- setsockoptã—ãŸã„ã¨ãã‚„ancillary dataã‚’sendmsgã§é€ã‚ŠãŸã„ã¨ãã«æœ‰ç”¨ï¼ˆä¾‹ï¼‰
- libc
- 硬派ãªäººå‘ã‘
async/await
- mio-uds
- mioã‚’domain socketã«å¯¾å¿œã•ã›ãŸã‚‚ã®
- 後述ã®tokio, async-stdã‚‚ã“れを利用
tokio::net::unix
- å…ƒã¯
tokio-uds
ã¨ã„ã†å€‹åˆ¥ã®ãƒªãƒã‚¸ãƒˆãƒªã ã£ãŸã®ãŒï¼Œtokio
本体ã«å¸åŽã•ã‚Œï¼Œã•ã‚‰ã«ä»Šã§ã¯tokio-net
ã®ä¸€éƒ¨ï¼Ž - async/awaitã—ãŸã„人å‘ã‘
- å…ƒã¯
async_std::os::unix::net
- async-std版
- ç¾åœ¨ãƒã‚°ã£ã¦ã¦å‹•ãã¾ã›ã‚“
- 1.0ãŒå‡ºã‚‹ã“ã‚ã«ã¯ãã£ã¨ä¿®æ£ã•ã‚Œã¦ã„ã‚‹ã¯ãš
HTTPサーãƒ
- actix-web
- udsã®ã‚µãƒãƒ¼ãƒˆãŒã‚る(例)
- hyper
- hyperlocalを使ã†
例
std::os::unix::net::{UnixListner, UnixStream}
use std::fs; use std::io::prelude::*; use std::os::unix::net::{UnixListener, UnixStream}; use std::path::Path; use std::thread; fn handle_client(mut stream: UnixStream) -> std::io::Result<()> { let mut buf = [0; 1024]; let n = stream.read(&mut buf)?; let s = String::from_utf8_lossy(&buf[..n]); println!("{}", s); Ok(()) } fn main() -> Result<(), Box<dyn std::error::Error>> { let sockfile = Path::new("/tmp/uds.sock"); if sockfile.exists() { fs::remove_file(&sockfile)?; } let listner = UnixListener::bind(sockfile)?; for stream in listner.incoming() { let stream = stream?; thread::spawn(move || handle_client(stream).unwrap()); } Ok(()) }
// cargo-deps: tokio="0.2.0-alpha.6", tokio-net="0.2.0-alpha.6", futures-preview="0.3.0-alpha.19" use std::fs; use std::path::Path; use futures::StreamExt; use tokio; use tokio::io::AsyncReadExt; use tokio::net::unix::{UnixListener, UnixStream}; async fn handle_client(mut stream: UnixStream) -> Result<(), Box<dyn std::error::Error>> { let mut buf = [0; 1024]; let n = stream.read(&mut buf).await?; let s = String::from_utf8_lossy(&buf[..n]); println!("{}", s); Ok(()) } #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let sockfile = Path::new("/tmp/uds.sock"); if sockfile.exists() { fs::remove_file(&sockfile)?; } let listner = UnixListener::bind(sockfile)?; let mut incoming = listner.incoming(); while let Some(stream) = incoming.next().await { let stream = stream?; tokio::spawn(async move { handle_client(stream).await.unwrap(); }); } Ok(()) }