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