cpu负载就是cpu在一段时间内正在处理以及等待cpu处理的进程数之和的统计信息,也就是cpu使用队列的长度统计信息,这个数字越小越好。
维基百科关于系统负载的解释:
the system Load is a measure of the amount of work that a compute system is doing。
负载最具代表的是CPU负载和I/O负载。
有一类程序不会频繁地从磁盘输入输出,但是处理完成需要相当长的时间。因为该程序主要被用来做计算、逻辑判断等处理,所以程序的处理速度主要依赖于cpu的计算速度。此类cpu负载的程序称为“计算密集型程序”。
有一类程序主要从磁盘保存的大量数据中搜索找出任意文件。这种搜索程序的处理速度并不依赖于cpu,而是依赖于磁盘的读取速度,也就是输入输出(input/output,I/O)。磁盘越快,检索花费的时间就越短。此类I/O负载的程序称为“I/O密集型程序”。
当我们的电脑使用固态硬盘的时候,会发现启动系统和启动应用程序速度比传统的机械硬盘快,就是因为程序读写很快,cpu减少了等待I/O的时间。
我们同时运行多个程序,这些运行中的程序就是进程。当系统有只一个cpu核心的时候,从微观上看,同一时刻只有一个进程在执行,当这个程序是计算密集型程序时,在它的时间片内独占cpu进行疯狂运算,时间片到期后换下一个进程执行,当这个程序是I/O密集型程序时,在它的时间片内独占cpu,cpu可能空闲,等待I/O读取数据,这就造成了cpu资源浪费。
在Linux系统中,进程一般有5种状态:
状态 | 说明 |
---|---|
就绪态(running) | 进程可以运行(包括正在运行和等待运行的进程) |
浅度睡眠(interruptible) | 收到信号或资源到位后被唤醒 |
深度睡眠(uninterruptible) | 一般收到信号不可被唤醒,资源到位后被唤醒 |
暂停态(runnable) | 进程暂停执行 |
僵死态(zombie) | 进程执行结束,但尚未消亡 |
只有进程处于就绪态(running)和浅度睡眠状态(interruptible)才会被加入到负载等待进程中,也就是下面这两种情况的进程才会表现为负载的值:
- 需要立即使用CPU,也还需等待其他进程用完CPU
- 需要继续处理,也必须等待磁盘输入输出完成才能进行
Load Average 就是一段时间(1分钟、5分钟、15分钟)内平均Load,把cpu比喻成一架桥来理解一下Load Average:
系统负荷为0,意味着大桥上一辆车也没有。
系统负荷为0.5,意味着大桥一半的路段有车。
系统负荷为1.0,意味着大桥的所有路段都有车,也就是说大桥已经"满"了。但是必须注意的是,直到此时大桥还是能顺畅通行的。
系统负荷为1.7,意味着车辆太多了,大桥已经被占满了(100%),后面等着上桥的车辆为桥面车辆的70%。以此类推,系统负荷2.0,意味着等待上桥的车辆与桥面的车辆一样多;系统负荷3.0,意味着等待上桥的车辆是桥面车辆的2倍。总之,当系统负荷大于1,后面的车辆就必须等待了;系统负荷越大,过桥就必须等得越久。
CPU的系统负荷,基本上等同于上面的类比。大桥的通行能力,就是CPU的最大工作量;桥梁上的车辆,就是一个个等待CPU处理的进程(process)。如果CPU每分钟最多处理100个进程,那么系统负荷0.2,意味着CPU在这1分钟里只处理20个进程;系统负荷1.0,意味着CPU在这1分钟里正好处理100个进程;系统负荷1.7,意味着除了CPU正在处理的100个进程以外,还有70个进程正排队等着CPU处理。
使用如下命令可以查看系统负载情况:
top
下面逐一来解释:
top - 14:13:09 up 3:27, 4 users, load average: 0.00, 0.00, 0.00
任务: 304 total, 1 running, 227 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2017124 total, 81684 free, 1324148 used, 611292 buff/cache
KiB Swap: 969960 total, 954588 free, 15372 used. 504452 avail Mem
进程 USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3668 ljr 20 0 51384 4192 3376 R 1.0 0.2 0:04.18 top
3699 ljr 20 0 51356 4236 3448 S 0.7 0.2 0:00.30 top
1768 ljr 20 0 3616496 179840 79644 S 0.3 8.9 0:19.58 gnome-shell
3616 ljr 20 0 822184 43500 32980 S 0.3 2.2 0:01.04 gnome-terminal-
第一行:概述信息
数据 | 含义 |
---|---|
top - 14:13:09 | 表示系统当前时间 |
up 3:27 | 表示系统已经运行时间 |
4 users | 当前登录的用户数 |
load average: 0.00, 0.00, 0.00 | 分别表示内核任务队列在1分钟、5分钟、15分钟的长度,也就是通常我们说的负载。 |
第二行:任务信息
数据 | 含义 |
---|---|
任务: 304 total | 当前系统的进程总数 |
1 running | 当前系统中有1个正在运行的进程 |
227 sleeping | 当前系统中有227个休眠的进程 |
0 stopped | 停止进程数为0 |
0 zombie | 僵死进程数为0 |
第三行:cpu信息
%Cpu(s) | 含义 |
---|---|
0.1 us | 用户空间进程占用CPU时间的百分比 |
0.2 sy | 内核空间进程占用CPU时间的百分比 |
0.0 ni | ni表示nice的意思,也就是哪些用户进程被提升优先级之后,占用的CPU运行时间 |
99.7 id | 系统空闲时间 |
0.0 wa | CPU在等待I/O的时间 |
0.0 hi | CPU处理软中断(soft interrupt)的时间百分比 |
0.0 si | CPU处理硬中断(hard interrupt)的时间百分比 |
0.0 st | 表示在有虚拟机的时候,被虚拟机占用的CPU时间。st表示窃取的意思,steal的意思 |
第三行:内存使用信息
KiB Mem | 含义 |
---|---|
2017124 total | 系统可用的物理内存总量 |
81684 free | 当前的空闲内存总量 |
1324148 used | 当前已经使用的物理内存总量 |
611292 buff/cache | 用作系统内核缓存的物理内存总量 |
第四行:被缓冲的交换区总量
KiB Mem | 含义 |
---|---|
969960 total | 系统全部的交换区总量 |
954588 free | 空闲的交换区总量 |
15372 used | 当前已经使用的交换区总量 |
504452 avail Mem | 被缓冲的交换区总量 |
第五行:进程信息
字段 | 含义 |
---|---|
PID | 进程ID |
USER | 当前进程的用户 |
PR | 进程执行优先级 |
NI | 当前进程的NICE值,nice值可以调整进程运行的优先级 |
VIRT | 当前进程对虚拟内存使用量 |
RES | 当前进程的物理内存使用量 |
SHR | 当前进程的共享内存使用量 |
S | 当前进程的状态,可以是R= 正在运行状态,S=休眠状态,D=不可中断的睡眠状态,T=跟踪/停止,Z=僵尸进程 |
%CPU | 当前进程使用CPU的百分比 |
%MEM | 当前进程使用内存的百分比 |
TIME+ | 当前进程的累计CPU占用时间 |
COMMAND | 当前进程的命令行 |
top是我们常见的查看系统负载的工具,除此之外,我们还可以用以下工具查看和分析系统负载:
工具 | 描述 |
---|---|
uptime | 平均负载 |
vmstat | 包括系统范围的cpu平均负载 |
mpstat | 查看所有cpu核信息 |
top | 监控每个cpu用量 |
sar -u | 查看cpu信息 |
pidstat | 每个进程cpu用量分解 |
perf | cpu剖析与跟踪,性能计数分析 |
perf可以跟踪到进程内部具体函数耗时情况,可以指定内核函数进行统计,用法可参考帮助信息: