内存占用达到阙值,一直报警,持续了很长时间,由于是正在开发得服务器,并且在假期。直到周一来了才发现。

内存爆满会影响进程运行,使响应变慢,甚至服务挂掉。

学会查看并分析内存信息,及时应对至关重要。


查看内存

最常用得是 freetopvmstat 命令

free

linux 内存占用 java linux内存被占满了怎么分析_服务器

top

linux 内存占用 java linux内存被占满了怎么分析_ios_02

top 进入后,按 M,使得进程按照内存占用排序

尝试停止或重启占用内存较多的进程,很多情况可以及时缓解内存满的情况,

默认情况下,使用后的内存不会自动释放,可以修改/proc/sys/vm/drop_caches

vmstat

linux 内存占用 java linux内存被占满了怎么分析_linux 内存占用 java_03

上面得命令表示,每隔两秒采集一次,共采集 5 次

  • r,表示等待执行的任务数量
  • b,等待 I/O 的进程数量
  • swpd,内存使用量
  • free,空闲内存大小
  • buff,读写缓冲使用量
  • cache,文件系统 cache 占用大小
  • si,每秒从交换区写入内存的大小
  • so,每秒从内存写入交换区的大小
  • bi,每秒读取磁盘块数
  • bo,每秒写入磁盘块数
  • in,每秒中断数
  • cs,每秒上下文切换数
  • us,用户进程执行消耗 CPU 时间
  • sy,系统进程消耗 CPU 时间
  • id,空闲时间,包括 IO 等待时间(us + sy + id = 100)
  • wa,IO 等待时间


分析

内存满了之后看到的信息如下

linux 内存占用 java linux内存被占满了怎么分析_ios_04


linux 内存占用 java linux内存被占满了怎么分析_服务器_05

  • 连交换空间都占满了,首先服务器的内存实在是太小了,不到 1G!
  • 等待的进程(r,b)比较多,CPU 空闲时间(id)几乎为零,CPU 负荷也很重
  • IO 系列的数值很大(b,bi,bo),输入输出性能很差

针对上面的分析,是因为内存太小给服务器内存扩容后情况好转

除了内存本身的问题,也有可能是:

CPU 瓶颈,IO 系列数值很大后,进一步用iostat观察

③IO 瓶颈,CPU 系列数值很大后,进一步查看load average



本次分析比较简单,就是容量太小,扩大容量即可。

其他情况遇到后再来补充。

正式环境中,监视服务器内存使用情况很有必要,及时发现问题解决问题。