CLOVER🍀

That was when it all began.

Rocky Linux 9.4でBPF Compiler Collection(BCC)のtcptopを使って転送状況を確認をしてみる

これは、なにをしたくて書いたもの?

前に、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や、PythonLuaをフロントエンドにしたBPFプログラムの作成が容易になるそうです。

確認時点のRocky Linux 9.4で使えるBCCのバージョンは0.28.0です。

インストールおよびリファレンスガイド。

トレースやネットワークに関するツールやスクリプトがあるようです。

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自体は知っておくと便利そうなので、どこかで勉強したいですね。