通过 sar 命令获取用户态内核态运行时间
sar
命令介绍
sar - Collect, report, or save system activity information.
sar
命令用于获取 Linux 进程分别在用户态和内核态运行的时间比例,通过一定周期采集数据,可以看到每个 CPU 核心的工作负载,sar
命令可以用来分析性能。
如果系统不识别 sar
命令,则需要安装 sysstat
工具:
1 | sudo apt install sysstat |
sar
命令使用
命令 sar -P ALL 1
用来查看当前系统下所有的 CPU 信息,用 Ctrl+C 暂停运行后就会自动输出已采集的数据平均值。其中,all 字段是 CPU 两个核的平均值,下面是 0 和 1 两个核的具体值。
各字段含义:
- % user 用户空间的 CPU 使用
- % nice 改变过优先级的进程的 CPU 使用率
- % system 内核空间的 CPU 使用率
- % iowait CPU 等待 IO 的百分比
- % steal 虚拟机的虚拟机 CPU 使用的 CPU
- % idle 空闲的 CPU
%user
和 %nice
字段相加的值是用户态下的运行时间比例,%system
字段值是内核态的时间比例。
测试用户态执行时间
loop.c
死循环测试用例:
1 | int main(void) |
命令 sar -P ALL 1 1
第四个参数制定采集的次数,这里只采集一次。可以发现 CPU 占用率达 50%,则可以说明这个死循环测试用例几乎占满了用户态时间。由于测试环境是虚拟机,结果可能不同,感觉虚拟机 50% 应该就是本机 100% 的意思。如果在本机测试,CPU 占用率应该接近 100%。
测试内核态执行时间
loop_ppid.c
测试用例如下,在死循环里一直执行系统调用来获取父进程 pid:
1 | #include <sys/types.h> |
可以看出,在采集信息的这一秒内,用户态和内核态时间比例大约 26:24,这里虚拟机显示的总和 50 应该就是宿主机 100 的意思。这个测试用例中,会涉及到 main 函数中的循环处理(属于用户态)和内核执行系统调用的过程(属于内核态)。