点击上方 "Linux中文社区" 关注,星标或者置顶11点30分准时推送,第一时间送达

作者:Darren_Wen | 责编:中文妹

来源:blog.51cto.com/wendashuai/2506103

Linux中文社区(ID: Linux-China) 第 17 次推文上一篇:在 Windows 上直接运行 Linux,有命令行就是香!

正文

本文介绍linux内存机制、虚拟内存swap、buffer/cache释放等原理及实操。

一、什么是linux的内存机制?

二、linux什么时候开始使用虚拟内存(swap)?

三、怎么释放内存?四、怎么释放swap?

一、什么是linux的内存机制?

我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。

物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。

作为物理内存的扩展,linux会在物理内存不足时,使用交换分区的虚拟内存,更详细的说,就是内核会将暂时不用的内存块信息写到交换空间,这样以来,物理内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。

Linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。

要深入了解linux内存运行机制,需要知道下面提到的几个方面:

Linux系统会不时的进行页面交换操作,以保持尽可能多的空闲物理内存,即使并没有什么事情需要内存,Linux也会交换出暂时不用的内存页面。这可以避免等待交换所需的时间。

Linux 进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存,linux内核根据”最近最经常使用“算法,仅仅将一些不经常使用的页面文件交换到虚拟 内存,有时我们会看到这么一个现象:linux物理内存还有很多,但是交换空间也使用了很多。其实,这并不奇怪,例如,一个占用很大内存的进程运行时,需 要耗费很多内存资源,此时就会有一些不常用页面文件被交换到虚拟内存中,但后来这个占用很多内存资源的进程结束并释放了很多内存时,刚才被交换出去的页面 文件并不会自动的交换进物理内存,除非有这个必要,那么此刻系统物理内存就会空闲很多,同时交换空间也在被使用,就出现了刚才所说的现象了。关于这点,不 用担心什么,只要知道是怎么一回事就可以了。

交换空间的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页 面,它们又会被马上交换出去,如此以来,虚拟内存中可能没有足够空间来存储这些交换页面,最终会导致linux出现假死机、服务异常等问题,linux虽 然可以在一段时间内自行恢复,但是恢复后的系统已经基本不可用了。

因此,合理规划和设计Linux内存的使用,是非常重要的.

在Linux 操作系统中,当应用程序需要读取文件中的数据时,操作系统先分配一些内存,将数据从磁盘读入到这些内存中,然后再将数据分发给应用程序;当需要往文件中写 数据时,操作系统先分配内存接收用户数据,然后再将数据从内存写到磁盘上。然而,如果有大量数据需要从磁盘读取到内存或者由内存写入磁盘时,系统的读写性 能就变得非常低下,因为无论是从磁盘读数据,还是写数据到磁盘,都是一个很消耗时间和资源的过程,在这种情况下,Linux引入了buffers和 cached机制。

buffers与cached都是内存操作,用来保存系统曾经打开过的文件以及文件属性信息,这样当操作系统需要读取某些文件时,会首先在buffers 与cached内存区查找,如果找到,直接读出传送给应用程序,如果没有找到需要数据,才从磁盘读取,这就是操作系统的缓存机制,通过缓存,大大提高了操 作系统的性能。但buffers与cached缓冲的内容却是不同的。

buffers是用来缓冲块设备做的,它只记录文件系统的元数据(metadata)以及 tracking in-flight pages,而cached是用来给文件做缓冲。更通俗一点说:buffers主要用来存放目录里面有什么内容,文件的属性以及权限等等。而cached直接用来记忆我们打开过的文件和程序。

为了验证我们的结论是否正确,可以通过vi打开一个非常大的文件,看看cached的变化,然后再次vi这个文件,感觉一下两次打开的速度有何异同,是不是第二次打开的速度明显快于第一次呢?接着执行下面的命令:

find / -name .conf看看buffers的值是否变化,然后重复执行find命令,看看两次显示速度有何不同。

二、linux什么时候开始使用虚拟内存(swap)?

[root@wenwen ~]# cat /proc/sys/vm/swappiness60

上面这个60代表物理内存在使用40%的时候才会使用swap(参考网络资料:当剩余物理内存低于40%(40=100-60)时,开始使用交换空间)swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。

值越大表示越倾向于使用swap。可以设为0,这样做并不会禁止对swap的使用,只是最大限度地降低了使用swap的可能性。

通常情况下:swap分区设置建议是内存的两倍 (内存小于等于4G时),如果内存大于4G,swap只要比内存大就行。另外尽量的将swappiness调低,这样系统的性能会更好。

B.修改swappiness参数

临时性修改:[root@wenwen ~]# sysctl vm.swappiness=10vm.swappiness = 10[root@wenwen ~]# cat /proc/sys/vm/swappiness10

永久性修改:

[root@wenwen ~]# vim /etc/sysctl.conf加入参数:vm.swappiness = 35然后在直接:[root@wenwen ~]# sysctl -p /etc/sysctl.conf查看是否生效:cat /proc/sys/vm/swappiness35

立即生效,重启也可以生效。

三、怎么释放内存?

一般系统是不会自动释放内存的关键的配置文件/proc/sys/vm/drop_caches。这个文件中记录了缓存释放的参数,默认值为0,也就是不释放缓存。他的值可以为0~3之间的任意数字,代表着不同的含义:

0 – 不释放1 – 释放页缓存2 – 释放dentries和inodes3 – 释放所有缓存

实操:

很明显多出来很多空闲的内存了吧

四、怎么释放swap?

前提:首先要保证内存剩余要大于等于swap使用量,否则会宕机!根据内存机制,swap分区一旦释放,所有存放在swap分区的文件都会转存到物理内存上。通常通过重新挂载swap分区完成释放swap。

a.查看当前swap分区挂载在哪?b.关停这个分区c.查看状态:d.查看swap分区是否关停,最下面一行显示全e.将swap挂载到/dev/sda5上f.查看挂载是否成功

--END--

往期精彩

一文讲懂什么是 VLAN、三层交换机、网关、DNS、子网掩码、MAC地址

10大黑客专用的 Linux 操作系统

Linux 用着太爽啦!!!

华为被安卓屏蔽,以后可能将无系统可用!

高并发情况下 Linux 系统及 kernel 参数优化

喜欢本文的朋友们,欢迎长按下图,关注订阅号Linux中文社区

收看更多精彩内容

c++ 无法读取内存_Linux内存机制以及手动释放swap和buffer和cache相关推荐

  1. JNI内存方面说明以及相关类型手动释放内存

    JNI内存方面说明以及相关类型手动释放内存 一.Java内存 二.JNI内存和引用 三.Local Reference 四.Global Reference 五.Weak Global Referen ...

  2. 解决 pandas 读取数据时内存过大的问题

    解决 pandas 读取数据时内存过大的问题 背景: 在我们使用pandas进行数据处理的时候,有时候发现文件在本地明明不大,但是用pandas以DataFrame形式加载内存中的时候会占用非常高的内 ...

  3. linux delete内存不下降_linux内存分配管理

    linux内存分配管理 一.前言 作为从事与C/C++程序开发人员,我们一直需要很好的管理内存,申请和释放:可能很多只知道使用malloc.new去申请,使用free.delete去释放,但是,去根究 ...

  4. 内存分段分页机制理解_深度干货 | 真棒! 20 张图揭开内存管理的迷雾,瞬间豁然开朗...

    openEA开源周刊 openEA开源社区的官方运营载体 这里每天给大家呈现有价值的开源资讯,欢迎您的来稿与推荐,点击上方蓝色字,加入我们吧! 摘要:本篇跟大家说说内存管理,内存管理还是比较重要的一个 ...

  5. linux 初始化内存管理_Linux内存管理第二章 -- Describing Physical Memory

    首先来描述几个名词: NUMA:Non-Uniform Memory Access即内存非一致性访问.在很多巨星机上内存被分成了多个区域,CPU访问不同的内存区域耗费的时间是不同的.但在同一区域内,C ...

  6. [Win32]一个调试器的实现(四)读取寄存器和内存

    [Win32]一个调试器的实现(四)读取寄存器和内存 作者:Zplutor  出处:http://www.cnblogs.com/zplutor/  本文版权归作者和博客园共有,欢迎转载.但未经作者同 ...

  7. Nginx之共享内存与slab机制

    1. 共享内存 在 Nginx 里,一块完整的共享内存以结构体 ngx_shm_zone_t来封装,如下: typedef struct ngx_shm_zone_s ngx_shm_zone_t;t ...

  8. JVM堆外内存的回收机制分析

    本文来说下堆外内存的回收机制分析 文章目录 堆外内存 堆外内存的申请和释放 堆外内存的回收机制 本文小结 堆外内存 JVM启动时分配的内存,称为堆内存,与之相对的,在代码中还可以使用堆外内存,比如Ne ...

  9. python读取视频占用内存太大_Python 读取大文件内存占用检测示例

    导读热词对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录 ...

最新文章

  1. Anaconda:包安装以XGBoost为例
  2. 面向对象分析与设计的意义是什么
  3. springboot @RequestBody 接收字符串
  4. 【数据结构与算法】动画:什么是 BF 算法 ?
  5. 安装linux出现基础系统出错,Linux系统出错提示信息详解
  6. python三角函数拟合_使用python进行数据拟合最小化函数
  7. Java类类getDeclaredMethod()方法及示例
  8. 腾讯和阿里巴巴考虑互相开放生态,是真开放还是新的垄断?
  9. js获取Listbox选择的值
  10. 子元素个数不定的垂直居中布局
  11. macbook 放flash发烫,转html5
  12. Oracle简易界面工具 (Oracle 10g, Oracle 11g)
  13. 狂神说springboot源码_狂神说SpringBoot04:JSR303数据校验及多环境切换
  14. 实践的意义——写给图像处理算法爱好者的建议
  15. 解决windows安全中心一片空白,defender打开关闭变灰色的问题
  16. iOS---Xcode中删除描述文件Provisioning Profiles
  17. 老范的Bug跟踪管理系统0.1 Alpha——介绍篇
  18. atob()和btoa() 进行base64的编码和解码
  19. math_基本初等函数图型(幂函数/指数/对数/三角/反三角)
  20. idea设置代码提示

热门文章

  1. angluar ajax实例,Angular服务Request异步请求的实例讲解
  2. python 协程原理_Python协程greenlet实现原理
  3. Linux 下搭建 Java Web 开发环境
  4. XScuGic_Connect分析
  5. 2.3 《计算机组成原理》之浮点数的表示(基本格式、规格化[左规右规]、表示范围、IEEE754标准详解)
  6. 傅里叶变换音频可视化_Web Audio在音频可视化中的应用
  7. golang 将word转为pdf_如何将word转化为pdf格式
  8. cfree运行程序错误的原因_ARM Cortex-M 系列 MCU错误代码自动追踪库的使用分享
  9. export命令添加和删除环境变量
  10. ESP8266 如何修改默认上电校准方式?另外为什么 ESP8266 进⼊启动模式(2,7)并触发看⻔狗复位?