linux内存之系统命令

free

显示当前系统未使用和已使用的内存,以及被内核使用的内存缓冲区。默认按kb统计,可以选择-b|-k|-m|-g
在这里插入图片描述

dumpsys meminfo

查看进程或包名的内存使用情况

cat /proc/meminfo

记录系统内存的使用系统
在这里插入图片描述
MemTotal
可用的总内存大小

MemFree
当前还没有被用到的内存

MemAvailable
应用程序可用内存大小,系统中有些内存虽然已经被使用,但是可以回收的,比如cache/buffer、slab都有一部分可以回收,所以MemFree不能代表全部可用内存,这部分可以回收的内存加上MemFree才是系统可用的内存,即:
MemAvailable≈MemFree+Buffers+Cached,它是内核使用特定的算法计算出来的,是一个估计值

BuffersCached
buffer-缓冲 ,根据磁盘的读写速度设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能,linux有一个守护进程定期清空缓冲内容 (即写入磁盘),也可以通过sync命令手动清空缓冲
cache-缓存 cache经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下一次被访问,这样可以提高系统性能。

SwapCached
记录在交换缓存上的内容容量
所谓交换缓存是指,在换入某个内存页之后,物理磁盘上的交换空间依然保留同样的数据,这样的内存页会记录在"交换缓存"的列表上,这样的好处在于,当需要再次换出记录在交换缓存中的内存页时,可以直接使用交换分区中保存的内容,而无需将内存再次写入交换空间

ActiveInactiveActive(anon)Inactive(anon)Active(file)Inactive(file)
与文件关联的内存 (比如程序文件、数据文件所对应的页内存),称为file pages或 mapped pages
与文件无关的内存 (比如进程的堆栈,用malloc申请的内存),后者称为anoymous pages

LRU_INACTIVE_ANON  –  对应 Inactive(anon)
LRU_ACTIVE_ANON  –  对应 Active(anon)
LRU_INACTIVE_FILE  –  对应 Inactive(file)
LRU_ACTIVE_FILE  –  对应 Active(file)
LRU_UNEVICTABLE  –  对应 Unevictable 

Unevictable
有些内存页是不能被释放的,这些内存页不能放在LRU链表中,而是记录在Unevictable

Mlocked

SwapTotalSwapFree
SwapTotal 交换空间的总大小
SwapFree 交换空间的剩余容量

Dirty
脏数据,在磁盘缓冲区中尚未写入物理磁盘的内存大小

Writeback

AnonPages
Linux内核中存在一个rmap(reverse mapping)机制,负责管理匿名内存中每一个物理内存页映射到哪个进程的哪个逻辑地址这样的信息,这个rmap中记录的内存页综合就是Anonpages

Mapped

Shmem
tmpfs所使用的内存
tmpfs即利用物理内存来提供RAM磁盘的功能,在tmpfs上保存文件时,文件系统会暂时将它们保存到磁盘高速缓存上,因此它是属于磁盘高速缓存对应的"buffers+cached"一类。但是由于磁盘上并没有与之对应的内容,因此它并非记录在File-backed内存对应的LRU列表上,而是记录在匿名内存的LRU表上。这就是 buffers + cached = Active(file) + Inactive(file) + Shmem 公式的由来

KReclaimable

SlabSReclaimable、SUnreclaim
Slab使用的内存大小
SReclaimable是可回收的slab大小
SUnreclaim不可回收的slab大小

KernelStack
Kernel stack(内核栈)是常驻内存的,既不包括在LRU lists里,也不包括在进程的RSS/PSS内存里,所以我们认为它是kernel消耗的内存。统计值是/proc/meminfo的KernelStack。64bit 系统的 task_struct size 是16KB, 32bit的系统task_struct size为 8KB,每一个用户线程都会分配一个kernel stack(内核栈),内核栈虽然属于线程,但用户态的代码不能访问,只有通过系统调用(syscall)、自陷(trap)或异常(exception)进入内核态的时候才会用到,也就是说内核栈是给kernel code使用的

ShadowCallStack

PageTables
PageTables就是页表,用于存储各个进程的逻辑地址和物理地址的变换关系,它本身也是一个内存区域

NFS_Unstable
Bounce
WritebackTmp
CommitLimit
Committed_AS

VmallocTotal
Linux使用内存时,除了使用Slab中配置的对象外,还能直接将空闲内存页映射到逻辑地址上
这个容量指的是,理论上内核内部可以用来映射的逻辑地址的范围。这个值非常大,但并非实际使用的物理内存

VmallocUsed
通过vmalloc分配的内存都统计在/proc/meminfo的vmallocused值中,但是要注意,这个值不止包括了分配的物理内存,还统计了VM_IOREMAP、VM_MAP等操作的值,辟如VM_IOREMAP是把IO地址映射到内核空间,并未消耗物理内存,所以要把他排除在外,从物理内存的分配角度,只关心VM_ALLOC操作,这可以从/proc/vmallocinfo中的vmalloc记录看到

VmallocChunk
Percpu
AnonHugePages
ShmemHugePages
ShmemPmdMapped
FileHugePages
FilePmdMapped
CmaTotal
CmaFree
DriverCma

内存黑洞
进程通过将memoryinfo中的内存大小相加起来,发现总是比真实内存小,那是因为内存黑洞的存在,我们知道,Kernel的动态内存分配是通过以下几种接口:

alloc_pages/__get_free_page
vmalloc:以字节为单位分配虚拟地址连续的内存块
slab allocator

vmalloc和slab分配的内存都会被记录在meminfo中,但通过alloc_page/__get_free_page分配的内存,没有在/proc/meminfo中统计,不知道有多少,就像个黑洞

cat /proc/pagetrace

列出各个API占用的内存大小,并根据HighMem、Normal进行归类,根据API占用内存的大小可以判断每个模块占用的内存数量是否合理

cat /proc/slabinfo

主要统计各个项名称的active对象数,总对象数,对象大小,有active对象的页数,总页数以及slab占用数

cat /proc/vmallocinfo

查看虚拟内存分配情况的详细信息

/proc/pagetypeinfo

在这里插入图片描述

cat /proc/sys/vm/swappiness

在这里插入图片描述
swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面,linux的基本默认设置为60
内存在使用到100-60=40%的时候,就开始出现有交换分区的使用,内存的速度会比磁盘快很多,这样子会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能,所以在操作系统层面,要尽可能使用内存,对该参数进行调整

cat /proc/sys/vm/min_free_kbytes

min_free_kbytes = sqrt(lowmem_kbytes * 16) = 4 * sqrt(lowmem_kbytes)
这里lowmem_kbytes可认为是系统内存大小,计算出来的值有最小最大限制,最小为128K,最大为
64M。可以看出,min_free_kbytes随着内存的增大不是线性增长,没有必要也线性的预留出过多的内
存,能保证紧急时刻的使用量即可
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值