BCC - Linux パフォーマンス監視、ネットワーキングなどのための動的トレース ツール
BCC (BPF Compiler Collection) は、リソース豊富なカーネル トレースおよび操作プログラムを作成するための、適切なツールとサンプル ファイルの強力なセットです。これは、Linux 3.15 の新機能の 1 つである拡張 BPF (Berkeley Packet Filters) を利用します。これは当初 eBPF として知られていました。強い>。
実際には、BCC で使用されるコンポーネントのほとんどはLinux 4.1 以降を必要とし、その注目すべき機能には次のようなものがあります。
- すべてのツールはカーネルに組み込まれている BPF に基づいて動作し、BCC は Linux 4.x シリーズで追加された機能を使用するため、サードパーティのカーネル モジュールは必要ありません。
- ソフトウェア実行の監視を可能にします。
- サンプル ファイルとマニュアル ページを備えたいくつかのパフォーマンス分析ツールで構成されます。
推奨読書: Linux のパフォーマンスを監視する 20 のコマンド ライン ツール
上級 Linux ユーザーに最適な BCC を使用すると、C のカーネル インストルメンテーションと のフロントエンドを使用して BPF プログラムを簡単に作成できます。パイソンとルアです。さらに、パフォーマンス分析、監視、ネットワーク トラフィック制御などの複数のタスクをサポートします。
Linux システムに BCC をインストールする方法
BCC は Linux カーネル バージョン 4.1 以降で追加された機能を使用することに注意してください。また、要件として、カーネルは以下のフラグを設定してコンパイルされている必要があります。
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
[optional, for tc filters]
CONFIG_NET_CLS_BPF=m
[optional, for tc actions]
CONFIG_NET_ACT_BPF=m
CONFIG_BPF_JIT=y
CONFIG_HAVE_BPF_JIT=y
[optional, for kprobes]
CONFIG_BPF_EVENTS=y
カーネル フラグを確認するには、ファイル /proc/config.gz を表示するか、次の例のようにコマンドを実行します。
tecmint@TecMint ~ $ grep CONFIG_BPF= /boot/config-`uname -r`
CONFIG_BPF=y
tecmint@TecMint ~ $ grep CONFIG_BPF_SYSCALL= /boot/config-`uname -r`
CONFIG_BPF_SYSCALL=y
tecmint@TecMint ~ $ grep CONFIG_NET_CLS_BPF= /boot/config-`uname -r`
CONFIG_NET_CLS_BPF=m
tecmint@TecMint ~ $ grep CONFIG_NET_ACT_BPF= /boot/config-`uname -r`
CONFIG_NET_ACT_BPF=m
tecmint@TecMint ~ $ grep CONFIG_BPF_JIT= /boot/config-`uname -r`
CONFIG_BPF_JIT=y
tecmint@TecMint ~ $ grep CONFIG_HAVE_BPF_JIT= /boot/config-`uname -r`
CONFIG_HAVE_BPF_JIT=y
tecmint@TecMint ~ $ grep CONFIG_BPF_EVENTS= /boot/config-`uname -r`
CONFIG_BPF_EVENTS=y
カーネル フラグを確認したら、Linux システムにBCC ツールをインストールします。
Ubuntu 16.04 の場合
Ubuntu 16.04 用にナイトリー パッケージのみが作成されますが、インストール手順は非常に簡単です。カーネルをアップグレードしたり、ソースからコンパイルしたりする必要はありません。
echo "deb [trusted=yes] https://repo.iovisor.org/apt/xenial xenial-nightly main" | sudo tee /etc/apt/sources.list.d/iovisor.list
sudo apt-get update
sudo apt-get install bcc-tools
Ubuntu 14.04 の場合
まず、4.3 以降の Linux カーネルを http://kernel.ubuntu.com/~kernel-ppa/mainline からインストールします。
例として、以下の内容の小さなシェル スクリプト「bcc-install.sh」を作成します。
注: PREFIX値を最新の日付に更新し、提供されたPREFIX URL内のファイルも参照してください。実際のREL 値を取得し、シェル スクリプトに置き換えます。
#!/bin/bash
VER=4.5.1-040501
PREFIX=http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.5.1-wily/
REL=201604121331
wget ${PREFIX}/linux-headers-${VER}-generic_${VER}.${REL}_amd64.deb
wget ${PREFIX}/linux-headers-${VER}_${VER}.${REL}_all.deb
wget ${PREFIX}/linux-image-${VER}-generic_${VER}.${REL}_amd64.deb
sudo dpkg -i linux-*${VER}.${REL}*.deb
ファイルを保存して終了します。これを実行可能にしてから、次のように実行します。
chmod +x bcc-install.sh
sh bcc-install.sh
その後、システムを再起動します。
reboot
次に、以下のコマンドを実行して、署名付き BCC パッケージをインストールします。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys D4284CDD
echo "deb https://repo.iovisor.org/apt trusty main" | sudo tee /etc/apt/sources.list.d/iovisor.list
sudo apt-get update
sudo apt-get install binutils bcc bcc-tools libbcc-examples python-bcc
Fedora 24-23 について
システムのバージョンが必要なバージョンより低い場合は、http://alt.fedoraproject.org/pub/alt/rawhide-kernel-nodebug から4.2 以降のカーネルをインストールします。以下はその方法の例です。
sudo dnf config-manager --add-repo=http://alt.fedoraproject.org/pub/alt/rawhide-kernel-nodebug/fedora-rawhide-kernel-nodebug.repo
sudo dnf update
reboot
その後、BBC ツール リポジトリを追加し、システムを更新し、次の一連のコマンドを実行してツールをインストールします。
echo -e '[iovisor]\nbaseurl=https://repo.iovisor.org/yum/nightly/f23/$basearch\nenabled=1\ngpgcheck=0' | sudo tee /etc/yum.repos.d/iovisor.repo
sudo dnf update
sudo dnf install bcc-tools
Arch Linux 上 – AUR
まずカーネルを少なくともバージョン 4.3.1-1 にアップグレードし、その後、pacaur や yaourt< などの Arch パッケージ マネージャーを使用して以下のパッケージをインストールする必要があります。、カワなど。
bcc bcc-tools python-bcc python2-bcc
Linux システムで BCC ツールを使用する方法
すべてのBCC ツールは、/usr/share/bcc/tools
ディレクトリにインストールされます。ただし、.py
拡張子で終わる /tools
の下の BCC Github リポジトリから実行することもできます。
$ ls /usr/share/bcc/tools
argdist capable filetop offwaketime stackcount vfscount
bashreadline cpudist funccount old stacksnoop vfsstat
biolatency dcsnoop funclatency oomkill statsnoop wakeuptime
biosnoop dcstat gethostlatency opensnoop syncsnoop xfsdist
biotop doc hardirqs pidpersec tcpaccept xfsslower
bitesize execsnoop killsnoop profile tcpconnect zfsdist
btrfsdist ext4dist mdflush runqlat tcpconnlat zfsslower
btrfsslower ext4slower memleak softirqs tcpretrans
cachestat filelife mysqld_qslower solisten tplist
cachetop fileslower offcputime sslsniff trace
一般的な Linux システムのパフォーマンスとネットワークの監視で、いくつかの例を取り上げます。
open() システムコールをトレースする
まず、opensnoop を使用してすべての open()
システムコールをトレースしましょう。これにより、データ ファイル、構成ファイルなどを識別することで、さまざまなアプリケーションがどのように動作するかを知ることができます。
$ cd /usr/share/bcc/tools
$ sudo ./opensnoop
PID COMM FD ERR PATH
1 systemd 35 0 /proc/self/mountinfo
2797 udisksd 13 0 /proc/self/mountinfo
1 systemd 35 0 /sys/devices/pci0000:00/0000:00:0d.0/ata3/host2/target2:0:0/2:0:0:0/block/sda/sda1/uevent
1 systemd 35 0 /run/udev/data/b8:1
1 systemd -1 2 /etc/systemd/system/sys-kernel-debug-tracing.mount
1 systemd -1 2 /run/systemd/system/sys-kernel-debug-tracing.mount
1 systemd -1 2 /run/systemd/generator/sys-kernel-debug-tracing.mount
1 systemd -1 2 /usr/local/lib/systemd/system/sys-kernel-debug-tracing.mount
2247 systemd 15 0 /proc/self/mountinfo
1 systemd -1 2 /lib/systemd/system/sys-kernel-debug-tracing.mount
1 systemd -1 2 /usr/lib/systemd/system/sys-kernel-debug-tracing.mount
1 systemd -1 2 /run/systemd/generator.late/sys-kernel-debug-tracing.mount
1 systemd -1 2 /etc/systemd/system/sys-kernel-debug-tracing.mount.wants
1 systemd -1 2 /etc/systemd/system/sys-kernel-debug-tracing.mount.requires
1 systemd -1 2 /run/systemd/system/sys-kernel-debug-tracing.mount.wants
1 systemd -1 2 /run/systemd/system/sys-kernel-debug-tracing.mount.requires
1 systemd -1 2 /run/systemd/generator/sys-kernel-debug-tracing.mount.wants
1 systemd -1 2 /run/systemd/generator/sys-kernel-debug-tracing.mount.requires
1 systemd -1 2 /usr/local/lib/systemd/system/sys-kernel-debug-tracing.mount.wants
1 systemd -1 2 /usr/local/lib/systemd/system/sys-kernel-debug-tracing.mount.requires
1 systemd -1 2 /lib/systemd/system/sys-kernel-debug-tracing.mount.wants
1 systemd -1 2 /lib/systemd/system/sys-kernel-debug-tracing.mount.requires
1 systemd -1 2 /usr/lib/systemd/system/sys-kernel-debug-tracing.mount.wants
1 systemd -1 2 /usr/lib/systemd/system/sys-kernel-debug-tracing.mount.requires
1 systemd -1 2 /run/systemd/generator.late/sys-kernel-debug-tracing.mount.wants
1 systemd -1 2 /run/systemd/generator.late/sys-kernel-debug-tracing.mount.requires
1 systemd -1 2 /etc/systemd/system/sys-kernel-debug-tracing.mount.d
1 systemd -1 2 /run/systemd/system/sys-kernel-debug-tracing.mount.d
1 systemd -1 2 /run/systemd/generator/sys-kernel-debug-tracing.mount.d
....
ブロックデバイスの I/O レイテンシーの要約
この例では、バイオレイテンシを使用したディスク I/O レイテンシの分布の概要を示します。コマンドを実行した後、数分間待ってからCtrl-C を押してコマンドを終了し、出力を確認します。
$ sudo ./biolatecncy
Tracing block device I/O... Hit Ctrl-C to end.
^C
usecs : 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 : 3 |****************************************|
256 -> 511 : 3 |****************************************|
512 -> 1023 : 1 |************* |
exec() システムコールによる新しいプロセスのトレース
このセクションでは、execsnoop ツールを使用して実行中の新しいプロセスをトレースすることに移ります。 fork()
および exec()
システムコールによってプロセスがフォークされるたびに、それが出力に表示されます。ただし、すべてのプロセスがキャプチャされるわけではありません。
$ sudo ./execsnoop
PCOMM PID PPID RET ARGS
gnome-screensho 14882 14881 0 /usr/bin/gnome-screenshot --gapplication-service
systemd-hostnam 14892 1 0 /lib/systemd/systemd-hostnamed
nautilus 14897 2767 -2 /home/tecmint/bin/net usershare info
nautilus 14897 2767 -2 /home/tecmint/.local/bin/net usershare info
nautilus 14897 2767 -2 /usr/local/sbin/net usershare info
nautilus 14897 2767 -2 /usr/local/bin/net usershare info
nautilus 14897 2767 -2 /usr/sbin/net usershare info
nautilus 14897 2767 -2 /usr/bin/net usershare info
nautilus 14897 2767 -2 /sbin/net usershare info
nautilus 14897 2767 -2 /bin/net usershare info
nautilus 14897 2767 -2 /usr/games/net usershare info
nautilus 14897 2767 -2 /usr/local/games/net usershare info
nautilus 14897 2767 -2 /snap/bin/net usershare info
compiz 14899 14898 -2 /home/tecmint/bin/libreoffice --calc
compiz 14899 14898 -2 /home/tecmint/.local/bin/libreoffice --calc
compiz 14899 14898 -2 /usr/local/sbin/libreoffice --calc
compiz 14899 14898 -2 /usr/local/bin/libreoffice --calc
compiz 14899 14898 -2 /usr/sbin/libreoffice --calc
libreoffice 14899 2252 0 /usr/bin/libreoffice --calc
dirname 14902 14899 0 /usr/bin/dirname /usr/bin/libreoffice
basename 14903 14899 0 /usr/bin/basename /usr/bin/libreoffice
...
遅い ext4 操作をトレースする
ext4slower を使用して、10 ミリ秒より遅い ext4 ファイル システムの一般的な操作をトレースし、ファイル経由で遅いディスク I/O を個別に特定できるようにします。システム。
推奨読書: 13 の Linux パフォーマンス監視ツール
しきい値を超える操作のみを出力します。
$ sudo ./execslower
Tracing ext4 operations slower than 10 ms
TIME COMM PID T BYTES OFF_KB LAT(ms) FILENAME
11:59:13 upstart 2252 W 48 1 10.76 dbus.log
11:59:13 gnome-screensh 14993 R 144 0 10.96 settings.ini
11:59:13 gnome-screensh 14993 R 28 0 16.02 gtk.css
11:59:13 gnome-screensh 14993 R 3389 0 18.32 gtk-main.css
11:59:25 rs:main Q:Reg 1826 W 156 60 31.85 syslog
11:59:25 pool 15002 R 208 0 14.98 .xsession-errors
11:59:25 pool 15002 R 644 0 12.28 .ICEauthority
11:59:25 pool 15002 R 220 0 13.38 .bash_logout
11:59:27 dconf-service 2599 S 0 0 22.75 user.BHDKOY
11:59:33 compiz 2548 R 4096 0 19.03 firefox.desktop
11:59:34 compiz 15008 R 128 0 27.52 firefox.sh
11:59:34 firefox 15008 R 128 0 36.48 firefox
11:59:34 zeitgeist-daem 2988 S 0 0 62.23 activity.sqlite-wal
11:59:34 zeitgeist-fts 2996 R 8192 40 15.67 postlist.DB
11:59:34 firefox 15008 R 140 0 18.05 dependentlibs.list
11:59:34 zeitgeist-fts 2996 S 0 0 25.96 position.tmp
11:59:34 firefox 15008 R 4096 0 10.67 libplc4.so
11:59:34 zeitgeist-fts 2996 S 0 0 11.29 termlist.tmp
...
PID とレイテンシを使用してブロック デバイス I/O をトレースする
次に、biosnoop を使用して、プロセス ID、セクター、バイト、レイテンシーなどの詳細を含むディスク I/O ごとに 1 秒ごとに 1 行を出力してみましょう。
$ sudo ./biosnoop
TIME(s) COMM PID DISK T SECTOR BYTES LAT(ms)
0.000000000 ? 0 R -1 8 0.26
2.047897000 ? 0 R -1 8 0.21
3.280028000 kworker/u4:0 14871 sda W 30552896 4096 0.24
3.280271000 jbd2/sda1-8 545 sda W 29757720 12288 0.40
3.298318000 jbd2/sda1-8 545 sda W 29757744 4096 0.14
4.096084000 ? 0 R -1 8 0.27
6.143977000 ? 0 R -1 8 0.27
8.192006000 ? 0 R -1 8 0.26
8.303938000 kworker/u4:2 15084 sda W 12586584 4096 0.14
8.303965000 kworker/u4:2 15084 sda W 25174736 4096 0.14
10.239961000 ? 0 R -1 8 0.26
12.292057000 ? 0 R -1 8 0.20
14.335990000 ? 0 R -1 8 0.26
16.383798000 ? 0 R -1 8 0.17
...
トレースページキャッシュのヒット/ミス率
その後、cachestat の使用に進み、システム キャッシュから毎秒 1 行の要約統計情報を表示します。これにより、低いキャッシュ ヒット率と高いミス率を指摘することにより、システム チューニング操作が可能になります。
$ sudo ./cachestat
HITS MISSES DIRTIES READ_HIT% WRITE_HIT% BUFFERS_MB CACHED_MB
0 0 0 0.0% 0.0% 19 544
4 4 2 25.0% 25.0% 19 544
1321 33 4 97.3% 2.3% 19 545
7476 0 2 100.0% 0.0% 19 545
6228 15 2 99.7% 0.2% 19 545
0 0 0 0.0% 0.0% 19 545
7391 253 108 95.3% 2.7% 19 545
33608 5382 28 86.1% 13.8% 19 567
25098 37 36 99.7% 0.0% 19 566
17624 239 416 96.3% 0.5% 19 520
...
TCPアクティブ接続のトレース
tcpconnect を使用して TCP 接続を毎秒監視します。その出力には、送信元アドレスと宛先アドレス、およびポート番号が含まれます。このツールは予期しない TCP 接続を追跡するのに役立ち、それによってアプリケーション構成の非効率性や攻撃者を特定するのに役立ちます。
$ sudo ./tcpconnect
PID COMM IP SADDR DADDR DPORT
15272 Socket Threa 4 10.0.2.15 91.189.89.240 80
15272 Socket Threa 4 10.0.2.15 216.58.199.142 443
15272 Socket Threa 4 10.0.2.15 216.58.199.142 80
15272 Socket Threa 4 10.0.2.15 216.58.199.174 443
15272 Socket Threa 4 10.0.2.15 54.200.62.216 443
15272 Socket Threa 4 10.0.2.15 54.200.62.216 443
15272 Socket Threa 4 10.0.2.15 117.18.237.29 80
15272 Socket Threa 4 10.0.2.15 216.58.199.142 80
15272 Socket Threa 4 10.0.2.15 216.58.199.131 80
15272 Socket Threa 4 10.0.2.15 216.58.199.131 443
15272 Socket Threa 4 10.0.2.15 52.222.135.52 443
15272 Socket Threa 4 10.0.2.15 216.58.199.131 443
15272 Socket Threa 4 10.0.2.15 54.200.62.216 443
15272 Socket Threa 4 10.0.2.15 54.200.62.216 443
15272 Socket Threa 4 10.0.2.15 216.58.199.132 443
15272 Socket Threa 4 10.0.2.15 216.58.199.131 443
15272 Socket Threa 4 10.0.2.15 216.58.199.142 443
15272 Socket Threa 4 10.0.2.15 54.69.17.198 443
15272 Socket Threa 4 10.0.2.15 54.69.17.198 443
...
上記のすべてのツールは、さまざまなオプションとともに使用することもできます。特定のツールのヘルプ ページを有効にするには、-h
オプションを使用します。次に例を示します。
$ sudo ./tcpconnect -h
usage: tcpconnect [-h] [-t] [-p PID] [-P PORT]
Trace TCP connects
optional arguments:
-h, --help show this help message and exit
-t, --timestamp include timestamp on output
-p PID, --pid PID trace this PID only
-P PORT, --port PORT comma-separated list of destination ports to trace.
examples:
./tcpconnect # trace all TCP connect()s
./tcpconnect -t # include timestamps
./tcpconnect -p 181 # only trace PID 181
./tcpconnect -P 80 # only trace port 80
./tcpconnect -P 80,81 # only trace port 80 and 81
失敗した exec() システムコールのトレース
失敗した exec() の syscall をトレースするには、以下のように opensnoop で -x
オプションを使用します。
$ sudo ./opensnoop -x
PID COMM FD ERR PATH
15414 pool -1 2 /home/.hidden
15415 (ostnamed) -1 2 /sys/fs/cgroup/cpu/system.slice/systemd-hostnamed.service/cgroup.procs
15415 (ostnamed) -1 2 /sys/fs/cgroup/cpu/system.slice/cgroup.procs
15415 (ostnamed) -1 2 /sys/fs/cgroup/cpuacct/system.slice/systemd-hostnamed.service/cgroup.procs
15415 (ostnamed) -1 2 /sys/fs/cgroup/cpuacct/system.slice/cgroup.procs
15415 (ostnamed) -1 2 /sys/fs/cgroup/blkio/system.slice/systemd-hostnamed.service/cgroup.procs
15415 (ostnamed) -1 2 /sys/fs/cgroup/blkio/system.slice/cgroup.procs
15415 (ostnamed) -1 2 /sys/fs/cgroup/memory/system.slice/systemd-hostnamed.service/cgroup.procs
15415 (ostnamed) -1 2 /sys/fs/cgroup/memory/system.slice/cgroup.procs
15415 (ostnamed) -1 2 /sys/fs/cgroup/pids/system.slice/systemd-hostnamed.service/cgroup.procs
2548 compiz -1 2
15416 systemd-cgroups -1 2 /run/systemd/container
15416 systemd-cgroups -1 2 /sys/fs/kdbus/0-system/bus
15415 systemd-hostnam -1 2 /run/systemd/container
15415 systemd-hostnam -1 13 /proc/1/environ
15415 systemd-hostnam -1 2 /sys/fs/kdbus/0-system/bus
1695 dbus-daemon -1 2 /run/systemd/users/0
15415 systemd-hostnam -1 2 /etc/machine-info
15414 pool -1 2 /home/tecmint/.hidden
15414 pool -1 2 /home/tecmint/Binary/.hidden
2599 dconf-service -1 2 /run/user/1000/dconf/user
...
特定のプロセス関数をトレースする
以下の最後の例は、カスタム トレース操作を実行する方法を示しています。 PID を使用して特定のプロセスをトレースしています。
推奨読書: Netdata – Linux 用のリアルタイム パフォーマンス監視ツール
まずプロセス ID を決定します。
$ pidof firefox
15437
後で、 カスタムトレース コマンドを実行します。以下のコマンドでは、 -p
はプロセス ID を指定し、do_sys_open()
は 2 番目の引数を文字列として含めて動的にトレースされるカーネル関数です。
$ sudo ./trace -p 4095 'do_sys_open "%s", arg2'
TIME PID COMM FUNC -
12:17:14 15437 firefox do_sys_open /run/user/1000/dconf/user
12:17:14 15437 firefox do_sys_open /home/tecmint/.config/dconf/user
12:18:07 15437 firefox do_sys_open /run/user/1000/dconf/user
12:18:07 15437 firefox do_sys_open /home/tecmint/.config/dconf/user
12:18:13 15437 firefox do_sys_open /sys/devices/system/cpu/present
12:18:13 15437 firefox do_sys_open /dev/urandom
12:18:13 15437 firefox do_sys_open /dev/urandom
12:18:14 15437 firefox do_sys_open /usr/share/fonts/truetype/liberation/LiberationSans-Italic.ttf
12:18:14 15437 firefox do_sys_open /usr/share/fonts/truetype/liberation/LiberationSans-Italic.ttf
12:18:14 15437 firefox do_sys_open /usr/share/fonts/truetype/liberation/LiberationSans-Italic.ttf
12:18:14 15437 firefox do_sys_open /sys/devices/system/cpu/present
12:18:14 15437 firefox do_sys_open /dev/urandom
12:18:14 15437 firefox do_sys_open /dev/urandom
12:18:14 15437 firefox do_sys_open /dev/urandom
12:18:14 15437 firefox do_sys_open /dev/urandom
12:18:15 15437 firefox do_sys_open /sys/devices/system/cpu/present
12:18:15 15437 firefox do_sys_open /dev/urandom
12:18:15 15437 firefox do_sys_open /dev/urandom
12:18:15 15437 firefox do_sys_open /sys/devices/system/cpu/present
12:18:15 15437 firefox do_sys_open /dev/urandom
12:18:15 15437 firefox do_sys_open /dev/urandom
....
まとめ
BCC は、システム パフォーマンス監視のトレース、ブロック デバイス I/O のトレース、TCP 関数、ファイル システム操作、syscall、Node.js プローブなどのさまざまなシステム管理タスク用の強力で使いやすいツールキットです。 、その他にもたくさんあります。重要なのは、ガイドとなるツールのサンプル ファイルとマニュアル ページがいくつか同梱されており、ユーザー フレンドリーで信頼性が高いことです。
最後になりましたが、以下のコメント セクションを通じて、この主題に関するご意見を共有したり、質問したり、有益な提案や建設的なフィードバックを行ったりして、ご連絡いただけます。
詳細と使用法については、https://iovisor.github.io/bcc/ をご覧ください。