Linux系统下/proc/meminfo详解


Linux系统下/proc/meminfo详解

/proc/meminfo Explained

--------------------------------------------------------------------------------

March 2003 

--------------------------------------------------------------------------------

"Free," "buffer," "swap," "dirty." What does it all mean? If you said, "something to do with the Summer of '68", you may need a primer on 'meminfo'.

The entries in the /proc/meminfo can help explain what's going on with your memory usage, if you know how to read it.

Example of "cat /proc/meminfo":

root:    total:        used:        free:          shared:    buffers:    cached:
Mem:      1055760384    1041887232    13873152    0    100417536     711233536
Swap:     1077501952      8540160     1068961792
                        MemTotal:        1031016 kB    
MemFree:        13548 kB
MemShared:        0 kB
Buffers:        98064 kB
Cached:            692320 kB
SwapCached:        2244 kB
Active:            563112 kB
Inact_dirty:        309584 kB
Inact_clean:        79508 kB
Inact_target:        190440 kB
HighTotal:        130992 kB
HighFree:        1876 kB
LowTotal:        900024 kB
LowFree:        11672 kB
SwapTotal:        1052248 kB
SwapFree:        1043908 kB
Committed_AS:        332340 kB
                        The information comes in the form of both high-level and low-level statistics. At the top you see a quick summary of the most common values people would like to look at. Below you find the individual values we will discuss. First we will discuss the high-level statistics.

High-Level Statistics
MemTotal: Total usable ram (i.e. physical ram minus a few reserved bits and the kernel binary code) 
MemFree: Is sum of LowFree+HighFree (overall stat) 
MemShared: 0; is here for compat reasons but always zero. 
Buffers: Memory in buffer cache. mostly useless as metric nowadays 
Cached: Memory in the pagecache (diskcache) minus SwapCache 
SwapCache: Memory that once was swapped out, is swapped back in but still also is in the swapfile (if memory is needed it doesn't need to be swapped out AGAIN because it is already in the swapfile. This saves I/O)
Detailed Level Statistics
VM Statistics
VM splits the cache pages into "active" and "inactive" memory. The idea is that if you need memory and some cache needs to be sacrificed for that, you take it from inactive since that's expected to be not used. The vm checks what is used on a regular basis and moves stuff around.

When you use memory, the CPU sets a bit in the pagetable and the VM checks that bit occasionally, and based on that, it can move pages back to active. And within active there's an order of "longest ago not used" (roughly, it's a little more complex in reality). The longest-ago used ones can get moved to inactive. Inactive is split into two in the above kernel (2.4.18-24.8.0). Some have it three.

Active: Memory that has been used more recently and usually not reclaimed unless absolutely necessary. 
Inact_dirty: Dirty means "might need writing to disk or swap." Takes more work to free. Examples might be files that have not been written to yet. They aren't written to memory too soon in order to keep the I/O down. For instance, if you're writing logs, it might be better to wait until you have a complete log ready before sending it to disk. 
Inact_clean: Assumed to be easily freeable. The kernel will try to keep some clean stuff around always to have a bit of breathing room. 
Inact_target: Just a goal metric the kernel uses for making sure there are enough inactive pages around. When exceeded, the kernel will not do work to move pages from active to inactive. A page can also get inactive in a few other ways, e.g. if you do a long sequential I/O, the kernel assumes you're not going to use that memory and makes it inactive preventively. So you can get more inactive pages than the target because the kernel marks some cache as "more likely to be never used" and lets it cheat in the "last used" order.
Memory Statistics
HighTotal: is the total amount of memory in the high region. Highmem is all memory above (approx) 860MB of physical RAM. Kernel uses indirect tricks to access the high memory region. Data cache can go in this memory region. 
LowTotal: The total amount of non-highmem memory. 
LowFree: The amount of free memory of the low memory region. This is the memory the kernel can address directly. All kernel datastructures need to go into low memory. 
SwapTotal: Total amount of physical swap memory. 
SwapFree: Total amount of swap memory free. 
Committed_AS: An estimate of how much RAM you would need to make a 99.99% guarantee that there never is OOM (out of memory) for this workload. Normally the kernel will overcommit memory. That means, say you do a 1GB malloc, nothing happens, really. Only when you start USING that malloc memory you will get real memory on demand, and just as much as you use. So you sort of take a mortgage and hope the bank doesn't go bust. Other cases might include when you mmap a file that's shared only when you write to it and you get a private copy of that data. While it normally is shared between processes. The Committed_AS is a guesstimate of how much RAM/swap you would need worst-case.


在Linux下查看内存我们一般用free命令
[root@scs-2 tmp]# free
             total       used       free     shared    buffers     cached
Mem:       3266180    3250004      16176          0     110652    2668236
-/+ buffers/cache:     471116    2795064
Swap:      2048276      80160    1968116

下面是对这些数值的解释:
total:总计物理内存的大小。
used:已使用多大。
free:可用有多少。
Shared:多个进程共享的内存总额。
Buffers/cached:磁盘缓存的大小。
第三行(-/+ buffers/cached):
used:已使用多大。
free:可用有多少。
第四行就不多解释了。
区别:第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。这两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是16176KB,已用内存是3250004KB,其中包括,内核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached.
第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。
所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached。
如上例:
2795064=16176+110652+2668236

接下来解释什么时候内存会被交换,以及按什么方交换。 当可用内存少于额定值的时候,就会开会进行交换。
如何看额定值:
cat /proc/meminfo

[root@scs-2 tmp]# cat /proc/meminfo
MemTotal:      3266180 kB
MemFree:         17456 kB
Buffers:        111328 kB
Cached:        2664024 kB
SwapCached:          0 kB
Active:         467236 kB
Inactive:      2644928 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:      3266180 kB
LowFree:         17456 kB
SwapTotal:     2048276 kB
SwapFree:      1968116 kB
Dirty:               8 kB
Writeback:           0 kB
Mapped:         345360 kB
Slab:           112344 kB
Committed_AS:   535292 kB
PageTables:       2340 kB
VmallocTotal: 536870911 kB
VmallocUsed:    272696 kB
VmallocChunk: 536598175 kB
HugePages_Total:     0
HugePages_Free:      0
Hugepagesize:     2048 kB

用free -m查看的结果:
[root@scs-2 tmp]# free -m 
             total       used       free     shared    buffers     cached
Mem:          3189       3173         16          0        107       2605
-/+ buffers/cache:        460       2729
Swap:         2000         78       1921


查看/proc/kcore文件的大小(内存镜像):
[root@scs-2 tmp]# ll -h /proc/kcore 
-r-------- 1 root root 4.1G Jun 12 12:04 /proc/kcore

备注:

占用内存的测量

测量一个进程占用了多少内存,linux为我们提供了一个很方便的方法,/proc目录为我们提供了所有的信息,实际上top等工具也通过这里来获取相应的信息。

/proc/meminfo 机器的内存使用信息

/proc/pid/maps pid为进程号,显示当前进程所占用的虚拟地址。

/proc/pid/statm 进程所占用的内存

[root@localhost ~]# cat /proc/self/statm

654 57 44 0 0 334 0

输出解释

CPU 以及CPU0。。。的每行的每个参数意思(以第一行为例)为:

参数 解释 /proc//status

Size (pages) 任务虚拟地址空间的大小 VmSize/4

Resident(pages) 应用程序正在使用的物理内存的大小 VmRSS/4

Shared(pages) 共享页数 0

Trs(pages) 程序所拥有的可执行虚拟内存的大小 VmExe/4

Lrs(pages) 被映像到任务的虚拟内存空间的库的大小 VmLib/4

Drs(pages) 程序数据段和用户态的栈的大小 (VmData+ VmStk )4

dt(pages) 04

查看机器可用内存

/proc/28248/>free

total used free shared buffers cached

Mem: 1023788 926400 97388 0 134668 503688

-/+ buffers/cache: 288044 735744

Swap: 1959920 89608 1870312

我们通过free命令查看机器空闲内存时,会发现free的值很小。这主要是因为,在linux中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。但实际上这些内存也是可以立刻拿来使用的。

所以 空闲内存=free+buffers+cached=total-used

### Linux `/proc/meminfo` 文件详解 #### 背景介绍 在Linux系统中,`/proc/meminfo` 是一个虚拟文件,提供了关于系统内存使用情况的详细信息。这些信息由内核动态生成并更新,能够帮助管理员了解系统的内存状态以及优化性能。 负责输出此文件内容的核心源码位于 `fs/proc/meminfo.c` 中,具体函数为 `meminfo_proc_show()` [^1]。通过解析该文件的内容,可以深入了解当前系统的物理内存和交换空间的状态。 --- #### 主要字段解释 以下是 `/proc/meminfo` 文件中的常见条目及其含义: 1. **MemTotal** 表示系统总的可用物理内存大小(单位通常为KB)。这是硬件实际安装的RAM容量减去被保留的部分后的数值 [^2]。 2. **MemFree** 显示未使用的物理内存数量。需要注意的是,在现代操作系统中,“空闲”并不意味着这部分资源完全无用;实际上,部分可能已被作为缓存或缓冲区占用 。 3. **Buffers & Cached** - Buffers: 用于块设备的数据缓冲区域。 - Cached: 当前磁盘缓存所占有的内存量。这两项反映了操作系统的高效性——即使看似“已用”的内存也可能正服务于频繁访问的数据读写需求 [^2]。 4. **SwapTotal 和 SwapFree** 描述了交换分区的整体规模 (`SwapTotal`) 及剩余可利用的空间 (`SwapFree`) 。当物理内存不足时,系统会将不活跃页面移至swap以便腾出更多RAM供其他程序运行 。 5. **Active(anon)/Inactive(anon), Active(file)/Inactive(file)** 这些分类进一步细化活动与非活动页的区别,并区分匿名映射(anonymous mapping)还是基于文件的映射(file-backed mappings). 6. **Slab** Slab代表了一种特殊的内存管理方式,主要用于存储经常创建销毁的小型固定尺寸的对象实例比如inode、dentry等元数据结构体。这种方式减少了碎片化风险同时也加快分配速度[^3]. 7. **SReclaimable/SUnreclaimable** SReclaimable表示那些理论上可以通过回收来释放回通用池子里面的slabs;而SUnreclaimable则指代无法轻易收回再利用的那一类slab对象. 8. **PageTables/HugePages_Total etc...** 提供有关进程地址转换表以及其他高级特性如大页支持方面的统计资料. --- #### 示例代码展示如何读取 meminfo 数据 下面给出一段简单的 Python 脚本用来获取 MemInfo 的基本信息: ```python def parse_meminfo(): with open('/proc/meminfo', 'r') as f: lines = f.readlines() result = {} for line in lines: key, value = line.split(':') try: num_val = int(value.strip().split(' ')[0]) result[key.strip()] = num_val except ValueError: continue return result if __name__ == "__main__": info = parse_meminfo() print(f"Total Memory: {info['MemTotal']} KB") print(f"Free Memory: {info['MemFree']} KB") ``` 上述脚本打开 `/proc/meminfo`,逐行处理每一项键值对并将它们转化为字典形式返回给调用者。 --- ### 总结 通过对 `/proc/meminfo` 文件的理解可以帮助我们更好地掌握整个服务器或者PC端上的内存状况从而做出相应的调整措施提高效率降低延迟等问题发生几率。同时也要注意到不同版本之间可能存在细微差异所以最好查阅对应发行版手册确认最新定义。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值