提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
本篇文章梳理下关于Linux内存相关知识
提示:以下是本篇文章正文内容,下面案例可供参考
一、查看内存的命令
内存命令
有free、vmstat、sar、slabtop、pmap、smem,这些命令大多通多读取meminfo、slabinfo、或是/proc/pid下的maps、mem、smaps等文件来收集数据,通过这些命令我们可以监视系统整体或者是各个进程的内存使用状况。常用的命令有以下:
free命令
free -gh
其中:
total 代表的是列显示系统总的可用物理内存和交换空间大小,这个数值在/proc/meminfo中的Memtotal和Swaptotal中获得。
used 已经被使用的物理内存和交换空间,free命令统计的used=total-free-buffers-cache,排除了buffers/cache,.并非我们通常意义上认为的系统已使用内存量,所以当我们判断系统内存占用情况时不能简单的查看used项来进行判断,used不高的情况下,如若buffer/cache占用了许多内存,最终可使用的内存量也会很低。而swap的used=swaptotal–swapfree,也是读取meminfof的相关数据计算而来,是真正使因了的swap内存。
free 还有多少物理内存和交换空间可用使用。free项通过读取meminfo中的MemFree/SwapFree获得,是实际上未使用的物理内存交换内存。但free项不能简单的等同于系统当前可用内存,因为buffers,/cache中的内存缓冲区(块设备所占内存页)、文件缓存页(普通文件所占内存页)、slab分配的Sreclaimable都是可以进行回收再利用的。当我们一次性分配超出当前free项内内存若缓存有足够的可释放内存,将进行释放一同共用户进程使用。
buff/cache 显示被 buffer 和 cache 使用的物理内存大小
shared 列显示被共享使用的物理内存大小。
available一个估算值,估算当前真正可供用户进程使用的内存值,meminfo中的MemAvailable
sar命令
sar(System Activity Reporter)是一个用于收集、报告和保存系统性能数据的工具。要使用sar查看系统内存空间的变化,使用-r参数可以监控内存的变化情况,举例:
sar -r 1 5
这个命令的各个参数的意义如下:
-r: 指定sar报告内存使用情况。-r参数用于显示内存统计信息。
1: 指定数据收集的时间间隔,以秒为单位。在这个例子中,数据每秒采集一次。
5: 指定要收集的数据的总次数。在这个例子中,sar将收集5次数据,每次间隔1秒。
这个命令将输出一系列关于系统内存使用的统计信息,包括:
kbmemfree: 空闲内存的大小(以KB为单位)。
kbmemused: 已使用的内存大小(以KB为单位)。
%memused: 已使用内存占总内存的百分比。
kbbuffers: 缓冲区使用的内存大小(以KB为单位)。
kbcached: 缓存使用的内存大小(以KB为单位)。
kbcommit: 内核已经承诺分配但尚未分配的内存大小(以KB为单位)。
%commit: 已经承诺分配但尚未分配内存占总内存的百分比。
sar -r -s 00:00:00 -e 23:59:59
这个命令的各个参数的意义如下:
-r: 指定sar报告内存使用情况。
-s 00:00:00: 指定开始收集数据的时间,这里是午夜(00:00:00)。
-e 23:59:59: 指定结束收集数据的时间,这里是午夜的最后一秒(23:59:59)。
这个命令将输出一天中每隔默认时间间隔(通常是10分钟)收集的内存使用情况的统计数据。你可以根据需要调整开始和结束时间以及其他sar命令选项,以获取更详细或定制化的统计信息。
ps aux | head -1;ps aux | grep -v PID | sort -rn -k +4 | head -10
使用该命令查看内存占用高的前10个进程。
内存延申
延申一:
Linux 系统中,内存消耗涉及到内核空间和用户空间两个主要部分。内核空间包括内核代码、内核模块、缓冲区和数据结构;而用户空间则主要由运行的进程、堆、栈、共享内存、内存映射文件和用户态堆缓存等组成。理解这些不同部分如何消耗内存,有助于优化系统和应用程序的内存使用,以提升系统性能和稳定性,其中:
内核部分:Slab+ VmallocUsed + PageTables + KernelStack + HardwareCorrupted + Bounce + X
用户进程部分:Active + Inactive + Unevictable + (HugePages_Total * Hugepagesize)
之前处理过一个问题,数据库服务器内存爆满,触发了oom导致系统重启,重启后也发现了内存即将耗尽的情况,top查看发现可用内存仅剩1个多G,如下图,其中数据库服务用了将近一半的内u才能,而另一半内存却不知道哪里消耗的。
最后通过查看/proc/meminfo得知内核态中的内核栈消耗了部分的内存,通过上面meminfo的图片可以看到,内核部分slab+Kernelstack 有 12G多了+应用层的16G+free 1.8+cache 1.2= 31G差不多能对上,定位到内核栈消耗了部分内存。
延申二:
客户服务器内存满了崩溃过,重启之后恢复了正常,想分析下是哪个进程导致的内存占满,由于没有安装什么监控工具,不太好追溯具体哪个进程,给客户推荐了个cpumemmonitor这个工具,挺好用的推荐给大家,需要的可以私信我
1.使用自签名安装
2.安装完成后,自行启动,不需要重启
3.监控程序会定时60S,记录一次系统内存使用量和cpu占用较高进程名,并输出到/var/log/cpu-mem.log里。
4.可以通过查看cpu-men.log可以看到系统在死机前的cpu和内存状态。