首页 文章

'real','user'和'sys'在时间(1)的输出中是什么意思?

提问于
浏览
1408
$ time foo
real        0m0.003s
user        0m0.000s
sys         0m0.004s
$

“真实”,“用户”和“系统”在时间输出中意味着什么?

在对我的应用进行基准测试时哪一个有意义?

4 回答

  • 1684

    Real, User and Sys process time statistics

    其中一件事与另一件事情不同 . 实际是指实际经过的时间; User和Sys指的是仅由进程使用的CPU时间 .

    • Real 是挂钟时间 - 从通话开始到结束的时间 . 这是所有经过的时间,包括其他进程使用的时间片和进程花费的时间(例如,如果它等待I / O完成) .

    • User 是进程内用户模式代码(内核外)花费的CPU时间 . 这只是执行过程时使用的实际CPU时间 . 流程花费的其他流程和时间不计入此数字 .

    • Sys 是进程内核中花费的CPU时间 . 这意味着执行内核中系统调用所花费的CPU时间,而不是仍在用户空间中运行的库代码 . 与'user'类似,这只是进程使用的CPU时间 . 有关内核模式(也称为'supervisor'模式)和系统调用机制的简要说明,请参见下文 .

    User+Sys 将告诉您进程使用的实际CPU时间 . 请注意,这是跨所有CPU的,因此如果进程有多个线程(并且此进程在具有多个处理器的计算机上运行),则可能超过 Real (通常发生)报告的挂钟时间 . 请注意,在输出中,这些数字包括所有子进程(及其后代)的 UserSys 时间以及它们可能被收集的时间,例如:通过 wait(2)waitpid(2) ,尽管底层系统调用会分别返回进程及其子进程的统计信息 .

    Origins of the statistics reported by time (1)

    time 报告的统计数据来自各种系统调用 . 'User'和'Sys'来自wait (2)times (2),具体取决于特定系统 . 'Real'是根据gettimeofday (2)呼叫收集的开始和结束时间计算的 . 根据系统的版本, time 也可以收集各种其他统计信息,例如上下文切换的数量 .

    在多处理器计算机上,多线程进程或分叉子进程可能会比CPU总时间小 - 因为不同的线程或进程可能并行运行 . 此外,报告的时间统计来自不同的来源,因此对于非常短的运行任务记录的时间可能受到舍入误差的影响,如原始海报给出的示例所示 .

    A brief primer on Kernel vs. User mode

    在Unix或任何受保护的内存操作系统上,'Kernel' or 'Supervisor' mode指的是CPU可以运行的privileged mode . 某些可能影响安全性或稳定性的特权操作只能在CPU以此模式运行时完成 . 这些操作不适用于应用程序代码 . 此类操作的一个示例可能是操纵MMU以获取对另一个进程的地址空间的访问权限 . 通常,user-mode代码不能这样做(有充分理由),尽管它可以从内核请求shared memory,这可以由多个进程读取或写入 . 在这种情况下,通过安全机制从内核显式请求共享内存,并且两个进程必须显式附加到它才能使用它 .

    特权模式通常称为'kernel'模式,因为内核由在此模式下运行的CPU执行 . 为了切换到内核模式,您必须发出一个特定的指令(通常称为trap),该指令将CPU切换为在内核模式下运行,并从跳转表中保存的特定位置运行代码 . 出于安全原因,您无法切换到内核模式并执行任意代码 - 陷阱通过无法写入的地址表进行管理,除非CPU以管理员模式运行 . 使用显式陷阱编号进行陷阱,并在跳转表中查找地址;内核具有有限数量的受控入口点 .

    C库中的'system'调用(特别是手册页第2节中描述的那些)具有用户模式组件,这是您实际从C程序调用的组件 . 在幕后,他们可能会向内核发出一个或多个系统调用来执行特定服务(如I / O),但它们仍然可以在用户模式下运行代码 . 如果需要,也可以从任何用户空间代码直接向内核模式发出陷阱,尽管您可能需要编写汇编语言片段来为调用正确设置寄存器 . 可以找到描述Linux内核提供的系统调用的页面以及设置寄存器的约定here.

    More about 'sys'

    您的代码无法通过用户模式执行某些操作 - 例如分配内存或访问硬件(HDD,网络等) . 这些在内核的监督下,它本身就可以做到 . 您执行的某些操作(如 mallocfread / fwrite )将调用这些内核函数,然后将计为'sys'时间 . 不幸的是,它并不像"every call to malloc will be counted in 'sys' time"那么简单 . 对 malloc 的调用将自己进行一些处理(仍然在'user'时间内计算),然后在它可能调用内核函数的某个地方(在'sys'时间内计算) . 从内核调用返回后,'user'中会有更多时间,然后 malloc 将返回到您的代码 . 至于何时发生切换,以及在内核模式下花费了多少......你不能说 . 这取决于库的实现 . 此外,其他看似无辜的功能也可能在后台使用 malloc 之类的东西,这将在'sys'再次有一些时间 .

  • 223

    Real表示流程的总周转时间;用户显示用户定义指令的执行时间,而Sys用于执行系统调用的时间!

    实时包括等待时间(I / O的等待时间等)

  • 14

    为了扩展accepted answer,我只想提供另一个原因 realuser sys .

    请记住 real 表示实际经过的时间,而 usersys 值表示CPU执行时间 . 因此,在多核系统上, user 和/或 sys 时间(以及它们的总和)实际上可能超过实时 . 例如,在我正在为类运行的Java应用程序中,我得到以下值:

    real    1m47.363s
    user    2m41.318s
    sys     0m4.013s
    
  • 9

    real :从开始到结束运行过程所花费的实际时间,好像是由带有秒表的人测量的

    user :计算期间所有CPU花费的累计时间

    sys :所有CPU在系统相关任务(如内存分配)期间所累积的时间 .

    请注意,有时用户sys可能大于real,因为多个处理器可能并行工作 .

相关问题