一、基本概念
(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生效。
二、内存查看:
[plain]view plaincopy
[root@localhostdesktop]#free-m
totalusedfreesharedbuff/cacheavailable
mem:977690713215111
swap:20471501897
(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
/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(页面内存):
[plain]view plaincopy
echo1>/proc/sys/vm/drop_caches
tofreereclaimableslabobjects(includesdentriesandinodes)(索引节点链接):
echo2>/proc/sys/vm/drop_caches
tofreeslabobjectsandpagecache:
echo3>/proc/sys/vm/drop_caches
不过还是建议使用:
sysctl -w vm.vfs_cache_pressure=200
因为直接使用echo会太暴力。
(2)内存扩容:
实际上,并不是对物理内存扩容,而是增加swap交换分区,间接的增加内存,因为swap分区会存放内存溢出的、使用频次较低的数据:
[plain]view plaincopy
[root@localhostdesktop]#free-m
totalusedfreesharedbuff/cacheavailable
mem:977419623495390
swap:20471601887
[root@localhostdesktop]#ddif=/dev/zeroof=/home/swapbs=1024count=512000#创建一个块
512000+0recordsin
512000+0recordsout
524288000bytes(524mb)copied,2.83537s,185mb/s
[root@localhostdesktop]#du/home/swap-sh
500m/home/swap
[root@localhostdesktop]#mkswap/home/swap#变为swap分区
settingupswapspaceversion1,size=511996kib
nolabel,uuid=b10175fc-d933-43ee-8979-a1d466fea54f
[root@localhostdesktop]#/sbin/swapon/home/swap#使其生效
swapon:/home/swap:insecurepermissions0644,0600suggested.
[root@localhostdesktop]#free-m
totalusedfreesharedbuff/cacheavailable
mem:977420713485389
swap:25471602387
很明显,可以看到swap分区变大了。
雷诺K-ZE或将是最安全的电动汽车
第九届蓝桥杯单片机初赛客观题汇总与解析V1.0
即将发布!三星Galaxy XCover 5现身跑分网站
风机变频器作用是什么
飞思卡尔推出32位Qorivva微控制器(MCU)MPC5604E
你知道linux内存管理基础及方法?
一文解读SysTools Outlook PST Locator
关于UPS电源的使用注意事项
为什么有很多国家以及地区要限制chatGPT的发展
大富科技连环并购:华为背后的价格杀手
深鉴科技发布DDESE自动语音识别加速引擎
联迪商用已成功入选金融领域企业标准“领跑者”
快闪存储器的路线之争
利用静态时序分析工具解决带宽不足问题
UMPC超移动个人电脑全面解析(下)
变压器的进出接线方法
2020年中国磷酸铁锂电池行业市场调研分析报告(2020-2025年)
摩尔精英封测协同解决方案 力推SiP/FCBGA封装
一文带你了解在线式红外笑气检测仪-深圳欧森杰
工程师教你如何读懂电源电路单元