共计 6181 个字符,预计需要花费 16 分钟才能阅读完成。
这篇“Linux 中怎么查看 CPU 利用率”文章的知识点大部分人都不太理解,所以丸趣 TV 小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux 中怎么查看 CPU 利用率”文章吧。
1. 指标范围
1.1 User mode CPU utilization+ System mode CPU utilization
合理值:60-85%,如果在一个多用户系统中 us+sy 时间超过 85%,则进程可能要花时间在运行队列中等待,响应时间和业务吞吐量会受损害;us 过大,说明有用户进程占用很多 cpu 时间,需要进一步的分析其它软硬件因素;sy 过大,说明系统管理方面花了很多时间,说明该系统中某个子系统产生了瓶颈,需要进一步分析其它软硬件因素。
1.2 Wa(wait)
参考值:小于 25%,超过 25% 的 wa 的值可以表示子系统可能没有被正确平衡,也可能是磁盘密集工作负载的结果,系统的磁盘或其它 I / o 可能有问题,可以通过 iostat/SAR ndash;C 命令进一步分解分析
1.3 Id(idle)
参考值:大于 40,如果 r 经常大于 4,且 id 经常小于 40,表示 cpu 的负荷很重
1.4 r
参考值:小于 4,队列大于 4 时,表明系统的 cpu 或内存可能有问题,如果 r 经常大于 4,且 id 经常少于 40,表示 cpu 的负荷很重。当队列变长时,队列中进程在等待 cpu 调度执行时所花的时间会变长
1.5 判断 cpu 瓶颈的方法
很慢的响应时间(slow response time)
Cpu 的空闲时间为零(zero percent idle cpu)
过高的用户占用 cpu 时间(high percent user cpu)
过高的系统占用 cpu 时间(high percent system cpu)
长时间的有很长的运行进程队列(large run queue size sustained over time)
2. 如何查看 cpu 利用率
2.1 使用 top 命令查看
数据来自 /proc/stat 文件
%us =(User time + Nice time)/CPU 时间 *100% %sy=(System time + Hardirq time +Softirq time)/ CPU 时间 *100% %id=(Idle time)/CPU 时间 *100% %ni=(Nice time)/CPU 时间 *100% %wa=(Waiting time)/CPU 时间 *100% %hi=(Hardirq time)/CPU 时间 *100% %si=(Softirq time)/CPU 时间 *100% %st=(Steal time)/CPU 时间 *100%
备注:top 命令默认情况下,是每 3 秒刷新一次。也可以通过 top -d 刷新时间间隔 来指定刷新频率,如 top -d 0.1 或 top -d 0.01 等。top 执行时,也可以按“s”键,修改时间间隔。
2.2 使用 vmstat 查看
r 表示运行队列的大小,b 表示由于 IO 等待而的线程数量,in 表示中断的数量,cs 表示上下文切换的数量。
2.3 其它查看方式
Iostat、sar -q、sar ndash;u 等
3. CPU 介绍
3.1 内核中的时间
HZ 是系统时钟在一秒内固定发出时钟中断的次数。HZ 在编译内核前是可以进行配置的,因此通过下述命令就可以查看当前系统的时钟中断频率:cat /boot/config-`uname -r` | grep CONFIG_HZ
tick 为系统时钟每“滴答“一次的时间,其值为 (1/HZ) 秒。也就是连续两次时钟中断之间的时间间隔。
jiffies 用来计算自系统启动以来 tick 的次数,也就是说系统时钟每产生一次时钟中断,该变量的值就增加一次。
3.2 CPU 时间组成
CPU 的工作时间由三部分组成:用户态时间、系统态时间和空闲态时间。具体的组成为:
CPU 时间包含 User time、System time、Nice time、Idle time、Waiting time、Hardirq time、Softirq time、Steal time
空闲态时间 ==idle time
用户态时间 ==user time+ Nice time。
内核态时间 ==system time+ Hardirq time+ Softirq time。
user time。指 CPU 在用户态执行进程的时间。
system time。指 CPU 在内核运行的时间。
nice time。指系统花费在调整进程优先级上的时间。
idle time。系统处于空闲期,等待进程运行。
waiting time。指 CPU 花费在等待 I / O 操作上的总时间,与 ed 相似。
steal time。指当前 CPU 被强制 (involuntary wait) 等待另外虚拟的 CPU 处理完毕时花费的时间,此时 hypervisor 在为另一个虚拟处理器服务。
Softirq time、Hardirq time。分别对应系统在处理软硬中断时候所花费的 CPU 时间。
3.3 User mode CPU utilization
%usr。显示了用户方式下所花费 CPU 时间的百分比,用户使用 CPU 的进程包括:cpu 运行常规用户进程,cpu 运行 niced process,cpu 运行实时进程。一个进程可以在用户方式下执行,也可以在系统 (内核) 方式下执行,当一个进程在内核代码中运行时,我们称其处于内核态; 当一个进程正在执行用户自己的代码时,我们称其处于用户态,在用户方式下执行时,进程在它自己的应用代码中执行,不需要内核资源来进行计算、管理内存或设置变量
3.4 System mode CPU utilization
显示了系统方式下所花费 cpu 时间的百分比,包括内核进程 (kprocs) 和其他需要访问内核资源的进程所消耗的 cpu 资源,系统使用 cpu 的进程包括:用于系统调用,用于 I / O 管理(中断和驱动),用于内存管理(paging and swapping),用于进程管理(context switch and process start),如果一个进程需要内核资源,它必须执行一个系统调用,并由此切换到系统方式从而使该资源可用。
3.5 %wa(wait)
显示了暂挂本地磁盘 I / O 和 NFS 加载的磁盘的 cpu 空闲百分比,是由于进程等待 I / O 而使 cpu 处于空闲状态的比率,I/ O 主要包括:I/O,raw I/O,VM-paging/swapins。如果在 wait 运行时至少有一个未完成的磁盘 I /O,该事件就归为 I / O 等待时间,对磁盘的 I / O 请求会导致调用的进程阻塞(或睡眠),直到请求完成为止,一旦进程的 I / O 请求完成,该进程就放入运行队列中。如果 I / O 很快完成,该进程可以使用更多的 cpu 时间。
3.6 %id(idle)
除了上面的 WIO 以外的空闲情况,显示了没有本地 I / O 时 cpu 空闲或等待的时间百分比。如果没有线程可以执行(运行队列为空),系统分派一个叫做 wait 的线程,可称为 idle kproc。如果 ps 报告显示这个线程的总计时间较高,这表明存在时间段,其中没有其它线程准备在 cpu 上运行或等待执行。系统因此大部分时间空闲或等待新任务。
3.7 r(runq-sz)
运行进程队列的长度。对于可运行状态的进程个数的大小,这些进程在内存中准备就绪
4. 概念介绍
4.1 用户模式 + 内核模式
一般说来,一个进程在 CPU 上运行可以有两种运行模式,既可在用户模式下运行,又可在内核模式下运行 (即进程分别工作在用户态和内核态,在内核态工作仍旧是这个进程,除非进行了进程的切换)。通常操作系统把虚拟地址空间划分为用户空间和内核空间,例如 x86 平台的 Linux 系统虚拟地址空间是 0x00000000~0xffffffff,前 3GB(0x00000000~0xbfffffff) 是用户空间,后 1GB(0xc0000000~0xffffffff)是内核空间。用户加载到用户空间,在用户模式下执行,不能访问内核中的数据,也不能跳转到内核代码中执行。这样可以保护内核,如果一个进程访问了非法地址,顶多这一个进程崩溃,而不会影响到内核和整个系统的稳定性。
Cpu 在产生中断或异常时不仅会跳转到中断或异常服务城西,还会自动切换模式,从用户模式切换到特权模式,因此从中断或异常程序可以跳转到内核代码中执行。事实上,整个内核就是由各种中断和异常处理程序组成的。即,正常情况下处理器在用户模式执行用户程序,在中断或异常情况下处理器切换到特权模式执行内核程序,处理完中断或异常之后再返回用户模式继续执行用户程序,例如,用户进程 A 调用了内核系统调用来获取当前的时钟滴答数,在执行用户进程 A 中的系统调用指令时会保存当前用户进程的 IP,CS 等当前状态,然后再跳转到内核空间 (即内核代码区域) 去执行像应的系统调用函数,获取当前的时钟滴答数。执行完后再通过 IRET 指令返回到进程 A 中(就是将进入时保存的信息再复位到相应的寄存器中),再接着从 CS:EIP 地址开始执行 A 进程的指令。
进程在创建的时候除了创建进程的控制块之外,在内核里还创建了进程的内核栈,进程通过系统调用 (例如 fopen() 或者 open())进入内核后,此时处理器处于特权级 *** 的 (0 级) 内核代码中执行,当进程处于内核态时,执行的内核代码会使用当前进程的内核栈,是指向在进程的上下文上的,
内核模式的权限高于用户模式的权限。
用户级。系统用户可以与进行交互操作,如运行应用和系统命令,用户级通过系统调用接口访问内核级; 内核级。操作系统自动运行一些功能,它们主要对硬件进行操作
4.2 进程调度
任何进程要想占有 CPU,从而真正处于执行状态,就必须经由进程调度。进程调度机制主要涉及到调度方式、调度时机和调度策略。
1. 调度方式
Linux 内核的调度方式基本上采用“抢占式优先级”方式,即当进程在用户模式下运行时,不管是否自愿,在一定条件下(如时间片用完或等待 I /O),核心就可以暂时剥夺其运行而调度其它进程进入运行。但是,一旦进程切换到内核模式下运行,就不受以上限制而一直运行下去,直至又回到用户模式之前才会发生进程调度。
Linux 系统中的调度策略基本上继承了 Unix 的以优先级为基础的调度。就是说,核心为系统中每个进程计算出一个优先权,该优先权反映了一个进程获得 CPU 使用权的资格,即高优先权的进程优先得到运行。核心从进程就绪队列中挑选一个优先权 *** 的进程,为其分配一个 CPU 时间片,令其投入运行。在运行过程中,当前进程的优先权随时间递减,这样就实现了“负反馈”作用:经过一段时间之后,原来级别较低的进程就相对“提升”了级别,从而有机会得到运行。当所有进程的优先权都变为 0 时,就重新计算一次所有进程的优先权。
2. 调度策略
Linux 系统针对不同类别的进程提供了三种不同的调度策略,即 SCHED_FIFO、SCHED_RR 及 SCHED_OTHER。
SCHED_FIFO 适合于实时进程,它们对时间性要求比较强,而每次运行所需的时间比较短,一旦这种进程被调度开始运行后,就要一直运行到自愿让出 CPU,或者被优先权更高的进程抢占其执行权为止。
SCHED_RR 对应“时间片轮转法”,适合于每次运行需要较长时间的实时进程。一个运行进程分配一个时间片(如 200 毫秒),当时间片用完后,CPU 被另外进程抢占,而该进程被送回相同优先级队列的末尾。SCHED_OTHER 是传统的 Unix 调度策略,适合于交互式的分时进程。这类进程的优先权取决于两个因素,一个因素是进程剩余时间配额,如果进程用完了配给的时间,则相应优先权为 0; 另一个是进程的优先数 nice,这是从 Unix 系统沿袭下来的方法,优先数越小,其优先级越高。
nice 的取值范围是 19-20。用户可以利用 nice 命令设定进程的 nice 值。但一般用户只能设定正值,从而主动降低其优先级; 只有特权用户才能把 nice 的值置为负数。进程的优先权就是以上二者之和。核心动态调整用户态进程的优先级。这样,一个进程从创建到完成任务后终止,需要经历多次反馈循环。当进程再次被调度运行时,它就从上次断点处开始继续执行。对于实时进程,其优先权的值是(1000+ 设定的正值),因此,至少是 1000。所以,实时进程的优先权高于其它类型进程的优先权。另外,时间配额及 nice 值与实时进程的优先权无关。如果系统中有实时进程处于就绪状态,则非实时进程就不能被调度运行,直至所有实时进程都完成了,非实时进程才有机会占用 CPU。
后台命令 (在命令末尾有 符号,如 gcc f1.c ) 对应后台进程 (又称后台作业),后台进程的优先级低于任何交互(前台) 进程的优先级。所以,只有当系统中当前不存在可运行的交互进程时,才调度后台进程运行。后台进程往往按批处理方式调度运行。
3. 调度时机
核心进行进程调度的时机有以下几种情况:
(1)当前进程调用系统调用 nanosleep()或 pause()使自己进入睡眠状态,主动让出一段时间的 CPU 使用权;
(2)进程终止,*** 地放弃对 CPU 的使用;
(3)在时钟中断处理程序执行过程中,发现当前进程连续运行的时间过长;
(4)当唤醒一个睡眠进程时,发现被唤醒的进程比当前进程更有资格运行;
(5)一个进程通过执行系统调用来改变调度策略或降低自身的优先权(如 nice 命令),从而引起立即调度。
4. 调度算法
进程调度的算法应该比较简单,以便减少频繁调度时的系统开销。Linux 执行进程调度时,首先查找所有在就绪队列中的进程,从中选出优先级 *** 且在内存的一个进程。如果队列中有实时进程,那么实时进程将优先运行。如果最需要运行的进程不是当前进程,那么当前进程就被挂起,并且保存它的现场所涉及的一切机器状态,包括计数器和 CPU 寄存器等,然后为选中的进程恢复运行现场。
4.3 用户级线程与内核级线程
在许多类 Unix 系统中,如 Linux、FreeBSD、Solaris 等,进程一直都是操作系统内核调用的最小单位,也都采用多进程模型。后来引入了线程概念,有以下两种概念的线程:
用户级线程(User-Level Thread,ULT)。由应用进程利用线程库创建和管理,不在内核中实现线程,只在用户态中模拟出多线程,不依赖于核心,操作系统内核完全不知道多线程的存在。
内核线线程(Kernel-Level Thread,KLT),又称为内核支持的线程或轻量级进程。是在核心空间实现的,内核为每个线程在核心空间中设置了一个线程控制块,用来登记该线程的线程标识符、值、状态、优先级等信息,所有对线程的操作,如创建、撤销和切换都是通过系统功能调用由内核中的相应处理完成,内核维护进程及线程的上下文切换以及线程切换,类系统中一般通过修改进程的实现方式来实现,可以使用不完全的进程创建方式创建共享数据空间的进程,在 Linux 下这种系统调用为 clone(),而在 FreeBSD 下它为 rfork()。
5. 常见误区
5.1 Cpu 利用率很高就是 cpu 资源不够
出现 cpu 计数器不在范围时,不一定是由于 cpu 资源不够,因为其他资源的也会引起,例如内存不够时,cpu 会忙内存管理的事,表面上可能是 cpu 的利用为 100%
以上就是关于“Linux 中怎么查看 CPU 利用率”这篇文章的内容,相信大家都有了一定的了解,希望丸趣 TV 小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注丸趣 TV 行业资讯频道。