time ls有时不显示real/user/sys是因为触发了shell内置time关键字,仅输出简略real时间;要获得完整三段时间,须显式调用/usr/bin/time -p ls。

直接用 time 就行,但得注意它有两个“身份”,用错就看不到详细时间分项。
为什么 time ls 有时不显示 real/user/sys?
因为 shell 内置的 time 关键字(比如 Bash 的)默认输出简略——只显示 real 时间,且格式不可控。它不是 GNU 版本,不支持 -p 或自定义格式。
- 运行
type -a time,你会看到:time is a shell keyword和time is /usr/bin/time - 只输
time cmd,触发的是 shell 关键字,输出像:0.008s,没分项 - 要完整三段时间(real/user/sys),必须显式调用:
/usr/bin/time -p cmd - 某些发行版(如 Alpine)可能没预装 GNU time,需
apk add time或等价命令
/usr/bin/time -v 能看到什么额外信息?
-v(verbose)会输出几十行资源使用详情,远超时间本身,适合调试性能瓶颈。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 除了
real/user/sys,还包括:页面错误次数、上下文切换数、最大驻留集大小(Maximum resident set size) - 注意:
-v输出是英文且固定格式,不适合脚本解析;想自动化提取,优先用-f自定义格式,例如:/usr/bin/time -f "real:%e user:%U sys:%S" ls -
%e= real 秒数(浮点),%U= user 秒数,%S= sys 秒数;%M是峰值内存 KB 数
想测后台进程或已运行进程的耗时怎么办?
time 只能测**启动瞬间开始计时**的命令,对已运行的进程无效。这时得换工具。
- 查**已运行进程的累计 CPU 时间**:用
ps -o pid,comm,utime,stime,etime -p <pid></pid>,其中utime和stime是用户态/内核态累计秒数(整数),etime是启动至今的秒数(含休眠) - 查**实时运行时长**(比如某个服务跑了多久):
ps -o pid,comm,etime -C nginx,etime值就是秒数,可转成时分秒(awk '{printf "%d:%02d:%02d\n", $4/3600, ($4%3600)/60, $4%60}') - 别用
top看单次执行时间——它的TIME+列是该进程**自启动以来所有 CPU 时间总和**(单位厘秒),不是某次调用耗时
真正容易被忽略的点:real ≠ user + sys —— 当命令大量等待 I/O(比如读慢盘、等网络响应),real 会显著大于二者之和;而如果你在容器或虚拟机里跑 time,系统时间(sys)可能包含 Hypervisor 开销,数值未必反映宿主机真实内核行为。










