probeとかカーネルに関しての知識が浅すぎてとても難しい2章だった
目次
bitesize
ブロックデバイスのI/Oサイズをヒストグラムとして要約する
要求されたブロックサイズのI/O分布をプロセス名毎に表示する
block I/Oトレースポイントをトレースしてヒストグラムを更新する(カーネル空間側)
ユーザ空間側に非同期的にヒストグラムをコピーするのでオーバーヘッドがこくわずかで済む
前回と同様にddで書き込みながら試す
フィールド
Kbytes | キロバイトの範囲 |
count | Kbytesの範囲に入ったI/Oの数 |
distribution | countの可視化 |
コマンドを実行したterminal ❯ dd if=/dev/zero of=./swapfile bs=1M count=2048 2048+0 records in 2048+0 records out 2147483648 bytes (2.1 GB, 2.0 GiB) copied, 3.24655 s, 661 MB/s
❯ sudo /usr/share/bcc/tools/bitesize Tracing block I/O... Hit Ctrl-C to end. ^C Process Name = kworker/3:1H Kbytes : count distribution 0 -> 1 : 0 | | 2 -> 3 : 0 | | 4 -> 7 : 0 | | 8 -> 15 : 0 | | 16 -> 31 : 0 | | 32 -> 63 : 0 | | 64 -> 127 : 0 | | 128 -> 255 : 0 | | 256 -> 511 : 0 | | 512 -> 1023 : 3 |****************************************| Process Name = ThreadPoolForeg Kbytes : count distribution 0 -> 1 : 0 | | 2 -> 3 : 0 | | 4 -> 7 : 0 | | 8 -> 15 : 0 | | 16 -> 31 : 1 |****************************************| Process Name = nautilus-deskto Kbytes : count distribution 0 -> 1 : 0 | | 2 -> 3 : 0 | | 4 -> 7 : 1 |****************************************| Process Name = kworker/u256:1 Kbytes : count distribution 0 -> 1 : 9 | | 2 -> 3 : 0 | | 4 -> 7 : 39 |* | 8 -> 15 : 9 | | 16 -> 31 : 5 | | 32 -> 63 : 5 | | 64 -> 127 : 2 | | 128 -> 255 : 0 | | 256 -> 511 : 1 | | 512 -> 1023 : 778 |*************************************** | 1024 -> 2047 : 781 |****************************************| Process Name = jbd2/sda1-8 Kbytes : count distribution 0 -> 1 : 0 | | 2 -> 3 : 0 | | 4 -> 7 : 4 |****************************************| 8 -> 15 : 0 | | 16 -> 31 : 0 | | 32 -> 63 : 2 |******************** | 64 -> 127 : 0 | | 128 -> 255 : 2 |******************** | 256 -> 511 : 0 | | 512 -> 1023 : 1 |********** |
bpftool perf list
システム内の全てのraw_tracepoint, tracepoint, kprobeを表示する
terminal 2 ❯ sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args->filename)); }'
terminal 1 ❯ sudo bpftool perf list -p [{ "pid": 20499, "fd": 9, "prog_id": 19, "fd_type": "tracepoint", "tracepoint": "sys_enter_openat" } ] ❯ sudo bpftool prog show -p [{ "id": 19, "type": "tracepoint", "name": "sys_enter_opena", "tag": "1a6248388c2bcac4", "gpl_compatible": true, "loaded_at": 1570254902, "uid": 0, "bytes_xlated": 560, "jited": true, "bytes_jited": 371, "bytes_memlock": 4096, "map_ids": [18] } ]
vfsstat
一般的なVFS呼び出しをトレースし、一秒ごとの要約を出力する
ワークロードの特性評価、および時間経過に伴うオペレーションのパターンを見るのに役立つ
ユーザ空間側に非同期的にコピーするのでオーバーヘッドは小さい
フィールド
READ/s | vfs_read()呼び出しの一秒あたりの平均数 |
WRITE/s | vfs_write()呼び出しの一秒あたりの平均数 |
CREATE/s | vfs_create()呼び出しの一秒あたりの平均数 |
OPEN/s | vfs_open()呼び出しの一秒あたりの平均数 |
FSYNC/s | vfs_fsync()呼び出しの一秒あたりの平均数 |
❯ sudo /usr/share/bcc/tools/vfsstat TIME READ/s WRITE/s CREATE/s OPEN/s FSYNC/s 10:32:21: 81 29 0 7 0 10:32:22: 70 30 0 5 0 10:32:23: 548 303 0 2045 0 10:32:24: 80 100 0 5 0 10:32:25: 30 29 0 6 0 10:32:26: 49 29 0 20 0 10:32:27: 29 28 0 5 0 10:32:28: 1000 339 0 526 0 10:32:29: 47 28 0 20 0 10:32:30: 29 28 0 5 0
gethostlatency
getaddrinfo()
,gethostbyname()
,gethostbyname2()
が呼び出されたときにトレースおよび出力する
フィールド
PID | 呼び出しを実行しているプロセスのID |
COMM | 呼び出しを実行しているプロセス(コマンド)名 |
LATms | latency |
HOST | ルックアップのターゲットであるホスト名 |
❯ sudo /usr/share/bcc/tools/gethostlatency TIME PID COMM LATms HOST 10:41:40 36378 DNS Resolver #1 19.90 detectportal.firefox.com 10:41:40 36387 DNS Resolver #2 0.84 detectportal.firefox.com 10:41:40 36378 DNS Resolver #1 16.87 mozilla.org 10:41:40 36388 DNS Resolver #3 19.86 mozilla.org 10:41:41 36387 DNS Resolver #2 34.27 push.services.mozilla.com 10:41:41 36378 DNS Resolver #1 0.57 push.services.mozilla.com 10:41:41 36388 DNS Resolver #3 0.69 push.services.mozilla.com 10:41:41 36387 DNS Resolver #2 33.96 tiles.services.mozilla.com 10:41:41 36388 DNS Resolver #3 19.09 content-signature-2.cdn.mozilla.net 10:41:41 36378 DNS Resolver #1 36.61 ocsp.digicert.com
tcplife
TCPセッションをトレースして寿命(lifespan)を要約する
ワークロードの特性評価とフローアカウンティングに役立つ
フィールド
PID | プロセスID |
COMM | 呼び出しを実行しているプロセス(コマンド)名 |
LADDR | ローカルIP |
LPORT | ローカルポート |
RADDR | リモートIP |
RPORT | リモートポート |
TX_KB | トータルの送信(キロバイト) |
RX_KB | トータルの受信(キロバイト) |
MS | セッションの寿命 |
❯ sudo /usr/share/bcc/tools/tcplife PID COMM LADDR LPORT RADDR RPORT TX_KB RX_KB MS 41633 curl 192.168.221.129 36010 172.217.161.36 443 0 16 146.34 42828 curl 192.168.221.129 46722 182.22.59.229 443 0 5 67.13
USDT probe
node.jsのライブラリがあるので試してみる
terminal 1 ~/workspace/usdt-example via ⬢ v10.15.3 took 11s ❯ node index.js Firing probe... Firing probe... Firing probe... Firing probe... Firing probe... Probe fired! Firing probe... Probe fired! Firing probe... Probe fired! Firing probe... Probe fired! Firing probe... Probe fired! Firing probe... Probe fired! Firing probe... Probe fired! Firing probe... Probe fired! Firing probe... Probe fired! Firing probe... Probe fired! Firing probe... Disable provider Firing probe... Disable provider Firing probe... Disable provider
terminal 2 ❯ sudo /usr/share/bcc/tools/trace -p $(pgrep node) 'u::firstProbe "%d - %s", arg1, arg2' PID TID COMM FUNC - 58156 58156 node firstProbe 9 - My little string 58156 58156 node firstProbe 8 - My little string 58156 58156 node firstProbe 7 - My little string 58156 58156 node firstProbe 6 - My little string 58156 58156 node firstProbe 5 - My little string 58156 58156 node firstProbe 4 - My little string 58156 58156 node firstProbe 3 - My little string 58156 58156 node firstProbe 2 - My little string 58156 58156 node firstProbe 1 - My little string 58156 58156 node firstProbe 0 - My little string