sleep() に費やされた累積時間の合計を測定するには?

sleep() に費やされた累積時間の合計を測定するには?

BashとPythonで書かれたツールを分析しています。トップレベルの呼び出しは bash と Python プログラムの複数の階層を横断します。完了時間は約時間(4~5時間)です。この迷路のような呼び出しには、sleep()複数のファイル/プログラムにわたって多くの呼び出しが分散されています。寝る時間は場所によって異なります。ツールはシングルスレッド

foo.shとbar.shを呼び出すmain.shの例。実際のツールにはより多くのファイルがあり、各ファイルのサイズが大きく、sleep()すべてのファイル(foo.sh、bar.sh)を.change呼び出すことはできません。理想的にはmain.shに何かを追加したいと思います。

# main.sh
foo.sh
for (something):
  bar.sh    

# foo.sh
<stuff>
sleep 10
<stuff>
sleep 30
bar.sh
<stuff>
compute.py arg1 arg2

# bar.sh
<stuff>
while (something): 
  sleep 15
<stuff>

で費やした合計時間を知りたいですsleep()

sleep()ツールの開始から完了までに費やされた合計時間を確認する方法はありますか?

それ以外にも役に立つと思う提案や指示がありますか? bashやPythonでのみ動作する方法はありますか?

答え1

1つのオプションは、次のようなものを使用することです。sysdig。次のシェルスクリプトがある場合:

#!/bin/bash

for ((i = 0; i < 10; ++i)); do
    sleep $((i + 5))
done

次のように実行できます。

ex.sh& sudo sysdig proc.ppid=$! and evt.type=nanosleep and evt.dir='>'
[1] 34548
5578 19:12:08.307269713 4 sleep (34550) > nanosleep interval=6000000000(6s)
19206 19:12:14.308052173 0 sleep (34559) > nanosleep interval=7000000000(7s)
30764 19:12:21.308769638 4 sleep (34560) > nanosleep interval=8000000000(8s)
44222 19:12:29.309508180 0 sleep (34561) > nanosleep interval=9000000000(9s)
62699 19:12:38.310298027 4 sleep (34569) > nanosleep interval=10000000000(10s)
79052 19:12:48.311058659 0 sleep (34570) > nanosleep interval=11000000000(11s)
100582 19:12:59.311839491 4 sleep (34578) > nanosleep interval=12000000000(12s)
123807 19:13:11.312590028 0 sleep (34586) > nanosleep interval=13000000000(13s)
145141 19:13:24.313375302 4 sleep (34587) > nanosleep interval=14000000000(14s)

ここでは、親がシステムコール()をproc.ppid=$!呼び出すバックグラウンドスクリプト()内のプロセス、つまりシステムコールエントリイベント()を探しています。スクリプトは最初に呼び出しを考えるので、最終的に最初のイベントがありません。nanosleepevt.type=nanosleepevt.dir='>'sleep

このツールにはさまざまなフィルタリングオプションがあり、詳細を表示できます。ユーザーマニュアル。ユースケースに合わせてフィルタを調整する必要があるかもしれません。たとえば、sleep睡眠に対する特定のシステムコールを見つけるにはいくつかの実験が必要でした。

関連情報