一、基本概念(1)物理内存和虚拟内存物理内存:系统硬件提供的真实物理内存 虚拟内存:利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为swap,swap类似于windows的虚拟内存。 1、linux的内存管理采取的分页存取机制,会将内存中不经常使用的数据块交换到虚拟内存中。linux会不时地进行页面交换操作,以保持尽可能多的空闲物理内存,即使并没有什么事需要内存,linux也会交换出暂时不用的内存页面。 (2)buddy内存分配linux内核中引入的伙伴系统算法,将空闲页框分为11个块链表:1、2、4、8、16、32、64、128、256、512、1024个连续的页框块,每个页框为4K。比如,当申请100K的空间时,会先在大于100/4=25的页框中寻找,释放后,会将相邻的页框合并。但是频繁的申请和释放,会导致已分配页框的内存块中分散了很多小块的空闲页框。 (3)slab内存分配针对经常分配/释放的对象,如进程描述符等,在用伙伴系统进行分配释放时会造成大量的内存碎片,处理速度也慢。而slab是基于对象管理的,每当申请时,就从slab列表中分配一个出去,释放时,也是释放到slab表中,而不是返回给伙伴系统,从而避免碎片化(也就是直接在内存中进行)。 查看slab信息的命令是slabtop,其是读取/proc/slabinfo中的信息 (4)页存大小linux支持大页内存技术hugepage,从而减少TLB miss(Translation lookaside buffer 页表寄存器缓冲)。一般来讲,使用较小的页存可以减少碎片化,但是会导致进程的页表过长、降低页面换进换出的效率。 可以在/proc/meminfo中查看大页内存相关信息(HugePages*) 也可通过echo 2000 > /proc/sys/vm/nr_hugepages生效。
二、内存查看:
(1) 其中含义:mem:物理内存(第二行显示) swap:交换区内存(第三行显示) total:总的物理内存大小977,总的交换内存2047 used:已经使用的 free:空闲的 shared:多个进程共享的内存 buff/cache:磁盘缓存的大小 buffer是为了解决写磁盘的效率 cache是为了解决读磁盘的效率 available:可用的 关系:total = used + free +Buffers/cached 这里重点描述一下free和available的区别: free = 当前空闲的物理内存 available = free + Buffers/cached - 不可回收的 参见:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773
(2) free命令查询的结果是/proc/meminfo中的信息,也可以用cat查看具体的meminfo中的内存。
三、内存释放和扩容:(1) 内存释放:在linux中,buffer和cached主要是用于缓存已打开的文件、目录信息、inode等,频繁的文件访问,会导致cache使用的增加,使用free的大小减少。 命令1:sync,将缓存(即buffer)中的待写入磁盘的内容立即写入到磁盘中 命令2:清空/proc/sys/vm/drop_caches中的内容 (详情参见:https://www.kernel.org/doc/Documentation/sysctl/vm.txt) cache中文件包括page cache和buffer cache两种,前者用于文件、inode等操作,后者用于块设备操作 /proc/sys/vm/下的文件包括虚拟内存的管理,以及脏数据写入磁盘。 To free pagecache(页面内存):
不过还是建议使用: sysctl -w vm.vfs_cache_pressure=200 因为直接使用echo会太暴力。 (2) 内存扩容:实际上,并不是对物理内存扩容,而是增加swap交换分区,间接的增加内存,因为swap分区会存放内存溢出的、使用频次较低的数据:
很明显,可以看到swap分区变大了。 (责任编辑:IT) |