web-dev-qa-db-ja.com

オープンシステムコールのstraceに表示される時間の解釈

ベンダーアプリケーションで遅延の問題が発生しています。プロセスでstrace -Ttttを実行し、これを取得しました。

[...]
1470166748.946144 open("/opt/app/shdbrth/X       ", O_RDONLY) = -1 ENOENT (No such file or directory) <0.000016>
1470166800.850979 open("/opt/app/shdbrth/X38347", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 10 <0.000070>
1470166800.851139 fstat(10, {st_mode=S_IFREG|0660, st_size=0, ...}) = 0 <0.000006>
[...]

manpage によると、-tttは、syscallが行われた時刻を各行の前に付けます。 -Tオプションは、<>の括弧の間に呼び出しの処理にかかった時間を追加します。ただし、これは上記の例では合計されていないようです。

たとえば、2行目は1,470,166,800エポック秒と850,979マイクロ秒で始まりました。添付のタイマーによると、処理には70マイクロ秒かかりました。ただし、次の行は同じエポック秒と851,139マイクロ秒で始まります--- 90マイクロ秒の違い。

私はそれを単なる頭上で書き留めるつもりでしたが、おそらくもっと正確な説明があります。

2

行の先頭の時刻は、カーネルがそのシステムコールの処理を開始した時刻です。行末の期間は、カーネルがそのシステムコールの処理を開始してから、カーネルがシステムコールに応答するまでの間隔です。

次の行の先頭の時刻は、カーネルがその次のシステムコールの処理を開始した時刻です。 1つのシステムコールへの応答と次のシステムコールへのエントリの間に、2種類のことが起こりました。プロセスがユーザーコードを実行し、他のプロセスが同じプロセッサでスケジュールされた可能性があります。

あなたの例では、最初のopen呼び出しは16µsかかり、次の呼び出しは約12秒後に発行されました。この12秒間に、プロセスはユーザーコードを実行し、おそらく他のプロセスを実行するために何度もプリエンプトされました。 2回目のopen呼び出しとそれに続くfstatの間に、約90µsが経過しました。これがいかに小さいかを考えると、プロセスが実行したユーザーコードは少量であり、プリエンプトされなかったことを示しています。