これは、なにをしたくて書いたもの?
前に、iftopを使ってネットワークの転送状況を確認してみました。
Ubuntu Linux 22.04 LTSでネットワークの転送状況を確認したい(iftop、tcpdump) - CLOVER🍀
今回はBCCに含まれるtcptopを使ってみたいと思います。
BPF Compiler Collection(BCC)
BPF Compiler Collection(略してBCC)は、効率的にカーネルをトレースおよび操作できるツールキットです。
GitHub - iovisor/bcc: BCC - Tools for BPF-based Linux IO analysis, networking, monitoring, and more
Linux 3.15で追加された拡張Berkeley Packet Filters(eBPF)を使っており、BCCが使う多くの機能はLinux 4.1以降が必要になります。
これはREADME.md
の記述そのままですが、ここでいう「Linux」はカーネルのことですね。
BCCを使うと、Cのカーネルinstrumentationや、PythonとLuaをフロントエンドにしたBPFプログラムの作成が容易になるそうです。
確認時点のRocky Linux 9.4で使えるBCCのバージョンは0.28.0です。
インストールおよびリファレンスガイド。
- https://github.com/iovisor/bcc/blob/v0.28.0/INSTALL.md
- https://github.com/iovisor/bcc/blob/v0.28.0/docs/reference_guide.md
トレースやネットワークに関するツールやスクリプトがあるようです。
BPF Compiler Collection(0.28.0) / Contents
これが現時点で最新版の0.30.0になると、トレーシング、メモリーおよびプロセス、パフォーマンス計測、CPUおよびスケジューラー、
ネットワークおよびソケット、ストレージおよびファイルシステムと大量に増えます。
BPF Compiler Collection(0.30.0) / Contents
ちょっと押さえておいた方がよさそうですね。
今回はこの中でtcptopを使ってみます。使用するOSは、Rocky Linux 9.4です。
Ubuntu Linuxは?
ふだんなら自分はこういうツールをUbuntu Linuxで確認するのですが、今回はダメでした。
Ubuntu Linuxにインストールする場合、Ubuntu Linuxの標準リポジトリーもしくはPPAからインストールすることになっています。
Installing BCC / Packages / Ubuntu - Binary
前者は古すぎて動作せず、後者はUbuntu Linux 22.04 LTS(jammy)に対応するパッケージがありませんでした…。
現状だとソースコードからビルドする方法しかないので、今回は諦めました。
Ubuntu package builds are out of date · Issue #2678 · iovisor/bcc · GitHub
環境
今回の環境はこちら。Rocky Linux 9.4です。
$ cat /etc/redhat-release Rocky Linux release 9.4 (Blue Onyx) $ uname -srvmpio Linux 5.14.0-427.20.1.el9_4.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Jun 7 14:51:39 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
BCCをインストールする
それでは、BCCをインストールしましょう。
bcc-toolsパッケージでインストールします。
Installing BCC / Packages / RHEL - Binary
まずはパッケージの情報を確認。
$ dnf info bcc-tools メタデータの期限切れの最終確認: 0:00:05 前の 2024年06月13日 23時15分58秒 に実施しました。 利用可能なパッケージ 名前 : bcc-tools バージョン : 0.28.0 リリース : 5.el9 Arch : x86_64 サイズ : 467 k ソース : bcc-0.28.0-5.el9.src.rpm リポジトリー : appstream 概要 : Command line tools for BPF Compiler Collection (BCC) URL : https://github.com/iovisor/bcc ライセンス : ASL 2.0 説明 : Command line tools for BPF Compiler Collection (BCC)
インストール。
$ sudo dnf install bcc-tools
どのようなファイルがインストールされたのか確認してみます。
$ rpm -ql bcc-tools /usr/lib/.build-id /usr/lib/.build-id/5e /usr/lib/.build-id/5e/533180bf4af0349b742b1bd8328b6455e33643 /usr/share/bcc /usr/share/bcc/introspection /usr/share/bcc/introspection/bps /usr/share/bcc/tools /usr/share/bcc/tools/argdist /usr/share/bcc/tools/bashreadline /usr/share/bcc/tools/bindsnoop /usr/share/bcc/tools/biolatency /usr/share/bcc/tools/biolatpcts /usr/share/bcc/tools/biopattern /usr/share/bcc/tools/biosnoop /usr/share/bcc/tools/biotop /usr/share/bcc/tools/bitesize /usr/share/bcc/tools/bpflist /usr/share/bcc/tools/cachestat /usr/share/bcc/tools/cachetop /usr/share/bcc/tools/capable /usr/share/bcc/tools/cobjnew /usr/share/bcc/tools/compactsnoop /usr/share/bcc/tools/cpudist /usr/share/bcc/tools/cpuunclaimed /usr/share/bcc/tools/dbslower /usr/share/bcc/tools/dbstat /usr/share/bcc/tools/dcsnoop /usr/share/bcc/tools/dcstat /usr/share/bcc/tools/deadlock /usr/share/bcc/tools/deadlock.c /usr/share/bcc/tools/dirtop /usr/share/bcc/tools/doc /usr/share/bcc/tools/doc/argdist_example.txt /usr/share/bcc/tools/doc/bashreadline_example.txt /usr/share/bcc/tools/doc/bindsnoop_example.txt /usr/share/bcc/tools/doc/biolatency_example.txt /usr/share/bcc/tools/doc/biolatpcts_example.txt 〜省略〜 /usr/share/bcc/tools/doc/vfsstat_example.txt /usr/share/bcc/tools/doc/virtiostat_example.txt /usr/share/bcc/tools/doc/wakeuptime_example.txt /usr/share/bcc/tools/doc/xfsdist_example.txt /usr/share/bcc/tools/doc/xfsslower_example.txt /usr/share/bcc/tools/drsnoop /usr/share/bcc/tools/execsnoop /usr/share/bcc/tools/exitsnoop /usr/share/bcc/tools/ext4dist /usr/share/bcc/tools/ext4slower /usr/share/bcc/tools/filegone /usr/share/bcc/tools/filelife /usr/share/bcc/tools/fileslower /usr/share/bcc/tools/filetop /usr/share/bcc/tools/funccount /usr/share/bcc/tools/funcinterval /usr/share/bcc/tools/funclatency /usr/share/bcc/tools/funcslower /usr/share/bcc/tools/gethostlatency /usr/share/bcc/tools/hardirqs /usr/share/bcc/tools/javacalls /usr/share/bcc/tools/javaflow /usr/share/bcc/tools/javagc /usr/share/bcc/tools/javaobjnew /usr/share/bcc/tools/javastat /usr/share/bcc/tools/javathreads /usr/share/bcc/tools/killsnoop /usr/share/bcc/tools/klockstat /usr/share/bcc/tools/kvmexit /usr/share/bcc/tools/lib /usr/share/bcc/tools/lib/ucalls /usr/share/bcc/tools/lib/uflow /usr/share/bcc/tools/lib/ugc /usr/share/bcc/tools/lib/uobjnew /usr/share/bcc/tools/lib/ustat /usr/share/bcc/tools/lib/uthreads /usr/share/bcc/tools/llcstat /usr/share/bcc/tools/mdflush /usr/share/bcc/tools/memleak /usr/share/bcc/tools/mountsnoop /usr/share/bcc/tools/mysqld_qslower /usr/share/bcc/tools/netqtop /usr/share/bcc/tools/netqtop.c /usr/share/bcc/tools/nfsdist /usr/share/bcc/tools/nfsslower /usr/share/bcc/tools/nodegc /usr/share/bcc/tools/nodestat /usr/share/bcc/tools/offcputime /usr/share/bcc/tools/offwaketime /usr/share/bcc/tools/oomkill /usr/share/bcc/tools/opensnoop /usr/share/bcc/tools/perlcalls /usr/share/bcc/tools/perlflow /usr/share/bcc/tools/perlstat /usr/share/bcc/tools/phpcalls /usr/share/bcc/tools/phpflow /usr/share/bcc/tools/phpstat /usr/share/bcc/tools/pidpersec /usr/share/bcc/tools/ppchcalls /usr/share/bcc/tools/profile /usr/share/bcc/tools/pythoncalls /usr/share/bcc/tools/pythonflow /usr/share/bcc/tools/pythongc /usr/share/bcc/tools/pythonstat /usr/share/bcc/tools/readahead /usr/share/bcc/tools/reset-trace /usr/share/bcc/tools/rubycalls /usr/share/bcc/tools/rubyflow /usr/share/bcc/tools/rubygc /usr/share/bcc/tools/rubyobjnew /usr/share/bcc/tools/rubystat /usr/share/bcc/tools/runqlat /usr/share/bcc/tools/runqlen /usr/share/bcc/tools/runqslower /usr/share/bcc/tools/shmsnoop /usr/share/bcc/tools/slabratetop /usr/share/bcc/tools/sofdsnoop /usr/share/bcc/tools/softirqs /usr/share/bcc/tools/solisten /usr/share/bcc/tools/sslsniff /usr/share/bcc/tools/stackcount /usr/share/bcc/tools/statsnoop /usr/share/bcc/tools/swapin /usr/share/bcc/tools/syncsnoop /usr/share/bcc/tools/syscount /usr/share/bcc/tools/tclcalls /usr/share/bcc/tools/tclflow /usr/share/bcc/tools/tclobjnew /usr/share/bcc/tools/tclstat /usr/share/bcc/tools/tcpaccept /usr/share/bcc/tools/tcpcong /usr/share/bcc/tools/tcpconnect /usr/share/bcc/tools/tcpconnlat /usr/share/bcc/tools/tcpdrop /usr/share/bcc/tools/tcplife /usr/share/bcc/tools/tcpretrans /usr/share/bcc/tools/tcprtt /usr/share/bcc/tools/tcpstates /usr/share/bcc/tools/tcpsubnet /usr/share/bcc/tools/tcpsynbl /usr/share/bcc/tools/tcptop /usr/share/bcc/tools/tcptracer /usr/share/bcc/tools/threadsnoop /usr/share/bcc/tools/tplist /usr/share/bcc/tools/trace /usr/share/bcc/tools/ttysnoop /usr/share/bcc/tools/vfscount /usr/share/bcc/tools/vfsstat /usr/share/bcc/tools/virtiostat /usr/share/bcc/tools/wakeuptime /usr/share/bcc/tools/xfsdist /usr/share/bcc/tools/xfsslower /usr/share/man/man8/bcc-argdist.8.gz /usr/share/man/man8/bcc-bashreadline.8.gz /usr/share/man/man8/bcc-bindsnoop.8.gz /usr/share/man/man8/bcc-biolatency.8.gz /usr/share/man/man8/bcc-biolatpcts.8.gz 〜省略〜 /usr/share/man/man8/bcc-vfsstat.8.gz /usr/share/man/man8/bcc-virtiostat.8.gz /usr/share/man/man8/bcc-wakeuptime.8.gz /usr/share/man/man8/bcc-xfsdist.8.gz /usr/share/man/man8/bcc-xfsslower.8.gz
/usr/share/bcc/tools
ディレクトリ内にいろいろありそうです。
それではtcptopを使ってみましょう。
ヘルプ。
$ /usr/share/bcc/tools/tcptop --help usage: tcptop [-h] [-C] [-S] [-p PID] [--cgroupmap CGROUPMAP] [--mntnsmap MNTNSMAP] [-4 | -6] [interval] [count] Summarize TCP send/recv throughput by host positional arguments: interval output interval, in seconds (default 1) count number of outputs optional arguments: -h, --help show this help message and exit -C, --noclear don't clear the screen -S, --nosummary skip system summary line -p PID, --pid PID trace this PID only --cgroupmap CGROUPMAP trace cgroups in this BPF map only --mntnsmap MNTNSMAP trace mount namespaces in this BPF map only -4, --ipv4 trace IPv4 family only -6, --ipv6 trace IPv6 family only examples: ./tcptop # trace TCP send/recv by host ./tcptop -C # don't clear the screen ./tcptop -p 181 # only trace PID 181 ./tcptop --cgroupmap mappath # only trace cgroups in this BPF map ./tcptop --mntnsmap mappath # only trace mount namespaces in the map ./tcptop -4 # trace IPv4 family only ./tcptop -6 # trace IPv6 family only
使ってみましょう。
今回もEclipseをダウンロードしてみます。
$ curl -L 'https://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/2024-03/R/eclipse-java-2024-03-R-linux-gtk-x86_64.tar.gz&mirror_id=1' -o eclipse-java-2024-03-R-linux-gtk-x86_64.tar.gz
この時にtcptopで確認。
$ sudo /usr/share/bcc/tools/tcptop
こんな感じで、通信状況がリアルタイムにモニタリングできます。
PIDを指定することで、指定したプロセスのみの通信状況を見ることもできます。
$ sudo /usr/share/bcc/tools/tcptop -p [pid]
あと、前のエントリーと同じように応答を返さないHTTPサーバーでも試してみましょう。
wait_httpd.py
from http.server import HTTPServer, BaseHTTPRequestHandler from time import sleep address = ("0.0.0.0", 8000) class WaitHTTPRequestHandler(BaseHTTPRequestHandler): def do_GET(self): sleep(60) self.send_response(200) self.end_headers() self.wfile.write(b"Wait HTTP Server") with HTTPServer(address, WaitHTTPRequestHandler) as server: server.serve_forever()
Pythonのバージョン確認およびHTTPサーバーの起動。このサーバーはIPアドレス192.168.0.6で動かすものとします。
$ python3 --version Python 3.10.12 $ python3 wait_httpd.py
curlでアクセスして
$ curl 192.168.0.6:8000
確認。
$ sudo /usr/share/bcc/tools/tcptop
するとcurlの接続が表示されません。
どうやら、接続自体はあってもデータの送受信がないとtcptopには現れないみたいですね。
切断時や先にtcptopを起動した後にcurlでアクセスすると、一瞬表示されたりします。
おわりに
BPF Compiler Collection(BCC)に含まれるtcptopを試してみました。
BCCを知らなかったので、こういうツール群があったことを知れてよかった反面、Ubuntu Linuxで使えなかったのはちょっと残念だったりします。
ただ、BCC自体は知っておくと便利そうなので、どこかで勉強したいですね。