Python/CRASH APIを使ってみる

2、3年前にPyKdumpを紹介したことがありましたが、今回は、2019年7月時点で最新のmpykdump-3.1.0-x86_64.tar.gzをRHEL8の上で試してみたいと思います。
はじめに、こちらのURLからファイルをダウンロードしてください。
sourceforge.net

ファイルを展開し、crashの共有オブジェクトをロードします。すると拡張したコマンドを表示させることができます。

$ tar zxvf mpykdump-3.1.0-x86_64.tar.gz
$ crash
...
crash> extend usr/local/lib/mpykdump64.so
Setting scroll off while initializing PyKdump
./usr/local/lib/mpykdump64.so: shared object loaded
crash> extend
SHARED OBJECT                  COMMANDS
./usr/local/lib/mpykdump64.so  epython xportshow crashinfo taskinfo nfsshow hanginfo fregs tslog scsi scsishow dmshow 

では、実際にいくつか試してみましょう。

crash> xportshow --summary
TCP Connection Info
-------------------
Traceback (most recent call last):
  File "./usr/local/lib/mpykdump64.so/progs/xportshow.py", line 1116, in <module>
  File "/home/alexs/tools/pykdump/LinuxDump/inet/summary.py", line 50, in TCPIP_Summarize
  File "/home/alexs/tools/pykdump/LinuxDump/inet/proto.py", line 198, in __init__
  File "/home/alexs/tools/pykdump/pykdump/wrapcrash.py", line 565, in __getattr__
KeyError: '<struct tcp_sock> does not have a field <wmem_alloc_counter>'

 ** Execution took   0.02s (real)   0.01s (CPU)
crash> 

READMEファイルには、カーネル2.4.21から4.15.X対応と記載されているので、やはり4.18.0-80.Xでは問題があるようです。
それでも、動作するコマンドもあるので試してみる価値はありそうです。例えば、TCPの情報を出力するには、次のようにコマンドを入力します。

crash> xportshow -t
tcp   xx.xx.140.31:22            xx.xx.242.78:57670          ESTABLISHED

 ** Execution took   0.09s (real)   0.09s (CPU)

その他、ネットワークインターフェイスの情報やsshdに関連する情報を出力するには、次のようにコマンドを入力します。

crash> xportshow -i
====================== lo <struct net_device 0xffff8bef8dd5d000>  ============
lo             127.0.0.1/8  mtu=65536                        LOOPBACK
  inet6 addr: ::1/128
    flags=<IFF_UP|IFF_LOOPBACK>
    features=<SG|HW_CSUM|HIGHDMA|FRAGLIST|VLAN_CHALLENGED|TSO|LLTX|UFO>
====================== ens3 <struct net_device 0xffff8befb6509000>  ==========
ens3       xx.xx.140.31/24  mtu=1500      00:16:3e:8e:59:26  ETHER
  inet6 addr: fe80::216:3eff:fe8e:5926/64
    flags=<IFF_UP|IFF_BROADCAST|IFF_MULTICAST>
    features=<SG|HW_CSUM|HIGHDMA|HW_VLAN_FILTER|TSO>

 ** Execution took   0.27s (real)   0.26s (CPU)
crash> xportshow --program sshd

-----PID=4285  COMM=sshd 
 fd     file              socket
 --     ----              ------
  5  0xffff8beff9f4e800  0xffff8beffba738c0  PF_INET  SOCK_STREAM  TCP  
      tcp   xx.xx.140.31:22            xx.xx.242.66:56580          ESTABLISHED
  8  0xffff8beff9f2c800  0xffff8beffba72dc0  PF_FILE  SOCK_STREAM  UNIX 
  9  0xffff8beff9ff8d00  0xffff8beffa928000  PF_FILE  SOCK_DGRAM   UNIX 
 11  0xffff8beff9f2c100  0xffff8beffba72580  PF_FILE  SOCK_STREAM  UNIX 
 14  0xffff8beffcf34d00  0xffff8befd1c5fb80  PF_FILE  SOCK_STREAM  UNIX 

sysctlのdirtyに関連する情報を出力する場合には、次のようにコマンドを入力します。

crash> crashinfo --sysctl|grep dirty 
vm.dirty_background_bytes 0
vm.dirty_background_ratio 10
vm.dirty_bytes       0
vm.dirty_expire_centisecs 3000
vm.dirty_ratio       30
vm.dirty_writeback_centisecs 500
vm.dirtytime_expire_seconds 43200

メモリの使用率の高いプロセスを表示するには、次のようにコマンドを入力します。

crash> taskinfo --memory
 ==== First 8 Tasks reverse-sorted by RSS+SHM ====
   PID=  8769 CMD=crash           RSS=0.398 Gb
   PID=   717 CMD=sssd_nss        RSS=0.034 Gb
   PID=   707 CMD=tuned           RSS=0.025 Gb
   PID=   679 CMD=polkitd         RSS=0.022 Gb
   PID=   686 CMD=NetworkManager  RSS=0.018 Gb
   PID=   709 CMD=sssd_be         RSS=0.011 Gb
   PID=   677 CMD=sssd            RSS=0.010 Gb
   PID=     1 CMD=systemd         RSS=0.010 Gb

 ==== First 8 Tasks Reverse-sorted by RSS only ====
   PID=  8769 CMD=crash           RSS=0.398 Gb
   PID=   717 CMD=sssd_nss        RSS=0.034 Gb
   PID=   707 CMD=tuned           RSS=0.025 Gb
   PID=   679 CMD=polkitd         RSS=0.022 Gb
   PID=   686 CMD=NetworkManager  RSS=0.018 Gb
   PID=   709 CMD=sssd_be         RSS=0.011 Gb
   PID=   677 CMD=sssd            RSS=0.010 Gb
   PID=     1 CMD=systemd         RSS=0.010 Gb

 === Total Memory in RSS  0.637 Gb
 === Total Memory in SHM  0.000 Gb

 ** Execution took   0.58s (real)   0.09s (CPU), Child processes:   0.44s