vmstat命令

vmstat命令:用来获得有关进程、虚存、页面交换空间及 CPU活动的信息。这些信息反映了系统的负载情况。(vmstat reports information about processes, memory, paging, block IO, traps, and cpu activity.)

vmstat 命令的输出

vmstat 1 10

1代表每一秒进行一次采样,10代表采样10次

image

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
iobi

每秒读取的块数(读磁盘),默认块大小是1024byte

注:All linux blocks are currently 1024 bytes. Old kernels may report blocks as 512 bytes,

2048 bytes, or 4096 bytes

bo每秒写入的块数(写磁盘)
systemin

每秒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是读取磁盘。

image

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.

image

通过如下命令查看进程的上下文切换的情况

pidstat -w -p 12345 1
12345是PID,1代表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

参考:https://blog.csdn.net/mimi_csdn/article/details/79375471

原文地址:https://www.cnblogs.com/fuqu/p/10092954.html