ビデオ ファイルを変換するスクリプトがあり、それをテスト データでサーバー上で実行し、その時間を測定しますtime
。結果は次のようになりました。
real 2m48.326s
user 6m57.498s
sys 0m3.120s
なぜ実時間はユーザー時間よりもずっと短いのでしょうか? これはマルチスレッドと関係があるのでしょうか? それとも他に何かあるのでしょうか?
編集:そして、そのスクリプトは2分48秒くらいで実行されていたと思います
答え1
リアルタイムは通常他の 2 つよりも大きいため、表示される出力は少し奇妙です。
Real
時間は壁時計の時間です。(ストップウォッチで計測できる時間)User
時間はプロセス内でユーザーモードで費やされた時間の量ですSys
プロセス内のカーネルで費やされた CPU 時間です。
したがって、作業が複数のプロセッサによって同時に実行された場合、CPU 時間は経過したウォールクロック時間よりも長くなると考えられます。
これは同時実行/マルチスレッド/並列タイプのアプリケーションでしたか?
一例として、これは Linux システムでコマンドを発行したときに得られる結果ですtime find .
。予想どおり、経過real
時間は、この単一ユーザー/単一コア プロセスでは他のものよりもはるかに長くなっています。
real 0m5.231s
user 0m0.072s
sys 0m0.088s
経験則は次のとおりです。
- real < user: プロセスは CPU にバインドされており、複数のコア/CPU での並列実行を活用します。
- 実数 ≈ ユーザー: プロセスは CPU にバインドされており、並列実行の利点を活用しません。
- real > user: プロセスは I/O バウンドです。複数のコアで実行してもほとんど利点はありません。
答え2
これまで述べてきたことを説明すると、2 つのスレッド プロセスが何らかの計算を実行します。
/*a.c/*
#include <pthread.h>
static void * dosomething () {
unsigned long a,b=1;
for (a=1000000000; a>0; a--) b*=3;
return NULL;
}
main () {
pthread_t one, two;
pthread_create(&one,NULL, dosomething, NULL);
pthread_create(&two,NULL, dosomething, NULL);
pthread_join (one, NULL);
pthread_join (two, NULL);
}
/* end of a.c */
コンパイル
gcc a.c -lpthread
(これは単なる説明であり、実際には -D_REENTRANT フラグを追加する必要があります)
$ time ./a.out
real 0m7.415s
user 0m13.105s
sys 0m0.032s
(時間は 2 つの低速コアを持つ Intel Atom 上でのものです :) )
答え3
マルチスレッド プログラムである必要はありません。複数のプロセスで同じ効果を得ることができます。私は簡単な数値計算を行う C プログラムを書きました。
$ time ./runner
real 1m12.746s
user 1m12.493s
sys 0m0.015s
次に、プロセスのコピーを 2 つ実行するスクリプトを作成しました。
$ cat run_script
#!/bin/sh
./runner &
./runner &
wait
$ time ./run_script
real 1m31.231s
user 3m0.538s
sys 0m0.215s
答え4
レヴォンはこう言った。
私はi7(8プロセッサ)を持っているので、次のように実行しますbash
。
$ time for ((i=0;i<1000000;i++)); do echo $i; done | wc -l
1000000
real 0m4,878s
user 0m4,368s
sys 0m3,083s
次に、bashを1つのプロセッサに制限すると、taskset -cp 0 $BASHPID
$ taskset -cp 0 $BASHPID
pid 30551's current affinity list: 0-7
pid 30551's new affinity list: 0
結果は
$ time for ((i=0;i<1000000;i++)); do echo $i; done | wc -l
1000000
real 0m7,120s
user 0m4,282s
sys 0m2,824s
https://www.looklinux.com/how-to-run-process-or-program-on-specific-cpu-cores-in-linux/