东北街溜子--Linux内存机制以及手动释放swap和内存

进行微服务开发时,服务假死,发现swap分区爆了,如何解决这个问题。首先让我们了解一下linux的内存机制。

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

直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。物理内存就是系统硬件提供的内存大小,是真正的内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。linux会在物理内存不足时,使用交换分区的虚拟内存,更详细的说,就是内核会将暂时不用的内存块信息写到交换空间,这样以来,物理内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。Linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。

二、linux内存运行机制

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

2、Linux 进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存,linux内核根据”最近最经常使用“算法,仅仅将一些不经常使用的页面文件交换到虚拟内存。

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

以上服务假死,正是第3点造成的。

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

linux内部有一个阀值进行控制,当超过此阀值时,进行交换。以下命令可以看到设定的阀值。

【root@biz-1 ~】# cat /proc/sys/vm/swappiness

发现值为30,上面这个30代表物理内存在使用30%的时候才会使用swap。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。swap分区设置建议是内存的两倍 (内存小于等于4G时),如果内存大于4G,swap只要比内存大就行。另外尽量的将swappiness调低,这样系统的性能会更好。

于是操作如下:

【root@biz-1 ~】# vi /etc/sysctl.conf

加入vm.swappiness = 10

【root@biz-1 ~】#sysctl -p

查看是否生效:

【root@biz-1 ~】#cat /proc/sys/vm/swappiness

10

四、怎么释放内存?

一般系统是不会自动释放内存的

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

0 – 不释放

1 – 释放页缓存

2 – 释放dentries和inodes

3 – 释放所有缓存

【root@biz-1 ~】#free -m

【root@biz-1 ~】#echo "3" > /proc/sys/vm/drop_caches

发现释放,问题解决。

你可能感兴趣的:(东北街溜子--Linux内存机制以及手动释放swap和内存)