비디오 파일을 변환하는 스크립트가 있는데 테스트 데이터를 기반으로 서버에서 실행하고 시간을 측정합니다 time
. 결과적으로 나는 다음을 본다:
real 2m48.326s
user 6m57.498s
sys 0m3.120s
실시간 시간이 사용자 시간보다 훨씬 낮은 이유는 무엇입니까? 이것이 멀티스레딩과 관련이 있나요? 아니면 또 뭐야?
편집하다:스크립트가 2분 48초 정도 실행된 것 같아요
답변1
실시간은 일반적으로 다른 두 가지보다 크기 때문에 표시되는 출력은 약간 이상합니다.
Real
시간은 벽시계 시간입니다. (스톱워치를 사용하여 측정할 수 있습니다)User
시간은 프로세스 내에서 사용자 모드로 보낸 시간입니다.Sys
프로세스 내에서 커널이 소비한 CPU 시간입니다.
따라서 작업이 여러 프로세서에 의해 동시에 수행되면 CPU 시간이 사용되는 벽시계 시간보다 높을 것입니다.
동시/다중 스레드/병렬 유형 애플리케이션입니까?
예를 들어, 이것은 Linux 시스템에서 명령을 실행할 때 얻는 결과입니다 time find .
. 예상한 대로 real
이 단일 사용자/단일 코어 프로세스에서는 다른 프로세스보다 훨씬 오래 걸립니다.
real 0m5.231s
user 0m0.072s
sys 0m0.088s
경험 법칙은 다음과 같습니다.
- 실제 < 사용자: 프로세스는 CPU에 바인딩되어 있으며 여러 코어/CPU에서 병렬 실행을 활용합니다.
- 실제 ≒ 사용자: 프로세스는 CPU에 묶여 있으며 병렬 실행을 활용하지 않습니다.
- 실제 > 사용자: 프로세스가 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/