描述

一、基本概念

(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 plain copy

[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 - 不可回收的

参见: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 plain copy

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分区会存放内存溢出的、使用频次较低的数据:

[plain] view plain copy

[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分区变大了。

打开APP精彩内容

点击阅读全文

linux内存管理的主要概念是虚拟内存,你知道linux内存管理基础及方法?相关推荐

  1. linux内存管理的主要概念是虚拟内存,有关linux内存管理机制的相关内容,linux物理内存和虚拟内存,深入了解Linux内存运行 ......

    在linux中空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然. 这是Linux内存管理的一个优秀特性,区别于Windows的内存管理. 主要特点: 无论物理内存有多大,L ...

  2. Linux内存管理之基本概念介绍(一)

    Linux内存管理之基本概念介绍(一) Linux内存管理之物理内存管理(二) Linux内存管理之内存管理单元(MMU)(三) Linux内存管理之分配掩码(四) Linux内存管理之伙伴系统(五) ...

  3. 如何查看进程占用内存的大小以及物理内存和虚拟内存的区别

    概述 想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题--你的程序在运行时占用了多少内存(物理内存)?通常我们可以通过top命令查看进程占用了多少内存.这里我们可以 ...

  4. Linux内存管理:为什么 Linux 需要虚拟内存?为什么 Linux 默认页大小是 4KB?

    Table of Contents 为什么 Linux 需要虚拟内存? 缓存 内存管理 内存保护 总结 推荐阅读 为什么 Linux 默认页大小是 4KB? 页表项 碎片化 总结 推荐阅读 为什么 L ...

  5. Linux内存管理:NUMA技术详解(非一致内存访问架构)

    图片来源:https://zhuanlan.zhihu.com/p/68465952 <Linux内存管理:转换后备缓冲区(TLB)原理> <内存管理:Linux Memory Ma ...

  6. linux内存重映射的概念及对内核虚拟地址的重映射方法分析

    [摘要]本文分析了Linux设备的内存映射的相关概念和理论,使用例子对mmap及nopage的驱动编写方法进行了解释,最后对3种不同的内核虚拟空间分配方法下,mmap驱动编写方法进行了细致的分析和调试 ...

  7. linux c 将虚拟地址转化为物理地址_面试不懂 Linux 内存管理?我用 20 张图给你讲明白...

    微信搜索公众号「 后端技术学堂 」回复「1024」获取50本计算机电子书,回复「学习路线」获取超详细后端技术学习路线思维导图,文章每周持续更新,我们下期见! 大家好,我是柠檬哥. 分享编程学习,助力程 ...

  8. linux每个进程的地址空间大小,别再说你不懂 Linux 内存管理了,10 张图给你安排的明明白白...

    原标题:别再说你不懂 Linux 内存管理了,10 张图给你安排的明明白白 转自:LemonCode 过去的一周有点魔幻,有印象的有三个新闻:天猫总裁绯闻事件,蘑菇街裁员,不可能打工的周某也放出来了. ...

  9. Linux内存page,【原创】(十四)Linux内存管理之page fault处理

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

最新文章

  1. Pytorch和Tensorflow,谁会笑到最后?
  2. R语言多因素方差分析及评估假设检验
  3. 哈佛MIT坐镇的波士顿,正式宣布政府禁用人脸识别
  4. ecshop 删除订单时提示“以下订单无法被移除”的解决办法
  5. c语言表示测试结束,C语言简单测试题
  6. 数据库设计笔记——MySQL基础知识(四)
  7. ArcGIS实验教程——实验三十九:ArcGIS多元分类(ISO聚类分析、最大似然分类、主成分分析)案例教程
  8. 前端学习(2736):重读vue电商网站46之执行build 时报错
  9. C++读取文件,将文件内容读到string字符串里面
  10. POJ 2312Battle City(BFS-priority_queue 或者是建图spfa)
  11. StarWind RAM 磁盘仿真程序
  12. 编辑画面,element-ui的单选框组选中值以及画面选择样式无法切换,但是绑定的v-model值已发生变化
  13. https验证失败+Android,okhttpSSL证书验证失败有关问题
  14. 利用Python实现腾讯校园招聘状态查询
  15. 三个数相减的平方公式_小学二年级数学34个必考公式以及重难点解析
  16. vmware14克隆后UUID相同的解决方法
  17. 云服务器密码忘了_云服务器 root 密码忘记了怎么办
  18. Java项目:SSH房屋线下销售网站管理系统
  19. 3ds max7渲染传奇三剑客VRay教程(PDF)
  20. PS故障风海报制作技术分享

热门文章

  1. git工作中常用命令
  2. mac os域名解析处理 清缓存 映射
  3. 标题 日期问题java蓝桥杯,日期类的使用(java)-蓝桥杯
  4. mysql originator_MySQL数据库事件调度(Event)
  5. catia钣金根据线段折弯_折弯大神分析钣金折弯下刀顺序
  6. cglib实现动态代理
  7. mysql 字符转数值_深入MYSQL字符数字转换的详解
  8. Python学习札记(十七) 高级特性3 列表生成式
  9. 进阶学习js中的执行上下文
  10. eclipse 断点调试快捷键