BPF�ɂ��g���[�V���O���ȒP�ɂł���ubpftrace�v�̎g�����FBerkeley Packet Filter�iBPF�j����i9�j

Linux�ɂ����闘�p���}���ɑ����Ă���uBerkeley Packet Filter�iBPF�j�v�ɂ‚��āA��b���牞�p�܂ŕ��L���Љ��A�ځB����́A�ubpftrace�v�ɂ��g���[�V���O�ɂ‚��āB

» 2020�N06��15�� 05��00�� ���J
[���]���j�COSS�Z�L�����e�B�Z�p�̉�]

���̋L���͉������ł��B����o�^�i�����j����ƑS�Ă������������܂��B

�@Linux�ɂ����闘�p���}���ɑ����Ă���uBerkeley Packet Filter�iBPF�j�v�ɂ‚��āA��b���牞�p�܂ŕ��L���Љ��A�ځuBerkeley Packet Filter�iBPF�j�����v�B�O����BPF�ɂ��g���[�V���O�ɂ‚��āA�����܂��Ȏd�g�݂�T�v��������܂����B����́ABPF�ɂ���\�I�ȃg���[�V���O�c�[���ubpftrace�v�ɂ‚��āA��̓I�ɂǂ̂悤�Ȃ��Ƃ��ł���̂����Љ�܂��B�܂��Abpftrace�̒��ӓ_�╪����ɂ����_�ɂ‚��Ă��܂Ƃ߂܂��B

bpftrace�Ƃ�

�@bpftrace��BPF�𗘗p�����g���[�V���O�c�[���̈�‚ł��B��\�I��BPF�̃��C�u�����ł���uBCC�iBPF Compiler Collection�j�v�Ɠ������A���݂́uiovisor�v���Ǘ����Ă��܂��BBCC�Ɣ�r����ƁAbpftrace�̓g���[�X�����ɓ������A���ȒP�ɗ��p�ł���悤�ɂȂ��Ă���Ƃ�����ł��傤�B

�@bpftrace�ɂ͉��L�̂悤�ȓ���������܂��B

  • �g���[�V���O�������p�̌���ŋL�q
    • BPF�v���O�������L�ׂ̍�������⒍�ӎ������C�ɂ����Ƀg���[�X�v���O������������
  • ��v�g���[�V���O�@�\�̃T�|�[�g
    • �J�[�l���g���[�V���O
      • tracepoints
      • k(ret)probe
      • k(ret)func
      • perf event
    • ���[�U�[�v���O�����g���[�V���O
      • u(ret)probe
      • USDT�iUserland Statically Defined Tracing�j
  • �J�[�l���̍ŐV�@�\�̑Ή�
    • BTF�iBPF Type Format�j�ɂ��J�[�l���f�[�^�\���̎擾
    • BPF Trampoline�ɂ��g���[�V���O

�@BPF��p���ĉ����g���[�V���O�������ꍇ�A��Ԃ��E�߂̃c�[���ł��B

bpftrace�̓���

�@bpftrace���C���X�g�[�������v�ȕ��@���Љ�܂��B�O��Ƃ��āA��ʂ�Linux 4.9�ȏ��BPF���L�������ꂽ�J�[�l�����K�v�ł��BUbuntu 18.04+�AFedora 31+�AREHL�iRed Hat Enterprise Linux�j 8�AREHL 7�iBPF�@�\���o�b�N�|�[�g����Ă���j�Ȃǂŗ��p�ł��܂��B����bpftrace���������߂ɐV�K��OS�‹����\�z����ꍇ�́ABTF�̃T�|�[�g������Fedora 32�����E�߂ł��B

�p�b�P�[�W�}�l�W���[����̓���

�@�����̃p�b�P�[�W�}�l�W���[��bpftrace����舵���Ă��܂��B

sudo snap install bpftrace --devmode
sudo snap connect bpftrace:system-trace
Ubuntu

�@Ubuntu 20.04�ł�apt������C���X�g�[���ł��܂����Asnap�ł̕����p�b�P�[�W�̍X�V�p�x�������ł��B

sudo dnf install -y bpftrace
Fedora

�@�p�b�P�[�W�}�l�W���[�ɑ��݂���bpftrace�́A�ꍇ�ɂ���Ă̓o�[�W�������Â����Ƃ�����܂��B�����o�O�Ǝv���鋓���ɑ��������ꍇ�́A�ȉ��̕��@�ōŐV�ł������Ă݂Ă��������Bbpftrace�͌��݊����ɊJ������Ă���̂ŁA�o�O���C������Ă���”\��������܂��B

GitHub��embeded build���擾

�@GitHub Actions��embedded build����A�ŐV�̃r���h����肷�邱�Ƃ��”\�ł��B

Docker�C���[�W�̗��p

�@quay.io��bpftrace��Docker�C���[�W������܂��B����Docker�C���[�W�ɂ͍ŐV�ł�bpftrace���܂܂�Ă��܂��B����Docker�C���[�W�́A�ȉ��̂悤�ɃJ�[�l���\�[�X��debugfs��K�؂ɃR���e�i�Ƀ}�E���g�������privilege�ȃR���e�i�Ƃ��ė��p���܂��B

$ docker run -ti -v /usr/src:/usr/src:ro \
       -v /lib/modules/:/lib/modules:ro \
       -v /sys/kernel/debug/:/sys/kernel/debug:rw \
       --net=host --pid=host --privileged \
       quay.io/iovisor/bpftrace:latest

�@�R���e�i����/usr/bin/bpftrace��bpftrace������܂��B�܂�/usr/local/bin/�ȉ���bpftrace�̃X�N���v�g���C���X�g�[������Ă��܂��B

�����Ńr���h����

�@bpftrace�̍ŐV�@�\�A����BTF�Ɋւ���@�\�𗘗p����ꍇ�́A������BCC�Alibbpf��bpftrace���r���h����K�v������܂��B�ڍׂɂ‚��ẮuINSTALL.md�v���Q�Ƃ��Ă��������B

bpftrace����

�@bpftrace�̎��s������Ă݂܂��傤�B

�@�܂��ubpftrace --info�v��bpftrace���T�|�[�g���Ă���@�\����сA�J�[�l�����T�|�[�g���Ă���BPF�̋@�\�̗L�����m�F�ł��܂��B�Ȃ��A���̃R�}���h�����s�ł��Ȃ��ꍇ�Abpftrace�̃o�[�W�������Â��ł��B�܂��Abpftrace�̎��s�ɂ�root�����iCAP_SYS_ADMIN�j���K�v�ł��B

$ bpftrace --info
 
System
  OS: Linux 5.7.0+ #2 SMP Mon Jun 1 12:50:01 JST 2020
  Arch: x86_64
 
Build
  version: v0.10.0-163-gdc96
  LLVM: 10
  foreach_sym: yes
  unsafe uprobe: no
  bfd: yes
  bpf_attach_kfunc: 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
[...]

�@����ł�bpftrace���g���Ă݂܂��傤�B

$ bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s\n"�Astr(args->filename)); }'
Attaching 1 probe...
/proc/15720/cmdline
[...]

�@����́uopenat(2)�v�V�X�e���R�[�������s���ꂽ�ۂɁA�����̃t�@�C������\������bpftrace�̃X�N���v�g�ł��B�utracepoint:syscalls:sys_enter_openat�v���g���[�X�Ώۂ̃C�x���g���i�u�v���[�u�v�Ƃ����܂��j�A���̌��{ }�ň͂܂ꂽ�������A���̃C�x���g�����������ۂɎ��s����A�N�V�����i��BPF�v���O�����j�ł��B

�@BCC��BPF�v���O�������쐬����ꍇ�́y1�zBPF�v���O�����{�̂ƁA�y2�z�g���[�V���O���ʂ�\�����邽�߂̃v���O������ʁX�ɍ쐬����K�v������܂����Bbpftrace�̏ꍇ�́A���̕����𓝈�I�ɋL�q�ł���悤�ɂȂ��Ă��܂��B�����I�ɂ�bpftrace�̓X�N���v�g�����LLVM IR���o�R����BPF�v���O�����ɃR���p�C��������A������J�[�l���Ƀ��[�h���܂��B���̌�bpftrace�́ABPF�v���O�����̏o�͂��Ď����A�K�v�ɉ����Č��ʂ�\�����܂��B

�@bpftrace���g���[�X�ł���v���[�u�́ubpftrace -l�v�ŕ\���ł��܂��B

$ bpftrace -l
software:bpf-output:
software:context-switches:
software:cpu-clock:
[...]

�@�������A���̂܂܂��Ɛ������߂���̂ŁA�ȉ��̂悤�Ɍ��肵�Č�������Ƃ����ł��傤�B

$ bpftrace -l  'kprobe:vfs_*' // vfs_����͂��܂�kprobe�Ńg���[�X�”\�Ȋ֐���\��
$ bpftrace -l  'tracepoint:syscalls:*' // syscall��tracepoint�݂̂�\��

�@bpftrace�͈ȉ��̃v���[�u�ɑΉ����Ă��܂��B�e��v���[�u�̏ڍׂ��O���̋L�����Q�Ƃ��Ă��������B

�v���[�u�^�C�v �T�v BPF�v���O�����^�C�v
tracepoints tracepiont `BPF_PROG_TYPE_TRACEPOINT`
kprobe �J�[�l���֐��g���[�V���O `BPF_PROG_TYPE_KPROBE`
kretprobe ����ireturn�̃g���[�V���O�j `BPF_PROG_TYPE_KPROBE`
uprobe ���[�U�[�v���O�����g���[�V���O `BPF_PROG_TYPE_KPROBE`
uretrobe ����ireturn�̃g���[�V���O�j `BPF_PROG_TYPE_KPROBE`
usdt USDT `BPF_PROG_TYPE_KPROBE`
software perf software event `BPF_PROG_TYPE_PERF_EVENT`
hardware perf hardware event `BPF_PROG_TYPE_PERF_EVENT`
profile ��莞�ԊԊu�ŃC�x���g������ `BPF_PROG_TYPE_PERF_EVENT`
interval ��莞�ԊԊu�ŃC�x���g������ `BPF_PROG_TYPE_PERF_EVENT`
kfunc BPF trampoline�ɂ��g���[�X `BPF_PROG_TYPE_TRACING`
kretfunc ���� �ireturn�̃g���[�V���O�j `BPF_PROG_TYPE_TRACING`
BEGIN �v���O�����J�n���Ɏ��s����� �@
END �v���O�����I�����Ɏ��s����� �@

�@�܂��A�u-v�v�I�v�V�������ꏏ�ɕt����ƁA�v���[�u�̏ڍׂȏ�񂪓����܂��Btracepiont�̏ꍇ�̓A�N�Z�X�”\�Ȉ����̏�񂪓����܂��B

�@���L��bpftrace�v���O�����ł́A�uargs->filename�v�Ńt�@�C�����ɃA�N�Z�X���Ă��܂����B

$ bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s\n"�Astr(args->filename)); }'
Attaching 1 probe...
/proc/15720/cmdline
[...]
�i�Čf�j

�@���́ufilename�v�͉��L�ŕ\������Ă���tracepoint�̃f�[�^�ɑΉ����܂��B

$ bpftrace -lv 'tracepoint:syscalls:sys_enter_openat'
tracepoint:syscalls:sys_enter_openat
    int __syscall_nr;
    int dfd;
    const char * filename;
    int flags;
    umode_t mode;

�A�N�V�����łł��邱��

�@��ɏЉ��bpftrace�v���O�����ł́uprintf()�v�𗘗p���āA�t�@�C�������o�͂��Ă��܂����B��\�I�ȃA�N�V�����̒��g�Ƃ��ẮA�uprintf()�v�ɂ��o�͂̑��ɁABPF�}�b�v�𗘗p�����C�x���g�̌v��������܂��B�Ⴆ�΁A�ȉ��̃v���O�����́Abpftrtace���s����mCtrl�n�{�mC�n�L�[�Ŏ��s���I������܂ł́uopenat(2)�v�V�X�e���R�[���̔����񐔂��v�����܂��B

$ bpftrace -e 'tracepoint:syscalls:sys_enter_openat { @ = count(); }'
^C
 
@: 929

�@�����ŁA�u@�v��BPF�}�b�v���Ӗ����܂��BBPF�}�b�v�̓O���[�o���ȃf�[�^�\���Ƃ��ė��p�ł��܂��B�ucount()�v�̓}�b�v�ɑ΂�����ʂȊ֐��ŁA���̃v���[�u���Ă΂ꂽ�֐����}�b�v�ɕێ����܂��B���ʂƂ��č���̏ꍇ�́uopenat(2)�v���Ă΂ꂽ�񐔂��L�^����܂��Bbpftrace�̓v���O�����I�����Ɏ����Ń}�b�v�̒��g��\�����܂��B

�@�ȉ��̂悤�ɂ���ƁA�uoepnat(2)�v�̈����̃t�@�C������"/etc/passwd"�ł��������̂̂݌v�����܂��B

$ bpftrace -e 'tracepoint:syscalls:sys_enter_openat { if (str(args->filename) == "/etc/passwd") { @ = count(); }}'
 
@: 15

�@�t�@�C�����ʂŏW�v���邱�Ƃ��”\�ł��B

$ $bpftrace -e 'tracepoint:syscalls:sys_enter_openat { @[str(args->filename)] = count(); }'
Attaching 1 probe...
^C
 
@[/proc/16288/cmdline]: 1
[...]

�@���̂悤�ɁAbpftrace�ł͂�������Ƀ}�b�`�����C�x���g�̏W�v�⒊�o���ȒP�ɍs���܂��B���̍ۃ��[�U�[��BPF�ɂ‚��Ă͂قƂ�Ljӎ�����K�v�͂���܂���B����Ńg���[�V���O�v���O������BPF�v���O�����ɃR���p�C������Averifier�ň��S�������؂��ꂽ�̂��ɃJ�[�l�����œ��삵�܂��B���ʂƂ��āA��I�[�o�[�w�b�h�Ńg���[�V���O�����������ł��܂��B

kprobe�^kretprobe

�@kprobe�𗘗p����ƁA�J�[�l�����̊֐��i�u/proc/kallsyms�v�ŕ\�������قƂ�ǂ̊֐��j���g���[�X���邱�Ƃ��ł��܂��B�ȉ��́uvfs_open()�v�֐����Ă΂ꂽ�ۂɁA���̈�������t�@�C������\�����܂��B

$ bpftrace -e 'kprobe:vfs_open { $filename = str(((struct path *)arg0)->dentry->d_name.name);  printf("%s\n"�A$filename); }' --include linux/fs.h
Attaching 1 probe...
cmdline
[...]

�@kprobe�v���[�u�̒��ł́A�uarg0�v�uarg1�v�c�c�Ŋ֐��̈����ɃA�N�Z�X�ł��܂��B���̂Ƃ��A�����I�Ɉ����������ŃL���X�g�i����̏ꍇ�́u(struct path*)�v�j����K�v������܂��B�܂��A�ustruct path�v�̒�`���擾���邽�߂Ɂulinux/fs.h�v���C���N���[�h���Ă��܂��B��q��kfunc�𗘗p����ƁA���̋L�q���s�v�ɂȂ�܂��B

�@kretprobe�̓J�[�l���֐���return����ۂɃC�x���g���������܂��B�Ȃ��Akretprobe�͂��̐���ɂ��A�֐��̈����ɒ��ڃA�N�Z�X���邱�Ƃ͂ł��܂���Bkretprobe����֐��̈����ɃA�N�Z�X�������ꍇ�́A���O��kprobe�̃A�N�V�����œK����BPF�}�b�v�Ɉ�����ۑ�����K�v������܂��B

uprobe�^uretprobe

�@uprobe�^uretprobe�𗘗p���āA���[�U�[�v���O�������g���[�X���邱�Ƃ��ł��܂��B�Ⴆ�΁A�ȉ��̊ȒP�ȃv���O�������l���܂��B

#include <stdio.h>
 
int f(int a�Aint b){
    return a + b;
}
 
int main(){
    printf("%d\n"�Af(1,2));
}

�@���̃v���O�������R���p�C��������A�u-l�v�I�v�V�����Ńg���[�X�”\�Ȋ֐����擾�ł��܂��B

$ bpftrace -lv "uprobe:./a.out"
BTF: using data from /sys/kernel/btf/vmlinux
uprobe:./a.out:__do_global_dtors_aux
uprobe:./a.out:__libc_csu_fini
uprobe:./a.out:__libc_csu_init
uprobe:./a.out:_fini
uprobe:./a.out:_init
uprobe:./a.out:_start
uprobe:./a.out:deregister_tm_clones
uprobe:./a.out:f
uprobe:./a.out:frame_dummy
uprobe:./a.out:main
uprobe:./a.out:register_tm_clones

�@�ȉ��̂悤�ɂ��Ċ֐��uf�v���Ă΂ꂽ�ۂɁA���̂Ƃ��̈������o�͂ł��܂��B

$ bpftrace -e 'uprobe:./a.out:f { printf("%d�A%d\n"�Aarg0�Aarg1); }'
Attaching 1 probe...
1�A2

�@uprobe�͋��L���C�u�����̊֐��ɑ΂��Ă����p�”\�ł��B�Ⴆ�Ή��L�́A�ulibc�v�́unanosleep�v�֐����Ă񂾉񐔂��v���Z�X�����ƂɏW�v���܂��B

$ bpftrace -e 'u:/lib/x86_64-linux-gnu/libc.so.6:*nanosleep* { @[comm] = count(); }'
Attaching 7 probes...
^C
 
@[sleep]: 3

�@�Ȃ��Auprobe�ł̓J�[�l���̋@�\�̐���ɂ�蕂�������_���W�X�^�ɃA�N�Z�X���邱�Ƃ͂ł��܂���B

USDT�iUserland Statically Defined Tracing�j

�@USDT�̓��[�U�[�v���O�������Ŗ����I�Ƀv���[�u���`������@�ŁA���Ƃ��Ƃ́uDTrace�v��uSystemTap�v�ŗ��p����Ă������̂ł��BUSDT���`������@�͊�‚�����܂����A�ȉ��Ɂusys/sdt.h�v�𗘗p�����������܂��B

#include <stdio.h>
#include <sys/sdt.h>
 
int f(int a�Aint b){
    DTRACE_PROBE2(test�Aprobe�Aa�Ab);
    return a + b;
}
 
int main(){
    printf("%d\n"�Af(1,2));
}

�@�����ŁuDTRACE_PROBE2(...)�v��USDT�̒�`�ł��B�Ȃ��A�uDTRACE�v�Ƃ������O���t���Ă��܂����A����͂��Ƃ���DTrace�Ŏg���Ă����f�[�^�`���𗘗p���Ă��邩��ł����āAbpftrace�����s����ۂɉ���DTrace�̋@�\�𗘗p���Ă���킯�ł͂���܂���B

�@���̃v���O�������R���p�C��������A�u-l�v�I�v�V�����ňȉ��̂悤�ɒ�`����USDT���m�F�ł��܂��B

$ bpftrace -lv "usdt:./a.out"
BTF: using data from /sys/kernel/btf/vmlinux
usdt:./a.out:test:probe

�@USDT�̏���ELF�̓���Z�N�V�����Ɋi�[����Ă��܂��B����́ureadelf�v�R�}���h�ɂ���Ċm�F�ł��܂��B

$ readelf -n ./a.out
[...]
Displaying notes found in: .note.stapsdt
  Owner                 Data size       Description
  stapsdt              0x0000003b       NT_STAPSDT (SystemTap probe descriptors)
    Provider: test
    Name: probe
    Location: 0x0000000000000654, Base: 0x0000000000000718, Semaphore:
0x0000000000000000
    Arguments: -4@-4(%rbp) -4@-8(%rbp)

�@bpftrace����USDT�͈ȉ��̂悤�ɗ��p���܂��B�uarg0�v�uarg1�v�c�c��USDT�ɗ^���������ɃA�N�Z�X�ł��܂��B

$ bpftrace -e 'usdt:./a.out:test:probe { printf("%d�A%d\n"�Aarg0�Aarg1); }'
Attaching 1 probe...
1�A2

software�^hardware

�@software�^hardware�v���[�u�𗘗p����ƁA�w�肵��perf event��������񐔔��������ۂɃA�N�V���������s���邱�Ƃ��ł��܂��B

$ bpftrace -e 'software:faults:100 { @[comm] = count(); }'
Attaching 1 probe...
^C
 
@[git]: 1
@[tr]: 1
@[getent]: 1

profile

�@profile�v���[�u�𗘗p����ƁACPU���ƂɈ��Ԋu�ŃC�x���g���������܂��B����͎�Ɂukstack�v�uustack�v�Ƃ������X�^�b�N�g���[�X���擾����@�\�ƍ��킹�ăv���t�@�C�����O�ɗ��p����܂��B�ȉ��̃v���O�����́A99hz�ŃJ�[�l���X�^�b�N���擾���A���̃X�^�b�N�g���[�X���o�������񐔂��L�^���܂��B

$ bpftrace -e 'profile:hz:99 { @[kstack] = count(); }'
Attaching 1 probe...
^C
 
@[
    native_safe_halt+23
    __sched_text_end+38
    arch_cpu_idle+21
    default_idle_call+35
    do_idle+462
    cpu_startup_entry+29
    rest_init+174
    arch_call_rest_init+14
    start_kernel+1435
    x86_64_start_reservations+36
    x86_64_start_kernel+116
    secondary_startup_64+164
]: 98
[...]

interval

�@interval�͈��Ԋu�ŃC�x���g���������܂��Bprofile�Ǝ��Ă��܂����A�C�x���g����������̂�1�‚�CPU�݂̂ł��B��Ɉȉ��̂悤�ɑ��̃v���[�u�Ƒg�ݍ��킹�邱�Ƃ�ړI�ɗ��p����܂��B

// 1�b���bpftrace�̎��s���I��
i:1:s { printf("count = %d\n," @);
 
// 1�b���bpftrace�̎��s���I��
i:1:s { exit(); }

kfunc�^kretfunc

�@kfunc�^kretfunc��Linux 5.5���瓱�����ꂽ�ABTF�𗘗p�����g���[�X���@�ł��B�g������kprobe�Ƃقړ��l�ł����ABTF�𗘗p���邱�Ƃɂ��Akprobe�ƈ���ăJ�[�l�����֐��̈����̌^��BPF�v���O�����������ŔF�����Ă���܂��B��L��kprobe�̏�����kfunc�ŋL�q����ƁA���L�̂悤�ɂȂ�܂��Bkprobe�ƈႢ�A�����I�Ɉ������L���X�g����K�v������܂���B

$ bpftrace -e 'kfunc:vfs_open { $filename = str(args->path->dentry->d_name.name);  printf("%s\n"�A$filename); }'
Attaching 1 probe...
cmdline

�@BTF�ɂ‚��Ă͏ڂ����͎���������܂��B

bpftrace�����w�Ԃ��߂�

�@���ڂ���bpftrace���w�Ԃɂ́A�܂��������`���[�g���A�����Q�Ƃ��邱�Ƃ������߂��܂��B�ٖ�����{���������̂ŁA�Q�l�ɂ��Ă��������B

�@�܂��A�������|�W�g���́utools�v��bpftrace�̃X�N���v�g�������܂܂�Ă��܂��B���p�I�ȃg���[�V���O������ꍇ�͂܂������̃c�[������ɁA�K�v�ɉ����ĉ��ǂ������Ă����̂������Ǝv���܂��B���ڂ�������̋@�\�Ɋւ��Ă����t�@�����X�K�C�h���Q�Ƃ��Ă��������B

�@�p�t�H�[�}���X����Ɋւ���ڂ���������u�ǂ�ȂƂ��ɂǂ̃C�x���g���g���[�X���ׂ����v�Ɋւ��ẮA���L�̕������Q�l�ɂȂ�܂��B���ɁA�uBPF Performance Tools�v�ɂ�bpftrace��p�����g���[�X�c�[���̗Ⴊ�����܂܂�Ă��܂��B

  • Brendan Gregg�ABPF Performance Tools�AAddision-Wesley Professional�A2019.
  • Brendan Gregg�ASystems Performance: Enterprise and the Cloud�APrentice Hall�A2013.
  • �|��Łi���e ���h�i�ďC�j�A���� ���O�i�|��j�A�ډ��V�X�e���p�t�H�[�}���X�A�I���C���[�W���p�����A2017�j

bpftrace�̒��ӓ_�E������ɂ����_

�@�Ō�ɁAbpftrace�̕�����ɂ����_��͂܂�₷���_���܂Ƃ߂܂��B�g���u���V���[�g�̎Q�l�ɂ��Ă��������B�����ŎQ�Ƃ��Ă���bpftrace�̓o�[�W����0.10�ł��B�Ȃ�bpftrace�́A�܂��o�[�W����1.0�ɂȂ��Ă��炸�A�����ɏ����Ă��邱�Ƃ�����ς��”\�����\������܂��B

���@

�@bpftrace��C���ꃉ�C�N�ȕ��@�ł����A�����܂œƎ��̕��@�������A�\����͂����O�̂��̂𗘗p���Ă��܂��B����͍\����͂�Clang�𗘗p����BCC�ƈقȂ�܂��B�]���āABCC�̂悤��C����̕��@���g����Ǝv���ăv���O�������쐬����Ɖ��X�ɂ��ăG���[�ɂȂ�܂��B

�@�Ȃ��Abpftrace�͍\���̂̉�͏�����Clang�𗘗p���Ă��܂��B�������A�����܂Ń��C���̍\����͂�flex�^bison�ŏ������Ă��܂��B

�}�b�v�֐��̏���

�@bpftrace�̃}�b�v�֐��icount()�Ahist()�Alhist()�Amin()�Amax()�Asum()�Aavg()�Astats()�j�́A�ΏۂƂȂ�}�b�v�̒l���X�V���܂��B�Ⴆ�Ή��L��sum()�֐��́A

@ = sum($value);

�����I�ɂ́A���̂悤�Ȗ��ߗ�ɕϊ�����܂��B

$sum = @;       // bpf_map_lookup_elem()
$sum += $value;
@ = $sum;       // bpf_map_update_elem()

�񓯊��֐�

�@bpftrace�̊֐��̂����Aprintf()�Aprint()�Atime()�Aclear()�Azero()�Asystem()�Ajoin()�Acat()�Aexit()�͔񓯊��֐��ł��B�����̏�����BPF�v���O�����������ł͊������܂���Bbpftrace�̔񓯊��֐��͉��L�̂悤�ɓ��삵�܂��B

  1. BPF�v���O�������Ŕ񓯊��֐��i�Ⴆ��printf()�j�����s�i�ubpf_perf_event_output()�v�֐��𗘗p���āAperf buffer�ɂ��̊֐������s���ꂽ�|���������b�Z�[�W���o�́j
  2. ���[�U�[�X�y�[�X�œ��삷��bpftrace�̃����^�C����perf buffer�̃f�[�^��ǂݎ��
  3. �ǂݎ�����f�[�^�ɉ����Ĕ񓯊��֐��̏��������s

�@�]���āA�񓯊��֐��̎��s�ɂ̓��O������܂��B�����̏ꍇ����͖��ɂ͂Ȃ�܂��񂪁A�Ӑ}���Ȃ�����������N�����”\��������܂��B�Ⴆ�΁A�ȉ��̃v���O�������l���܂��B

{
  @ = 1;
  zero(@);
  printf("%d\n"�A@);
}

�@�uzero()�v�̓}�b�v�̃G���g�����u0�v�ɂ���֐��ł����A���̃v���O�����́u1�v���o�͂��܂��B�Ȃ��Ȃ�uzero(@)�v�͔񓯊��֐��ł���Aprintf()�����s�������_�iprintf()���񓯊��֐��ł����ABPF�v���O������print���������perf buffer�ɏo�͂��܂��j�ł�zero()�̏����͊������Ă��Ȃ����߂ł��B���̗�̏ꍇ�ł�zero()�ł͂Ȃ�����0��������i@ = 0�B���̏ꍇbpf_map_update_elem()�j�Ŗ��͉����ł��܂��B

�@�������A�����ł͈�v�f���������Ă��܂��񂪁A�N���A�������}�b�v�̗v�f���Ƃɏ����K�v������܂��B

�@�Ȃ��Adelete()�͔񓯊��֐��ł͂���܂���ibpf_map_delete_elem()�����s���܂��j�B

������̎�舵��

�@�uprintf(%s)�v�̈�����A�}�b�v�̃L�[��l�Ƃ��ĕ�����𗘗p�������ꍇ������܂��Bbpftrace�ŕ�������\��������@�͉��L��3�‚ł��B

  1. �����񃊃e�����i�Ⴆ�΁A"abc"�j
  2. str()�֐��𗘗p����
  3. char []�̍\���̂̃t�B�[���h�l

�@�����Œ��ӂ��ׂ��_�́A�|�C���^��str()�֐��𗘗p���Ė����I�ɕ�����ɕϊ�����K�v���������ŁAchar []�̍\���̂̃t�B�[���h�Ɋւ��Ă̓A�N�Z�X���Ɏ����ŕ�����ɕϊ������Ƃ������Ƃł��B

�@��̗��������ƁA�udo_sys_open()�v�֐��̑�2�����́uconst char __user *filename�v�ŁA����̓|�C���^�Ȃ̂ŁA�t�@�C�����̕�����𓾂�ɂ�str()�𗘗p���܂��B����ŁAstruct task_struct��comm��char[16]�Ȃ̂ŁA�P���Ɂucurtask->comm�v�ƃA�N�Z�X���邾���ŕ����񂪓����܂��icurtask�̓J�[�l����current�ϐ��i���݂̃^�X�N��task struct�j��ێ�����r���g�C���ϐ��ł��j�Bstr()�𗘗p����K�v�͂���܂���i�Ȃ��Atask struct��comm�t�B�[���h�ɂ͐�p�̃r���g�C���ϐ�comm�Œ��ڃA�N�Z�X�ł��܂��j�B

�@�������bpftrace�̃X�^�b�N��ɕۑ�����܂��B�����I�ɂ͕�����͌Œ蒷�ň����Ă���A���̒����̓f�t�H���g��64�ł��B���̒l��BPFTRACE_STRLEN�ŕύX�ł��܂��BBPF�v���O�����̃X�^�b�N��512�o�C�g�����Ȃ����߁A�����̕�����������ꍇ�̓X�^�b�N�I�[�o�[�t���[�ŃG���[�ɂȂ邱�Ƃ�����܂��B���̂悤�ȏꍇ�͂���BPFTRACE_STRLEN�̒l�̕ύX�������Ă��������B��������Œ蒷�ň������R�́ABPF�}�b�v�̃L�[��l�̃T�C�Y���Œ�ł��邽�߂ł��B

�@�Ȃ�������Ɋւ��Ă̓C���f�b�N�X�ŃA�N�Z�X�ł��Ȃ��A�����������Z���ł��Ȃ��Ȃǂ̖�肪����A�������@�̕ύX���c�_����Ă��܂��B

�t�@�C���̃C���N���[�h

�@�u#include�v�𗘗p����C�̃w�b�_���C���N���[�h���邱�Ƃ��ł��܂��B����͍\���̂̉�͂ɗ��p���܂��B�C���N���[�h�ɂ���`���ꂽ�\���̂͌�q�̃L���X�g�ŗ��p�ł��܂��B�Ȃ��A�w�b�_���C���N���[�h��������Ƃ����āA���̃w�b�_���Œ�`����Ă���C�����C���֐����g�p�ł���悤�ɂ͂Ȃ�܂���B

enum�l

�@enum����`����Ă���t�@�C�����C���N���[�h����ƁA�v���O�����̒��ł���enum�l�𗘗p���邱�Ƃ��ł��܂��B

�L���X�g

�@bpftrace�v���O�����ł́A�����l���\���̂ւ̃|�C���^�փL���X�g�”\�ł��B

$a = (struct file*)$value;

�@�܂��A�����l�̃L���X�g���”\�ł��B

$a = (uint16)$value;

�@�����^�Ƃ��ė��p�ł���̂�int8�Aint16�Aint32�Aint64�Auint8�Auint16�Auint32�Auint64�ł��B

�@����ȊO�̌^�ւ̃L���X�g�̓T�|�[�g����Ă��܂���B

�|�C���^���Z

�@bpftrace�ɂ�C����I�ȃ|�C���^���Z�̊T�O�͂���܂���B�|�C���^�l�͂����̐����l�Ƃ��Ĉ����܂��B�|�C���^���Z������ꍇ�́A�ȉ��̂悤�Ƀ|�C���^�T�C�Y�������I�t�Z�b�g����Z����K�v������܂��B

$a = $ptr+$index*8;

profile��interval�̈Ⴂ

�@profile��interval�͋���perf��software event�ł���CPU�𗘗p���܂����Aprofile���S��CPU�ɑ΂��ăC�x���g��L���ɂ������ŁAinterval��CPU0�ɑ΂��Ă̂݃C�x���g��L�������܂��B

BEGIN�^END�C�x���g�����̃^�C�~���O

�@bpftrace�ł͈ȉ��̂悤�ȗ���ŏ������i�݂܂��B

0.bpftrace�v���O�����̃R���p�C��
1.BEGIN�v���[�u�̎��s
2.BPF�v���O�����̃A�^�b�`
3.�����̊J�n�B�mCtrl�n�{�mC�n�L�[��uexit()�v�ŏI��
4.END�v���[�u�̎��s
5.perf buffer�����i�c�����񓯊��֐��̎��s�j
6.BPF�v���O�����̃f�^�b�`
7.�}�b�v�̒l�̏o��

�O������̃}�b�v�̑���

�@���ݎ��s����bpftrace�v���O���������p���Ă���}�b�v�𑀍삵�������Ƃ�����܂��Bbpftool�𗘗p����ƃR�}���h���C������}�b�v���e�̊m�F��X�V���ł��܂��B

�@�Ȃ��Abpftrace�v���O��������Abpftrace���s�ȑO���瑶�݂���}�b�v���Q�Ƃ�����@�́A���݂͑��݂��܂���Bbpftrace�����p����}�b�v��bpftrace�v���O�����R���p�C�����ɍ쐬����Abpftrace�I�����ɍ폜����܂��B

���̑�

�@�O�q�̒ʂ�Abpftrace�͌��݃o�[�W����1.0�Ɍ����Ċ����ɊJ�����ł��B�����o�O�̂悤�ȋ����ɑ��������ꍇ�A�ŐV�ł������Ă݂�Ƃ��ꂪ�C������Ă���”\��������܂��B�ŐV�łł��o�O�����݂��Ă���ꍇ�́A����GitHub��issue�ɕ񍐂��Ă݂Ă��������B

����́ABTF��p�����g���[�V���O��@�ɂ‚���

�@�����BPF��p������\�I�ȃg���[�V���O�c�[���ł���bpftrace�̎g�����ƁA���̎d�g�݂ɂ‚��Đ������܂����B����́ABPF�ɂ��g���[�V���O���x�����邽�߂ɓ������ꂽ�V�@�\BTF�ƁA���̉��p����Љ�܂��B

�M�ҏЉ�

���]�� ��j�i�݂��� �܂��̂�j

������w ��w�@ ��񗝍H�w�n������ ���m�ے�

�I�y���[�e�B���O�V�X�e���≼�z���Z�p�̌����ɏ]���B


Copyright © ITmedia, Inc. All Rights Reserved.

'; if( !this.isSubscription ) { this.insertTarget = document.querySelector('#cmsBody .subscription') || document.querySelector('#cmsBody .inner'); } }; BodyAdIMSWithCCE.prototype = Object.create(BodyAdContent.prototype); BodyAdIMSWithCCE.prototype.activate = function () { refreshGam('InArtSpecialLink'); } // global reference window.itm = itm; //entry point BodyAdEventBase.polyfill(); const bodyAdManager = BodyAdManager.getInstance(); bodyAdManager.addEventListener(BodyAdManager.EVENTS.READY, function (ev) { bodyAdManager.loadAdvertise(); }); bodyAdManager.init(); })();
�X�|���T�[����̂��m�点PR

���ڂ̃e�[�}

Microsoft  WindowsőO2025
AI for GWjAO
[R[h^m[R[h Zg by IT - ITGWjArWlX̒SŊ􂷂gD
Cloud Native Central by IT - XP[uȔ\͂gD
�V�X�e���J���m�E�n�E �y�����i�r�zPR
���Ȃ��ɂ������߂̋L��PR

RSS�ɂ‚���

�A�C�e�B���f�B�AID�ɂ‚���

���[���}�K�W���o�^

��IT�̃��[���}�K�W���́A �������A���ׂĖ����ł��B���Ѓ��[���}�K�W�������w�ǂ��������B