Автор Тема: time - какво означават real,user и sys ?  (Прочетена 1451 пъти)

Naka

  • Напреднали
  • *****
  • Публикации: 3306
    • Профил
Пускам един дълъг, мултитаскинг скрипт и искам да измеря за колко време ще се изпълни.

Код:
time script.pl

и получавам това:
Код:
real 206m 15sec
user 309m
sys 17m

Кое какво означава и как да ги тълкувам? Винаги съм си мислил, че истинското време за което програмата ще се изпълни е 'real'(винаги първото число), но тук 'real' е много по-малко от 'user' ???

Има ли някаква корелация между real,user,sys. Например да се каже че винаги real=user+sys
да не би за мултитаскинг програма нещата да са различни?


« Последна редакция: Oct 16, 2011, 12:51 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: time - какво означават real,user и sys ?
« Отговор #1 -: Oct 16, 2011, 13:15 »
Цитат
Например да се каже че винаги real=user+sys

Не, не можеш да кажеш такова нещо. Може да бъде и далеч повече и далеч по-малко. User и sys показват времето, в което програмата ти е била в running state и се е изпълнявала върху някой процесор/ядро (демек не е чакала в runqueue). Много елементарен и груб пример е да пробваш time sleep 1. Real time ще ти е около секунда, user и sys вероятно ще клонят към нула.

Алтернативно, многонишково приложение, което е CPU-интензивно и се изпълнява върху многоядрена система, ще даде по-висок user+sys спрямо "real".
Активен

"Knowledge is power" - France is Bacon

Naka

  • Напреднали
  • *****
  • Публикации: 3306
    • Профил
Re: time - какво означават real,user и sys ?
« Отговор #2 -: Oct 17, 2011, 15:52 »
Да разбирам, ли че при една мулти-процесорна програма 'user' е сборът от времената на всички процеси, които програмата пуска и затова в моят случай получавам 'real'<'user',

т.е. ако имаме идеално приложение - което да може да са паралелезира на 100%, като пренебрегнем и другите програми - т.е. нищо да не и пречи (а и syscalls==0)

ще имаме нещо такова
при 1 процесор:
Код:
real 100m
user 100m
sys 0m

при 2 процесора:
Код:
real 50m
user 100m   (50m+50m)
sys 0m

Ако това е долу-горе така може ли user/real да е показател колко печелим от мулти-thread-а?

« Последна редакция: Oct 17, 2011, 15:54 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: time - какво означават real,user и sys ?
« Отговор #3 -: Oct 17, 2011, 16:32 »
Това би било валидно само и единствено ако нишките през цялото време са били в running state и операционната система приоритетно ги е изпълнявала. Ако създадеш няколко нишки (но не повече от броя на ядрата), които въртят един безкраен цикъл и системата не е натоварена с други неща, ще получиш ситуация близка до твоята, не точно 100/100/0, но близо.


Това не е добър индикатор колко печелиш от паралелизацията. Не е казано че приложението е CPU-bound, може нишките да четат от сокети или файлове (блокираща операция, при която task-а минава в sleeping state и доброволно "сдава" процесора). Примерно ако четеш от голям файл, няма почти никаква файда от вдигането на няколко нишки, които четат парчета от файла (по-вероятно е дори да съсипеш бързодействието, заради повечето seek операции по диска).

И като цяло, не е добра метрика това. Ако много добре знаеш как работи приложението - може и да бъде донякъде индикативно.
Активен

"Knowledge is power" - France is Bacon