记录 Linux 内存性能分析相关工具及参数解析
vm
Linux 使用虚拟内存来管理分配内存空间,为了支持虚拟内存管理,需要
页面调度有不同的算法:
- 局部页面置换算法
分配给一个进程的物理页面数目确定,置换选择范围仅限于当前进程占用的物理页面
- 最优算法
- 先进先出算法 FIFO
- 最近最久未使用算法 LRU
- 时钟算法、最不常用算法 (LRU的近似)
- 全局页面置换算法
置换页面的选择范围是所有可换出的物理页面
- 工作集算法
- 缺页率算法
当出现大量页缺失时会造成 系统颠簸,系统效能会急剧下降
free
读取 /proc/meminfo
文件中信息,显示内存相关信息
$ free
total used free shared buffers cached
Mem: 63444 38012 25432 4 4780 12312
-/+ buffers/cache: 20920 42524
Swap: 0 0 0
内存使用常见问题:
- free 内存少
和 Linux 内存使用设计有关,会尽量提高内存使用率,经常会把磁盘上的内容缓存到内存,用来加速。当内存不足时会释放缓存部分,让给真正需要的程序使用 - buffer / cached
- buffer 缓存的是磁盘文件的元数据,例如文件属性、目录结构等
- cached 缓存的是真正的文件内容
- 判断内存真正不足
- 持续的内存换入换出
- 较多的主缺页中断
次缺页中断,是在内存中可以找到目标页
主缺页中断,是在内存中找不到,需要到磁盘中找
vmstat
显示进程,内存,分页,IO,中断,CPU活动的信息
$ vmstat 1
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,服务器高峰可以接受