У меня есть скрипт, конвертирующий видеофайлы, и я запускаю его на сервере на тестовых данных и измеряю его время по time
. В результате я увидел:
real 2m48.326s
user 6m57.498s
sys 0m3.120s
Почему реальное время настолько меньше пользовательского? Имеет ли это какое-то отношение к многопоточности? Или к чему-то еще?
Редактировать:И я думаю, что этот сценарий длился около 2 минут 48 секунд.
решение1
Показанный вами вывод немного странный, поскольку реальное время обычно больше двух других.
Real
время - это время на настенных часах (то, что мы можем измерить секундомером)User
время — это количество времени, проведенное в пользовательском режиме в рамках процессаSys
время ЦП, затрачиваемое ядром в рамках процесса.
Поэтому я предполагаю, что если бы работа выполнялась несколькими процессорами одновременно, время ЦП было бы больше, чем затраченное время настенных часов.
Был ли это тип приложения параллельным/многопоточным/конкурентным?
Просто в качестве примера, вот что я получаю на своей системе Linux, когда даю команду time find .
. Как и ожидалось, прошедшее real
время намного больше, чем у других в этом однопользовательском/одноядерном процессе.
real 0m5.231s
user 0m0.072s
sys 0m0.088s
Правило большого пальца таково:
- real < user: Процесс ограничен ЦП и использует преимущества параллельного выполнения на нескольких ядрах/ЦП.
- real ≈ user: Процесс ограничен процессором и не использует преимущества параллельного выполнения.
- real > user: Процесс ограничен вводом-выводом. Выполнение на нескольких ядрах не принесет практически никаких преимуществ.
решение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/