问题描述
近期有一台linux服务器一致触发告警,物理内存利用率(%)在2020-04-17 10:02:55发生错误告警94.37 >= 90,登录服务器查看free,如下图所示:
shift + M按内存排序后,观察系统中使用内存最大的进程情况,如上图所示,最大只占用1G多内存(RES);
附:第三行cpu的状态的解释:
us(user cpu time):用户态使用的cpu时间比。该值较高时,说明用户进程消耗的 CPU 时间比较多,比如,如果该值长期超过 50%,则需要对程序算法或代码等进行优化。
sy(system cpu time):系统态使用的cpu时间比。
ni(user nice cpu time):用做nice加权的进程分配的用户态cpu时间比
id(idle cpu time):空闲的cpu时间比。如果该值持续为0,同时sy是us的两倍,则通常说明系统则面临着 CPU 资源的短缺。
wa(io wait cpu time):cpu等待磁盘写入完成时间。该值较高时,说明IO等待比较严重,这可能磁盘大量作随机访问造成的,也可能是磁盘性能出现了瓶颈。
hi(hardware irq):硬中断消耗时间
si(software irq):软中断消耗时间
st(steal time):虚拟机偷取时间
上述这些参数的值加起来是100%。
shared 多个进程共享的内存总额
buffers 磁盘缓存(Buffer Cache)的大小(可提高系统I/O调用的性能),buffers是用来给块设备做的缓冲大小、buffers是用来存储目录里面有什么内容,权限等等
cached 磁盘缓存(Page Cache)的大小(可提高系统I/O调用的性能),cached用来给文件做缓冲,用来记忆我们打开的文件.
-buffers/cache 表示已被我们的程序使用的内存数,计算方法:used - buffers - cached
+buffers/cache 表示还可已被我使用的内存数,计算方法:free + buffers + cached
操作系统目前可用内存总量=free + buffers + cached,
问题分析
执行:cat /proc/meminfo
参数解释如下:
MemTotal: 16431704 kB //可用的总内存
MemFree: 1427312 kB //完全未用到的物理内存 LowFree+HighFree
MemAvailable: 14627588 kB //可用的MemAvailable ≈ MemFree+Buffers+Cached
Buffers: 377300 kB //缓冲区内存数,即buffer cache写缓冲到磁盘的内存临时存放,
Cached: 12880152 kB //缓存区内存数,即Page Cache读缓存到内存的临时空间
SwapCached: 0 kB //被告诉缓冲区cache使用的交换空间使用的大小
Active: 1714236 kB //Active:(pages[LRU_ACTIVE_ANON] + pages[LRU_ACTIVE_FILE])活跃中的高速缓存区使用的页面文件大小
Inactive: 12749900 kB //pages[LRU_INACTIVE_ANON] + pages[LRU_INACTIVE_FILE]不常用的高速缓存区页面文件大小
Active(anon): 1221132 kB
Inactive(anon): 123316 kB
Active(file): 493104 kB
Inactive(file): 12626584 kB
Unevictable: 4084 kB
Mlocked: 4084 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 82068 kB // 需要写入磁盘(等待被写回磁盘)的内存区大小
Writeback: 0 kB //正在被写回磁盘的大小
AnonPages: 1210972 kB //未映射页的内存大小
Mapped: 135868 kB //设备和文件等映射的大小
Shmem: 135256 kB
Slab: 455588 kB //存放内核数据结构缓存,可减少申请和释放内存带来的消耗,slabtop 可查看这部分内存的具体使用
SReclaimable: 418912 kB //可收回Slab的大小
SUnreclaim: 36676 kB //不可回收的slab的大小,36676+418912=455588
KernelStack: 5568 kB //常驻内存,每一个用户线程都会分配一个kernel stack(内核栈)
PageTables: 9560 kB //管理内存分页页面的索引表的大小
NFS_Unstable: 0 kB //不稳定页表的大小
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 8215852 kB
Committed_AS: 3231192 kB
VmallocTotal: 34359738367 kB //vmalloc内存区大小,34T
VmallocUsed: 0 kB //vmalloc已经使用的内存
VmallocChunk: 0 kB /vmalloc区可用的连续最大块的大小
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 155516 kB //描述线性映射空间中,有多个空间分别使用了2M/4K页映射,直接映射(direct mapping)的内存大小
DirectMap2M: 12427264 kB
DirectMap1G: 6291456 kB
2)vmstat
解释说明:
procs部分的解释:
r 列表示运行和等待cpu时间片的进程数,如果长期大于1,说明cpu不足,需要增加cpu。
b 列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。
cpu部分的解释:
us 列显示了用户方式下所花费 CPU 时间的百分比。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,需要考虑优化用户的程序。
sy 列显示了内核进程所花费的cpu时间的百分比。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
wa 列显示了IO等待所占用的CPU时间的百分比。这里wa的参考值为30%,如果wa超过30%,说明IO等待严重,这可能是磁盘大量随机访问造成的,也可能磁盘或者 磁盘访问控制器的带宽瓶颈造成的(主要是块操作)。
id 列显示了cpu处在空闲状态的时间百分比
system部分的解释
in 列表示在某一时间间隔中观测到的每秒设备中断数。
cs列表示每秒产生的上下文切换次数,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。
memory部分的解释
swpd 切换到内存交换区的内存数量(k表示)。如果swpd的值不为0,或者比较大,比如超过了100m,只要si、so的值长期为0,系统性能还是正常
free 当前的空闲页面列表中内存数量(k表示)
buff 作为buffer cache的内存数量,一般对块设备的读写才需要缓冲。
cache: 作为page cache的内存数量,一般作为文件系统的cache,如果cache较大,说明用到cache的文件较多,如果此时IO中bi比较小,说明文件系统效率比较好。
swap部分的解释
si 由内存进入内存交换区数量。so由内存交换区进入内存数量。
IO部分的解释
bi 从块设备读入数据的总量(读磁盘)(每秒kb)。
bo 块设备写入数据的总量(写磁盘)(每秒kb)
3)hcache