ビデオファイルを変換するスクリプトがあり、テストデータに基づいてサーバー上で実行して時間を測定します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
経験則は次のとおりです。
- 実際の<ユーザー:プロセスはCPUにバインドされており、複数のコア/ CPUで並列実行を利用します。
- 実際の≒ユーザー:プロセスはCPUに縛られ、並列実行を利用しません。
- 物理>ユーザー:プロセスは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/