Performance
工具
time 命令
首先说明两个 bash 内置的 time 命令和外部的 /usr/bin/time 命令的区别。前者不支持 -v 选项,无法查看除了 CPU 时间之外的其他信息;后者支持 -v 选项,可以查看更多信息,比如内存使用情况、I/O 情况等。前者支持别名、shell 函数、管道等,后者不支持。
time 给出了三个时间,实际时间(real time)、用户时间(user CPU time)和系统时间(system CPU time)。实际时间是从开始到结束的时间,包括了 CPU 时间、等待时间、I/O 时间等。用户时间是进程在用户态下执行的时间,包含当前进程和子进程。系统时间是进程在内核态下执行的时间,也包含当前进程和子进程。CPU 时间是用户时间和系统时间的总和。
对于单进程程序,用户时间和系统时间的总和通常小于实际时间,因为 CPU 时间不包括等待时间。对于多进程程序,用户时间和系统时间的总和可能大于实际时间,因为多个进程可能同时在运行。
等待时间包括等待 I/O 完成,这些时间不会包含在 CPU 时间中。多个进程共享 CPU,因此也可能是当前进程等待被调度执行,这些时间也是等待时间的一部分。
实际工作中,如果系统加用户时间远小于真实时间,说明程序是 I/O 密集型的,或者发生了严重的死锁/等待。如果用户时间远远大于真实时间,说明程序是计算密集型的,斌且多线程/进程并行度很高。如果系统占比很高,说明程序频繁地进行系统调用,或者频繁地进行上下文切换,这是一个危险的信号,说明程序可能存在性能问题。