linux 系统内存,linux系统怎么看内存大小
很多朋友对于linux 系统内存和linux系统怎么看内存大小不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
Linux里面VIRT和RES代表什么意思
深入理解Linux世界中的内存管理:VIRT与RES的奥秘
Linux操作系统中的内存管理是其高效性能的关键,其中VIRT和RES是两个重要的内存指标,它们分别揭示了进程在虚拟和实际内存中的占用情况。VIRT,全称为Virtual Memory Size,代表的是进程占用的虚拟内存总量。这一数字包含了物理内存(即RAM)的使用、swap空间的占用,以及操作系统为进程分配但实际未使用的内存。虽然VIRT看似庞大,但往往并不直观反映实际内存需求,因为它的值可能会超过实际硬件内存总容量。
相比之下,RES,即Resident Set Size,是进程实际占用的物理内存,不包括swap空间,但包括与其他进程共享的内存。RES值的实用性明显优于VIRT,因为它能提供一个更准确的内存占用量。然而,即使如此,我们仍需注意,某些进程可能因为内存不足而被swap到硬盘,这部分内存也应该计入RES的计算中,尽管它并未真正存储在RAM中。
最后,SHR,即Shared Memory,代表的是进程可以与其他进程共享的内存空间。这是Linux内核Copy on Write(CoW)机制的体现,当一个进程fork出子进程时,两者可以共享相同的内存区域,直到子进程需要更改数据时才会进行实际的复制。这种机制有效地节省了内存资源,但理解SHR的含义对于理解进程间内存协作至关重要。
总结来说,VIRT、RES和SHR这三个内存指标在Linux中各有其重要性,VIRT提供了总览,RES聚焦实际使用,而SHR则揭示了进程间的内存共享。理解这些概念,有助于我们更好地监控和优化系统内存使用,确保资源的有效分配和性能的提升。
linux查看系统内存大小
在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
Linux内核:内存管理——Slab分配器
深入解析Linux内核:内存管理的艺术——SLAB分配器
在Linux内核的世界里,内存管理是一项至关重要的任务。其中,SLAB分配器扮演着关键角色,它解决了页框分配器的大页框浪费问题,通过专用SLAB(如TCP)和普通SLAB(如kmalloc-8, kmalloc-16等)实现了高效而灵活的内存管理。通过执行`cat/proc/slabinfo`,我们可以窥探SLAB的运行状态。
SLAB的核心理念在于对象大小的固定性,这有助于减少内存碎片,提高内存使用效率。kmem_cache(SLAB缓存)是其最高层级的数据结构,它负责描述和管理SLAB及其对象。内核模块通过kmem_cache_create定制化的SLAB,确保内存管理的灵活性。
kmem_cache结构内部,对象大小(object_size)与SLAB的全局配置如gfporder和num保持同步。每个NUMA节点的SLAB管理由struct kmem_cache_node数组负责,它支持分布式内存管理,确保了内存的均衡分配。
在kmem_cache的内部结构中,SLAB链表是关键部分,包括slabs_partial、slabs_full和slabs_free。slabs_partial存储部分使用的SLAB描述符,slabs_full则是所有对象的链表,而slabs_free则记录空闲的SLAB。这些链表通过spinlock_t lock进行同步,确保了在分配和回收过程中的线程安全。
SLAB设计巧妙,如SLUB(Simple Low Overhead Buffering)和SLOB(Simplified Low Overhead Buffering)结构,它们结合了计数器、活跃对象和动态链表,以实现内存的高效分配。SLAB描述符还包括页标志、对象地址指针和空闲对象链表,这些细节都在CONFIG_SLUB配置中有所体现。
SLAB描述符中的freelist和填充区域的优化,以及对象地址的着色设计,都是提高内存利用率的重要手段。内存着色通过添加偏移量避免同一行内存冲突,提升了性能。本地CPU和共享链表的组合,形成了SLAB分配器的高效运作框架,优先级分配原则保证了快速响应。
了解这些细节后,我们发现SLAB分配器是Linux内核内存管理的精髓所在,它在内存分配和回收的过程中,巧妙地平衡了效率与灵活性。通过深入研究这些内部机制,我们可以更好地理解和优化我们的系统内存使用。
【推荐阅读】
1. Linux文件系统详解
2. Linux进程管理:实时调度
3. Linux内核内存管理-缺页异常& brk系统调用
原文作者:tolimit
原文地址:linux内存源码分析- SLAB分配器概述
---
经过上述的精炼与重构,文章内容更加清晰,突出了SLAB分配器在Linux内核内存管理中的核心作用和关键细节,为读者提供了深入理解内存管理的窗口。