现象

前两天遇到一个奇怪现象,仅cpu的us值负载高,其他值都很低。具体如下:

1、使用top或atop查看,发现仅cpu的us值高,导致整体cpu高;截图如下

2、通过监控发现,高峰期比较规律,一般为每小时的前20分钟,之后峰值就自动下去恢复到正常状态,期间执行任何命令都很流畅;

3、该主机运行mongo服务和其他两台共同组成集群模式,其他主机未出现这种情况。

 top截图:进程上未看到高负载的进程,系统负载也低、cpu的wa值也很低,只有cpu的us值高,id值相应也下降。

定位[仅cpu的us负载高]进程--pidstat_用户态

    分别看全部cpu核数us值几乎都很高,sy值很低。

定位[仅cpu的us负载高]进程--pidstat_用户态_02

 atop中显示cpu的us值都有好几个cpu的us值100%,sy值却很低。进程依然看不到高负载。

定位[仅cpu的us负载高]进程--pidstat_us和sy值区别_03

分析过程

1、了解cpu的us和sy值含义

了解cpu的us和sy值分别在系统中代表什么意思,是进程或线程还是磁盘或缓存等信息;

定位[仅cpu的us负载高]进程--pidstat_us和sy值区别_04

top截图中,其中 87.1% us 表示的为用户占用了 87.1%的 CPU 时间,主要为所运行的应用程序对 CPU 的消耗;0.2% sy 表示的为系统占用了0.2%的 CPU 时间, 主要为系统切换所消耗的 CPU; 0.0% ni 表示被 nice 命令改变优先级的任务所占用的 CPU 时间的百分比; 12.6.0% id 表示 CPU 的空闲时间所占的百分比为 12.6%; 0.0% wa 表示的为在执行的过程中等待 IO 所占用的 CPU 的百分比为 0%; 0.0% hi 表示的为硬件中断所占用的 CPU 时间百分比为 0.2%; 0.0% si 表示的为软件中断所占用的 CPU 时间的百分比为 0.0%。对于多个或多核的 CPU, 上面的显示则会是多个 CPU 所占用的百分比的总和。

具体us和sy解释:

us 用户空间占用CPU百分比 ,sy 内核空间占用CPU百分比

用户 CPU 使用率,包括用户态 CPU使用率(user)和低优先级用户态 CPU使用率(nice),表示 CPU 在用户态运行运行的时间百分比用户 CPU 使用率高,通常说明有应用程序比较繁忙。

系统 CPU 使用率,表示 CPU 在内核态运行时间百分比(不包括中断)。系统 CPU 使用率高,说明内核比较繁忙。

4G的进程地址空间(内存)被人为的分为两个部分–用户空间与内核空间。用户空间从0到3G(0xc0000000),内核空间占据3G到4G。用户进程通常情况下只能访问用户空间的虚拟地址,不能访问内核空间的虚拟地址。例外情况只有用户进程进行系统调用(代表用户进程在内核态执行)等时刻可以访问到内核空间。  所以内核的操作占用内核空间,进程的操作占用进程空间

用户空间对应进程,所以每当进程切换,用户空间就会跟着变化;而内核空间是由内核负责映射,它并不会跟着进程变化,是固定的。内核空间地址有自己对应的页表,用户进程各自有不同的页表。

每个进程的用户空间都是完全独立、互不相干的。

举个例子 说明下这个百分比

比如一秒内有100个cpu时间片,这个cpu时间片就是cpu工作的最小单位。那么这100个cpu时间片在不同的区域和目的进行操作使用,就代表这个区域所占用的cpu时间比。也就是这里得出的cpu时间百分比。这里的区域指的是用户空间区域和内核空间区域。

比如下面一个程序:将文件从磁盘的src原位置拷贝到磁盘的dst目标位置

定位[仅cpu的us负载高]进程--pidstat_内核空间_05

  将文件从磁盘的src原位置拷贝到磁盘的dst目标位置----文件会从src先读取进入到内核空间,然后再读取到用户空间,然后拷贝数据到用户空间的buf上,再通过用户空间,内核空间,数据才到磁盘的dst上。

所以从上面这个程序来看,cpu消耗在kernel space的时候就是sy(系统态使用的cpu百分比),cpu消耗在user space的时候就是us(用户态使用的cpu百分比)

2、定位消耗资源的进程

通过命令去找消耗us或sy的资源的进程,使用 mpstat 或pidstat

pidstat 是sysstat软件套件的一部分,sysstat包含很多监控linux系统状态的工具,它能够从大多数linux发行版的软件源中获得。如果没有则需要安装 sysstat工具,执行 yum insall  sysstat,

pidstat 命令是 sysstat 工具的一个命令,用来监控全部或者指定进程的CPU、内存、线程、设备IO等系统资源的占用情况。pidstat 首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令之后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。pidstat可以监控到进程级别的信息;这就意味着我们就可以直接定位问题源头。

   pidstat查看cpu的us或sy消耗: pidstat

定位[仅cpu的us负载高]进程--pidstat_内核空间_06

常用的例子:

pidstat    2 1  ##运行2次,间隔1秒,统计cpu的情况;
pidstat -d 2 1  ##运行2次,间隔1秒,统计磁盘io的情况;
pidstat -r 2 3  ##运行2次,间隔3秒,统计内存的情况;
pidstat -w 2 5  ##运行2次,间隔5秒,统计上下文切换的情况;
pidstat -t -p {pid号}  ##指定进程号的统计情况;
pidstat -C -G 关键字   ##显示匹配关键字的进程统计情况

初步结论

确定mongo进程导致,和业务的计划任务有关。


通过对比同集群中其他节点cpu的us和sy值确定。

定位[仅cpu的us负载高]进程--pidstat_内核空间_07