[Lkst-develop] LKST 1.3 lkstlogdのバグ修正

Back to archive index

Masami HIRAMATSU hiram****@sdl*****
2002年 11月 21日 (木) 11:29:44 JST


日立の平松です。

lkstlogdに不具合があったので修正しました。
以前の修正パッチでは修正し切れなかった部分です。
添付パッチはLKST v1.3からの修正パッチになっています。

・リソース解放手順のバグ修正
	リソース解放時にマスクセットとバッファの解放の順番が逆になっているため
	バッファ解放を行おうとして失敗する可能性がありました。
	バッファとマスクセットの解放順序を逆にして回避しました。

・initlogコマンドとの併用時に、時々子プロセスが異常終了するバグの修正
	バッファ取りこぼし警告を標準エラー出力に出そうとして、initlogがいないために
	エラーとなり、その時点で終了してしまいます。
	バッファ取りこぼしなどの警告を、全てsyslogに出力するように変更しました。

・プロセス監視ルーチンの強化
	親プロセス、子プロセスのどちらか一方が終了したとき、もう一方も終了させます。

今回のバグの症状は、
・initlogと一緒に使わなければ生じない。(単体では再現しない)
・高負荷状態でしか生じない。(キー入力に遅れが生じるレベルの負荷)
・いつ何が起きているかがわかりにくい。(気づいたときには子プロセスがいなくなっている)
という特徴があり、実運用状態での原因究明を行わなければならなかったため、LKST自身の
機能を使ってバグ探しをしてみました。
LKSTの使い方の参考例になるかと思いますので、以下にバグ探しの手法を記します。

まず、いつ、どこで、何が起きたのかを確かめるために、lkstlogdのプロセスのログだけを
静的バッファ(リングの外のバッファ(ID=0))に記録し、そのほかのプロセスのログは、
カレントのバッファに記録するようなイベントハンドラを作りました。

このイベントハンドラをaddonドライバにして、insmodして追加しました。
次に、RDEFAULTマスクセットを読出し、defaultイベントハンドラを、先ほど作ったハンドラに
置き換えたマスクセットを、新たに登録しました。
この新しいマスクセットを使用し、lkstlogdを起動します。
この後、高負荷をかけることで症状が再現するのを待ち、再現したところで静的バッファを読み
出しました。
このとき得られたログを解析したところ、
・子プロセスが高負荷をかけた後でいなくなっている。
・いなくなる直前にSIGPIPEを受け取っている。
・SIGPIPEはシステムコール番号4(write)を発行している間に発生している。
・writeの直前に、システムコール番号3(read)を発行し、戻り値がエラー(EAGAIN)である。
ということが判りました。
子プロセスのreadコマンドは、バッファを読むために使われているので、この戻り値が
エラーになったときの処理を調べると、
	fprintf(stderr, "lkstlogd error: lkst device read()...
と、標準エラー出力を使っていることが判りました。つまり、この標準エラー出力が破壊された
ために異常終了していることがわかりました。

あとは、発生条件であるinitlogとの関係が疑われますから、initlogで簡単なデーモン(fork
して親プロセスを終了させ、子プロセスはしばらくスリープした後標準エラーに出力する。)を
実行して、確かにSIGPIPEが発生していることを確認し、これをsyslogに出力するよう変更する
ことで、問題を回避することが出来ました。

今回の経験から、以下の点に気づきました。

・カーネルをリコンパイルせずに使えるのは非常に楽。
	リブート無しで、カスタムイベントハンドラを追加できる。

・今回のような複合的要因における問題解析には威力を発揮する。
	initlogを使ってターミナルから切り離された環境でしか発現しないなど、
	実際の動作時の問題に対応しやすい。

・ioctlの種類が是非とも欲しい。
	親プロセスのバグ解析で、ioctlを発行しながらビジーループを行っていた。
	ioctlの種類がわかっていれば、LKST_IOC_BUFF_SHIFTを発行していることが
	すぐにわかったはず。

・静的バッファ(リングから外れているバッファ)が一つしかないのは辛い。
	子プロセスの異常終了解析で、親プロセスの分は別に取りたかったのだが、リングから
	外れたバッファが一つしか無くて苦労した。リング内にあるとデーモンが上書きして
	消してしまう。

・プロセスの起動と終了イベントが欲しい。
	タスクがどこで落ちているのかが判りにくい。今回はシグナルで判断しました。

ioctlについてはsystem_call_entryに渡される引数を追加するだけだと思うので、
出来るだけ早く対応したいところです。


-- 
平松 雅巳(Masami HIRAMATSU)

(株)日立製作所 システム開発研究所 第3部 304ユニット
E-mail: hiram****@sdl*****
Tel: 044-959-0258
(内線)8-69-3346
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: lkst-1.3-logd-free_resources_and_syslog.patch.gz
型:         application/x-gzip
サイズ:     4613 バイト
説明:       無し
下载 


Lkst-develop メーリングリストの案内
Back to archive index