強大なstrace
私を失望させた。これはどのようにして可能ですか?
time foo
これは、foo
実行に数秒かかる( "実際の")が、ユーザー空間( "user")とカーネル( "sys")の両方で無視できるCPU時間を使用することを示しています。好奇心のために、foo
以下に定義されています。
そのため、CPU命令を実行するのではなく、他の何かを待つのにほとんどの時間を費やしています。通常、私はそれがどのように待っているかを見ることができますstrace
-つまり、どのシステムコールが長期間ブロックしているのか。残念ながら、このアプローチは機能しませんでした。
strace -ttt -T -C -w foo
は、システムコール、タイムスタンプ、およびシステムコールに費やされた(実際の)時間の概要を示しています。しかし、この特定のプロセスは、システムコールの内部で費やされる全体(実)時間はごくわずかであることを示しました。
foo
ですjournalctl -b -u dev-hugepages.mount
。これを再現するために、毎回異なるsystemdユニットへの最後の引数を変更しなければならなかったことを除いて。つまり、調査対象の遅延は、あるsystemdユニットのログを取得しようとしたときに初めて発生しました。 編集:主な質問に答えた後、私はこの遅延を再現する問題が発生している理由にも気付きました。
このプロセスに費やされる時間は特定の問題であり、明らかにすべてのシステムで発生するわけではありません。https://github.com/systemd/systemd/issues/7963
journalctl
1つのプロセスのみを実行すると思います。journalctl
なんらかの理由で1つの余分なスレッドを使用しているような気がします。つまり、1つのclone()呼び出しがありました。これはあなたが技術的に正しいことを意味すると思いますが、技術的に問題とは無関係です。 time
プロセス全体を見て、プロセス全体がかなり眠い(何かをブロックする)ことを示しました。 strace
十分な睡眠を示さなかった。2番目のスレッドがスリープしているかどうかは関係ありません。メインスレッドもtime
結果を説明するために非常にスリープ状態である必要があります。