vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对linux系统的虚拟内存、进程、CPU活动进行监控。vmstat提供了一种低开销的系统性能观察方式,在非常高负荷的服务器上,我们可以使用vmstat查看并监控系统的健康情况。
1. 命令格式
vmstat [-a] [-n] [-S unit] [delay [ count]]
vmstat [-s] [-n] [-S unit]
vmstat [-m] [-n] [delay [ count]]
vmstat [-d] [-n] [delay [ count]]
vmstat [-p disk partition] [-n] [delay [ count]]
vmstat [-f]
vmstat [-V]
2. 命令功能
用来显示虚拟内存的信息
3. 命令参数
-a,显示活跃和非活跃的内存
-f,显示从系统启动至今的fork数量
-m,显示slabinfo
-n,只在开始时显示一次各字段名称
-s,显示内存相关统计信息及多种系统活动数量
delay,刷新时间间隔,如果不指定,只显示一条结果
count,刷新次数,如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
-d,显示磁盘相关统计信息。
-p,显示指定磁盘分区统计信息
-S,使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)
-V,显示vmstat版本信息。
4. 使用实例
例一:显示虚拟内存的使用情况
# vmstat 5 6 // 在5秒时间内进行6次采样。
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 3029876 199616 690980 0 0 0 2 3 2 0 0 100 0 0
0 0 0 3029752 199616 690980 0 0 0 41 1009 39 0 0 100 0 0
0 0 0 3029752 199616 690980 0 0 0 3 1004 36 0 0 100 0 0
0 0 0 3029752 199616 690980 0 0 0 4 1004 36 0 0 100 0 0
0 0 0 3029752 199616 690980 0 0 0 6 1003 33 0 0 100 0 0
0 0 0 3029752 199616 690980 0 0 0 5 1003 33 0 0 100 0 0
说明:
-
Procs(进程)
r,运行队列中的进程数量
b,等待IO的进程数量
-
Memory
swpd: 使用虚拟内存大小
free: 可用内存大小
buff: 用作缓冲的内存大小
cache: 用作缓存的内存大小
-
Swap
si,每秒从交换区写到内存的大小
so,每秒写入交换区的内存大小
-
IO:(现在Linux版本块的大小为1024bytes)
bi,每秒读取的块数
bo,每秒写入的块数
-
系统
in,每秒中断数,包括时钟中断
cs,每秒上下文切换数
-
CPU(以百分比表示)
us,用户进程执行时间(user time)
sy,系统进程执行时间(system time)
id,中央处理器的空闲时间(包括IO等待时间),以百分比表示
wa,IO等待时间
备注: 如果r经常大于4,且id经常少于40,则表示CPU的负载很重;如果bi,bo 长期不等于0,则表示内存不足;如果disk经常不等于0,且在 b中的队列大于3, 表示io性能不好。Linux在具有高稳定性、可靠性的同时,具有很好的可伸缩性和扩展性,能够针对不同的应用和硬件环境,优化出当前应用需要的最佳性能。因此企业在维护Linux系统,进行系统调优时,了解系统性能分析工具是至关重要的。
例二:显示活跃和非活跃内存
命令:
vmstat -a 2 5
# vmstat -a 2 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free inact active si so bi bo in cs us sy id wa st
0 0 0 3029752 387728 513008 0 0 0 2 3 2 0 0 100 0 0
0 0 0 3029752 387728 513076 0 0 0 0 1005 34 0 0 100 0 0
0 0 0 3029752 387728 513076 0 0 0 22 1004 36 0 0 100 0 0
0 0 0 3029752 387728 513076 0 0 0 0 1004 33 0 0 100 0 0
0 0 0 3029752 387728 513076 0 0 0 0 1003 32 0 0 100 0 0
说明:使用-a选项,显示活跃和非活跃内存时,所显示的内容除了增加inact和active外,其他显示内容与例一相同。
Memory
inact,非活跃内存大小(当使用-a选项时显示)
active,活跃的内存大小(当使用-a选项时显示)
例三:查看系统已经fork了多少次
命令:
vmstat -f
# vmstat -f
forks
说明:这个数据是从/proc/stat中的processes字段取得的。
例四:查看内存使用的详细信息
命令:
vmstat -s
# vmstat -s
total memory
used memory
active memory
inactive memory
free memory
buffer memory
swap cache
total swap
used swap
free swap
non-nice user cpu ticks
nice user cpu ticks
system cpu ticks
idle cpu ticks
IO-wait cpu ticks
IRQ cpu ticks
softirq cpu ticks
stolen cpu ticks
pages paged in
pages paged out
pages swapped in
pages swapped out
interrupts
CPU context switches
boot time
forks
说明:这些信息的分别来自/proc/meminfo,/proc/stat,/proc/vmstat。
例五:查看磁盘的读/写
命令:
vmstat -d
说明:这些信息主要来自/proc/diskstats。merged表示一次来自合并的写/读请求,系统一般会把多个连接/或邻近的读/写请求合并到一起操作。
例六:查看/dev/sda1磁盘的读/写
# df
文件系统 K-块 已用 可用 已用% 挂载点
/dev/sda3 % /tmpfs
% /dev/shm
/dev/sda1 % /boot
# vmstat -p /dev/sda1
sda1 reads read sectors writes requested writes
# vmstat -p /dev/sda3
sda3 reads read sectors writes requested writes
说明:这些信息主要来自于/proc/diskstats
reads,来自于这个分区读的次数。
read sectors,来自于这个分区的读扇区的次数。
writes,来自于这个分区的写的次数。
requested writes,来自于这个分区的写请求次数。
例七:查看系统的slab信息
命令:
vmstat -m
说明:这组信息来自于/proc/slabinfo。
slab:由于内核会有许多小对象,这些对象构造销毁十分频繁,比如i-node,dentry,如果每次构建这些对象时,就向内存要一个页(4kb),而它们实际只有几个字节,这样就会非常浪费。为了解决这个问题,linux引入了一种新的机制来处理在同一个页框中如何分配小存储区,而slab可以对小对象进行分配,这样就不用为每一个对象分配页框,从而节省了空间。slab对这些小对象进行缓冲,可以重复利用,减少内存分配次数。
5. linux内存管理机制
5.1 物理内存和虚拟内存的区别
我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此我们希望所有数据的读取和写入都在内存中完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。
物理内存就是系统硬件提供的内存大小,是真正的内存。相对于物理内存,linux还有一个虚拟内存的概念。虚拟内存就是为了满足物理内存的不足而提出的策略,它利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。
作为物理内存的扩展,linux会在物理内存不足时,使用交换分区的虚拟内存。更详细的说,linux内核会将暂时不用的内存块信息写入交换空间,这样物理内存得到了释放,就可以用于其它目的。当需要用到原始内容时,这些信息会被系统从交换空间重新读入物理内存中。
linux的内存管理采取的是分页存取机制,为了保证物理内存得到充分的利用,在适当的时候,内核会将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存中。
5.2 深入了解linux内存运行机制
首先,Linux系统会不时地进行页面交换操作,以保持尽可能多的空闲物理内存。即使没有什么事情需要内存,Linux也会交换出暂时不用的内存页面,这可以避免等待交换所需的时间。
其次,linux进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存中。linux内核根据“最近最经常使用”算法,仅将一些不经常使用的页面文件交换到虚拟内存。有时我们会看到这样一个现象:linux物理内存还有很多,但是交换空间也使用了很多。其实,这并不奇怪。例如,一个占用很大内存的进程运行时,需要耗费很多内存资源,此时就会有一些不常用的页面文件被交换到虚拟内存中。当这个占用很多内存资源的进程,运行结束并释放了很多内存时,刚才被交换出去的页面文件并不会自动地交换进物理内存,除非有这个必要,此时系统物理内存就会空闲很多,同时交换空间也在被使用,就出现了刚才所说的现象了。
最后,在使用交换空间的页面时,它会首先被交换到物理内存。如果此时,物理内存没有足够的空间容纳这些页面,它们又会被马上交换出去。如此以来,虚拟内存中可能没有足够空间来存储这些交换页面,最终会导致linux出现假死机,服务异常等问题。linux虽然可以在一段时间内自行恢复,但是恢复后的系统已经基本不可用了。因此,合理地规划和设计linux内存的使用,是非常重要的。
5. 3 虚拟内存原理
在系统中运行的每个进程都需要使用内存,但不是每个进程都需要一直使用系统分配的内存空间。当系统运行所需的内存超过实际的物理内存时,内核会释放某些进程所占用但未使用的部分或所有物理内存。linux内核将这部分文件存储在磁盘上直到进程下一次调用,并将释放出的物理内存提供给需要的进程使用。
在Linux内存管理中,主要通过“调页Paging”和“交换Swapping”来完成上述的内存调度。调页算法是将内存中最近不常使用的页面交换到磁盘上,把活动页面保留在物理内存中,以供进程使用。交换技术是将整个进程而不是部分页面,全部交换到磁盘上。
分页(Page)写入磁盘的过程被称作Page-Out,分页(Page)从磁盘重新回到物理内存的过程被称作Page-In。当内核需要一个分页,但发现此分页不在物理内存中(因为已经被Page-Out了),此时就发生了分页错误(Page Fault)。
当发现可运行内存变少时,系统内核会通过Page-Out,释放一部分物理内存。尽管Page-Out不是经常发生,但如果Page-out频繁不断地发生,直到内核管理分页的时间超过运行进程的时间时,系统性能就会急剧下降。这时,系统已经运行地非常慢或进入暂停状态,这种状态被称作thrashing(颠簸)。