Linux内存机制以及手动释放swap和buffer和cache

本文介绍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)?

A.[[email protected] ~]# cat /proc/sys/vm/swappiness

60

上面这个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参数

临时性修改:

[[email protected] ~]# sysctl vm.swappiness=10

vm.swappiness = 10

[[email protected] ~]# cat /proc/sys/vm/swappiness

10

永久性修改:

[[email protected] ~]# vim /etc/sysctl.conf

加入参数:

vm.swappiness = 35

然后在直接:

[[email protected] ~]# sysctl -p /etc/sysctl.conf

查看是否生效:

cat /proc/sys/vm/swappiness

35

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

Linux内存机制以及手动释放swap和buffer和cache


推荐文章
《SLAM机器人基础教程》第五章 Linux基础

第五章Linux基础本章基于树莓派,以ubuntu为例讲解Linux。本章内容规划:5.1节,Linux概述5.2节,系统安装5.3节,Linux指令及ubuntu的使用5.4节,SSH和VNC5.5

linux详解sudoers

sudo使用  Linux是多用户多任务的操作系统,共享该系统的用户往往不只一个。出于安全性考虑,有必要通过useradd创建一些非root用户,只让它们拥有不完全的权限;如有必要,再来提升权限执行。

Linux iconv使用

iconv[选项】文件输入/输出格式规范:-f, --from-code=名称原始文本编码-t,--to-code=名称 输出编码信息:-l,--list 列举所有已知的字符集输出控制:-c

【原创】Linux中断子系统(四)-Workqueue

背景 Readthefuckingsourcecode!--By鲁迅 Apictureisworthathousandwords.--By高尔基 说明: Kernel版本:4.14 ARM64处理器,

Ubuntu编译配置Opencv

一、1.下载opencv源代码2.安装编译依赖库 2.1 sudoapt-getupdate 2.2 sudoapt-getinstallcmakesudoapt-getinstalllibgtk2.

Ubuntu20.4安装

官网下载镜像https://releases.ubuntu.com/20.04/ubuntu-20.04-live-server-amd64.iso挂载开装选语言选键盘网络设置DHCP到地址代理设置空

linux基础命令学习(一)

pwd输出当前工作路径tree以树状图列出目录的内容ctrl+c取消命令的执行clear 清空屏幕ls列出文件目录蓝色是目录,白色是普通文件aliascls=clear 别名终端:本地终端、远程虚

在Eclipse或者STS中使用SVN插件

在Eclipse/STS安装SVN插件  在STS4中默认是没有SVN插件的,需要我们手动安装SVN插件安装有两种方式,一种是在线安装,一种是离线安装但是在线安装,由于网络问题,一般很难安装成功,所以

安装VMWare tools,踩坑。记录一下

对于没钱买服务器的小白,只能靠安装虚拟机来勉强度日子。最近比较闲,想实现一下docker的自动化部署,在制作java8镜像时出了个问题。就是怎么在虚拟机上实现与本机文件夹的共享。坑了2天。记录一下,环

vmware中ubuntu系统扩展磁盘

总体思路:对新增硬盘进行分区(新硬盘可以直接增加逻辑分区挂载目录,老硬盘先删除逻辑分区重新分区再挂载目录),对逻辑分区再进行目录挂载。虚拟机中ubuntu系统扩展磁盘有两种方式:一、添加一块新硬盘,对

Linux学习笔记——硬盘分区和安装双系统

1.前言  假设电脑上已经安装了windowsXP或者windows7。试图在使用windows的同时,在电脑上安装ubuntu。  假设电脑上已经存在C盘、D盘、E盘和F盘,且E盘和F盘的剩余空间较

eclipse 版本号

Eclipse 3.1 版本代号 IO 【木卫1,伊奥】  Eclipse 3.2 版本代号 Callisto 【木卫四,卡里斯托 】Eclipse 3.3 版本代号 Eruopa 【木卫二,欧罗巴

linux find命令

由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统(NFS ),find命令在该文件系统中同样有效,只你具有相应的权限。 在运

如何删除Mac 的启动台(应用)残留的图标

如何删除MacOs启动台(应用)残留的图标方法很简单,删除“启动台”数据库里对应app的信息即可忘记什么版本的时候以前在“应用程序”删除应用后,启动台自动更新删掉不知道什么时候开始,直接在“应用程序”

Linux 安装 SVN

搬运地址: https://www.cnblogs.com/siashan/p/9528669.html 本文的目的,也就是想让后继之人在搭建svn服务器时不再犯错,不再被网上漫天的坑爹作品所坑害,

VMware workstation 14永久激活密钥、注册码

VMwareworkstation14永久激活密钥、注册码CG54H-D8D0H-H8DHY-C6X7X-N2KG6ZC3WK-AFXEK-488JP-A7MQX-XL8YFAC5XK-0ZD4H-0

[Linux]调整swap

在启动Tomcat的过程中,tomcat/catalina.out中报出如下故障:>/opt/govern/wydaas/logs/catalina.out #Thereisinsufficientm

Linux编程:--消息队列(MessageQueue)相关概念和原理

 一、消息队列概述消息队列(MessageQueue,简称为MQ)其本质是就是个队列,FIFO先进先出,只不过是队列中储放的主要内容是message,因而叫消息队列主要用于:不同的服务server、进

《鸟哥linux》--第十一章课后习题答案

1.在linux上可以找到哪些shell?哪个档案记录可用的shell?儿linux预设的shell是?  1./bin/bash,/bin/tcsh,/bin/csh  2./etc/shells 

Linux下 boost库编译并加入到环境变量

1、下载源码:http://www.boost.org/2、tarzxvfboost_1_70_0.tar.gz3、cdboost_1_70_04、./bootstrap.sh--with-libra