linux 内存管理基础
一、基本概念
(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生效。
二、内存查看:
[root@localhost Desktop]# free -m
total used free shared buff/cache available
Mem: 977 690 71 3 215 111
Swap: 2047 150 1897
(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 - 不可回收的
- /proc/meminfo: provide estimated available memory
- Many load balancing and workload placing programs check /proc/meminfo to estimate how much free memory is available. They generally do this by adding up "free" and "cached", which was fine ten years ago, but is pretty much guaranteed to be wrong today. It is wrong because Cached includes memory that is not freeable as page cache, for example shared memory segments, tmpfs, and ramfs, and it does not include reclaimable slab memory, which can take up a large fraction of system memory on mostly idle systems with lots of files.
(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(页面内存):
echo 1 > /proc/sys/vm/drop_caches
To free reclaimable slab objects (includes dentries and inodes)(索引节点链接):
echo 2 > /proc/sys/vm/drop_caches
To free slab objects and pagecache:
echo 3 > /proc/sys/vm/drop_caches
不过还是建议使用:
sysctl -w vm.vfs_cache_pressure=200
因为直接使用echo会太暴力。
(2) 内存扩容:
实际上,并不是对物理内存扩容,而是增加swap交换分区,间接的增加内存,因为swap分区会存放内存溢出的、使用频次较低的数据:
[root@localhost Desktop]# free -m
total used free shared buff/cache available
Mem: 977 419 62 3 495 390
Swap: 2047 160 1887
[root@localhost Desktop]# dd if=/dev/zero of=/home/swap bs=1024 count=512000 # 创建一个块
512000+0 records in
512000+0 records out
524288000 bytes (524 MB) copied, 2.83537 s, 185 MB/s
[root@localhost Desktop]# du /home/swap -sh
500M /home/swap
[root@localhost Desktop]# mkswap /home/swap # 变为swap分区
Setting up swapspace version 1, size = 511996 KiB
no label, UUID=b10175fc-d933-43ee-8979-a1d466fea54f
[root@localhost Desktop]# /sbin/swapon /home/swap # 使其生效
swapon: /home/swap: insecure permissions 0644, 0600 suggested.
[root@localhost Desktop]# free -m
total used free shared buff/cache available
Mem: 977 420 71 3 485 389
Swap: 2547 160 2387
很明显,可以看到swap分区变大了。