health-checkコマンドでプロセスを監視する

はじめに

Ubuntu Packagesにhealth-checkというパッケージがあり、これを使ってプロセスのリソース使用状況を監視することができる。
CPUの使用率、メモリ消費、ファイルI/O、ネットワーク接続など、様々な側面からプロセスを調査できるとのことなので試してみる。

環境

WSL2 (Ubuntu 24.04 LTS)
health-check 0.03.12-1

health-checkとは

health-checkはUbuntuのuniverseリポジトリで提供されているプロセス監視ツールである。
プロセスがシステムリソースをどのように使用しているかを詳細に分析することができる。

主な機能

health-checkが監視できる主な項目は以下の通り

  • CPU使用率
  • カーネルのウェイクアップイベント
  • ファイルI/O活動(open、read、write、closeなど)
  • システムコールの活動
  • poll、selectなどのタイムアウト待ちシステムコールの過剰なポーリング
  • メモリ使用状況(ヒープとスタックの成長など)
  • ネットワーク接続(不正なインターネット活動の発見)
  • ネットワーク使用量(送信/受信)の計測
  • fsync, fdatasync, syncfs, syncシステムコールによるデータ同期
  • ページフォールトの計測

これらの統計情報をJSON形式のファイルにエクスポートして、後で分析することも可能となっているようだ。

health-checkをインストールする

Ubuntu環境では、以下のコマンドでインストールできる

sudo apt install health-check
ログ
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
  crack-common libdouble-conversion3 libgl1-amber-dri libglapi-mesa libllvm17t64 libmd4c0 libpcre2-16-0
  libqt5core5t64 libqt5dbus5t64 libqt5gui5t64 libqt5network5t64 libqt5qml5 libqt5qmlmodels5 libqt5quick5
  libqt5svg5 libqt5waylandclient5 libqt5waylandcompositor5 libqt5widgets5t64 libqt5x11extras5
  libxcb-damage0 libxcb-xinerama0 libxcb-xinput0 mesa-utils-bin qt5-gtk-platformtheme qttranslations5-l10n
  qtwayland5 xbitmaps
Use 'sudo apt autoremove' to remove them.
The following NEW packages will be installed:
  health-check
0 upgraded, 1 newly installed, 0 to remove and 36 not upgraded.
Need to get 48.9 kB of archives.
After this operation, 152 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu noble/universe amd64 health-check amd64 0.03.12-1 [48.9 kB]
Fetched 48.9 kB in 1s (46.2 kB/s)
Selecting previously unselected package health-check.
(Reading database ... 127617 files and directories currently installed.)
Preparing to unpack .../health-check_0.03.12-1_amd64.deb ...
Unpacking health-check (0.03.12-1) ...
Setting up health-check (0.03.12-1) ...
Processing triggers for man-db (2.12.0-4build2) ...

基本的な使い方

コマンドライン引数

health-checkコマンドのオプション

オプション説明
-b簡略表示モード
-c全ての子プロセスを追跡
-d [秒数]テストの継続時間(秒単位)
-ffork/vfork/cloneシステムコールを追跡
-hヘルプ情報の表示
-p [PID/プロセス名]追跡するプロセスIDまたはプロセス名(カンマ区切り)
-m [回数]追跡するシステムコールの最大数(デフォルト:100万)
-o [ファイル名]JSON出力ファイル
-rIPアドレスの名前解決(時間がかかる場合がある)
-u [ユーザー]指定したユーザーとしてコマンドを実行
-v詳細な出力
-wウェイクロックカウントを監視(軽量なfnotify監視)
-Wウェイクロック使用状況を監視(システムコール検査のオーバーヘッドあり)

health-checkを使ってみる

特定のプロセスを監視する

既存のプロセスを名前またはプロセスIDで指定して監視するには

sudo health-check -p docker -c -d 30

この例では、dockerプロセスとそのすべての子プロセスを30秒間監視する。

結果
CPU usage (in terms of 1 CPU):
   PID Process                USR%   SYS% TOTAL%   Duration
  4572 docker                 0.03   1.53   1.57      30.00  (very light load)
  4524 docker                 0.00   0.30   0.30      30.00  (very light load)
  4512 docker                 0.00   0.00   0.00      30.00  (idle)
  4497 docker                 0.00   0.00   0.00      30.00  (idle)
  4483 docker                 0.00   0.00   0.00      30.00  (idle)
  4471 docker                 0.00   0.00   0.00      30.00  (idle)
  4450 docker                 0.00   0.00   0.00      30.00  (idle)
 Total                        0.03   1.83   1.87             (very light load)

Page Faults:
   PID Process                 Minor/sec    Major/sec    Total/sec
  4572 docker                       0.00         0.00         0.00
  4524 docker                       0.00         0.00         0.00
  4512 docker                       0.00         0.00         0.00
  4497 docker                       0.00         0.00         0.00
  4483 docker                       0.00         0.00         0.00
  4471 docker                       0.00         0.00         0.00
  4450 docker                       0.00         0.00         0.00

Context Switches:
   PID Process                Voluntary   Involuntary     Total
                             Ctxt Sw/Sec  Ctxt Sw/Sec  Ctxt Sw/Sec
  4573 docker                     911.44         0.00       911.44 (quite high)
  4583 docker                     218.96         0.00       218.96 (quite high)
  4530 docker                     166.93         0.00       166.93 (quite high)
  4586 docker                      83.80         0.00        83.80 (moderate)
  4704 docker                      52.27         0.00        52.27 (moderate)
  4541 docker                      19.40         0.00        19.40 (moderate)
  5630 docker                       1.50         0.00         1.50 (low)
  4519 docker                       1.37         0.00         1.37 (low)
  4508 docker                       1.37         0.00         1.37 (low)
  4472 docker                       1.37         0.00         1.37 (low)
  4516 docker                       1.30         0.00         1.30 (low)
  4716 docker                       1.30         0.00         1.30 (low)
  4478 docker                       1.30         0.00         1.30 (low)
  4465 docker                       1.17         0.00         1.17 (low)
  4489 docker                       1.10         0.00         1.10 (low)
  4724 docker                       1.07         0.00         1.07 (low)
  4485 docker                       0.77         0.00         0.77 (very low)
  4464 docker                       0.77         0.00         0.77 (very low)
  4500 docker                       0.73         0.00         0.73 (very low)
  4463 docker                       0.73         0.00         0.73 (very low)
  4743 docker                       0.67         0.00         0.67 (very low)
  4722 docker                       0.60         0.00         0.60 (very low)
  4720 docker                       0.60         0.00         0.60 (very low)
  4509 docker                       0.57         0.00         0.57 (very low)
  4715 docker                       0.57         0.00         0.57 (very low)
  4506 docker                       0.43         0.00         0.43 (very low)
  4723 docker                       0.37         0.00         0.37 (very low)
  4518 docker                       0.37         0.00         0.37 (very low)
  4513 docker                       0.33         0.00         0.33 (very low)
  4498 docker                       0.33         0.00         0.33 (very low)
  4484 docker                       0.33         0.00         0.33 (very low)
  4452 docker                       0.33         0.00         0.33 (very low)
  4480 docker                       0.30         0.00         0.30 (very low)
  4714 docker                       0.27         0.00         0.27 (very low)
  4718 docker                       0.23         0.00         0.23 (very low)
  4491 docker                       0.23         0.00         0.23 (very low)
  4740 docker                       0.17         0.00         0.17 (very low)
  4502 docker                       0.17         0.00         0.17 (very low)
  4717 docker                       0.17         0.00         0.17 (very low)
  4515 docker                       0.07         0.00         0.07 (very low)
  4514 docker                       0.07         0.00         0.07 (very low)
  4745 docker                       0.07         0.00         0.07 (very low)
  4721 docker                       0.07         0.00         0.07 (very low)
  4719 docker                       0.07         0.00         0.07 (very low)
  4505 docker                       0.07         0.00         0.07 (very low)
  4503 docker                       0.07         0.00         0.07 (very low)
  4501 docker                       0.07         0.00         0.07 (very low)
  4744 docker                       0.07         0.00         0.07 (very low)
  4492 docker                       0.07         0.00         0.07 (very low)
  4490 docker                       0.07         0.00         0.07 (very low)
  4488 docker                       0.07         0.00         0.07 (very low)
  4487 docker                       0.07         0.00         0.07 (very low)
  4486 docker                       0.07         0.00         0.07 (very low)
  4713 docker                       0.07         0.00         0.07 (very low)
  4712 docker                       0.07         0.00         0.07 (very low)
  4711 docker                       0.07         0.00         0.07 (very low)
  4481 docker                       0.07         0.00         0.07 (very low)
  4479 docker                       0.07         0.00         0.07 (very low)
  4477 docker                       0.07         0.00         0.07 (very low)
  4476 docker                       0.07         0.00         0.07 (very low)
  4475 docker                       0.07         0.00         0.07 (very low)
  4474 docker                       0.07         0.00         0.07 (very low)
  4473 docker                       0.07         0.00         0.07 (very low)
  4466 docker                       0.07         0.00         0.07 (very low)
  4462 docker                       0.07         0.00         0.07 (very low)
  4456 docker                       0.07         0.00         0.07 (very low)
  4455 docker                       0.07         0.00         0.07 (very low)
  4454 docker                       0.07         0.00         0.07 (very low)
  4453 docker                       0.07         0.00         0.07 (very low)
  4572 docker                       0.07         0.00         0.07 (very low)
  4524 docker                       0.07         0.00         0.07 (very low)
  4512 docker                       0.07         0.00         0.07 (very low)
  4497 docker                       0.07         0.00         0.07 (very low)
  4483 docker                       0.07         0.00         0.07 (very low)
  4471 docker                       0.07         0.00         0.07 (very low)
  4450 docker                       0.07         0.00         0.07 (very low)
  4706 docker                       0.00         0.00         0.00 (idle)
  4705 docker                       0.00         0.00         0.00 (idle)
  4585 docker                       0.00         0.00         0.00 (idle)
  4584 docker                       0.00         0.00         0.00 (idle)
  4577 docker                       0.00         0.00         0.00 (idle)
  4576 docker                       0.00         0.00         0.00 (idle)
  4575 docker                       0.00         0.00         0.00 (idle)
  4574 docker                       0.00         0.00         0.00 (idle)
  4755 docker                       0.00         0.00         0.00 (idle)
  4703 docker                       0.00         0.00         0.00 (idle)
  4702 docker                       0.00         0.00         0.00 (idle)
  4544 docker                       0.00         0.00         0.00 (idle)
  4543 docker                       0.00         0.00         0.00 (idle)
  4542 docker                       0.00         0.00         0.00 (idle)
  4534 docker                       0.00         0.00         0.00 (idle)
  4533 docker                       0.00         0.00         0.00 (idle)
  4532 docker                       0.00         0.00         0.00 (idle)
  4531 docker                       0.00         0.00         0.00 (idle)
  4746 docker                       0.00         0.00         0.00 (idle)
  4521 docker                       0.00         0.00         0.00 (idle)
  4520 docker                       0.00         0.00         0.00 (idle)
  4517 docker                       0.00         0.00         0.00 (idle)
 Total                           1478.12         0.00      1478.12

File I/O operations:
   PID Process               Count  Op  Filename
  5627 docker                    1    C /mnt/wsl/docker-desktop/cli-tools/usr/bin/docker
 Op: O=Open, R=Read, W=Write, C=Close

File I/O Operations per second:
   PID Process                 Open   Close    Read   Write
  5627 docker                  0.00    0.03    0.00    0.00

System calls traced:
   PID Process              Syscall               Count    Rate/Sec    Total μSecs  % Call Time
  4450 docker               futex                     1       0.0333             0      0.0000
  4452 docker               futex                     2       0.0667           102      0.0000
  4452 docker               restart_syscall           1       0.0333       6278768      1.3111
  4452 docker               nanosleep                 1       0.0333         10847      0.0023
  4453 docker               futex                     1       0.0333             0      0.0000
  4454 docker               futex                     1       0.0333             0      0.0000
  4455 docker               epoll_pwait               1       0.0333             0      0.0000
  4456 docker               futex                     1       0.0333             0      0.0000
  4462 docker               futex                     1       0.0333             0      0.0000
  4463 docker               futex                     5       0.1667       6279364      1.3112
  4463 docker               epoll_pwait               1       0.0333            78      0.0000
  4463 docker               tgkill                    1       0.0333            76      0.0000
  4463 docker               getpid                    1       0.0333            53      0.0000
  4463 docker               rt_sigreturn              1       0.0333            31      0.0000
  4463 docker               sched_yield               1       0.0333            57      0.0000
  4464 docker               futex                     7       0.2333       6281263      1.3116
  4464 docker               nanosleep                 2       0.0667           299      0.0001
  4465 docker               futex                    10       0.3333       6280683      1.3115
  4465 docker               sched_yield               2       0.0667            76      0.0000
  4465 docker               epoll_pwait               1       0.0333            47      0.0000
  4465 docker               rt_sigreturn              1       0.0333            53      0.0000
  4465 docker               getpid                    1       0.0333            53      0.0000
  4465 docker               tgkill                    1       0.0333            54      0.0000
  4466 docker               read                      1       0.0333             0      0.0000
  4471 docker               futex                     1       0.0333             0      0.0000
  4472 docker               nanosleep                 9       0.3000          1389      0.0003
  4472 docker               futex                     4       0.1333       5939110      1.2402
  4472 docker               restart_syscall           1       0.0333       9300549      1.9421
  4473 docker               futex                     1       0.0333             0      0.0000
  4474 docker               futex                     1       0.0333             0      0.0000
  4475 docker               futex                     1       0.0333             0      0.0000
  4476 docker               futex                     1       0.0333             0      0.0000
  4477 docker               futex                     1       0.0333             0      0.0000
  4478 docker               epoll_pwait               7       0.2333      15240218      3.1824
  4478 docker               read                      5       0.1667           242      0.0001
  4478 docker               write                     4       0.1333           274      0.0001
  4478 docker               futex                     2       0.0667           160      0.0000
  4479 docker               futex                     1       0.0333             0      0.0000
  4480 docker               read                      2       0.0667      15238935      3.1822
  4480 docker               write                     1       0.0333            68      0.0000
  4480 docker               futex                     1       0.0333            61      0.0000
  4481 docker               futex                     1       0.0333             0      0.0000
  4483 docker               futex                     1       0.0333             0      0.0000
  4484 docker               futex                     2       0.0667            89      0.0000
  4484 docker               nanosleep                 1       0.0333         10441      0.0022
  4484 docker               restart_syscall           1       0.0333       6190703      1.2927
  4485 docker               futex                     6       0.2000       6192323      1.2931
  4485 docker               sched_yield               1       0.0333            31      0.0000
  4485 docker               rt_sigreturn              1       0.0333            38      0.0000
  4485 docker               getpid                    1       0.0333           119      0.0000
  4485 docker               tgkill                    1       0.0333            83      0.0000
  4486 docker               read                      1       0.0333             0      0.0000
  4487 docker               futex                     1       0.0333             0      0.0000
  4488 docker               futex                     1       0.0333             0      0.0000
  4489 docker               futex                     8       0.2667       6192746      1.2932
  4489 docker               getpid                    2       0.0667            69      0.0000
  4489 docker               tgkill                    2       0.0667           110      0.0000
  4489 docker               rt_sigreturn              1       0.0333            48      0.0000
  4489 docker               epoll_pwait               1       0.0333            47      0.0000
  4490 docker               futex                     1       0.0333             0      0.0000
  4491 docker               futex                     3       0.1000       6191600      1.2929
  4492 docker               epoll_pwait               1       0.0333             0      0.0000
  4497 docker               futex                     1       0.0333             0      0.0000
  4498 docker               futex                     2       0.0667           112      0.0000
  4498 docker               restart_syscall           1       0.0333       7741765      1.6166
  4498 docker               nanosleep                 1       0.0333         11136      0.0023
  4500 docker               futex                     6       0.2000       7743093      1.6169
  4500 docker               nanosleep                 2       0.0667           403      0.0001
  4500 docker               rt_sigreturn              1       0.0333            30      0.0000
  4501 docker               futex                     1       0.0333             0      0.0000
  4502 docker               futex                     2       0.0667       7743779      1.6170
  4503 docker               futex                     1       0.0333             0      0.0000
  4505 docker               read                      1       0.0333             0      0.0000
  4506 docker               futex                     4       0.1333       7743210      1.6169
  4506 docker               rt_sigreturn              1       0.0333            30      0.0000
  4508 docker               futex                     9       0.3000       7742658      1.6168
  4508 docker               sched_yield               3       0.1000           114      0.0000
  4508 docker               tgkill                    2       0.0667           121      0.0000
  4508 docker               getpid                    2       0.0667           241      0.0001
  4508 docker               epoll_pwait               2       0.0667            85      0.0000
  4508 docker               rt_sigreturn              1       0.0333            33      0.0000
  4509 docker               futex                     3       0.1000       7742978      1.6169
  4509 docker               tgkill                    1       0.0333            43      0.0000
  4509 docker               rt_sigreturn              1       0.0333            43      0.0000
  4509 docker               nanosleep                 1       0.0333           218      0.0000
  4509 docker               getpid                    1       0.0333            43      0.0000
  4512 docker               futex                     1       0.0333             0      0.0000
  4513 docker               futex                     2       0.0667            98      0.0000
  4513 docker               nanosleep                 1       0.0333         10522      0.0022
  4513 docker               restart_syscall           1       0.0333       7876072      1.6447
  4514 docker               futex                     1       0.0333             0      0.0000
  4515 docker               epoll_pwait               1       0.0333             0      0.0000
  4516 docker               futex                     8       0.2667       7876963      1.6448
  4516 docker               getpid                    3       0.1000           863      0.0002
  4516 docker               tgkill                    3       0.1000           220      0.0000
  4516 docker               epoll_pwait               2       0.0667           101      0.0000
  4516 docker               sched_yield               1       0.0333            51      0.0000
  4516 docker               rt_sigreturn              1       0.0333            88      0.0000
  4517 docker               futex                     1       0.0333             0      0.0000
  4518 docker               futex                     5       0.1667       7879667      1.6454
  4519 docker               futex                    11       0.3667       7877951      1.6451
  4519 docker               getpid                    2       0.0667           108      0.0000
  4519 docker               rt_sigreturn              2       0.0667            73      0.0000
  4519 docker               tgkill                    2       0.0667           257      0.0001
  4519 docker               nanosleep                 1       0.0333           126      0.0000
  4520 docker               read                      1       0.0333             0      0.0000
  4521 docker               futex                     1       0.0333             0      0.0000
  4524 docker               futex                     1       0.0333             0      0.0000
  4530 docker               nanosleep              1563      52.0985        309351      0.0646
  4530 docker               futex                   106       3.5332      28543135      5.9603
  4530 docker               sched_yield               2       0.0667            94      0.0000
  4530 docker               restart_syscall           1       0.0333        967159      0.2020
  4531 docker               futex                     1       0.0333             0      0.0000
  4532 docker               futex                     1       0.0333             0      0.0000
  4533 docker               futex                     1       0.0333             0      0.0000
  4534 docker               futex                     1       0.0333             0      0.0000
  4541 docker               read                     93       3.0999      29880911      6.2397
  4541 docker               write                    92       3.0666          6947      0.0015
  4541 docker               futex                    61       2.0333          5011      0.0010
  4542 docker               futex                     1       0.0333             0      0.0000
  4543 docker               futex                     1       0.0333             0      0.0000
  4544 docker               futex                     1       0.0333             0      0.0000
  4572 docker               futex                     1       0.0333             0      0.0000
  4573 docker               nanosleep              8638     287.9251       1629005      0.3402
  4573 docker               futex                   477      15.8995      27820162      5.8093
  4573 docker               restart_syscall           1       0.0333         51670      0.0108
  4574 docker               futex                     1       0.0333             0      0.0000
  4575 docker               futex                     1       0.0333             0      0.0000
  4576 docker               futex                     1       0.0333             0      0.0000
  4577 docker               futex                     1       0.0333             0      0.0000
  4583 docker               epoll_pwait            1545      51.4985      29755811      6.2135
  4583 docker               read                    754      25.1326         40841      0.0085
  4583 docker               write                   377      12.5663         25359      0.0053
  4583 docker               futex                   228       7.5998         15470      0.0032
  4583 docker               sched_yield               3       0.1000           123      0.0000
  4584 docker               futex                     1       0.0333             0      0.0000
  4585 docker               futex                     1       0.0333             0      0.0000
  4586 docker               read                    406      13.5329      29891241      6.2418
  4586 docker               write                   405      13.4996         26571      0.0055
  4586 docker               futex                   251       8.3664         16961      0.0035
  4702 docker               futex                     1       0.0333             0      0.0000
  4703 docker               futex                     1       0.0333             0      0.0000
  4704 docker               epoll_pwait             371      12.3663      29853865      6.2340
  4704 docker               read                    186       6.1998         11070      0.0023
  4704 docker               write                    93       3.0999          6716      0.0014
  4704 docker               futex                    43       1.4333          3159      0.0007
  4705 docker               futex                     1       0.0333             0      0.0000
  4706 docker               futex                     1       0.0333             0      0.0000
  4711 docker               futex                     1       0.0333             0      0.0000
  4712 docker               futex                     1       0.0333             0      0.0000
  4713 docker               futex                     1       0.0333             0      0.0000
  4714 docker               futex                     2       0.0667       6280417      1.3115
  4714 docker               nanosleep                 1       0.0333           165      0.0000
  4715 docker               futex                     4       0.1333       6280647      1.3115
  4715 docker               tgkill                    1       0.0333            55      0.0000
  4715 docker               rt_sigreturn              1       0.0333            35      0.0000
  4715 docker               getpid                    1       0.0333            62      0.0000
  4716 docker               futex                     9       0.3000       6192283      1.2931
  4716 docker               rt_sigreturn              2       0.0667            70      0.0000
  4716 docker               tgkill                    1       0.0333            39      0.0000
  4716 docker               nanosleep                 1       0.0333           122      0.0000
  4716 docker               getpid                    1       0.0333            38      0.0000
  4716 docker               sched_yield               1       0.0333            38      0.0000
  4716 docker               epoll_pwait               1       0.0333            50      0.0000
  4717 docker               futex                     2       0.0667       6192118      1.2930
  4718 docker               futex                     3       0.1000       6192078      1.2930
  4719 docker               epoll_pwait               1       0.0333             0      0.0000
  4720 docker               futex                     3       0.1000       7742762      1.6168
  4720 docker               getpid                    2       0.0667            87      0.0000
  4720 docker               tgkill                    2       0.0667            87      0.0000
  4720 docker               rt_sigreturn              1       0.0333            49      0.0000
  4721 docker               futex                     1       0.0333             0      0.0000
  4722 docker               futex                     4       0.1333       7877644      1.6450
  4722 docker               rt_sigreturn              2       0.0667           157      0.0000
  4722 docker               getpid                    1       0.0333            36      0.0000
  4722 docker               tgkill                    1       0.0333            39      0.0000
  4723 docker               futex                     4       0.1333       7877959      1.6451
  4723 docker               rt_sigreturn              1       0.0333            37      0.0000
  4724 docker               futex                     8       0.2667       7879050      1.6453
  4724 docker               getpid                    2       0.0667            76      0.0000
  4724 docker               rt_sigreturn              2       0.0667            82      0.0000
  4724 docker               tgkill                    2       0.0667            75      0.0000
  4740 docker               futex                     2       0.0667      29987705      6.2620
  4740 docker               epoll_pwait               1       0.0333            45      0.0000
  4743 docker               futex                     4       0.1333       6280659      1.3115
  4743 docker               rt_sigreturn              1       0.0333            30      0.0000
  4743 docker               nanosleep                 1       0.0333           116      0.0000
  4743 docker               getpid                    1       0.0333            52      0.0000
  4743 docker               tgkill                    1       0.0333            55      0.0000
  4744 docker               futex                     1       0.0333             0      0.0000
  4745 docker               futex                     1       0.0333             0      0.0000
  4746 docker               futex                     1       0.0333             0      0.0000
  4755 docker               futex                     1       0.0333             0      0.0000
  5627 docker               futex                     4       0.1333       4600532      0.9607
  5627 docker               rt_sigprocmask            2       0.0667           132      0.0000
  5628 docker               nanosleep                15       0.5000          3287      0.0007
  5628 docker               futex                     3       0.1000          7892      0.0016
  5628 docker               restart_syscall           1       0.0333       4591781      0.9588
  5629 docker               futex                     1       0.0333             0      0.0000
  5630 docker               futex                    10       0.3333       4601319      0.9608
  5630 docker               epoll_pwait               5       0.1667          1366      0.0003
  5630 docker               read                      2       0.0667           146      0.0000
  5630 docker               exit_group                1       0.0333             0      0.0000
  5630 docker               epoll_ctl                 1       0.0333            57      0.0000
  5630 docker               write                     1       0.0333            99      0.0000
  5630 docker               close                     1       0.0333            88      0.0000
  5631 docker               futex                     9       0.3000          6392      0.0013
  5631 docker               epoll_pwait               8       0.2667       4596265      0.9598
  5631 docker               read                      4       0.1333           200      0.0000
  5631 docker               write                     2       0.0667           148      0.0000
  5631 docker               nanosleep                 1       0.0333           145      0.0000
  5632 docker               futex                     1       0.0333             0      0.0000
  5633 docker               futex                     2       0.0667       4604244      0.9614
  5634 docker               read                      1       0.0333             0      0.0000
  5635 docker               futex                     1       0.0333             0      0.0000
  5636 docker               futex                     1       0.0333             0      0.0000
  5637 docker               epoll_pwait               6       0.2000          2912      0.0006
  5637 docker               futex                     5       0.1667       4599401      0.9604
  5637 docker               read                      3       0.1000           162      0.0000
  5637 docker               nanosleep                 2       0.0667           281      0.0001
  5637 docker               write                     1       0.0333            71      0.0000
 Total                                            16123     537.4180     478887223

Top polling system calls:
   PID Process              Syscall             Rate/Sec   Infinite   Zero     Minimum    Maximum    Average
                                                           Timeouts Timeouts   Timeout    Timeout    Timeout
  4452 docker               nanosleep               0.0333        0        0  10.0 msec  10.0 msec  10.0 msec
  4455 docker               epoll_pwait             0.0333        1        0   0.0 sec    0.0 sec    0.0 sec
  4463 docker               epoll_pwait             0.0333        0        1   0.0 sec    0.0 sec    0.0 sec
  4464 docker               nanosleep               0.0667        0        0   3.0 usec   3.0 usec   3.0 usec
  4465 docker               epoll_pwait             0.0333        0        1   0.0 sec    0.0 sec    0.0 sec
  4472 docker               nanosleep               0.3000        0        0  20.0 usec  20.0 usec  20.0 usec
  4478 docker               epoll_pwait             0.2333        4        3   0.0 sec    0.0 sec    0.0 sec
  4484 docker               nanosleep               0.0333        0        0  10.0 msec  10.0 msec  10.0 msec
  4489 docker               epoll_pwait             0.0333        0        1   0.0 sec    0.0 sec    0.0 sec
  4492 docker               epoll_pwait             0.0333        1        0   0.0 sec    0.0 sec    0.0 sec
  4498 docker               nanosleep               0.0333        0        0  10.0 msec  10.0 msec  10.0 msec
  4500 docker               nanosleep               0.0667        0        0   3.0 usec   3.0 usec   3.0 usec
  4508 docker               epoll_pwait             0.0667        0        2   0.0 sec    0.0 sec    0.0 sec
  4509 docker               nanosleep               0.0333        0        0   3.0 usec   3.0 usec   3.0 usec
  4513 docker               nanosleep               0.0333        0        0  10.0 msec  10.0 msec  10.0 msec
  4515 docker               epoll_pwait             0.0333        1        0   0.0 sec    0.0 sec    0.0 sec
  4516 docker               epoll_pwait             0.0667        0        2   0.0 sec    0.0 sec    0.0 sec
  4519 docker               nanosleep               0.0333        0        0   3.0 usec   3.0 usec   3.0 usec
  4530 docker               nanosleep              52.0985        0        0  20.0 usec   2.6 msec  51.3 usec
  4573 docker               nanosleep             287.9251        0        0  20.0 usec   5.1 msec  52.2 usec
  4583 docker               epoll_pwait            51.4985      773      772   0.0 sec    0.0 sec    0.0 sec
  4704 docker               epoll_pwait            12.3663      186      185   0.0 sec    0.0 sec    0.0 sec
  4714 docker               nanosleep               0.0333        0        0   3.0 usec   3.0 usec   3.0 usec
  4716 docker               nanosleep               0.0333        0        0   3.0 usec   3.0 usec   3.0 usec
  4716 docker               epoll_pwait             0.0333        0        1   0.0 sec    0.0 sec    0.0 sec
  4719 docker               epoll_pwait             0.0333        1        0   0.0 sec    0.0 sec    0.0 sec
  4740 docker               epoll_pwait             0.0333        0        1   0.0 sec    0.0 sec    0.0 sec
  4743 docker               nanosleep               0.0333        0        0   3.0 usec   3.0 usec   3.0 usec
  5628 docker               nanosleep               0.5000        0        0  20.0 usec  20.0 usec  20.0 usec
  5630 docker               epoll_pwait             0.1667        0        2   0.0 sec   23.9 sec   14.3 sec
  5631 docker               epoll_pwait             0.2667        0        5   0.0 sec   28.5 sec    9.5 sec
  5631 docker               nanosleep               0.0333        0        0   3.0 usec   3.0 usec   3.0 usec
  5637 docker               epoll_pwait             0.2000        0        3   0.0 sec   23.9 sec   12.0 sec
  5637 docker               nanosleep               0.0667        0        0   3.0 usec   3.0 usec   3.0 usec
 Total                                            406.5218      967      979

Distribution of poll timeout times:
                                                            10.0  100.0    1.0   10.0  100.0    1.0   10.0  100.0
                                                    up to    to     to     to     to     to     to     to  or more
                                              Zero    9.9   99.9  999.9    9.9   99.9  999.9    9.9   99.9        Infinite
   PID Process              Syscall            sec   usec   usec   usec   msec   msec   msec    sec    sec    sec   Wait
  4452 docker               nanosleep            0     -      -      -      -       1     -      -      -      -       0
  4455 docker               epoll_pwait          0     -      -      -      -      -      -      -      -      -       1
  4463 docker               epoll_pwait          1     -      -      -      -      -      -      -      -      -       0
  4464 docker               nanosleep            0      2     -      -      -      -      -      -      -      -       0
  4465 docker               epoll_pwait          1     -      -      -      -      -      -      -      -      -       0
  4472 docker               nanosleep            0     -       9     -      -      -      -      -      -      -       0
  4478 docker               epoll_pwait          3     -      -      -      -      -      -      -      -      -       4
  4484 docker               nanosleep            0     -      -      -      -       1     -      -      -      -       0
  4489 docker               epoll_pwait          1     -      -      -      -      -      -      -      -      -       0
  4492 docker               epoll_pwait          0     -      -      -      -      -      -      -      -      -       1
  4498 docker               nanosleep            0     -      -      -      -       1     -      -      -      -       0
  4500 docker               nanosleep            0      2     -      -      -      -      -      -      -      -       0
  4508 docker               epoll_pwait          2     -      -      -      -      -      -      -      -      -       0
  4509 docker               nanosleep            0      1     -      -      -      -      -      -      -      -       0
  4513 docker               nanosleep            0     -      -      -      -       1     -      -      -      -       0
  4515 docker               epoll_pwait          0     -      -      -      -      -      -      -      -      -       1
  4516 docker               epoll_pwait          2     -      -      -      -      -      -      -      -      -       0
  4519 docker               nanosleep            0      1     -      -      -      -      -      -      -      -       0
  4530 docker               nanosleep            0     -    1504     39     20     -      -      -      -      -       0
  4573 docker               nanosleep            0     -    8354    193     91     -      -      -      -      -       0
  4583 docker               epoll_pwait        772     -      -      -      -      -      -      -      -      -     773
  4704 docker               epoll_pwait        185     -      -      -      -      -      -      -      -      -     186
  4714 docker               nanosleep            0      1     -      -      -      -      -      -      -      -       0
  4716 docker               nanosleep            0      1     -      -      -      -      -      -      -      -       0
  4716 docker               epoll_pwait          1     -      -      -      -      -      -      -      -      -       0
  4719 docker               epoll_pwait          0     -      -      -      -      -      -      -      -      -       1
  4740 docker               epoll_pwait          1     -      -      -      -      -      -      -      -      -       0
  4743 docker               nanosleep            0      1     -      -      -      -      -      -      -      -       0
  5628 docker               nanosleep            0     -      15     -      -      -      -      -      -      -       0
  5630 docker               epoll_pwait          2     -      -      -      -      -      -      -       3     -       0
  5631 docker               epoll_pwait          5     -      -      -      -      -      -      -       3     -       0
  5631 docker               nanosleep            0      1     -      -      -      -      -      -      -      -       0
  5637 docker               epoll_pwait          3     -      -      -      -      -      -      -       3     -       0
  5637 docker               nanosleep            0      2     -      -      -      -      -      -      -      -       0

Polling system call analysis:
 docker (4463), epoll_pwait:
          1 immediate timed out calls with zero timeout (non-blocking peeks)
 docker (4465), epoll_pwait:
          1 immediate timed out calls with zero timeout (non-blocking peeks)
 docker (4478), epoll_pwait:
          2 immediate timed out calls with zero timeout (non-blocking peeks)
 docker (4489), epoll_pwait:
          1 immediate timed out calls with zero timeout (non-blocking peeks)
 docker (4500), nanosleep:
          1 nanosleep system call errors
 docker (4508), epoll_pwait:
          2 immediate timed out calls with zero timeout (non-blocking peeks)
          1 repeated immediate timed out polled calls with zero timeouts (heavy polling peeks)
 docker (4516), epoll_pwait:
          2 immediate timed out calls with zero timeout (non-blocking peeks)
          1 repeated immediate timed out polled calls with zero timeouts (heavy polling peeks)
 docker (4583), epoll_pwait:
        765 immediate timed out calls with zero timeout (non-blocking peeks)
 docker (4704), epoll_pwait:
        185 immediate timed out calls with zero timeout (non-blocking peeks)
 docker (4716), epoll_pwait:
          1 immediate timed out calls with zero timeout (non-blocking peeks)
 docker (5630), epoll_pwait:
          2 immediate timed out calls with zero timeout (non-blocking peeks)
 docker (5631), epoll_pwait:
          5 immediate timed out calls with zero timeout (non-blocking peeks)
          1 repeated immediate timed out polled calls with zero timeouts (heavy polling peeks)
 docker (5637), epoll_pwait:
          3 immediate timed out calls with zero timeout (non-blocking peeks)
          1 repeated immediate timed out polled calls with zero timeouts (heavy polling peeks)

Filesystem Syncs:
 None.

Inotify watches added:
 None.

Memory:
Per Process Memory (K):
   PID Process              Type        Size       RSS       PSS
  4497 docker               Stack        136        20        20
  4497 docker               Heap     1228008      9728      9728
  4497 docker               Mapped     27372     18724      2829
  4483 docker               Stack        136        20        20
  4483 docker               Heap     1227752      9688      9688
  4483 docker               Mapped     27372     18896      2880
  4450 docker               Stack        136        16        16
  4450 docker               Heap     1228264      8012      8012
  4450 docker               Mapped     27372     18960      2910
  4512 docker               Stack        136        20        20
  4512 docker               Heap     1228264      7812      7812
  4512 docker               Mapped     27372     18960      2893
  4572 docker               Stack        136        20        20
  4572 docker               Heap     1227868      7724      7724
  4572 docker               Mapped     27372     18912      2939
  4471 docker               Stack        136        24        24
  4471 docker               Heap     1227752      7520      7520
  4471 docker               Mapped     27372     18960      2893
  4524 docker               Stack        136        20        20
  4524 docker               Heap     1227752      7584      7584
  4524 docker               Mapped     27372     18848      2875

Change in memory (K/second):
   PID Process              Type        Size       RSS       PSS
  4572 docker               Mapped      0.00      0.00     10.80 (growing moderately fast)
  4524 docker               Mapped      0.00      0.00     10.80 (growing moderately fast)
  4512 docker               Mapped      0.00      0.00     10.93 (growing moderately fast)
  4497 docker               Mapped      0.00      0.00     10.93 (growing moderately fast)
  4483 docker               Mapped      0.00      0.00     10.87 (growing moderately fast)
  4471 docker               Mapped      0.00      0.00     10.93 (growing moderately fast)
  4450 docker               Mapped      0.00      0.00     10.73 (growing moderately fast)

Heap Change via brk():
 None.

Memory Change via mmap() and munmap():
 None.

Open Network Connections:
   PID Process              Proto         Send   Receive  Address
  4450 docker               UNIX        0.00 B    0.00 B  /run/user/1002/pipewire-0
  4450 docker               UNIX        0.00 B    0.00 B  /tmp/dbus-xLfyChPmct
  4450 docker               UNIX        0.00 B    0.00 B  /run/dbus/system_bus_socket
  4450 docker               UNIX        0.00 B    0.00 B  /tmp/.X11-unix/X0
  4471 docker               UNIX        0.00 B    0.00 B  /run/systemd/journal/stdout
  4471 docker               UNIX        0.00 B    0.00 B  /run/guest-services/docker.proxy.sock
  4471 docker               UNIX        0.00 B    0.00 B  /run/user/1002/pipewire-0
  4471 docker               UNIX        0.00 B    0.00 B  /var/run/docker.sock
  4483 docker               UNIX        0.00 B    0.00 B  /run/systemd/journal/stdout
  4483 docker               UNIX        0.00 B    0.00 B  /var/run/docker.sock
  4483 docker               UNIX        0.00 B    0.00 B  /run/guest-services/docker.proxy.sock
  4483 docker               UNIX        0.00 B    0.00 B  /run/dbus/system_bus_socket
  4497 docker               UNIX        0.00 B    0.00 B  /run/dbus/system_bus_socket
  4497 docker               UNIX        0.00 B    0.00 B  /var/run/docker.sock
  4497 docker               UNIX        0.00 B    0.00 B  /run/systemd/journal/stdout
  4497 docker               UNIX        0.00 B    0.00 B  /run/guest-services/docker.proxy.sock
  4512 docker               UNIX        0.00 B    0.00 B  /run/dbus/system_bus_socket
  4512 docker               UNIX        0.00 B    0.00 B  /run/systemd/journal/stdout
  4512 docker               UNIX        0.00 B    0.00 B  /run/guest-services/docker.proxy.sock
  4524 docker               UNIX        0.00 B    0.00 B  /run/host-services/backend.sock
  4524 docker               UNIX        0.00 B    0.00 B  /run/user/1002/bus
  4524 docker               UNIX        0.00 B    0.00 B  /var/run/docker.sock
  4572 docker               UNIX        0.00 B    0.00 B  /run/guest-services/docker.proxy.sock
  4572 docker               UNIX        0.00 B    0.00 B  /var/run/docker.sock
  4572 docker               UNIX        0.00 B    0.00 B  /run/systemd/journal/stdout
  5627 docker               UNIX        0.00 B    0.00 B  /run/dbus/system_bus_socket
  5627 docker               UNIX        0.00 B    0.00 B  /run/systemd/journal/stdout
  5627 docker               UNIX        0.00 B    0.00 B  /var/run/docker.sock
 Total                                  0.00 B    0.00 B

コマンドを実行して監視する

特定のコマンドを実行し、その実行中の動作を監視する

sudo health-check /bin/dd if=/dev/zero of=test-dd bs=1M count=100

この例では、ddコマンドを実行し、そのプロセスの動作を監視する。

結果
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.105105 s, 998 MB/s

CPU usage (in terms of 1 CPU):
   PID Process                USR%   SYS% TOTAL%   Duration
  6934 dd                     0.00  67.76  67.76       0.12  (high load)

Page Faults:
   PID Process                 Minor/sec    Major/sec    Total/sec
  6934 dd                        2871.30         0.00      2871.30

Context Switches:
   PID Process                Voluntary   Involuntary     Total
                             Ctxt Sw/Sec  Ctxt Sw/Sec  Ctxt Sw/Sec
  6934 dd                        5480.03         0.00      5480.03 (high)

File I/O operations:
   PID Process               Count  Op  Filename
  6934 dd                      100    W /home/kbushi/test-dd
  6934 dd                        3    R /usr/lib/x86_64-linux-gnu/libc.so.6
  6934 dd                        1    C /usr/lib/locale/C.utf8/LC_CTYPE
  6934 dd                        1    C /usr/lib/locale/C.utf8/LC_NUMERIC
  6934 dd                        1    C /usr/lib/locale/C.utf8/LC_TIME
  6934 dd                        1    C /usr/lib/x86_64-linux-gnu/libc.so.6
  6934 dd                        1    C /usr/lib/locale/C.utf8/LC_COLLATE
  6934 dd                        1    C /usr/lib/locale/C.utf8/LC_MONETARY
  6934 dd                        1    C /usr/lib/locale/C.utf8/LC_MESSAGES/SYS_LC_MESSAGES
  6934 dd                        1    C /usr/lib/locale/C.utf8/LC_PAPER
  6934 dd                        1    C /usr/lib/locale/C.utf8/LC_NAME
  6934 dd                        1    C /usr/lib/locale/C.utf8/LC_ADDRESS
  6934 dd                        1    C /usr/lib/locale/C.utf8/LC_TELEPHONE
  6934 dd                        1    C /usr/lib/locale/C.utf8/LC_MEASUREMENT
  6934 dd                        1    C /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
  6934 dd                        1    C /usr/lib/locale/C.utf8/LC_IDENTIFICATION
  6934 dd                        1    C /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
  6934 dd                        1    C /usr/bin/dd
  6934 dd                        1   CW /home/kbushi/test-dd
  6934 dd                        1    O /home/kbushi/test-dd
  6934 dd                        1    O /usr/lib/locale/C.utf8/LC_CTYPE
  6934 dd                        1    O /usr/lib/locale/C.utf8/LC_NUMERIC
  6934 dd                        1    O /usr/lib/locale/C.utf8/LC_TIME
  6934 dd                        1    O /usr/lib/locale/C.utf8/LC_COLLATE
  6934 dd                        1    O /usr/lib/locale/C.utf8/LC_MONETARY
  6934 dd                        1    O /usr/lib/locale/C.utf8/LC_MESSAGES/SYS_LC_MESSAGES
  6934 dd                        1    C /usr/lib/locale/C.utf8/LC_MESSAGES
  6934 dd                        1    O /usr/lib/locale/C.utf8/LC_MESSAGES
  6934 dd                        1    O /usr/lib/locale/C.utf8/LC_PAPER
  6934 dd                        1    O /usr/lib/locale/C.utf8/LC_NAME
  6934 dd                        1    O /usr/lib/locale/C.utf8/LC_ADDRESS
  6934 dd                        1    O /usr/lib/locale/C.utf8/LC_TELEPHONE
  6934 dd                        1    O /usr/lib/locale/C.utf8/LC_MEASUREMENT
  6934 dd                        1    O /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
  6934 dd                        1    O /usr/lib/locale/C.utf8/LC_IDENTIFICATION
  6934 dd                        1    C /etc/locale.alias
  6934 dd                        1    R /etc/locale.alias
  6934 dd                        1    O /etc/locale.alias
  6934 dd                        1    C /etc/ld.so.cache
  6934 dd                        1    O /usr/lib/x86_64-linux-gnu/libc.so.6
  6934 dd                        1    O /etc/ld.so.cache
  6934 dd                        1    R /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
  6934 dd                        1    O /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
  6934 dd                        1   OR /usr/bin/dd
 Total                         145
 Op: O=Open, R=Read, W=Write, C=Close

File I/O Operations per second:
   PID Process                 Open   Close    Read   Write
  6934 dd                    169.40  169.40   50.82  855.46

System calls traced:
   PID Process              Syscall               Count    Rate/Sec    Total μSecs  % Call Time
  6934 dd                   write                   103     872.4008         84766     84.2203
  6934 dd                   read                    103     872.4008         10157     10.0916
  6934 dd                   openat                   32     271.0371          1774      1.7626
  6934 dd                   mmap                     22     186.3380           988      0.9816
  6934 dd                   close                    22     186.3380          1044      1.0373
  6934 dd                   fstat                    17     143.9885           774      0.7690
  6934 dd                   mprotect                  3      25.4097           137      0.1361
  6934 dd                   rt_sigaction              3      25.4097           125      0.1242
  6934 dd                   brk                       3      25.4097           130      0.1292
  6934 dd                   pread64                   2      16.9398           115      0.1143
  6934 dd                   dup2                      2      16.9398            86      0.0854
  6934 dd                   set_robust_list           1       8.4699            43      0.0427
  6934 dd                   prlimit64                 1       8.4699            43      0.0427
  6934 dd                   access                    1       8.4699            45      0.0447
  6934 dd                   lseek                     1       8.4699            42      0.0417
  6934 dd                   munmap                    1       8.4699            63      0.0626
  6934 dd                   execve                    1       8.4699           190      0.1888
  6934 dd                   set_tid_address           1       8.4699            42      0.0417
  6934 dd                   futex                     1       8.4699            42      0.0417
  6934 dd                   exit_group                1       8.4699             0      0.0000
  6934 dd                   arch_prctl                1       8.4699            42      0.0417
 Total                                              322    2727.3112        100648

Filesystem Syncs:
 None.

Inotify watches added:
 None.

Memory:
Per Process Memory (K):
   PID Process              Type        Size       RSS       PSS
  6934 dd                   Stack        132        12        12
  6934 dd                   Heap        1236      1080      1080
  6934 dd                   Mapped      2828      1992       150

Change in memory (K/second):
   PID Process              Type        Size       RSS       PSS
  6934 dd                   Stack       0.00   -101.64    -67.76 (shrinking moderately fast)
  6934 dd                   Heap     7589.04   8063.35   8351.33 (growing very fast)
  6934 dd                   Mapped   2473.21  13551.86    575.95 (growing very fast)

Heap Change via brk():
   PID                       brk Count   Change (K)  Rate (K/Sec)
  6934 dd                            1            0          0.00 (no change)

Memory Change via mmap() and munmap():
   PID                         mmaps  munmaps  Change (K)  Rate (K/Sec)
  6934 dd                         22        1        5514      46709.35 (growing very fast)

Open Network Connections:
 None.

Analysis ran for just 0.1181 seconds, so rate calculations may be misleading

結果をJSONファイルに出力する

監視結果をJSON形式で保存して後で分析するには:

sudo health-check -p docker -c -d 10 -o docker-health.json

docker-health.json

出力結果について

health-checkの出力は、以下のようなセクションに分かれている

CPU使用率

プロセスごとのユーザー空間とシステム空間のCPU使用率が表示される。
高い負荷が検出されると「high load」などの評価が付く。

ウェイクアップ

カーネルのウェイクアップイベントが表示され、頻度に応じて「high」「moderate」「low」などの評価が付く。

コンテキストスイッチ

自発的および非自発的なコンテキストスイッチの回数が表示される。
高頻度のコンテキストスイッチは、プロセスがCPU時間を効率的に使用できていないことを示す。

ファイルI/O操作

ファイルの開く(O)、閉じる(C)、読み取り(R)、書き込み(W)などの操作が記録される。
ディスクI/Oのボトルネックを特定できる。

システムコール

プロセスが呼び出したシステムコールの種類と頻度が表示される。

ポーリングシステムコール

poll、select、epoll_waitなどのタイムアウト待ちシステムコールが分析される。
ゼロタイムアウトでの頻繁なポーリングは非効率的なリソース使用を示す。

メモリ使用状況

スタック、ヒープ、マップされたメモリの使用量と、時間あたりの変化率が表示される。

ネットワーク接続

開かれているネットワーク接続の一覧が表示される。

実際の使用例

例1:高負荷プロセスの分析

サーバーのCPU使用率が突然高くなった場合、topコマンドでCPU使用率の高いプロセスを見つけた後、そのプロセスをhealth-checkで詳細に分析できる:

sudo health-check -p [high-cpu-process-id] -c -d 300

これにより、プロセスが実際に何をしているのか、どのシステムコールが多く呼び出されているのかがわかる。

例2:メモリリークの調査

メモリ使用量が時間とともに増加しているプロセスがある場合

sudo health-check -p [leaking-process] -c -d 600 -o memory-leak-analysis.json

長時間の監視とJSON出力を組み合わせることで、メモリリークの詳細なパターンを分析できる。

例3:バッテリー消費の調査

ノートPCでバッテリーの消費が早い場合、ウェイクアップの多いプロセスを特定できる:

sudo health-check -p $(pgrep -d, -u $USER) -w -d 60

このコマンドは、現在のユーザーのすべてのプロセスを監視し、ウェイクアップの多いプロセスを特定する。

参考

おわりに

health-checkというパッケージを使ってみた。
結構いろいろな調査に使えそうで便利なので覚えておこう…。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。