perf stat时间用于系统和用户的经过时间

22 浏览
0 Comments

perf stat时间用于系统和用户的经过时间

$ time foo
real        0m0.003s
user        0m0.000s
sys         0m0.004s
$

在时间输出中,realusersys分别代表什么意思?在对我的应用程序进行基准测试时,哪一个是有意义的?

real表示实际经过的时间,包括等待时间和处理时间。它是整个命令执行的总时间。

user表示CPU执行用户态程序的时间,即执行命令时CPU花费的时间。

sys表示CPU执行内核态程序的时间,即执行命令时CPU花费在内核操作上的时间。

在基准测试应用程序时,real是最有意义的,因为它给出了整个命令执行的总时间,包括等待时间和处理时间。

0
0 Comments

实际,用户和系统进程时间统计

问题出现的原因:

问题是关于实际时间(Real)和用户时间(User)以及系统时间(Sys)之间的关系。实际时间是指从调用开始到结束的实际经过的时间,用户时间是进程在用户模式下执行的CPU时间,系统时间是进程在内核中执行的CPU时间。问题提出了为什么用户时间和系统时间的总和不等于实际时间。

解决方法:

根据问题中的内容,用户时间和系统时间是通过调用系统调用wait(2)或waitpid(2)来获取的,实际时间是通过调用gettimeofday(2)来计算的。在多处理器机器上,多线程进程或创建子进程的进程的经过时间可能小于总CPU时间。同时,对于非常短的运行任务,由于时间统计来自不同的来源,可能会存在舍入误差。

此外,问题还提到了内核模式和用户模式之间的区别。内核模式是CPU可以运行的特权模式,在此模式下,CPU可以执行某些特权操作,而应用程序代码无法执行这些操作。内核模式通常被称为“内核”模式,因为内核在该模式下由CPU执行。从用户模式切换到内核模式需要发出特定的指令(通常称为陷阱),该指令将CPU切换到内核模式并从跳转表中运行代码。用户模式代码无法直接从用户空间调用内核模式,但可以通过汇编语言编写一小段代码来设置正确的寄存器进行调用。

此外,问题还提到了系统调用在C库中的实现,这些调用在幕后可能会向内核发出一个或多个系统调用以执行特定的服务,例如I/O。问题中还提到了一些操作,例如使用malloc或访问硬件,这些操作只能在内核的监督下进行,因此会计入系统时间。

最后,问题还涉及如何测量GPU计算的时间。根据回答中的描述,GPU时间不会计入进程统计,因为对GPU的调用要么会阻塞进程(强制进行上下文切换),要么是非阻塞的,在这种情况下,进程将继续运行,系统将测量进程使用的CPU时间。要测量进程使用的GPU时间,需要使用特定于GPU的基准测试工具。

最后,问题还提到了关于实际时间如何花费的更多细节的问题。根据回答,实际时间可能用于其他进程,因此使用这些调用无法确定计算机正在执行的操作。可以使用大多数Unix系统上的进程账户系统获取统计信息,但是无法使用这些调用来确定计算机正在执行的操作。

0
0 Comments

问题:为什么实际时间(real)可以超过用户时间(user)和系统时间(sys)的总和?

在多核系统中,用户时间和系统时间表示CPU执行时间,而实际时间表示实际经过的时间。因此,在多核系统中,用户时间和/或系统时间(以及它们的总和)实际上可以超过实际时间。这是因为在单线程的应用程序中,虽然程序只有一个线程在执行,但是Java虚拟机(JVM)或操作系统可以利用多个核心来执行一些额外的任务,例如垃圾回收等。此外,如果应用程序在等待文件或流时花费大量时间,实际时间也会大大超过用户时间和系统时间,因为在等待获取文件或类似资源的访问权限时不使用CPU时间。

因此,实际时间可以超过用户时间和系统时间的总和,这是由于多核系统中的额外任务执行或等待IO资源访问的影响。

解决方法:无需特别处理,这是多核系统中的正常现象。对于单线程应用程序,实际时间超过用户时间和系统时间并不表示虚拟机开销或操作系统开销,而是由于额外的任务执行或IO资源访问的等待时间。

0