Linux内存机制以及手动释放swap,buffer,cache
目录
一、什么是内存机制
从物理硬盘中读写比从内存中读写要慢得多,所以,我们希望所有数据的读、写都是在内存中完成,但是,内存大小是有限的,就引入了物理内存和虚拟内存的概念
物理内存:硬件内存条内存大小
虚拟内存(swap space):从磁盘中虚拟出的一块空间,为了满足物理内存不足时提出的策略。简单说就是当物理内存不足 是,使用swap space空间。准确来说:就是当物理内存不足时,系统会把物理内存中不常使用的数据写入到虚拟内存中,这样就腾出了空间,释放了物理内存。当需要使用这部分不常用的数据时,内存会重新从虚拟内存中数据读入到物理内存中,可以把虚拟内存理解为“仓库”,临时存放数据
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
上面这个30代表物理内存在使用70%的时候才会使用swap(参考网络资料:当剩余物理内存低于70%(70=100-30)时,开始使用交换空间)swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。
值越大表示越倾向于使用swap。可以设为0,这样做并不会禁止对swap的使用,只是最大限度地降低了使用swap的可能性。
通常情况下:swap分区设置建议是内存的两倍 (内存小于等于4G时),如果内存大于4G,swap只要比内存大就行。另外尽量的将swappiness调低,这样系统的性能会更好。
我们可以调整这个值
临时调整:
永久调整,将该参数写入到内核并加载
echo "vm.swappiness=20" >> /etc/sysctl.cof
sysctl -p 重新加载
三、怎么释放内存
一般系统是不会自动释放内存的关键的配置文件/proc/sys/vm/drop_caches。这个文件中记录了缓存释放的参数,默认值为0,也就是不释放缓存。他的值可以为0~3之间的任意数字,代表着不同的含义:
-
0 – 不释放
-
1 – 释放页缓存
-
2 – 释放dentries和inodes
-
3 – 释放所有缓存
echo "3" > /proc/sys/vm/drop_caches
四、怎么释放swap
前提:首先要保证内存剩余要大于等于swap使用量,否则会宕机!根据内存机制,swap分区一旦释放,所有存放在swap分区的文件都会转存到物理内存上。通常通过重新挂载swap分区完成释放swap。
释放swap操作步骤:
a.查看当前swap分区挂载在哪?
b.关停这个分区
c.查看状态:
d.查看swap分区是否关停,最下面一行显示全
e.将swap挂载到/dev/dm-1上
f.查看挂载是否成功
#查看swap使用情况
free -m
#查看swap磁盘
swapon -s
/dev/dm-1
#停止swap使用,简单理解为卸载,系统就会把swap中数据搬迁到内存中
swapoff /dev/dm-1
#重新挂载,启用swap
swapon /dev/dm-1
#查看启用情况
swapon -s
--文章参考Darren_Wen的内存机制,仅做学习收藏
上一篇: Linux(CentOS)基础命令
下一篇: 手动释放Linux服务器内存