内存占用达到阙值,一直报警,持续了很长时间,由于是正在开发得服务器,并且在假期。直到周一来了才发现。
内存爆满会影响进程运行,使响应变慢,甚至服务挂掉。
学会查看并分析内存信息,及时应对至关重要。
查看内存
最常用得是 free
、top
、vmstat
命令
free
top
top 进入后,按 M
,使得进程按照内存占用排序
尝试停止或重启占用内存较多的进程,很多情况可以及时缓解内存满的情况,
默认情况下,使用后的内存不会自动释放,可以修改/proc/sys/vm/drop_caches
vmstat
上面得命令表示,每隔两秒采集一次,共采集 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 等待时间
分析
内存满了之后看到的信息如下
- 连交换空间都占满了,首先服务器的内存实在是太小了,不到 1G!
- 等待的进程(r,b)比较多,CPU 空闲时间(id)几乎为零,CPU 负荷也很重
- IO 系列的数值很大(b,bi,bo),输入输出性能很差
针对上面的分析,是因为内存太小给服务器内存扩容后情况好转
除了内存本身的问题,也有可能是:
① CPU 瓶颈,IO 系列数值很大后,进一步用iostat
观察
② ③IO 瓶颈,CPU 系列数值很大后,进一步查看load average
本次分析比较简单,就是容量太小,扩大容量即可。
其他情况遇到后再来补充。
正式环境中,监视服务器内存使用情况很有必要,及时发现问题解决问题。