free
通过读取/proc/meminfo文件中信息,显示系统中空闲物理内存总量,已使用的内存总量,swap空间,内核使用的缓存和缓冲
使用
格式
free -[b|k|m]
显示
内存使用率(MEMUsedPerc)=100(MemTotal-MemFree-Buffers-Cached)/MemTotal*
内存相关
关于内存的几个常见问题:
空闲空间少
其实linux中空闲的物理空间经常是很少的,和linux使用内存的思路有关
linux会尽量提高内存使用率,经常会把磁盘上的内容缓存到内存,用来加速
当内存不足时,linux就会释放缓存部分,让给真正需要的程序使用buffer 和 cache
buffer 缓存的是磁盘文件的元数据,例如文件属性、目录结构等等
cache 缓存的是真正的文件内容关注要点
MemTotal:总内存大小
MemFree: 空闲内存大小
Buffers和Cached:磁盘缓存的大小如何判断内存真正不足
内存不足主要有2个明显的表现
(1)持续的内存换入换出
(2)较多的主缺页中断
主缺页中断的概念:
缺页中断包含主/次缺页中断
次缺页中断,是在内存中可以找到目标页
主缺页中断,是在内存中找不到,需要到磁盘中找
所以较多的主缺页中断意味着较多的访问磁盘
vmstat
vmstat显示进程,内存,分页,块IO,中断,CPU活动的信息
虚拟内存知识
在系统中运行的每个进程都需要使用到内存,但不是每个进程都需要每时每刻使用系统分配的内存空间。当系统运行所需内存超过实际的物理内存,内核会释放某些进程所占用但未使用的部分或所有物理内存,将这部分资料存储在磁盘上直到进程下一次调用,并将释放出的内存提供给有需要的进程使用。
在Linux内存管理中,主要是通过“调页Paging”和“交换Swapping”来完成上述的内存调度。调页算法是将内存中最近不常使用的页面换到磁盘上,把活动页面保留在内存中供进程使用。交换技术是将整个进程,而不是部分页面,全部交换到磁盘上。
分页(Page)写入磁盘的过程被称作Page-Out,分页(Page)从磁盘重新回到内存的过程被称作Page-In。当内核需要一个分页时,但发现此分页不在物理内存中(因为已经被Page-Out了),此时就发生了分页错误(Page Fault)。
当系统内核发现可运行内存变少时,就会通过Page-Out来释放一部分物理内存。经管Page-Out不是经常发生,但是如果Page-out频繁不断的发生,直到当内核管理分页的时间超过运行程式的时间时,系统效能会急剧下降。这时的系统已经运行非常慢或进入暂停状态,这种状态亦被称作thrashing(颠簸)。
使用
参数
vmstat 1 2 1s刷新一次,循环两次
vmstat 2 输出两次
-d 磁盘模式,显示磁盘
-p dev 指定分区显示 -p后跟设备名称
使用样例
- vmstat
输出:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1108572 2356 1506880 0 0 92 13 148 654 3 1 95 1 0
字段说明:
Procs(进程):
r: 运行队列中进程数量
b: 等待IO的进程数量
Memory(内存):
swpd: 使用虚拟内存大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free: 可用内存大小
buff: 用作缓冲的内存大小
cache: 用作缓存的内存大小
Swap:
si: 每秒从磁盘写到虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。
so: 每秒写入磁盘的虚拟内存大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。
IO:
bi: 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte。
bo: 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
系统:
in: 每秒中断数,包括时钟中断。
cs: 每秒上下文切换数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
CPU(以百分比表示):
us: 用户进程执行时间,us的值比较高时,说明用户进程消耗的CPU时间多,如果长期大于50%,需要考虑优化程序。
sy: 系统进程执行时间,sy的值比较高时,就说明内核消耗的CPU时间多;如果us+sy超过80%,就说明CPU的资源存在不足。
id: 空闲时间(包括IO等待时间)
wa: 等待IO时间,wa值越高,说明IO等待越严重。如果wa值超过20%,说明IO等待严重。
需要关注指标:
- r 运行的进程比较多,系统繁忙
- bo 磁盘写的数据量大
- us 持续大于50,服务器高峰可以接受
- wa IO等待,持续大于30,说明IO等待严重
- id 持续小于50,服务器高峰可以接受
- vmstat -d
输出:
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 39921 4296 2489785 868514 21660 1994 523688 2201496 0 383
sr0 0 0 0 0 0 0 0 0 0 0
dm-0 28600 0 2030513 696826 4843 0 110008 2207246 0 244
dm-1 271 0 2168 2171 0 0 0 0 0 1
loop0 0 0 0 0 0 0 0 0 0 0
loop1 0 0 0 0 0 0 0 0 0 0
loop2 0 0 0 0 0 0 0 0 0 0
dm-2 10615 0 442345 203700 17397 0 409528 649147 0 167
字段说明:
1. reads:
total,读取总量
metged,合并后分组的读
sectors,成功读取的扇区
ms,读取所花费的时间(ms)
2. writes 写入
3. IO
cur 正在进行的IO
sec IO花费的秒数
- vmstat -m(SLAB)
输出:
Cache Num Total Size Pages
nf_conntrack_ffff8800c0996300 0 0 312 26
nf_conntrack_ffff8800b6ae0000 0 0 312 26
fuse_inode 21 21 768 21
nf_conntrack_ffff8800c0990000 0 0 312 26
nf_conntrack_ffffffff819a09c0 546 546 312 26
kvm_vcpu 0 0 16064 2
- vmstat -s
显示各种事件计数器和内存统计信息
常见问题分析
CPU问题现象:
- 如果在processes中运行的序列(process r)是连续的大于在系统中的CPU的个数表示系统现在运行比较慢,有多数的进程等待CPU.
- 如果r的输出数大于系统中可用CPU个数的4倍的话,则系统面临着CPU短缺的问题,或者是CPU的速率过低,系统中有多数的进程在等待CPU,造成系统中进程运行过慢.
- 如果空闲时间(cpu id)持续为0并且系统时间(cpu sy)是用户时间的两倍(cpu us) 系统则面临着CPU资源的短缺.
解决办法:
当发生以上问题的时候请先调整应用程序对CPU的占用情况.使得应用程序能够更有效的使用CPU.同时可以考虑增加更多的CPU. 关于CPU的使用情况还可以结合mpstat/ps aux/ top /prstat –a等等一些相应的命令来综合考虑关于具体的CPU的使用情况,和那些进程在占用大量的CPU时间.一般情况下,应用程序的问题会比较大一些.比如一些SQL语句不合理等等都会造成这样的现象.
内存问题现象:
内存的瓶颈是由scan rate (sr)来决定的.scan rate是通过每秒的始终算法来进行页扫描的.如果scan rate(sr)连续的大于每秒200页则表示可能存在内存缺陷.同样的如果page项中的pi和po这两栏表示每秒页面的调入的页数和每秒调出的页数.如果该值经常为非零值,也有可能存在内存的瓶颈,当然,如果个别的时候不为0的话,属于正常的页面调度这个是虚拟内存的主要原理.
解决办法:
- 调节应用或者服务使得对内存和cache的使用更加有效.
- 增加系统的内存.
- 关于内存的使用情况还可以结ps aux top prstat –a等等一些相应的命令来综合考虑关于具体的内存的使用情况,和那些进程在占用大量的内存.一般情况下,如果内存的占用率比较高,但是,CPU的占用很低的时候,可以考虑是有很多的应用程序占用了内存没有释放,但是,并没有占用CPU时间,可以考虑应用程序,对于未占用CPU时间和一些后台的程序,释放内存的占用.