timeコマンドは、4ミリ秒のタイマーティックからミリ秒をどのように計算しますか?

timeコマンドは、4ミリ秒のタイマーティックからミリ秒をどのように計算しますか?

time他のUbuntuシステム(実際のハードウェアと仮想マシンの両方)のbashコマンドから時々ミリ秒を取得しCONFIG_HZ=250ます。real 0m0.001suser 0m0.001ssys 0m0.001s

どうやってこれができますか?

real編集:私はコマンドの始めと終わりで利用可能な高解像度の時間ソースを照会して、経過時間を正確に計算できることを認めますtime
ただし、パフォーマンス上の理由からシステムコールの開始または終了に関するタイムソースクエリがないため、CPU時間は4ミリ秒の倍数であるタイマティック(タイマ割り込み数)として計算されるuserと予想されます。sys

2番目の編集:MC68020の答えを考えると、質問は次のようになります。Linuxカーネルは、システムコールでuserマイクロ秒単位の精度sysでCPU使用率を返すことができますかgetrusage
パフォーマンス上の理由から、すべてのシステムコールの開始と終了に対してタイムソースクエリを実行できないと主張した場合、私は何か間違っていますか?

ベストアンサー1

読むことができるように一部のコード

#if defined (HAVE_GETRUSAGE) && defined (HAVE_TIMEVAL) && defined (RUSAGE_SELF)
...
  getrusage (RUSAGE_SELF, &self);
...
  print_timeval (stdout, &self.ru_utime);
...
#else
#  if defined (HAVE_TIMES)
...
  times (&t);
  print_clock_t (stdout, t.tms_utime);
...

HAVE_GETRUSAGE、HAVE_TIMEVAL、および RUSAGE_SELF 設定に応じて、 bash のtime内部コマンドは次のように使用します。ガートラセージシステムコールまたは移流システムコール。

getrusageCase では、bashtimeコマンドは rusage 構造の ru_stime および ru_utime メンバーを使用し、上記のマニュアルページに従って関連する timeval 構造のメンバーを計算します。マイクロ秒精度

timesシステムコールが使用されると、bashtimeコマンドは関連するClock_t構造体のメンバーを出力します。この正確な場合、値は実際にはクロックサイクルで報告されるため、報告された値が1 / CONFIG_HZより優れていないように正しく作成する方法があります。

timesシステムコールのマニュアルページで読んだ可能性がありますが、いくつかの理由で使用することはお勧めできません。だから私はあなたのシステム設定(HAVE_GETRUSAGE ...)がbashがそれに頼る必要がないように適していると信じています。そうでなければ…あなたは正しいです。あなたが報告した正確さは…面白いです。


A / getrusageが1 / CONFIG_HZよりもタイミングをより正確に報告できる理由: なぜなら:

Linux 2.6.21以降、Linuxは高解像度タイマー(HRT)をサポートしています。 HRTをサポートするシステムでは、スリープとタイマーのシステムコールの精度はjiffyによって制限されなくなりますが、ハードウェアが許可するほど高くなる可能性があります。マイクロ秒精度は最新ハードウェアの典型です。

この記事で読むことができるように時間とタイマーの概要


B/各システムコールの開始時にタイマーを適切に設定し、完了後すぐに読み取らずにutime / stimeの正確性をどのように取得できますか?

正確なCPU時間:どんな関係ですか?ディスパッチャー!スケジューラ完全に公平プロパティを共有し、タスク処理の義務を忘れないで、喜んで... nanosleep...
CPU時間はいくらですか? :もちろん銃!それはu_time + s_timeです。なぜなら(非常にまれな例外を除いて)、スケジューラは、タスクがどのように(そしてどのような状況で)時間を無駄にするのか全く気にしないからです。
それでは、誰がs / u時間率に興味を持っていますか? : CPU会計マニアの皆さん!

B.1/それでは…u_timeとs_timeを区別しますか? …仮説を…やろう!

(良い?)昔のLinux(<2.6。?カーネルとして知られている)では、CPU計算は一種の単純な(ism?)経験的な方法でした。一部のジョブがスケジュールされると、スケジューラーはジョブが実行されているコンテキストを記録します。

CPU会計士は、ジョブがスケジュールされてから実行されたすべての時間が、スケジュールされた時点で実行されていたコンテキストで消費されたと仮定します。

このことから、時計の正確性のために、ユーザーとシステムのCPU時間に関する個々のレポートの正確性について議論することは多少無意味であることが理解できます。何が何であるかを判断するには、単にエラーがあります。時間の経過とともにエラーが蓄積されます。ジョブの存続期間中にジョブがスケジュールまたはキャンセルされる回数を追加することがCPU時間統計愛好家に役立つ唯一の機会は、+のエラーが-のエラーを補償することを期待することです。したがって、この値の意味は何でも(別々に考慮されるので、合計は真で正確で意味があります)

B.2/バグは大丈夫ですが…それほど深刻ではありません!それでは…始めましょう…仮想で!

仮想CPUを搭載したシステムでは、実際のCPUよりも多くの仮想CPUが仮想プラットフォームで使用されている場合、実際のCPUは他の仮想プロセッサのサービスに時間の一部を費やす可能性があり、実際にプロセスを利用できないものがタイムスライスを占めるできます。いっぱい。
これは不正確であるだけでなく、完全に非現実的なs_time数値をもたらします。

簡単に言えば2.6程度になります。 ?カーネル、Linuxに付属仮想CPU時間統計他の機能の中でも、実行コンテキストが変更されるたびにCPU時間統計を提供し、あいまいではなく、正確で正確なu-timeとs-timeを可能にします。

すべてと同様に、無料のランチはありません...(CPUあたり)タイマーはどこにでもあります...かなりのオーバーヘッドが予想されます。

気にしないでください。多くの親ディストリビューション(RHEL、SUZE ...)はすぐにこの仮想CPU時間統計をデフォルト値に設定しました。

3.7から利用可能ないくつかのカーネルチューナブル(CONFIG_TICK_CPU_ACCOUNTING)のおかげで(個人的には重要ではありません。AFAIKはまだ在庫Linuxビルドのデフォルトです。)まだ(良い?)古いcheep CPUの計算方法を選択できます。 .. ..私は(個人的に)u_time + s_timeの合計にのみ興味があります。

これはみんなになります;-)

おすすめ記事