通过 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 两个核的具体值。

image-20230104151720278

各字段含义:

  • % user 用户空间的 CPU 使用
  • % nice 改变过优先级的进程的 CPU 使用率
  • % system 内核空间的 CPU 使用率
  • % iowait CPU 等待 IO 的百分比
  • % steal 虚拟机的虚拟机 CPU 使用的 CPU
  • % idle 空闲的 CPU

%user%nice 字段相加的值是用户态下的运行时间比例,%system 字段值是内核态的时间比例。

测试用户态执行时间

loop.c 死循环测试用例:

1
2
3
4
5
int main(void)
{
for(;;)
;
}

命令 sar -P ALL 1 1 第四个参数制定采集的次数,这里只采集一次。可以发现 CPU 占用率达 50%,则可以说明这个死循环测试用例几乎占满了用户态时间。由于测试环境是虚拟机,结果可能不同,感觉虚拟机 50% 应该就是本机 100% 的意思。如果在本机测试,CPU 占用率应该接近 100%。

image-202301041550695

测试内核态执行时间

loop_ppid.c 测试用例如下,在死循环里一直执行系统调用来获取父进程 pid:

1
2
3
4
5
6
7
#include <sys/types.h>
#include <unistd.h>

int main(void) {
for(;;)
getppid();
}

可以看出,在采集信息的这一秒内,用户态和内核态时间比例大约 26:24,这里虚拟机显示的总和 50 应该就是宿主机 100 的意思。这个测试用例中,会涉及到 main 函数中的循环处理(属于用户态)和内核执行系统调用的过程(属于内核态)。

image-20230104160645849