vmstat命令:用来获得有关进程、虚存、页面交换空间及 CPU活动的信息。这些信息反映了系统的负载情况。(vmstat reports information about processes, memory, paging, block IO, traps, and cpu activity.)
vmstat 命令的输出
vmstat 1 10
1代表每一秒进行一次采样,10代表采样10次
1、字段详解
类别 | 字段 | 释义 |
procs | r | 等待执行的任务数,显示正在执行和等待CPU资源的任务个数,当这个值超过了CPU数目,代表出现了CPU瓶颈 如果r经常大于4,且id经常少于40,表示cpu的负荷很重。 |
b | 表示阻塞的进程数量 | |
memory | swpd | 正在使用的swap大小,单位为Kbyte,虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了 |
free | 空闲的内存空间,单位为kbyte | |
buff | 已使用的buff大小,单位为kbyte,属于内存中的一个区域,先写入buff,再写入磁盘 | |
cache | 已使用的cache大小,单位为kbyte,属于内存中的一个区域,先写入cache,CPU再读取 linux下内存利用率算法:(cache+buffers+free)/total |
|
swap | si | 每秒从swap读出的内存,in是读,如果这个值大于0,表示物理内存不够用或者内存泄露了,单位是KB |
so | 置换到swap的内存,,out是写,如果这个值大于0,表示物理内存不够用或者内存泄露了,单位是KB | |
io | bi | 每秒读取的块数(读磁盘),默认块大小是1024byte 注:All linux blocks are currently 1024 bytes. Old kernels may report blocks as 512 bytes, 2048 bytes, or 4096 bytes |
bo | 每秒写入的块数(写磁盘) | |
system | in | 每秒CPU的中断次数,包括时间中断;中断其实就是由硬件或软件所发送的一种称为IRQ(中断请求)的信号, 中断允许让设备,如键盘,串口卡,并口等设备表明它们需要CPU,如果cpu利用率在合理范围内,大量的中 断也是可以接受的。一个巨大的中断值,同时伴随着缓慢的系统性能表现,可能是模块使用不当或者硬件上出 问题导致外设不断给CPU送中断; |
cs | 每秒上下文切换次数。 上下文切换是指CPU从一个进程切换到另一个进程,这个过程也是需要消耗一定时间的。如果说上下文切换过于频繁, 说明CPU用于执行进程代码的时间少了,CPU像个搬运工,频繁在寄存器和运行队列之间奔波 ,更多的时间花在了 进程切换,而不是真正工作的进程上。。这个值要越小越好,太大了,要考虑调低线程或者进程的数目,CPU没有充 分利用,是不可取的。 还可以使用:sar -w来查看上下文切换的 | |
cpu | us | 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器 在做压力测试,性能表现不佳) |
sy | 系统CPU时间,如果太高,表示系统调用时间长,说明系统内核消耗的CPU资源多,例如是IO操作频繁 | |
id | 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率, sy是系统CPU使用率 若系统的CPU的idle很高,但是系统响应慢时,可能是CPU等待分配内存,此时应加大内存 | |
wa | 等待IO CPU时间,wa的值比较高时,说明IO等待比较严重,可能是由于磁盘大量做随机访问造成, 也可能是磁盘的带宽出现瓶颈 |
关于io的bi与bo参数:
在根目录下执行du -sh * 命令,bi有变化,代表bi是读取磁盘。
2、一些概念
2.1 CPU中断
CPU 是一种硬件资源,和任何其他硬件设备一样也需要驱动和管理程序才能使用,我们可以把内核的进程调度看作是 CPU 的管理程序,用来管理和分配CPU 资源,合理安排进程抢占 CPU,并决定哪个进程该使用 CPU、哪个进程该等待。操作系统内核里的进程调度主要用来调度两类资源:进程(或线程)和中断,进程调度给不同的资源分配了不同的优先级,优先级最高的是硬件中断,其次是内核(系统)进程,最后是用户进程。每个 CPU 都维护着一个可运行队列,用来存放那些可运行的线程。线程要么在睡眠状态(blocked 正在等待 IO)要么在可运行状态,如果 CPU 当前负载太高而新的请求不断,就会出现进程调度暂时应付不过来的情况,这个时候就不得不把线程暂时放到可运行队列里。
2.2 上下文切换
context switch过高会导致CPU像个搬运工,频繁在寄存器和运行队列之间奔波 ,更多的时间花在了线程切换,而不是真正工作的线程上。直接的消耗包括CPU寄存器需要保存和加载,系统调度器的代码需要执行。间接消耗在于多核cache之间的共享数据。
引起上下文切换的原因
- 当前任务的时间片用完之后,系统CPU正常调度下一个任务;
- 当前任务碰到IO阻塞,调度线程将挂起此任务,继续下一个任务;
- 多个任务抢占锁资源,当前任务没有抢到,被调度器挂起,继续下一个任务;
- 用户代码挂起当前任务,让出CPU时间;
- 硬件中断;
通过如下命令也可以查看到上下文切换的情况,除非每秒超过100000次或更多,一般都不用担心上下文切换
sar -w 1
-w Report task creation and system switching activity.
proc/s
Total number of tasks created per second.
cswch/s
Total number of context switches per second.
通过如下命令查看进程的上下文切换的情况
pidstat -w -p 12345 1
2.3 IO密集型和CPU密集型业务
- IO密集型指的是系统的CPU耗能相对硬盘/内存的耗能要好很多,此时,系统运作,大部分的状况是CPU在等I/O(硬盘/内存)的读写,此时CPU负载不高
- CPU密集型指的是系统硬盘/内存耗能相对CPU的耗能要好很多,此时,系统运作,大部分的状况是CPU负载100%,CPU要读写I/O,IO在很短的时间就可以完成,而CPU还有很多运算要处理,CPU负载很高,大部分时间用来计算,逻辑判断等CPU动作的程序
参考:https://blog.csdn.net/langkeziju/article/details/47166399
参考:https://www.cnblogs.com/tommyli/p/3746187.html
参考:https://blog.csdn.net/aobama12/article/details/61632815
参考:https://blog.csdn.net/weixin_36795183/article/details/77930046