我有一個轉換視訊檔案的腳本,我在伺服器上根據測試資料運行它並通過 測量其時間time
。結果我看到:
real 2m48.326s
user 6m57.498s
sys 0m3.120s
為什麼即時時間比使用者時間低很多?這和多執行緒有什麼關係嗎?或者還有什麼?
編輯:我認為該腳本運行了大約 2 分 48 秒
答案1
您顯示的輸出有點奇怪,因為即時通常會比其他兩個更大。
Real
時間是掛鐘時間。 (我們可以用秒錶測量)User
time 是進程內使用者模式所花費的時間量Sys
是進程內核心花費的 CPU 時間。
所以我想如果工作是由多個處理器同時完成的,CPU 時間將高於所使用的掛鐘時間。
這是並發/多執行緒/並行類型的應用程式嗎?
舉個例子,這是我發出指令時在 Linux 系統上得到的結果time find .
。正如預期的那樣,real
在這個單一用戶/單核心進程上,所花費的時間比其他進程要長得多。
real 0m5.231s
user 0m0.072s
sys 0m0.088s
經驗法則是:
- real < user:進程受 CPU 限制,並利用多核心/CPU 上的平行執行。
- real ≈ user:此程序受 CPU 限制,且不利用並行執行。
- real > user:流程受 I/O 限制。在多個核心上執行幾乎沒有優勢。
答案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
(時間是在具有兩個慢速核心的 Intel Atom 上:))
答案3
它不需要是多線程程序;您可以透過多個進程獲得相同的效果。我寫了一個 C 程式來進行一些簡單的數字運算:
$ time ./runner
real 1m12.746s
user 1m12.493s
sys 0m0.015s
然後我編寫了一個腳本來運行該進程的兩個副本:
$ 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 限制為一個進程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/