kernel-2.6.17でのspinlockのオーナー情報
先日のダンプ内のSPINLOCKのコメント欄で話題になっていたspinlockのオーナーの特定についてですが、少し調べてみました。
Fedora Core 5のUpdateカーネルとして提供されている2.6.17-1.2157_FC5と、
http://people.redhat.com/anderson/ で提供されているcrash-4.0-2.33の組み合わせでカーネルの内部を覗いて見ました。
kernel-debuginfoは、
ftp://ftp.kddlabs.co.jp/pub/Linux/distributions/fedora/core/updates/5/i386/debug/kernel-debuginfo-2.6.17-1.2157_FC5.i686.rpm
あたりからダウンロードしてきます。約800MB程度ありますので、ご注意を。
まず最初にkernel-2.6.17-1.2157_FC5.i686.rpmをインストールし、そのカーネルで起動します。
続いて、kernel-debuginfo-2.6.17-1.2157_FC5.i686.rpmと、crash-4.0-2.33.i386.rpmをインストールしてから下記の操作を行います。
-------------
# uname -r
2.6.17-1.2157_FC5
# crash /boot/System.map-2.6.17-1.2157_FC5
crash> ps
--------------
で適当なプロセス(syslogdなどが良いでしょう)を選択して、filesコマンドでファイル一覧を表示させます。
----------------------
crash> files 1473
PID: 1473 TASK: c1321550 CPU: 0 COMMAND: "syslogd"
ROOT: / CWD: /
FD FILE DENTRY INODE TYPE PATH
0 c132e500 d08fe6e0 d1c985b4 SOCK socket:/[3800]
1 d1af3d80 d0a1f930 d0a47b58 REG /var/log/messages
2 c12c7900 d0a1f9c4 d0a478b4 REG /var/log/secure
3 d1c965c0 d08fe2d4 d0a47610 REG /var/log/maillog
4 d1dc78c0 d08fe240 d0a4736c REG /var/log/cron
5 d1dc7a40 d08feef8 d0a470c8 REG /var/log/spooler
6 c13c10c0 d0a1fc14 d0a62dfc REG /var/log/boot.log
-----------------
次にinode情報を表示させてみます。
-----------------
crash> struct inode d0a62dfc
....
i_lock = {
raw_lock = {
slock = 1
},
magic = 3735899821,
owner_cpu = 4294967295,
owner = 0xffffffff
},
....
-------
というように、spinlockをつかんでいるownerのエントリを確認することができるようになっていました。
今回は、稼動中のカーネルの情報を見ましたので、実際にspinlockを取得している瞬間ではないためownerのエントリが0xffffffffに初期化されていましたが、実際のデッドロックの発生時など、ダンプファイルからデッドロックの原因特定に役立つことは間違いなさそうです。

コメント